Problem z czyszczeniem tablicy

Problem z czyszczeniem tablicy
tariel36
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 8 lat
  • Postów:92
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?

Kopiuj
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.
olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
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ąć.


Pozdrawiam.
edytowany 1x, ostatnio: olesio
tariel36
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 8 lat
  • Postów:92
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 :/

Kopiuj
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.
olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
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.

Kopiuj
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.

Pozdrawiam.
edytowany 2x, ostatnio: olesio
tariel36
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 8 lat
  • Postów:92
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

olesio
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Szczecin
  • Postów:4191
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.


Pozdrawiam.
edytowany 1x, ostatnio: olesio
tariel36
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 8 lat
  • Postów:92
0

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

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)