Plik z Rekordami jakis błąd:)

0

witam:)

mam taki oto kodzik

uses crt;
type
student=record
  imie,nazwisko:string[30];
  nrinde:integer;
  stypendium:real;
  oceny:array[1..5] of byte;

end;
tab=array[1..10] of student;
var
stu: file of student;
osoba:student;
a:tab;
n:word;
procedure wprowadz(var n:word;  osoba:student);
var
i,j:byte;
begin
  for i:=1 to n do
    begin
         writeln('student nr' ,i); writeln;
         with osoba do
         begin
           for j:=1 to 5 do
               begin
                  writeln('ocena ',j); readln(osoba.oceny[j]);
               end;
         end;
    end;
end;
procedure wyswietl(var n:word; osoba:student);
var
i,j:byte;
begin
  for i:=1 to n do
  begin
    writeln('student ',i, ' ');
    with osoba do
       begin
           for j:=1 to 5 do
           begin
                writeln('ocena ',j,'=',osoba.oceny[j]);
           end;
       end;
  end;
end;
begin
     clrscr;
     writeln('ile student˘w'); readln(n);
     wprowadz(n,osoba);
     clrscr;
     wyswietl(n,osoba);
     assign(stu,'D:\student');
     reset(stu);
     write(stu,osoba);
     readln;
     close(stu);
end.

mam problem obawiam się ze nie zapisuje sie to porawnie do pliku oraz nie chce wypisac mi prawidłowo ocen na ekran

0

Po to deklarujesz tablicę aby to do niej zapisywać. Po krótce tak to powinno wyglądać jak poniżej, no
i to działa poprawnie z tego co sprawdziłem. Wyświetla oceny ok oraz zapisuje do pliku. A wczytanie
danych z pliku oraz obsługę błędów przy wprowadzaniu danych już sobie mam nadzieję sam zrobisz.
Kod kompilowany pod DevPascalem został wcześniej poludzku sformatowany i poprawiono wielkości
liter w nazwach zmiennych. Zapis jest jak widać do pliku D:\studenci.dat, ale to można łatwo zmienić.

program studenci;

uses Crt;

type
Student = record
  Imie, Nazwisko : string[30];
  NrIndeksu : integer;
  Stypendium : Real;
  Oceny : array[1..5] of Byte;
end;

var
  stu : File of Student;
  Tab : array[1..10] of student;
  Osoba : Student;
  N : Word;

procedure Wprowadz(var N: word);
var
  I, J : Byte;
begin
  for I := 1 to N do
    begin
    Writeln;
    Writeln('Student nr ' , I);
      with Tab[I] do
        begin
          for J := Low(Tab[I].Oceny) to High(Tab[I].Oceny) do
            begin
            Write('Ocena ', J, ' ');
            Readln(Oceny[J]);
            end;
        end;
    end;
end;

procedure Wyswietl(var N : Word);
var
  I, J : Byte;
begin
  for i := 1 to N do
    begin
    Writeln;
    writeln('Student nr ', I);
      with Tab[I] do
        begin
            for J := Low(Tab[I].Oceny) to High(Tab[I].Oceny) do
            begin
            Writeln('Ocena ', J, ' = ', Oceny[J]);
            end;
        end;
    end;
end;

var
  I : integer;
begin
  ClrScr;
  Write('Ile studentow: ');
  Readln(N);
  ClrScr;
  Wprowadz(N);
  ClrScr;
  Wyswietl(N);
  Assign(Stu, 'D:\studenci.dat');
  Rewrite(stu);
  for I := Low(Tab) to N do
     begin
     Osoba := Tab[I];
     Write(Stu, Osoba);
     end;
  Close(Stu);
  Readln;
end.
0

Wielkie dzięki za pomoc kurcze troche gapiostwo mnie załatwiło:) ale wielkie dzięki swoją drogą ciekawy kompilator:) jeszcze raz wielkie dzięki

0

a jeszcze mam takie ptanie ta procedurka

procedure srednia (var N:word);
var
  i,j:byte;
  sr:real;
  suma:byte;
begin
  suma:=0;
  sr:=1;
  for i:=1 to n do
   begin
     writeln('student nr ',i);
     with Tab[i] do
      begin
       while not eof(stu) do
       read(stu,osoba);
        begin
         for j:= Low(tab[i].Oceny) to High(Tab[i].Oceny)  do
           begin
          [b]   suma:=suma+Tab[i].oceny;[/b]
           end;
        sr:=suma/5;
        writeln('srednia ucznia ',sr);
      end;
  end;
end;

w zaznaczonym daje error konflikt Typow co nie tak robie?

0

