Wątek przeniesiony 2017-12-08 14:05 z Delphi i Pascal przez Patryk27.

Kolejka dynamiczna i dużo błędów

0

Witam mam taki problem z tym kodem zdaje sobie sprawę ze jest dużo błędów ale niestety nie wiem jak poradzić sobie z tym zadaniem i moglibyście rzucić okiem na to zadanie ???

program project1;

type WOcena = ^ TOcena;
     TOcena = record
       nazwisko , imie:string;
       id_studenta: longint;
       nr_sprawdz: byte;
       ocena:real;
       nastepny:WOcena;

     end;
var poczatek,koniec: WOcena; x:TOcena;

procedure  Wstaw(var P:WOcena);
var Q:WOcena; x:real;
              y:byte;
              begin
                New(Q);
                Q^.ocena:=x;
                Q^.nr_sprawdz:=y;
                Q^.nastepny:=P;

           end;

procedure Dane(var x:TOcena);
begin
  with x do
  begin
    write('Podaj numer sprawdzianu')readln(nr_sprawdz);
    write('Podaj ocene')readln(ocena);

  end;
end;
procedure  liczba_studentow(var poczatek:WOceny);
var dostateczny,dobry:integer;
    begin
      liczba:=0;
      if poczatek = NIL then
      begin
        write('sory ,ale nie ma nic tutaj nie ma');
        exit;
        end;
      while poczatek <> NIL do
        begin
          if poczatek^.nr_sprawdz = 3 then if koniec^.nr_sprawdz = 4;
          begin
          if poczatek^.ocena>dostateczny;
          dostateczny:=poczatek^.wartosc;
          if koniec^.ocena>dobry;
          dobry:=koniec^.wartosc;

          end;
          poczatek:=poczatek^.nastepny;
        end;
Write('najwieksza ocenta to ',liczba:3:4);
    end;

procedure wyswietl(P:WOcena);
          begin
               while P<> NIL do
                 begin
                   while (P^.nr_sprawdz,'',P^.nastepny);
                   P:=P^.nastepny;
                   end;
               end;
procedure wprowadz_dane(var P:WOcena);
var i,n:integer; x:=TOcena;
              begin
                P:=NIL;
                write( 'ile wprawdzasz nr_sprawdz?.');
                readln(n);
                for i:=1 to n do
                begin
                  writeln(i,'ocena');
                  dane(x);
                  wstaw(P);
                  end;
                end;
end.
0

zdaję sobie sprawę ze to tragicznie wygląda ale niestety nie ogarniam tworzenia kolejki i dlatego pytam proszę o pomoc

1

Problemem jest to, że w procedurze liczba_studentow podajesz wskaźnik przez referencję i w jej ciele go modyfikujesz. Zmiany jakie wprowadzasz mają zasięg globalny, więc w dalszej części wszystko się posypie. Przekaż ten parametr przez wartość – bez słówka var.


@Adrian Zybała: owszem, tragicznie wygląda ten kod, ale nie dlatego że jest błędny, a dlatego, że w ogóle nie myślisz o jego formatowaniu. Wcięcia masz losowe, do tego polskie identyfikatory… I nie nazywasz rzeczy po imieniu – to nie jest dynamiczna kolejka, a lista jednokierunkowa. Znając konkretną nazwę tego kontenera, możesz teraz znaleźć w sieci informacje na temat jego budowy i implementacji.

Pierwszą rzeczą, którą w tym przypadku powinieneś napisać, jest deklaracja typu węzła listy. Trochę to dziwne, że Ocena posiada swoje imię, nazwisko czu numer studenta, a także to, że ocena jest liczbą rzeczywistą, ale nie wnikam – takie mogą być odgórne założenia. Sugeruję zacząć od poniższego kodu:

type
  PListNode = ^TListNode;
  TListNode = record
    Name: String;
    Surename: String;
    StudentID: Integer;
    TestID: Integer;
    Grade: Double;
    NextNode: PListNode;
  end;

Teraz należy napisać zestaw procedur umożliwiających m.in.:

  • dodanie elementu na koniec listy,
  • wstawienie elementu w dowolne miejsce listy (jeśli faktycznie potrzebne),
  • usunięcie elementu z listy lub jej wyczyszczenia,
  • wyświetlenie listy.
