Witam!
Jestem w trakcie pisania programu, który jako lista jednokierunkowa ma zawierać dane: nazwisko, rok urodzenia, rok studiów. Operacje jakie ma wykonywać:
- dodawanie tak, że nazwiska są ułożone rosnąco alfabetycznie (działa)
- usuwanie pierwszego (działa)
- usuwanie ostatniego (nie działa, problem z napisaniem właściwego kodu)
- usuwanie elementu o określonym nazwisku (działa)
- wyszukanie elementu o określonym nazwisku (działa)
- sortowanie wg roku urodzenia (działa)
- wyświetlanie całej listy (wyświetla, ale tylko raz, tak jakby usuwa listę po jej wyświetleniu)
- usuwanie całej listy (działa)
- Problemem jest pierwszy element z listy, który staje się "nietykalny", omija go sortowanie, a dodatkowo program przypisuje mu dziwną wartość do parametru: rok studiów.
- Dalej z punktem 3: nie jestem w stanie napisać działającego kodu na usunięcie ostatniego elementu z listy, przy wielu próbach udało mi się tylko dojść do momentu, gdy wyrzucał mi ciągle komunikat o pustej liście. Z powodu braku kodu tej procedury zakomentowałem ją w głównym menu.
- Przy sortowaniu listy wg roku urodzenia, nie potrafię wstawić komunikatów: lista jest pusta, brak elementów do posortowania i lista została posortowana. W którym miejscu to powinno się znaleźć?
- Problem z punktem 7: po dodaniu kilku elementów do listy, możliwe jest jej jednokrotne wyświetlenie, po nim tak jakby zostaje ona usunięta i każda następna próba kończy się powiadomieniem o pustej liście.
- Chciałbym jeszcze aby w konsoli ENTER bez wprowadzenia wybranej opcji programu(lub wpisania żądanej wartości) nie przeskakiwał do nowej linii. Da się to jakoś zrobić?
Jeszcze niby podstawa i banał (ale też mi odmawia posłuszeństwa), czyli kontrola wprowadzanych danych przez użytkownika. W polach nazwisko zakaz wprowadzania cyfr, a w polach rok urodzenia i rok studiów możliwość stosowania tylko znaków cyfrowych. Wiem wiem.. użyj funkcji VAL, ale jak dokładnie, żeby to działało? Nie da się inaczej, jakąś prostą pętlą?
Kodzik:
program L1;
USES Crt;
type
Pstudent = ^student;
student = record
nazwisko : string[30];
rurodzenia: integer;
rstudiow: integer;
next : Pstudent;
end;
procedure dodaj_sortujac(var head : Pstudent);
var
tmp, pom : Pstudent;
begin
new(tmp);
write('Nazwisko: ');
readln(tmp^.nazwisko);
write('Rok urodzenia: ');
readln(tmp^.rurodzenia);
write('Rok studiow: ');
readln(tmp^.rstudiow);
if (head = nil) or (head^.nazwisko > tmp^.nazwisko) then
begin
tmp^.next := head;
head := tmp;
end
else begin
pom := head;
while (pom^.next <> nil) and (pom^.next^.nazwisko < tmp^.nazwisko) do
pom := pom^.next;
tmp^.next := pom^.next;
pom^.next := tmp;
end;
end;
procedure usun_pierwszego(var head : Pstudent);
var
pom, tmp : Pstudent;
begin
tmp := head;
if tmp = nil then write('Lista jest pusta. Brak elementu do usuniecia. ')
else
begin
if tmp = head then
begin
head := head^.next;
dispose(tmp);
end
else
begin
pom := head;
while pom^.next <> tmp do
pom := pom^.next;
pom^.next := tmp^.next;
dispose(tmp);
end;
writeln('Usunieto pierwszego studenta z listy. ');
end;
readln;
end;
procedure wyswietl_liste(var head : Pstudent);
begin
//clrscr;
writeln('Lista studentow prezentuje sie nastepujaco: ');
if head = nil then
write('Lista jest pusta. ')
else begin
while head <> nil do
begin
writeln(head^.nazwisko, ' ', head^.rurodzenia, ' ', head^.rstudiow);
head := head^.next;
end;
end;
readln;
end;
procedure usun_liste(var head : Pstudent);
var
pom: Pstudent;
begin
if head = nil then begin
write('Lista jest pusta. Brak elementow do usuniecia.');
readln;
end
else
begin
while head <> nil do
begin
pom:=head;
head := head^.next;
dispose(pom);
;
end;
writeln('Lista zostala usunieta. ');
readln;
end;
end;
function szukaj(head : Pstudent; nazwisko : string) : Pstudent;
begin
while (head <> nil) and (head^.nazwisko <> nazwisko) do
head := head^.next;
szukaj := head;
end;
procedure usun_nazwisko(var head : Pstudent);
var
pom, tmp : Pstudent;
nazwisko : string[30];
begin
write('Podaj nazwisko studenta, ktorego chcesz usunac z listy: ');
readln(nazwisko);
tmp := szukaj(head, nazwisko);
if tmp = nil then
write('Nie ma takiego studenta na liscie. ')
else
begin
if tmp = head then
begin
head := head^.next;
dispose(tmp);
end
else
begin
pom := head;
while pom^.next <> tmp do
pom := pom^.next;
pom^.next := tmp^.next;
dispose(tmp);
end;
writeln('Student o nazwisku: "', nazwisko, '" zostal usuniety z listy.');
end;
readln;
end;
procedure szukaj_nazwisko(var head : Pstudent);
var
tmp : Pstudent;
nazwisko : string[30];
begin
write('Podaj nazwisko studenta, ktorego chcesz znalezc: ');
readln(nazwisko);
tmp := szukaj(head, nazwisko);
if tmp = nil then
write('Nie ma takiego studenta na liscie. ')
else
begin
writeln('Znaleziono studenta o nazwisku: "', nazwisko, '": ');
writeln;
writeln(head^.nazwisko, ' ', head^.rurodzenia, ' ', head^.rstudiow);
writeln;
end;
readln;
end;
procedure sortuj_rurodzenia (var head : Pstudent);
var
sort, tmp, pom : Pstudent;
begin
sort := nil;
while head <> nil do
begin
new(tmp);
tmp^.nazwisko := head^.nazwisko;
tmp^.rurodzenia := head^.rurodzenia;
if sort = nil then
begin
tmp^.next := nil;
sort := tmp;
end
else
begin
pom := sort;
while (pom^.next <> nil) and (pom^.next^.rurodzenia > tmp^.rurodzenia) do
pom := pom^.next;
tmp^.next := pom^.next;
pom^.next := tmp;
end;
dispose(head);
head := head^.next;
end;
head := sort;
write('Ukonczono. ');
readln;
end;
var
i : integer;
tmp : Pstudent;
BEGIN
repeat
Clrscr;
Writeln('Lista jednokierunkowa operujaca na danych: Nazwisko, Rok urodzenia, Rok studiow.');
Writeln;
Writeln('+1. Dodaj studenta do listy.');
Writeln('+2. Usun pierwszego studenta z listy.');
Writeln('3. Usun ostatniego studenta z listy.');
Writeln('+4. Usun studenta o wskazanym nazwisku.');
Writeln('+5. Wyszukaj studenta o wskazanym nazwisku.');
Writeln('6. Sortuj liste wg roku urodzenia.');
Writeln('7. Wyswietl cala liste.');
Writeln('+8. Usun cala liste.');
Writeln('+0. Zakoncz prace.');
Writeln;
Write('Wybierz opcje: ');
readln(i);
writeln;
writeln;
if i = 1 then dodaj_sortujac(tmp);
if i = 2 then usun_pierwszego(tmp);
//if i = 3 then usun_ostatniego(tmp);
if i = 4 then usun_nazwisko(tmp);
if i = 5 then szukaj_nazwisko(tmp);
if i = 6 then sortuj_rurodzenia(tmp);
if i = 7 then wyswietl_liste(tmp);
if i = 8 then usun_liste(tmp);
until i = 0;
writeln;
END.