Program w pascalu (uzycie rekordow, procedur i plikow).

0

Zacząłem pisać program na informatykę ale nie czuje się pewnie w tym temacie dlatego mam parę pytań. Program kompilowany był w free pascalu.
Przepraszam ze bez wciec ale na razie łatwo się w tym połapać.
1.Podczas kompilacji wywala syntax error że potrzebne jest begin zamiast end na końcu. Nie mam pojęcia co z tym zrobić.

  1. Mam problem z napisaniem procedury wyświetlającej osoby z najwyższymi wynikami
    
program politechnika;
uses crt;

Const
 haslo='poli';

Type uczen=record

lp:integer;
imie:string[20];
nazw:string[20];
mat:byte;
fiz:byte;
end;

var
tab: array[1..5] of uczen;
plik: file of uczen;
wprowadz:string;
petla:integer;
znak:string;



procedure wpis;                           {procedura wpisująca dane uczniów}
var
z,x:byte;
begin

begin
clrscr;
write('Prosze podac ilosc uczniow aplikujacych sie na uczelnie: ');
readln(x);
assign(plik, 'aplikanci.txt');
rewrite(plik);
for z:=1 to x do

begin
clrscr;
write('Lp; ');
readln(tab[z].lp);
write('Imie; ');
readln(tab[z].imie);
write('Nazwisko; ');
readln(tab[z].nazw);
write('Ilosc punktow z matematyki; ');
readln(tab[z].mat);
write('Ilosc punktow z fizyki; ');
readln(tab[z].fiz);
write(plik,tab[z]);
clrscr;
end;
close(plik);
end;
end;

procedure wypi;                        {procedura wypisująca wprowadzone dane}
var z:byte;

begin
assign(plik,'aplikanci.txt');
reset(plik);
while not eof(plik) do
begin
read(plik,tab[z]);
with tab[z] do
begin
writeln;
write('Lp: ');
writeln(tab[z].lp);
write('Imie: ');
writeln(tab[z].imie);
write('Nazwisko: ');
writeln(tab[z].nazw);
write('Ilosc punktow z matematyki: ');
writeln(tab[z].mat);
write('Ilosc punktow z fizyki: ');
writeln(tab[z].fiz);
end;
end;
end;

procedure menu;                                     {menu}
var
w :byte;
begin
writeln('||||||||||||||||POLITECHNIKA WARSZAWSKA||||||||||||||||');
writeln('1. Wpisz osoby aplikujace na uczelnie.');
writeln('2. Wypisz osoby wpisane.');
writeln('3. Najwyzszy wynik z matematyki');
writeln('4. Najwyzszy wynik z fizyki');
writeln('5. Najwyzsza srednia');
writeln('6. Zamknac program.');
writeln('||||||||||||||||||||||||||||||||||||||||||||||||||||||||');
readln(w);

begin
if w=1 then begin wpis;
menu;
end else
if w=2 then begin wypi;
menu;
end else



end;
end;

begin                                                    {hasło do programu, tak żeby był fajniejszy :D}
petla:=1;
repeat
wprowadz:='';
if petla=10 then
begin
ClrScr;
GotoXY(31,12);
TextColor(Red+Blink);
Write('Brak dostępu!');
Delay(1500);
Exit;
end;
ClrScr;
GotoXY(31,12);
TextColor(White);
Write('Podaj haslo: ');
repeat
znak:=readkey;
if znak<>#13 then
begin
write('*');
wprowadz:=wprowadz+znak;
end;
until znak=#13;
petla:=petla+1;
until wprowadz=haslo;
clrscr;
delay(3000);
gotoxy(10,12);
textcolor(green);
writeln('Dostęp przyznany' );
delay(3000);
textcolor(white);
gotoxy(16,18);
write('Witam w programie');
delay(3000);
clrscr;
begin
menu;                                                       {wywołanie menu po wpisaniu hasła, niestety program żąda wpisania na końcu begin zamiast end i nie mam pojęcia co z tym zrobić}
end;
end;
end.
0

Przepraszam ze bez wciec ale na razie łatwo się w tym połapać.

Nie no serio łatwo? To po co entery w ogóle dajesz?!
Albo stosujesz się do ogólnie przyjętych zasad albo licz się z tym że inni (w domyśle: ci którzy uważają że ich czas jest coś warty) przejdą obok twojego tematu obojętnie.

0
Krysix napisał(a):

Przepraszam ze bez wciec ale na razie łatwo się w tym połapać.

Krysix napisał(a):

Podczas kompilacji wywala syntax error że potrzebne jest begin zamiast end na końcu.
To właśnie brak wcięć się kłania. Jak zrobisz te wcięcia natychmiast zobaczysz czemu się nie kompiluje. Potem wklej kod jeszcze raz i pytaj o kolejne problemy.

0