No pomyśl chwilę. Do zmiennej typu liczbowego próbujesz dodać całą zawartość tablicy. Nie da się
w ten sposób. Po to robisz pętle z J aby dodać wszystkie elemety tablicy, które są typu Byte czyli
tak powinno być: Suma := Suma + Tab[I].Oceny[J]; a poza tym polecam zamiast na sztywno przez
pięć dzielić przez najwyższy element tablicy z ocenami. Czyli najniższy element niech będzie tak jak
jest czyli ma numer jeden, a ilośc przedmiotów do oceny możesz później zmienić i będzie ich więcej
niż pięć, zrób tak: Sr := Suma div High(Tab[I].Oceny); Poza tym jakbyś używał chociaż Dev-Pascal,
a nie starego TurboPascal to by Tobie podpowiedział, że do dzielenia przez liczbę całkowitą - używać
należy div, a nie slasha. No i polecam nazywać zmienne z dużych liter oraz nazwy funkcji czy też to
metod pisać z dużych liter (oprócz pogrubionych słów kluczowych jak begin czy end albo for, to, do).
Kod będzie wtedy bardziej czytelniejszy. Wprawdzie używając Dev-Pascala generujesz pliki o 3 razy
większe niż w Pascalu, ale możesz używać długich nazw plików, a exeki spakować później np. UPX.

0
procedure srednia (var N:word);
var
  i,j:byte;
  sr,sr1:integer;
  suma:byte;
begin
   suma:=0;
  for i:=1 to n do
   begin
     writeln('student nr ',i);
     with Tab[i] do
       begin
       while not eof(stu) do
       read(stu,osoba);
        begin
        sr:=0;
           for j:= Low(tab[i].Oceny) to High(Tab[i].Oceny)  do

           begin
             suma:=suma+oceny[j];

            end;
                   sr:=suma div 5;
                   sr1:=suma mod 5;
             writeln('uczen ',i,'ma srednia');
             writeln('srednia ucznia ',sr,',',sr1);
          end;
      end;
  end;
end;

Powiedz mi jeszcze tylko gdzie wyzerowac srednią:) kombinuje i nic mi to nie daje:) i jak takie ładne wychodzą Ci kody w tym dev-pascalu?

0

i jeszcze gdybym chciał dac srednia powyzej 4,5 to jak to umiescic w tej procedurze

0

Sorry, to ja Ciebie wprowadziłem w błąd. Otóż oby policzyć prawidłową średnią suma ocena jak i średnia,
muszą być typu zmenno przecinkowego. Ilość zer po przecinku można także ustawić tak jak poniżej - czyli
w tym przypadku na jedno miejsce po przecinku. A przykładów jak obliczyć średnią w Pascalu masz masę
w necie - wystarczyło w google wpisać: pascal średnia i dostałbyś działający przykład w pierwszym linku :)

procedure Srednia(N: Word);
var
  I, J : Byte;
  Suma, Sr : Real;
begin
  Suma := 0;
  for I := 1 to N do
   begin
     Sr := 0;
     Writeln('Student nr ', I);
     with Tab[I] do
     begin
       for  J := Low(Tab[I].Oceny) to High(Tab[I].Oceny) do
         begin
         Suma := Suma + Oceny[J];
         end;
     Sr := Suma / High(Tab[I].Oceny);
     {Sr:0:1 - powoduje wyświetlenie tylko jednego zera po separatorze liczby całkowitej}
     Writeln('Student ', I, ' ma srednia ', Sr:0:1);
     end;
   end;
end;

Poza tym z procedury Srednia usunąłem wczytywanie z pliku, bo Twoje nie jest zbyt poprawne. Poza tym
prosiłem abyś inaczej formatował kod, a Ty nadal piszesz zmienne z małych liter itd - no ale jak uważasz.
A wczytywanie z pliku zrobił bym tak jak poniżej. Tylko z procedur Srednia, Wprowadz oraz Wyswietl - to
usunął bym śłowko var i zostawi samo (N : Word), bo var o ile się nie mylę jest używane tylko i wyłącznie
jeżeli w procedurze masz zamiar modyfikować zawartość tej zmiennej, a Ty używasz jej tylko do pętli for.
Poza tym później dorób sobie nazwę pliku jako stałą albo zmienną ustalaną na początku i obsługę błędów
IO w odczytywaniu - jeżeli np. pliku nie ma na dysku albo jego otwarcie czy zapisanie nie będzie możliwe.

procedure WczytajPlik;
var
  I, IloscRekordow : Byte;
begin
  Assign(Stu, 'D:\studenci.dat');
  Reset(Stu);
  IloscRekordow := FileSize(Stu);
  if IloscRekordow = 0 then
     Exit;
  for I := 0 to IloscRekordow -1 do
    begin
    Seek(Stu, I);
    Read(Stu, Osoba);
    Tab[I+1] := Osoba;
    end;
  Close(Stu);
  Wyswietl(IloscRekordow);
end;

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