Pascal.Typ rekordowy,Srednia pensja.Potrzebna pomoc!

0

napisalam program z pracownikami i musze dodac do niego jeszcze procedure obliczajaca srednia pensje.

 program prac;
uses
crt;
 type
 pracownik=record
 nazwisko:string[15];
 wiek:byte;
 pensja:real;
end;
 plik=file of pracownik;


 procedure wprowadz(var pl:plik);

 var
 p:pracownik;
 i,n:byte;

 begin
 clrscr;
 rewrite(pl);
  write('podaj liczbe pracownikow :');
  readln(n);
     for i:=1 to n do
     begin
     writeln('pracownik nr:',i);
     write('nazwisko');readln(p.nazwisko);
     write('pensja');readln(p.pensja);
     write('wiek');readln(p.wiek);
     write(pl,p);
     end;
     close(pl);
     end;

procedure wyswietl(var pl:plik);
var
p:pracownik;
  begin
  clrscr;
  reset(pl);
  while not eof(pl) do
  begin
  read(pl,p);
  if p.wiek>40 then writeln(p.nazwisko);
  end;
  close(pl);
  end;

   var
   pl:plik;
   begin
   assign(pl,'baza.dat');
   wprowadz(pl);
   wyswietl(pl);
   readkey;
   end.


prosze o odpowiedz

0

Z czym masz problem ?
Dodajesz wszystkie pensje podczas wypisywania, dzielisz tę liczbę przez ilość ludzi i wypisujesz.

Czyli będzie mniej więcej, tak:

Procedure Wyswietl(Var pl: Plik);
Var P   : Pracownik;
    I, C: Integer;
Begin
  ClrScr;
  Reset(pl);
  While Not Eof(pl) Do
  Begin
   Read(pl, P);
   I := 0;  // Łączne pensje
   C := 0;  // Liczba ludzi
   if P.Wiek > 40 Then
   Begin
    WriteLn(P.Nazwisko);
    Inc(I, P.Pensja);
    Inc(C);
   End;
  End;
  I := I Div C;
  WriteLn('Średnia pensja: '+I)
  Close(pl);
End;

Sprawdź, czy nie ma błędów, ponieważ nie chce mi się specjalnie ściągać TP.

Swoją drogą, to dlaczego nie użyjesz tablic ?

0

dobry patent ale pojawia sie blad w miejscu

 Begin
    WriteLn(P.Nazwisko);
    Inc(I, P.Pensja);(oczekiwano zmiennej porzadkowej)
    Inc(C);
   End 

duzo mi pomogles dalo mi do myslenia ale nie umiem poprawic tego bledu.

0

wymyslilam cos takiego,ale nie liczy mi sredniej wszystkich pensji tylko kazdej z osobna. nie moge skorzystac z tablic bo mam narzucone ze ma byc typ rekordowy.

procedure srednia(var pl:plik);
var
p:pracownik;
i:byte;
s:real;
sr:real;

begin
clrscr;
reset(pl);

while not eof(pl) do
begin
read(pl,p);
s:=0; i:=0;
if p.wiek>40 then
begin
s:=s+p.pensja;
i:=i+1;
end;
end;
sr:=s/i;
writeln('srednia wynosi: ',sr:6:2);

close(pl);
end;
 
1

Heh. W moim kodzie też był błąd.

procedure srednia(var pl:plik);
var
p:pracownik;
i:byte;
s:real;
sr:real;

begin
clrscr;
reset(pl);
s:=0; i:=0; //tylko tutaj
while not eof(pl) do
begin
read(pl,p);
//tutaj nie należy zerować
if p.wiek>40 then
begin
s:=s+p.pensja;
i:=i+1;
end;
end;
sr:=s/i;
writeln('srednia wynosi: ',sr:6:2);

close(pl);
end;

Sprawdź teraz ;)

BTW: 'Inc(i)' jest równoznaczne z 'I := I + 1';
A 'Inc(I, 5') to to samo, co 'I := I + 5'; tak na marginesie.

0

Jestes super !!!DZiekuje:) dziala wszystko. Wiem co to inc ale wole + bo na cwiczeniach tak robimy. Mam jeszcze dodac zeby wyswietlał minimalna i maksymalna pensje ale sprobuje sama jak mi nie pojdzie to napisze.

0

jednak daleko nie zaszlam;/ po if nie wiem jaki dac warunek chodzi o to zeby wyswietlał najwieksza pensje

procedure maximum(var pl:plik);
var
p:pracownik;
begin
clrscr;
reset(pl);
while not eof(pl) do
begin
read(pl,p);
if ????????? then

 
1

Momencik...

procedure maximum(var pl:plik);
var
p:pracownik;
Mi,Ma: integer; //najmniejsza pensja ; największa
begin
clrscr;
reset(pl);
mi := 999999;//heh
ma := 0;
while not eof(pl) do
begin
read(pl,p);
if p.pensja > ma then
 ma := p.pensja;