0

przecież to się nawet nie skompiluje. O ile to można uznać za błąd łatwy do poprawienia

write('Podaj numer sprawdzianu')readln(nr_sprawdz);
    write('Podaj ocene')readln(ocena);

if poczatek^.ocena>dostateczny;

if koniec^.ocena>dobry;

to tutaj

if poczatek^.nr_sprawdz = 3 then if koniec^.nr_sprawdz = 4;

while (P^.nr_sprawdz,'',P^.nastepny);

nie mam pojęcia co autor miał na myśli. Pomijając też taki drobny fakt, że tego się po prostu czytać nie da
To poniżej NIE JEST POPRAWIONE jest po prostu sformatowane

type
  WOcena = ^TOcena;

  TOcena = record
    nazwisko, imie: string;
    id_studenta: longint;
    nr_sprawdz: byte;
    ocena: real;
    nastepny: WOcena;
  end;

var
  poczatek, koniec: WOcena;
  x: TOcena;

procedure Wstaw(var P: WOcena);
var
  Q: WOcena;
  x: real;
  y: byte;
begin
  New(Q);
  Q^.ocena := x;
  Q^.nr_sprawdz := y;
  Q^.nastepny := P;

end;

procedure Dane(var x: TOcena);
begin
  with x do
  begin
    write('Podaj numer sprawdzianu');
    readln(nr_sprawdz);
    write('Podaj ocene');
    readln(ocena);

  end;
end;

procedure liczba_studentow(var poczatek: WOceny);
var
  dostateczny, dobry: integer;
begin
  liczba := 0;
  if poczatek = NIL then
  begin
    write('sory ,ale nie ma nic tutaj nie ma');
    exit;
  end;
  while poczatek <> NIL do
  begin
    if poczatek^.nr_sprawdz = 3 then
    begin
      if poczatek^.ocena > dostateczny then
        dostateczny := poczatek^.wartosc;
      if koniec^.ocena > dobry then
        dobry := koniec^.wartosc;

    end;
    poczatek := poczatek^.nastepny;
  end;
  Write('najwieksza ocenta to ', liczba: 3: 4);
end;

procedure wyswietl(P: WOcena);
begin
  while P <> NIL do
  begin
    while (P^.nr_sprawdz <> P^.nastepny) do
      P := P^.nastepny;
  end;
end;

procedure wprowadz_dane(var P: WOcena);
var
  i, n: integer;
  x: TOcena;
begin
  P := NIL;
  write('ile wprawdzasz nr_sprawdz?.');
  readln(n);
  for i := 1 to n do
  begin
    writeln(i, 'ocena');
    dane(x);
    wstaw(P);
  end;
end;
0

podsyłam treść zadania jakie dostałem do zrobienia żeby było do czego się odnieść

1

tu nie ma co przesyłać treści zadania tylko trzeba wziąć dupę w troki, przysiąść i zacząć poprawiać to co w pierwszym poście dałeś.

0

@Adrian Zybała: zadanie jest bardzo proste:

wyznaczenie liczby studentów, którzy uzyskali oceny w przedziale [3, 4] na sprawdzianie nr 2.

Wszystkie dane są zawarte w treści – sprawdzian drugi, ocena w przedziale pomiędzy 3 a 4. Warunek musi sprawdzać, czy pole nr_sprawdz zawiera wartość 2, a także czy pole ocena zawiera wartość z przedziału – kodu wiele nie potrzeba. Według (anty)standardów kodu z zadania, funkcja powinna wyglądać tak:

uses
  Math;

function liczba_studentow(AOcena: WOcena): Integer;
begin
  Result := 0;
  
  while AOcena <> nil do
  begin
    if (AOcena^.nr_sprawdz = 2) and Math.InRange(AOcena^.ocena, 3, 4) then
      Result += 1;
  
    AOcena := AOcena^.nastepny;
  end;
end;

Jeśli chcesz, możesz w dodatkowych parametrach przekazać numer sprawdzianu oraz wymagane oceny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1