Czy tak jak poniżej nie wygląda lepiej? Poprawiłem błąd i usunąłęm zbędne enetery likwidując niepotrzebne puste linijki oraz poprawiłem błąd. A co do liczenia średniej to póki masz dwa przedmioty to i tak łatwo to przetestować, w czym masz problem? Nie wiesz jak się liczy średnią? Sumujesz oceny ze wszystkich przedmiotów, które też najlepiej trzymać w tablicy, co ułatwi zrobienie tego w pętli. Także zerujesz jakąs zmienną pomocniczą. W pętli sumujesz tablicę z ocenami, następnie dzielisz zmienną z sumą przez Length(TablicaOceny) i masz średnią. Zmienna do przechowywania średniej powinna być zmienną na przykład typu Real czyli zmienno przecinkową. Za pomocą instrukcji ZmiennaZeSrednia : 0 : 2 sformatujesz zmienną do dwóch miejsc po separatorze dziesiętnym. Także jak dla mnie początek kodu powinien wyglądać na przykład tak:

//...
const
  haslo = 'poli';
  IloscPrzedmiotow = 2;
  NazwyPrzedmiotow : array[1..IloscPrzedmiotow] of string =
    (
    'matematyka',
    'fizyka'
    );

type
  TUczen = record
    Lp : integer;
    Srednia : Real;
    Imie : string[20];
    Nazw : string[20];
    Oceny : array[1..IloscPrzedmiotow] of Byte;
  end;
//...

Oczywiście trzeba później poprawić wczytywanie zmiennych. I zalecam zrezygnowanie z tak długich delayów, jak chcesz robić bajerancki program to zrób go w WinAPI z użyciem Windowsowych kontrolek, a nie jakieś opóźnianie odpalania, chyba że dziwny prowadzący zajećia tego wymagał w poleceniu, ale wątpie. Poza tym polecam pisać nazwy zmiennych, stałych, procedur, funkcji i typów z wielkich liter, ładniej to według mnie wtedy wygląda i jeszcze bardziej zwiększa czytelnośc. A poniżej przeformatowany i poprawiony kod. Możłiwości formatowania kodu jest wiele. Ja osobiście używam formatera dodanego do zmodyfikowanej - alternatywnej wersji GExperts dla Delphi 7 Personal. Wygoogluj go sobie wraz z tą wersją Delphi. Są darmowe. Instalujesz GExperts po zainstalowaniu Delphi, w wersji normalnej czyli nie alternatywnej, a później przy wyłączonym Delphi nadpisujesz dllkę GExpertsa. Ale są też programy do tego celu, chyba jakieś komponenty JEDI i tym podobne. Tylko że Formatter w tym GExperts ma tę przewagę nad programami zewnętrznymi jakich używałem, że przefoamtuje nawet kod napisany jako jedna linia i ładnie go rozdzieli, poza tym ma dużo opcji i możłiwość dodania HotKeya w Delphi. Poza tym GExperts ma przydatną funkcję pod Ctrl+G skakanie do procedur i funkcji, co bardzo ułatwia nawigacje w ubogim standardowo IDE Delphi 7. Podsumowując formatuj sam albo z gotowymi rozwiązaniami, cokolwiek byle nie taki kod jak wkleiłeś. Następnym razem jak wypatrze taki kod w Twoim wykonaniu i bezczelny dopisek że nie formatowałem, bo "idzie się połapać", to wątek wyląduje w Koszu.

program politechnika;

uses
  crt;

const
  haslo = 'poli';

type
  uczen = record
    lp : integer;
    imie : string[20];
    nazw : string[20];
    mat : byte;
    fiz : byte;
  end;

var
  tab : array[1..5] of uczen;
  plik : file of uczen;
  wprowadz : string;
  petla : integer;
  znak : string;

procedure wpis; {procedura wpisująca dane uczniów}
var
  z, x : byte;
begin
  clrscr;
  write('Prosze podac ilosc uczniow aplikujacych sie na uczelnie: ');
  readln(x);
  assign(plik, 'aplikanci.txt');
  rewrite(plik);
  for z := 1 to x do
  begin
    clrscr;
    write('Lp; ');
    readln(tab[z].lp);
    write('Imie; ');
    readln(tab[z].imie);
    write('Nazwisko; ');
    readln(tab[z].nazw);
    write('Ilosc punktow z matematyki; ');
    readln(tab[z].mat);
    write('Ilosc punktow z fizyki; ');
    readln(tab[z].fiz);
    write(plik, tab[z]);
    clrscr;
  end;
  close(plik);
end;

procedure wypi; {procedura wypisująca wprowadzone dane}
var
  z : byte;
