[PASCAL] Suma elementów parzystych i nieparzystych

Zauher13
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 7 cze 2015, o 23:18
Płeć: Mężczyzna
Lokalizacja: Wwa
Podziękował: 9 razy

[PASCAL] Suma elementów parzystych i nieparzystych

Post autor: Zauher13 »

Mam napisać program który zsumuję wszystkie wartości dla elementów parzystych i nieparzystych.

Kod: Zaznacz cały

program suma;

var tab:array[1..1000] of integer;
var n,i,a,b:integer;

procedure oblicz;
          begin
          randomize;
          writeln ('podaj n-ilosc rzutow kostka 0<n<299');
          readln (n);

for i:=1 to n do begin
    tab[i]:=random(6);
    writeln (i,' : ',tab[i]);
end;
for i:=1 to n-2 do begin
    if (tab[i]mod 2)=0 then
    begin
    a:=a+tab[i];
    end
else
    begin
    b:=b+tab[i];
    end;
end;
writeln ('suma parzystych =',a);
writeln ('suma nieparzystych =',b);
end;
begin
  writeln ('Numerek : Wylosowana wartosc');
  oblicz;
  readln;
end.       


Napisałem coś takiego i nie działa tak jak powinno, ktoś podpowie co zmienić? (wszystko działa oprócz funkcji sumującej)
SlotaWoj
Użytkownik
Użytkownik
Posty: 4211
Rejestracja: 25 maja 2012, o 21:33
Płeć: Mężczyzna
Lokalizacja: Kraków PL
Podziękował: 2 razy
Pomógł: 758 razy

[PASCAL] Suma elementów parzystych i nieparzystych

Post autor: SlotaWoj »

Błąd podstawowy polega na błędnym wykorzystaniu wartości zwracanych przez funkcję Random. Przeczytaj opis tej funkcji.
  1. Dlaczego wypełnianie tablicy danymi nie jest odseparowane (proceduralnie) od sumowania?
  2. Dlaczego 0<n<299 gdy tablica jest 1000-elementowa?
  3. Wyprowadzanie (w celach kontrolnych, jakże by inaczej) wartości elementów tablicy powinno być odseparowane (proceduralnie) od wypełniania tejże.
  4. Dlaczego instrukcja:
    • writeln ('Numerek : Wylosowana wartosc');]
    nie jest bezpośrednio przed pętlą, w której są wyprowadzane wartości kolejnych elementów tablicy?
  5. Dlaczego zmienne, w których jest przeprowadzane sumowanie nie mają nadanych wartości początkowych?
  6. Dlaczego ww. zmienne nie nazywają się np. SumaPa i SumaNie, tylko enigmatycznie a i b?
  7. Gdyby wypełnić tablicę kolejnymi liczbami (ciąg arytmetyczny), to łatwo wyliczyć, jaka jest suma elementów o wartościach parzystych jak i nieparzystych. Pozwalałoby to na ocenę poprawności algorytmu sumowania bez wnikania w zawartość tablicy, a dopiero później gdy sumowanie mamy OK, należało wygenerować tablicę, w której mamy wyniki rzutów kością.
Generalnie: Twój program charakteryzuje się wybitnym brakiem elegnacji.
Zauher13
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 7 cze 2015, o 23:18
Płeć: Mężczyzna
Lokalizacja: Wwa
Podziękował: 9 razy

[PASCAL] Suma elementów parzystych i nieparzystych

Post autor: Zauher13 »

Dzięki, jesteś wielki! A odnośnie braku elegancji to jedynym moim usprawiedliwieniem jest to że się na tym po prostu nie znam. Mam ten przedmiot na studiach który w żadnym stopniu nie jest związany z moim głównym kierunkiem, więc moja przygoda z programowaniem zaczeła się jakieś 3 tygodnie temu. Leci "pomógł"
SlotaWoj
Użytkownik
Użytkownik
Posty: 4211
Rejestracja: 25 maja 2012, o 21:33
Płeć: Mężczyzna
Lokalizacja: Kraków PL
Podziękował: 2 razy
Pomógł: 758 razy

