Problem z czyszczeniem tablicy

0

Witam, otóż muszę zrobić program, który by obliczał średnią ważoną. Znalazłem na innym forum kod źródłowy użytkownika o nicku - Lou93 - który sobie przystosowałem do swojej potrzeby. I mam 1 problem, otóż za każdym razem program trzeba uruchamiać od nowa by wyczyścić tablice która jest tworzona, mimo kodu który ma rzekomo ją czyścić, czy ktoś mógłby mi wskazać drogę żeby faktycznie program sam sobie czyścił tą tablicę po wykonaniu i wypisaniu wyniku, zamiast uruchamiać go od nowa za każdym razem?

program srednia;
uses crt;
var
i, j:integer;
oceny:array[1..32] of real;
waga:array[1..32] of integer;
suma_ocen:real;
suma_wag:integer;
klawisz:char;
zakoncz:string;
LABEL
zle;
begin
zle:
clrscr;
writeln(' ____________________________');
writeln('/                            \');
writeln('| LICZENIE  SREDNIEJ WAZONEJ |');
writeln('\____________________________/');
writeln;
writeln;
writeln('INSTRUKCJA');
writeln('________________________________________________________________________________');
writeln;
writeln('kalkualtor zapyta o ocene ktora nalezy wprowadzic w postaci liczby');
writeln('calkowitej [np 5 dla piatki][UWAGA! dla ocen z + i - ocene nalezy');
writeln('wpisac w postaci liczby rzeczywistej, np dla 3+ 3.75 (koniecznie');
writeln('kropka . a nie przecinek ,), a nastepnie kalkulator zapyta o jej');
writeln('wage [nalezy ja wpisac w postaci calkowitej, np dla wagi 0,10 nalezy');
writeln('wpisac 10.');
writeln;
writeln;
writeln('kliknij aby przejsc dalej');
klawisz:=readkey;
clrscr;

repeat
write('Podaj z ilu ocen chcesz wyliczyc srednia wazona (max 32) : ');
readln(i);
if i>32 then
   begin
   writeln('Za duza liczba');
   goto zle;
   end
else
    for j:=1 to i do
        begin
        clrscr;
        writeln('._______________.');
        writeln('|ocena | sposob |');
        writeln('|      | zapisu |');
        writeln('|---------------|');
        writeln('|  1+  |  1.50  |');
        writeln('|  2-  |  1.50  |');
        writeln('|  2+  |  2.50  |');
        writeln('|  3-  |  2.75  |');
        writeln('|  3+  |  3.50  |');
        writeln('|  4-  |  3.75  |');
        writeln('|  4+  |  4.50  |');
        writeln('|  5-  |  4.75  |');
        writeln('|  5+  |  5.50  |');
        writeln('|  6-  |  5.75  |');
        writeln('|_______________|');
        writeln('powyzej znajduje sie tabela z przykladowa postacia ocen, nie ma');
        writeln('obowiazku podazania za wartosciami ocen z + i -, chodz liczby');
        writeln('nadal musza byc zapisywane w postaci rzeczywistej');
        writeln;
        writeln('Podaj ', j,'. ocene');
        readln(oceny[j]);
        writeln('Podaj wage tej oceny');
        readln(waga[j]);
        end;
writeln;
writeln;

write('Srednia : ');
for j:=1 to i do
    begin
    suma_ocen:=suma_ocen+(oceny[j]*waga[j]);
    suma_wag:=suma_wag+waga[j];
    end;
writeln(suma_ocen/suma_wag:8:2);
writeln;
writeln('kliknij aby kontynuowac');
readkey;

{---------petla do 'czyszczenia' tablicy--------------}

for j:=1 to 32 do
begin
oceny[j]:=0;
waga[j]:=0;
end;

{---------petla do 'czyszczenia' tablicy--------------}

clrscr;

writeln('chcesz obliczyc srednia kolejnego ucznia czy zakonczyc program?');
writeln('["kont" lub "uczen" by kontynuowac ; "exit" by wyjsc');
readln(zakoncz);
until zakoncz='exit'

end.
0

Daj sobie ten kod czyszczący na początku, a calośc wykonuj w pętli repeat until nie wpisze się "exit" czy co tam sobie zakładasz. A i wiesz pewnie, że stosowanie goto jest przestarzałe oraz niezalecane. Zamiast takich tworów porób sensowne if'y i pokazuj błędy albo w pętlach repeat until. Na pewno da się każdy sensowny kod napisac bez goto, to nie Basic z ZX Spectruma. Tyle moge doradzić, bo kod przydługi oraz w ogóle niesformatowany, dlatego tylko spojrzałem pobieżnie. Jak widzę konstrukcję goto to taki kod jest dla mnie dyskwalifikujący. I jeżeli jest on na jakieś zaliczenie to nie zdziwił bym się wykładowcy jakby go w ogóle nie chciał przyjąć.

0

powiedzmy że ten program jest w ramach pewnego 'zakładu' z nauczycielem, który źródła sprawdzać nie będzie, a funkcjonalność:)
wydaje mi się że poprawiłem to co mi powiedziałeś, ale niestety tablica nadal nie jest czyszczona :/