begin
  assign(plik, 'aplikanci.txt');
  reset(plik);
  while not eof(plik) do
  begin
    read(plik, tab[z]);
    with tab[z] do
    begin
      writeln;
      write('Lp: ');
      writeln(tab[z].lp);
      write('Imie: ');
      writeln(tab[z].imie);
      write('Nazwisko: ');
      writeln(tab[z].nazw);
      write('Ilosc punktow z matematyki: ');
      writeln(tab[z].mat);
      write('Ilosc punktow z fizyki: ');
      writeln(tab[z].fiz);
    end;
  end;
end;

procedure menu; {menu}
var
  w : byte;
begin
  writeln('||||||||||||||||POLITECHNIKA WARSZAWSKA||||||||||||||||');
  writeln('1. Wpisz osoby aplikujace na uczelnie.');
  writeln('2. Wypisz osoby wpisane.');
  writeln('3. Najwyzszy wynik z matematyki');
  writeln('4. Najwyzszy wynik z fizyki');
  writeln('5. Najwyzsza srednia');
  writeln('6. Zamknac program.');
  writeln('||||||||||||||||||||||||||||||||||||||||||||||||||||||||');
  readln(w);
  begin
    if w = 1 then
    begin
      wpis;
      menu;
    end
    else
      if w = 2 then
      begin
        wypi;
        menu;
      end
      else

  end;
end;

begin {hasło do programu, tak żeby był fajniejszy :D}
  petla := 1;
  repeat
    wprowadz := '';
    if petla = 10 then
    begin
      ClrScr;
      GotoXY(31, 12);
      TextColor(Red + Blink);
      Write('Brak dostępu!');
      Delay(1500);
      Exit;
    end;
    ClrScr;
    GotoXY(31, 12);
    TextColor(White);
    Write('Podaj haslo: ');
    repeat
      znak := readkey;
      if znak <> #13 then
      begin
        write('*');
        wprowadz := wprowadz + znak;
      end;
    until znak = #13;
    petla := petla + 1;
  until wprowadz = haslo;
  clrscr;
  delay(3000);
  gotoxy(10, 12);
  textcolor(green);
  writeln('Dostęp przyznany');
  delay(3000);
  textcolor(white);
  gotoxy(16, 18);
  write('Witam w programie');
  delay(3000);
  clrscr;
  begin
    menu; {wywołanie menu po wpisaniu hasła, niestety program żąda wpisania na końcu begin zamiast end i nie mam pojęcia co z tym zrobić}
  end;
end.
0

Co do wcięć, przepraszam to się już więcej nie powtórzy.
Troche przemodelowałem program i zamiast pokazywac średnia bedzie od razu mówił kto się dostał.
Patrząc na rozpoczęcie programu które napisałeś wykminiłem coś takiego:

 
program politechnika;
 
uses
  crt;
 
const
  haslo = 'poli';
  IloscPrzedmiotow = 2;
  NazwyPrzedmiotow : array[1..IloscPrzedmiotow] of string = ( 'matematyka', 'fizyka' );
  srednia = 70;
  max= 4;
type
  TUczen = record
    Lp : integer;
    Imie : string[20];
    Nazw : string[20];
    Srednia : Real;
    Oceny : array[1..IloscPrzedmiotow] of Byte;
  end;

 
var
  plik : file of TUczen;
  wprowadz : string;
  petla : integer;
  znak : string;
  sum : real;
  i : byte;
 
procedure sred;
var
y:byte;
sum;=0;
for i:=1 to max do                                                       {i kolejne pytanie jak teraz wstawić tam ilość uczniów jaką wpisywaliśmy? na razie wpisałem ją jako stałą}
  sum:=sum+TUczen[y].mat+TUczen[y].fiz                      {nie wiem jak ustawić to na tej twojej stałej, tak by było na mojej}
  if sum/IloscPrzedmiotow>srednia then
    begin
      writeln('Uczen ',y,' dostal się na uczelnie');sum:=0;end else
        begin writeln('Uczen ',y,' nie dostal się na uczelnie');sum:=0;
        end;
     end;
writeln;
readkey;
end.

Wybaczcie mój wąski tor rozumowania ale nigdy nie robiłem zadań na rekordach w tablicy i dlatego sprawia mi to taki problem a ciężko znaleźć jakieś przykłady czegoś podobnego. Zastanawiam się co powinienem wpisać żeby dla danego ucznia wyświetlało daną wartość. Nie wiem czy ma to być czytane z pliku w którym wcześniej zapisywałem czy może z rekordów które na początku wpisujemy. Głównie problem polega na tym, że nie wiem jak połączyć wpisywane na początku dane z procedurą w późniejszej części programu taką jak ta na obliczanie średniej, tak żeby dla jednego ucznia liczylo średnią z jego wynikami itd. dla każdego ucznia.

0