[PASCAL] Suma elementów parzystych i nieparzystych

Post autor: SlotaWoj »

To nie jest usprawiedliwienie. Jakiś język programowania trzeba znać. PASCAL jest super, bo został opracowany jako język do nauki programowania. Przyda się (mowa o zasadach postępowania), jak będziesz korzystał z Visual Basica w Excelu.
Zauher13
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 7 cze 2015, o 23:18
Płeć: Mężczyzna
Lokalizacja: Wwa
Podziękował: 9 razy

[PASCAL] Suma elementów parzystych i nieparzystych

Post autor: Zauher13 »

Trochę zmieniłem program. Teraz to ja wpisuję liczby do tablicy i dodatkowo oblicza średnią arytmetyczną elementów parzystych i nie parzystych. Tylko jest jeden problem który nie za bardzo wiem jak rozwiązać, mianowicie jak wybiorę liczbę elementów 5 powiedzmy o wartościach (10,15,20,25,30) to działa ale jak już wezmę ilość elementów 4 o wartościach (4,4,4,4) to program wszystkie liczby traktuje jak parzyste, problem pewnie leży w sposobie liczenia wartości parzystych i nieparzystych ale jakoś tego nie widzę.

Kod: Zaznacz cały

program suma;
        var tab:array[1..100] of integer;
        var n,i,a,sumpa,sumnie:integer;
        var SrPa,SrNie:Extended;

procedure wpisz;
          begin
          writeln ('wpisz liczbe wierszy');
          readln (n);
          writeln ('wypelnij tabele liczbami');
          for i:=1 to n do begin
          readln (tab[i]);
end;
end;
procedure oblicz;
          begin
          for i:=1 to n do
          begin
          if (tab[i]mod 2)=0 then
          begin
          sumpa:=sumpa+tab[i];
          end
             else
             begin
             sumnie:=sumnie+tab[i];
             end;
          end;
          writeln ('suma parzystych =',sumpa);
          writeln ('suma nieparzystych =',sumnie);

          a:=(tab[i]mod 2);
          if a=0 then begin
          SrPa:=sumpa/(0.5*i);
          SrNie:=sumnie/(0.5*i);
          end
             else
             begin
             SrPa:=sumpa/((i-1)*(0.5));
             SrNie:=sumnie/((i+1)*(0.5));
             end;

             writeln ('srednia parzystych =',SrPa:3:5);
             writeln ('srednia nieparzystych =',SrNie:3:5);

end;
begin
wpisz;
oblicz;
readln;
end.
            
SlotaWoj
Użytkownik
Użytkownik
Posty: 4211
Rejestracja: 25 maja 2012, o 21:33
Płeć: Mężczyzna
Lokalizacja: Kraków PL
Podziękował: 2 razy
Pomógł: 758 razy

[PASCAL] Suma elementów parzystych i nieparzystych

Post autor: SlotaWoj »

  1. Użycie przy wprowadzaniu elementów tablicy wywołania procedury Read zamiast Readln pozwoli na prowadzenie wielu elementów w jednym wierszu (oddzielonych spacjami).
  2. Aż prosi się, aby zmienna i (licznik pętli) była lokalna w procedurach Wpisz i Oblicz.
  3. Znowu nie są zainicjowane zmienne SumPa i SumNie.
  4. zmienna i po zakończeniu pętli ma wartość nieokreśloną (zależną od implementacji) więc instrukcja:
    • a:=(tabmod 2);

    nie jest jednoznaczna.
  5. Fragment, w którym są obliczane SrPa i SrNie jest spaprany.
    Należy równolegle z obliczaniem kolejnych wartości SumPa i SumNie liczyć elementy parzyste i nieparzyste (potrzebne będą dodatkowe liczniki).
  6. Należy założyć, że gdy np. parzystych nie ma (licznik=0), to:
    • SrPa := 0;

    Dla nieparzystych podobnie.
ODPOWIEDZ