if p.pensja < mi Then
 mi := p.pensja;
end;
end;

Jakoś tak.

1

Ustawiasz zmienną liczbową na przykład Max na 0. Lecisz pętlą po wszystkich
rekordach w pliku i sprawdzasz czy Pensja > Max. Jeżeli tak to ustawiasz Max
na te wartość. Dzięki temu po skończeniu pętli zmienna zawiera najwyższą ze
wszystkich pensji. Aby ustalić Minimalną ustawiasz zmienną Min := Max; a w
pętli sprawdzasz czy Pensja < Min jeślli tak to ustawiasz Min := Pensja; tyle.

EDIT: Patryk27 mnie ubiegł jak pisałem posta, ale powinnaś teraz pojąć ideę.

0

Dzieki wielkie ludzie naprawde!!bardzo mi pomogliscie, na dzisiaj daje wam spokoj:)

0

sorry chłopaki ale chyba znowu nie dam rady, moze jestem zaglupia czy cos w tym stylu ale nie umiem takiego zadania
Dany jest rekord dotyczacy danych studenta o nastepujacych polach: Nazwisko, wiek, rok studiów,
ocena. Napisac program, w którym:
a) wczytywane sa dane do rekordu i zapamietywane w tablicy jednowymiarowej;
b) wyswietlane sa poszczególne rekordy;
c) wyswietlane sa dane studentów, których srednia jest wieksza od 4,0 i wyznaczana jest
ich liczba
chodzi mi o ta srednia bo te 2 pkt pierwsze sa dobrze. jak moge liczyc srednia ich ocen jak wpisuje tylko jedna ich ocene.moze mnie wysmiejecie ale nie czaje

 program studentci;
uses
crt;
type
student=record
nazwisko:string[15];
wiek:byte;
rok_studiow:byte;
ocena:integer;
end;
plik=file of student;

procedure wprowadz(var pl:plik);
var
s:student;
i,n:byte;

begin
clrscr;
rewrite(pl);
write('Podaj liczbe studentow:');
readln(n);
for i:=1 to n do
begin
writeln('student nr:',i);
write('nazwisko');readln(s.nazwisko);
write('wiek');readln(s.wiek);
write('rok studiow');readln(s.rok_studiow);
write('ocena');readln(s.ocena);
write(pl,s);
end;
close(pl);
end;

procedure wyswietl(var pl:plik);
var
s:student;
begin
clrscr;
reset(pl);
while not eof(pl) do
begin
read(pl,s);
writeln(s.nazwisko);writeln(s.ocena);writeln(s.wiek);
end;
close(pl);
end;

procedure srednia(var pl:plik);
var
s:student;
i:byte;
su:real;
sr:real;
begin
clrscr;
reset(pl);
su:=0;i:=0;
while not eof(pl) do
begin
read(pl,s);
begin
su:=su+s.ocena;
i:=i+1;
end;
end;
sr:=su/i;
begin
if s.ocena>sr then
begin
writeln(s.nazwisko);
end;
end;
close(pl);

end;
var
pl:plik;
begin
assign(pl,'stu.dat');
wprowadz(pl);
wyswietl(pl);
srednia(pl);
readkey;
end.

ps. to juz moj ostatni problem na dzisiaj

0

Z treści wynika, że ocena ma być jedna, to może chodzi później o policzenie
średniej dla wszystkich studentów, ale to trochę bez sensu. Może masz jakąś
możliwośc upewnić się czy układającemu zadanie nie chodziło przypadkiem o
to aby 1 student, posiadał do wprowadzenia kilka ocen, z kilku przedmiotów.

0

niestety nie mam takiej mozliwosci, moze trzeba policzyc srednia ocen wszystkich studentow a pozniej wyswietlic studentow ktorzy maja ocene wieksza od 4.0 taki jest moj pomysl.Myslalam ze ja cos zle czytam.dzieki za odpowiedz

0

@Gaby:
Wg.mnie ciągle bez sensu :/

Chyba, że "ocena:integer;", to jest już średnia.
Wtedy nie trzeba by liczyć jej...Nie no, zaraz
zwariuję od tego zadania ;) Ale to musi być tak,
że właśnie 'ocena: integer' to jest już ta średnia.
Moim tokiem myślenia byłoby:

procedure srednia(var pl:plik);
var
s:student;
ilosc: integer;
begin
clrscr;
reset(pl);
ilosc := 0;
while not eof(pl) do
begin
 read(pl,s);
 if s.ocena>4 then
 begin
  writeln(s.nazwisko);
  inc(ilosc); 
 end;
end;
close(pl);
WriteLn('Ilość studentów ze średnią większą od 4.0   -->   '+Ilosc);
end;

Ale i tak to nie ma sensu.

Heh.trzeba by to przerzucić to nietuzinkowych tematów :)

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