Dalej coś kombininujesz z .fiz i .mat. A przecież nie masz już takich zmiennych, bo doradziłem Tobie zastosować tablicę. Nadal jednak nie wiem w czym problem w pętli zrobić po prostu coś w stylu:

  Sum := Sum + Tab[ZmiennaZawierajacaIndeksTabliczyZUczniami].Oceny[ZmiennaZawierajacaIndeksTablicyZOcenami];

I znowu źle formatujesz kod. Poza tym z tego co widzę "zjadłeś" begin po deklaracji zmiennych lokalnych.

0

Dla Ciebie może to nie problem ale ja nigdy nie pracowałem na takiej tablicy, proszę o trochę wyrozumiałości, pascala uczę się od 2 tygodni.

 NazwyPrzedmiotow : array[1..IloscPrzedmiotow] of string =
    (
    'matematyka',
    'fizyka'
    );
Mój problem jest taki że nie wiem jak to ^ połączyć z tym (te wartosci wpisywane w 'matematyka' i 'fizyka'). Te tab[] to wziąłeś tak dla przykładu?
Sum := Sum + Tab[ZmiennaZawierajacaIndeksTabliczyZUczniami].Oceny[ZmiennaZawierajacaIndeksTablicyZOcenami];

A formatować to formatuje w fpc ręcznie, nie jest u mnie wymagana super estetyka, oby działał.

0

A formatować to formatuje w fpc ręcznie, nie jest u mnie wymagana super estetyka, oby działał.

Co do wcięć, przepraszam to się już więcej nie powtórzy.

No przecież, mówisz tak żeby nam pasowało ale robisz po swojemu! Super

Dla Ciebie może to nie problem ale ja nigdy nie pracowałem na takiej tablicy, proszę o trochę wyrozumiałości, pascala uczę się od 2 tygodni.

A wiesz po co jest dział newbie?

Mój problem jest taki że nie wiem jak to ^ połączyć z tym (te wartosci wpisywane w 'matematyka' i 'fizyka'). Te tab[] to wziąłeś tak dla przykładu?

Albo nie przeczytałeś tutoriala o tablicach tak jak powinieneś był albo nie umiesz algorytmicznie myśleć. Może zacznij od podstaw co? Bo póki co walisz fajne konstrukcje w stylu TUczen[y].mat+TUczen[y].fiz. Zgaduję że resztę programu masz zrobioną niesamodzielnie.

BTW. Widzę że @olesio znowu gotowce daje, tylko że mój drogi olesiu, dając mu sformatowany kod nie powiedziałeś mu automatycznie jak się formatuje kod i że powinien to robić (możesz mu to mówić ale jak się sam przekona to zrozumie). O ile twoje posty są bardzo pożyteczne dla pytacza nie uczą niczego w kwestii rozwiązywania problemów która moim zdaniem jest najważniejsza.A większości osób potrzebne jest właśnie to, a nie rozwiązanie (bo ich poziom wiedzy jest bardzo niski). Moim zdaniem powinieneś pozwalać osobom rozwiązywać swoje problemy samemu (i tylko asystować) zamiast pokazywać im jak to powinno być i tym samym nie ucząc ich niczego.

0

@-123oho: napisałem mu najkrócej jak potrafiłem przykład jak może wygodnie formatować prawidłowo kod przy użyciu chocby Delphi 7 i alteratywnego GExperts. Ale pytający nadal się upiera, że nie formatuje. A przecież nie chodzi tylko o estetykę, tylko o czytelnośc, Fakt, byłem sam kiedyś tak głupi, że celowo wywalełem wszelkie formatowanie z kodu kiedy jeszcze pisałem pierwsze programu pod Delphi 3, a radzącego mi formatowac wykładowcy Programowania Obiektowego na studium, na które uczęszczałem w ogóle w tej kwestii nie słuchałem. Teraz jak widze niesformatowany kod to mnie odrzuca wręcz. Nie uważam się za guru i eksperta, ale polecam Tobie Krysix nas posłuchać i jednak nauczyć się formatować kod. Po to aby nie powielac błedów ludzi którzy tego nie robią/nie robili. A co do innych pytań, to ja pokazałem jak ma wyglądać liczenie średniej. Jeśli @Krysix nie wiesz jak operować na tablicach to poczytaj artykuł do znalezienia w google. Ja Twojemu pozostałemu kodowi się dokłądnie nie przyglądałem, ale skoro stosujesz tablicę i operujesz na jej elementach, jak zauważył to @-123oho, a nie umiesz użyć tablicy dla obliczenia średniej czy nazw przedmiotów to najprawdopodobniej ten kod w całości nie jest Twój. A nie chcąc się nauczyć oszczędź swój i nasz czas, złoż ofertę z rozsądną stawką za napisanie gotowca za Ciebie w dziale Ofery Pracy, a z pewnością ktoś Ciebie wyręczy, bo mam wrażenie, że oczekujesz chyba jednak gotowca, a nie porad.

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