program srednia;
uses crt;
var
i, j:integer;
oceny:array[1..32] of real;
waga:array[1..32] of integer;
suma_ocen:real;
suma_wag:integer;
klawisz:char;
zakoncz:string;

begin

clrscr;
writeln(' ____________________________');
writeln('/                            \');
writeln('| LICZENIE  SREDNIEJ WAZONEJ |');
writeln('\____________________________/');
writeln;
writeln;
writeln('INSTRUKCJA');
writeln('________________________________________________________________________________');
writeln;
writeln('kalkualtor zapyta o ocene ktora nalezy wprowadzic w postaci liczby');
writeln('calkowitej [np 5 dla piatki][UWAGA! dla ocen z + i - ocene nalezy');
writeln('wpisac w postaci liczby rzeczywistej, np dla 3+ 3.75 (koniecznie');
writeln('kropka . a nie przecinek ,), a nastepnie kalkulator zapyta o jej');
writeln('wage [nalezy ja wpisac w postaci calkowitej, np dla wagi 0,10 nalezy');
writeln('wpisac 10.');
writeln;
writeln;
writeln('kliknij aby przejsc dalej');
klawisz:=readkey;
clrscr;


repeat

for j:=1 to 32 do
begin
oceny[j]:=0;
waga[j]:=0;
end;

repeat
clrscr;
write('Podaj z ilu ocen chcesz wyliczyc srednia wazona (max 32) : ');
readln(i);
if i>32 then writeln('Za duza liczba');
until i<33;

        clrscr;
        writeln('._______________.');
        writeln('|ocena | sposob |');
        writeln('|      | zapisu |');
        writeln('|---------------|');
        writeln('|  1+  |  1.50  |');
        writeln('|  2-  |  1.50  |');
        writeln('|  2+  |  2.50  |');
        writeln('|  3-  |  2.75  |');
        writeln('|  3+  |  3.50  |');
        writeln('|  4-  |  3.75  |');
        writeln('|  4+  |  4.50  |');
        writeln('|  5-  |  4.75  |');
        writeln('|  5+  |  5.50  |');
        writeln('|  6-  |  5.75  |');
        writeln('|_______________|');
        writeln('powyzej znajduje sie tabela z przykladowa postacia ocen, nie ma');
        writeln('obowiazku podazania za wartosciami ocen z + i -, chodz liczby');
        writeln('nadal musza byc zapisywane w postaci rzeczywistej');
        writeln;

for j:=1 to i do
        begin
        writeln('Podaj ', j,'. ocene');
        readln(oceny[j]);
        writeln('Podaj wage tej oceny');
        readln(waga[j]);
        writeln;
        end;
writeln;
writeln;

write('Srednia : ');
for j:=1 to i do
    begin
    suma_ocen:=suma_ocen+(oceny[j]*waga[j]);
    suma_wag:=suma_wag+waga[j];
    end;
writeln(suma_ocen/suma_wag:8:2);
writeln;
writeln('kliknij aby kontynuowac');
readkey;


clrscr;

writeln('chcesz obliczyc srednia kolejnego ucznia czy zakonczyc program?');
writeln('[wcisnij klawisz] by kontynuowac lub wpisz "wyjscie" by wyjsc');
readln(zakoncz);
until zakoncz='wyjscie'

end.
0

Jak nie umiesz formatować kodu to używaj http://olesio.eu/delfor poza tym skąd wnioskujesz, że się Tobie tablice nie zerują? Wpisywałem "na pałę" najpierw trzy oceny podając 1, 1, 1, 1, 1, 1 (ocena, waga). Nastepnie wpisywałem 2, 1, 2, 1, 2, 1. I wynik jest inny, a jakby się nie zerowały to jako tablica zadeklarowana lokalnie miała by losowe wartości albo z poprzedniego stanu. Ponadto kod powinien wyglądać przynajmniej tak jak poniżej, a nie u Ciebie zero konkretnych wicięć i nie wiadomo kiedy jaki blok się kończy. Dodałem moduł Windows i funkcję Beep żeby Tobie pokazać dźwiękowo, że pętla z wyzerowaniem tablic następuje za każdym razem. Mam nadzieję, że używasz FPĆ, bo w Turbo to już nie wiem komu każą pisać jak to pod nowszymi systemami bez DosBoxa nie zadziała samo IDE. Poza tym jak coś mogę doradzić. Wpisywanie wartości wedlug mnie powinno się odbywać w tych samych linijkach także robisz Write('Podaj cosik: '); a następnie Readln(Zmienna); i wtedy to wygląda jak powinno. Również nie powinieneś używać konkretnych liczb w pętlach dotyczących tablic tylko for I := Low(Tablica) to High(Tablica) do... Więcej błędów nie zauważyłem. Nie skupiałem się na tym jak program ma dzialąć, ale w obecnej postaci zerowanie tablic na pewno występuje za każdym razem.

program srednia;

uses
  Windows, Crt;

var
  i, j : integer;
  oceny : array[1..32] of real;
  waga : array[1..32] of integer;
  suma_ocen : real;
  suma_wag : integer;
  klawisz : char;
  zakoncz : string;
begin
  clrscr;
  writeln(' ____________________________');
  writeln('/                            \');
  writeln('| LICZENIE  SREDNIEJ WAZONEJ |');
  writeln('\____________________________/');
  writeln;
  writeln;
  writeln('INSTRUKCJA');
  writeln('________________________________________________________________________________');
  writeln;
  writeln('kalkualtor zapyta o ocene ktora nalezy wprowadzic w postaci liczby');
  writeln('calkowitej [np 5 dla piatki][UWAGA! dla ocen z + i - ocene nalezy');
  writeln('wpisac w postaci liczby rzeczywistej, np dla 3+ 3.75 (koniecznie');
  writeln('kropka . a nie przecinek ,), a nastepnie kalkulator zapyta o jej');
  writeln('wage [nalezy ja wpisac w postaci calkowitej, np dla wagi 0,10 nalezy');
  writeln('wpisac 10.');
  writeln;
  writeln;
  writeln('kliknij aby przejsc dalej');
  klawisz := readkey;
  clrscr;
  repeat
    suma_ocen := 0;
    suma_wag := 0;
    for j := 1 to 32 do
    begin
      oceny[j] := 0;
      waga[j] := 0;
    end;
    Beep(750, 300);
    repeat
      clrscr;
      write('Podaj z ilu ocen chcesz wyliczyc srednia wazona (max 32) : ');
      readln(i);
      if i > 32 then writeln('Za duza liczba');
    until i < 33;
    clrscr;
    writeln('._______________.');
    writeln('|ocena | sposob |');
    writeln('|      | zapisu |');
    writeln('|---------------|');
    writeln('|  1+  |  1.50  |');
    writeln('|  2-  |  1.50  |');
    writeln('|  2+  |  2.50  |');
    writeln('|  3-  |  2.75  |');
    writeln('|  3+  |  3.50  |');
    writeln('|  4-  |  3.75  |');
    writeln('|  4+  |  4.50  |');
    writeln('|  5-  |  4.75  |');
    writeln('|  5+  |  5.50  |');
    writeln('|  6-  |  5.75  |');
    writeln('|_______________|');
    writeln('powyzej znajduje sie tabela z przykladowa postacia ocen, nie ma');
    writeln('obowiazku podazania za wartosciami ocen z + i -, chodz liczby');
    writeln('nadal musza byc zapisywane w postaci rzeczywistej');
    writeln;
      for j := 1 to i do
    begin
      writeln('Podaj ', j, '. ocene');
      readln(oceny[j]);
      writeln('Podaj wage tej oceny');
      readln(waga[j]);
      writeln;
    end;
    writeln;
    writeln;
    write('Srednia : ');
    for j := 1 to i do
    begin
      suma_ocen := suma_ocen + (oceny[j] * waga[j]);
      suma_wag := suma_wag + waga[j];
    end;
    writeln(suma_ocen / suma_wag : 8 : 2);
    writeln;
    writeln('kliknij aby kontynuowac');
    readkey;
    clrscr;
    writeln('chcesz obliczyc srednia kolejnego ucznia czy zakonczyc program?');
    writeln('[wcisnij klawisz] by kontynuowac lub wpisz "wyjscie" by wyjsc');
    readln(zakoncz);
  until zakoncz = 'wyjscie';
end.
0

uważam że się nie zeruje ponieważ po 1 przejściu programu nagle zaczynają mi wychodzić inne wynik niż poprzednio.
np wziąłem sobie 3 liczby:

  1. 1 wag 5 ; 3 wag 2 ; 5 wag 1 => 2,00 za 1 razem
  2. 3 wag 2 ; 1 wag 1 ; 5 wag 4 => 3.86 [na razie się zgadza]
  3. 1 wag 5 ; 3 wag 2 ; 5 wag 1 => 2.57 [inny wynik]
  4. 1 wag 5 ; 3 wag 2 ; 5 wag 1 => 2.42 [inny wynik]

chyba że jest to inny błąd. Jakiś inny pomysł?;s

0
tariel36 napisał(a)

chyba że jest to inny błąd. Jakiś inny pomysł?;s

Oczywiście, że jest inny błąd. Przy zerowaniu tablicy wyzeruj również zmienne użyte później w pętli do liczenia średniej, a wszystko będzie ok. Wcześniej to przeoczyłem, A mój kod powyżej też poprawiłem.

0

super, teraz działa jak należy, dzięki za pomoc i cierpliwość:)

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