Komputer Świat Ekspert - Forum: wyliczanie średniej ocen - Komputer Świat Ekspert - Forum

Skocz do zawartości

Strona 1 z 1
  • Nie możesz napisać tematu
  • Temat jest zamknięty

wyliczanie średniej ocen

#1 Użytkownik nie jest zalogowany   rObO87 

  • Uczestnik
  • PipPip
  • Grupa: Czytelnicy
  • Postów 672
  • Rejestracja: 07-styczeń 04

Napisano 25 styczeń 2005, 21:12

Mam do napisania program, który wylicza średnią ocen na koniec semestru.
Będzie to wyglądało mniej więcej na tej zasadzie:
writeln('Wpisz oceny:');
writeln('język polski');
readln(k);

itd. wiem jak to zrobić by program wyświetlil średnią, ale mam pewien problem. Chcę
by ten program był uniwersalny tj. sprawdził wszystkie przedmioty, a jeżeli jakiekoś
w danym roku nie mam to:
writeln('WOS');
readln(k) <- wpisuje BRAK
Czy istnieje taka funkcja, która by sprawdziła czy gdziekolwiek wpisano BRAK, czy też
należy wpisać warunek sprawdzający po każdym writeln czy wpisany znak to liczba czy słowo BRAK?
Mam nadzieję, ze rozumiecie o co mi chodzi.


---------------------------------------------------------------------------------------------------
Pentium 4 2,6 GHz HT; Radeon 9600 XT Sapphire; 512 DDR 400 MHz Kingston; Asus P4P800; Win XP Professional + Service Pack 2
0

#0 Bot Reklamowy

  • Grupa: Reklama

#2 Użytkownik nie jest zalogowany   Kodie 

  • Zaawansowany Uczestnik
  • PipPipPipPip
  • Grupa: Czytelnicy
  • Postów 2298
  • Rejestracja: 18-luty 04

Napisano 25 styczeń 2005, 21:43

nie znam dobrze Pascala, ale IMHO możesz to zrobić tak (czyli opcja z warunkami):


var:

przedmioty: array[1..15] of string[20];

srednia: real;

liczba_ocen: byte;

i,tmp_i : byte;



BEGIN

przedmioty[1]:='J. Polski';

przedmioty[2]:='Matma';

... uzupełnic całą liste



for i:=1 to 15

tmp_error:=0;

begin

     writeln('Wpisz ble ble: ',przedmioty[i]);

           readln(tmp_i);

           if tmp_i<>0 then

                  inc(liczba_ocen);

                  srednia := srednia + tmp_i;

           end;

     end;



srednia := srednia / liczba_ocen;

writeln('Srednia: ',srednia);

END.



Może nie działać, ale masz poglądowo:D Aha, jeśli musi być zmiast 0 (jak nie masz danego przedmiotu), to musisz pokombinować ze wczytaniem stringa, a potem val(); :) (btw. ten program jest bardzie uniwersalny, bo łatwo dodawać nowe przedmioty, wystarczy powiększyć tablice i zakres pętli:) )

Kodie
0

#0 Bot Reklamowy

  • Grupa: Reklama

#3 Użytkownik nie jest zalogowany   cfk 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 23
  • Rejestracja: 09-październik 04

Napisano 25 styczeń 2005, 21:43

nie ma czegoś takiej funkcji o któej wspominasz...albo wszedzie zakładasz if albo inna petle typu for, while
pozdro:)
0

#0 Bot Reklamowy

  • Grupa: Reklama

#4 Użytkownik nie jest zalogowany   adam1105 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 94
  • Rejestracja: 15-wrzesień 04

Napisano 25 styczeń 2005, 21:55

Wczytaj jako string, zamień na liczbę Val'em.
var k:string;
l,blad:integer;
...
writeln('Podaj ');
readln(k);
Val(k,l,blad)
if blad<>0 then //wszystko OK, w l jest liczba
else //w blad jest numer znaku nieużywanego przy okreslaniu liczby
0

#5 Użytkownik nie jest zalogowany   Karol - programista 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 159
  • Rejestracja: 09-sierpień 04

Napisano 28 styczeń 2005, 21:58

Oto mój pomysł:


USES CRT;

VAR ocena, suma, ilosc: INTEGER;

VAR srednia: REAL;

VAR wybor: CHAR;

BEGIN

REPEAT

CLRSCR;

WRITE('Wpisz ocenę: ');

wybor:=readkey;

WRITE(wybor);

IF (wybor='1') THEN ocena:=1;

IF (wybor='2') THEN ocena:=2;

IF (wybor='3') THEN ocena:=3;

IF (wybor='4') THEN ocena:=4;

IF (wybor='5') THEN ocena:=5;

IF (wybor='6') THEN ocena:=6;

suma:=suma+ocena;

ilosc:=ilosc+1;

srednia:=suma/ilosc;

WRITELN('Aktualna średnia ocen to: ',srednia:0:2);

WRITELN;

WRITELN('Czy chcesz podawać następną ocenę??');

wybor:=readkey;

UNTIL (wybor='n');

END.



Piszcie na forum i piszcie na e-mail: pokorski@neostrada.pl
0

#6 Użytkownik nie jest zalogowany   Asdef 

  • defragmentator mózgów
  • PipPipPipPip
  • Grupa: Czytelnicy
  • Postów 2943
  • Rejestracja: 14-styczeń 04

Napisano 29 styczeń 2005, 12:47

cytat:
Karol - programista napisał:

Oto mój pomysł:


USES CRT;

VAR ocena, suma, ilosc: INTEGER;

VAR srednia: REAL;

VAR wybor: CHAR;

BEGIN

REPEAT

CLRSCR;

WRITE('Wpisz ocenę: ');

wybor:=readkey;

WRITE(wybor);

IF (wybor='1') THEN ocena:=1;

IF (wybor='2') THEN ocena:=2;

IF (wybor='3') THEN ocena:=3;

IF (wybor='4') THEN ocena:=4;

IF (wybor='5') THEN ocena:=5;

IF (wybor='6') THEN ocena:=6;

suma:=suma+ocena;

ilosc:=ilosc+1;

srednia:=suma/ilosc;

WRITELN('Aktualna średnia ocen to: ',srednia:0:2);

WRITELN;

WRITELN('Czy chcesz podawać następną ocenę??');

wybor:=readkey;

UNTIL (wybor='n');

END.


nie myślałeś aby użyć funkcji case ?

Piszcie na forum i piszcie na e-mail: pokorski@neostrada.pl



Asdef www.kanalia.toya.net.pl
konkurs: FL_Studio jesteś kompozytorem amatorem? weź udział w konkursie więcej info pod adresem www.kanalia.toya.net.pl
szukam redaktorów kanalia@poprostu.net
zapraszam na http://www.kanalia.l...dfree.com/forum

0

#7

  • Grupa: Guests

Napisano 29 styczeń 2005, 22:20

moze ja też sie dołącze...

a jak to zrobic w delphi bo mam np. j.poski: i tu jest Edit teraz wpisze oceny takie jak: 4,5,6,3,4,6,7 i one są po przecinku to jak z tego obliczyć średnią potem z innych przedmiotów a na końcu wszystkie obliczyć...?

Anonymous AdSoft
0

#8 Użytkownik nie jest zalogowany   neo182 

  • Slackware geek
  • PipPipPip
  • Grupa: Czytelnicy
  • Postów 1694
  • Rejestracja: 19-listopad 03

Napisano 30 styczeń 2005, 10:07

Wrzucasz każdy znak do tablicy. Potem wyszukujesz w tablicy ','(przecinki) i zamieniasz je na 0. Następnie oddajesz wszystkie liczby z tablicy. Potem sprawdzasz ile w tablicy jest zer i odejmujesz je od ilości elementów tablicy. I potem sobie łądnie dzielisz i jest.

Napewno można znaleść łatwiejszy soposob.


Got root ?
0

#9

  • Grupa: Guests

Napisano 31 styczeń 2005, 13:16

hehe jakiś przykładzik...?

Anonymous AdSoft
0

#10 Guest__*

  • Grupa: Guests

Napisano 31 styczeń 2005, 14:19

eee a po co do tablicy?

wczytujesz po jednym, jesli != ',' to dodajesz do zmiennej powiedzmy suma i inkrementujesz licznik

a potem suma/licznik i wsio

przyklad sobie sam napisz:)

Micro$oft Windows - a thirty-two bit extension and graphical shell to a
sixteen-bit patch to an eight-bit operating system originally coded for
a four-bit microprocessor which was written by a two-bit company that
can't stand one bit of competition.
0

#11 Użytkownik nie jest zalogowany   LewB ar 

  • LewBar
  • PipPip
  • Grupa: Czytelnicy
  • Postów 817
  • Rejestracja: 12-maj 04

Napisano 31 styczeń 2005, 14:56

[quote]
frag4:
wczytujesz po jednym, jesli != ','
[/code]
To chyba nie Pascal, bo w nim masz <> ;)

www.lewbar.prv.pl
0

#12 Guest__*

  • Grupa: Guests

Napisano 31 styczeń 2005, 15:24

czepiasz sie ;)

Micro$oft Windows - a thirty-two bit extension and graphical shell to a
sixteen-bit patch to an eight-bit operating system originally coded for
a four-bit microprocessor which was written by a two-bit company that
can't stand one bit of competition.
0

#13 Użytkownik nie jest zalogowany   rObO87 

  • Uczestnik
  • PipPip
  • Grupa: Czytelnicy
  • Postów 672
  • Rejestracja: 07-styczeń 04

Napisano 03 luty 2005, 22:28

napisałem coś takiego:

program srednia_ocen;
uses crt;
type
raport=text;
var
przedmioty: array [1..13] of string;
suma,srednia:real;
i,j,k:byte;
w:raport;

begin
clrscr;
assign(w,'c:raport.txt');
rewrite(w);
suma:=0;
srednia:=0;
j:=0;
przedmioty[1]:='jezyk polski';
przedmioty[2]:='I jezyk obcy';
przedmioty[3]:='II jezyk obcy';
przedmioty[4]:='historia';
przedmioty[5]:='matematyka';
przedmioty[6]:='fizyka';
przedmioty[7]:='chemia';
przedmioty[8]:='biologia';
przedmioty[9]:='geografia';
przedmioty[10]:='informatyka';
przedmioty[11]:='wychowanie fizyczne';
przedmioty[12]:='przysposobienie obronne';
przedmioty[13]:='wiedza o spoleczenstwie';
writeln(' Program obliczajacy srednia ocen szkolnych');
writeln;
writeln('Wpisz oceny z poszczegolnych przedmiotow');
writeln('UWAGA! Gdy nie uczysz sie jakiegos przedmiotu wpisz "0"');
writeln('Wykaz ocen i srednia znajsziesz w pliku RAPORT na dysku C');
for i:=1 to 13 do begin
writeln;
write(przedmioty[i],': ');
read(k);
if k=0 then j:=j+1;
if (k<0) or (k>6) then writeln('Wpisales niewlasciwa liczbe! Powtorz wpisywanie ocen!');
suma:=suma+k;
writeln(w,przedmioty[i],': ',k);
end;
srednia:=suma/(13-j);
writeln(w);
writeln('Twoja srednia ocen to: ',srednia:1:2);
writeln(w,'Twoja srednia ocen to: ',srednia:1:2);
readln;
end.

działa dobrze tylko dlaczego nie wyświetla mi się średnia i program odrazu się wyłącza? co należało by zrobić by po wpisaniu błędnej oceny program rozpoczął jeszcze raz proces wpisywania ocen, czyli od nowa?

---------------------------------------------------------------------------------------------------
Pentium 4 2,6 GHz HT|Radeon 9600 XT Sapphire|2x256 DDR Kingston 400 MHz|Asus P4 P800|Master 1: HDD 6 GB Segate|Slave 1: CD-RW LiteOn|Master 2: DVD-ROM LG| Slave 2: HDD 80 GB Segate|Pentagram V.92 Hex 2|Windows XP Professional +SP2|Linux Mandrake 10.0|Canon BJC-250|Canon LiDE 30|Canon MV 750i
0

#14 Użytkownik nie jest zalogowany   neo182 

  • Slackware geek
  • PipPipPip
  • Grupa: Czytelnicy
  • Postów 1694
  • Rejestracja: 19-listopad 03

Napisano 04 luty 2005, 11:56

Czy ty do elementów tablicy nie przypisałeś stringngów ?

przedmioty[1]:='jezyk polski';

przedmioty[2]:='I jezyk obcy';

przedmioty[3]:='II jezyk obcy';

przedmioty[4]:='historia';

przedmioty[5]:='matematyka';

przedmioty[6]:='fizyka';

przedmioty[7]:='chemia';

przedmioty[8]:='biologia';

przedmioty[9]:='geografia';

przedmioty[10]:='informatyka';

przedmioty[11]:='wychowanie fizyczne';

przedmioty[12]:='przysposobienie obronne';

przedmioty[13]:='wiedza o spoleczenstwie';



Got root ?
0

#15 Użytkownik nie jest zalogowany   Oxi 

  • Ronin
  • Grupa: Moderator po przejściach
  • Postów 2482
  • Rejestracja: 19-wrzesień 03

Napisano 04 luty 2005, 12:27

cytat:
neo182 napisał:

Czy ty do elementów tablicy nie przypisałeś stringngów ?


Tak właśnie zrobił.
A w czym problem ? Przecież to jest tablica stringów - więc wszystko jest OK.



ICQ : 245-363-570 | TLEN : oxisoft | GG : 486-2-486

0

#16 Guest__*

  • Grupa: Guests

Napisano 04 luty 2005, 12:42

nie lubie pascala, wiec zbytnio sie nie przygladnalem programowi, ale mam dwie rady:

1. zrob sobie rekord skladajacy sie z nazwy przedmiotu i sredniej uzyskanej z niego

2. nie zapisuj do pliku tego co wypisujesz na ekran, to dziwne troche. jak bedzie chcial kolo zachowac wynik to sobie zrobi kopiuj/wklej

Micro$oft Windows - a thirty-two bit extension and graphical shell to a
sixteen-bit patch to an eight-bit operating system originally coded for
a four-bit microprocessor which was written by a two-bit company that
can't stand one bit of competition.
0

#17 Użytkownik nie jest zalogowany   neo182 

  • Slackware geek
  • PipPipPip
  • Grupa: Czytelnicy
  • Postów 1694
  • Rejestracja: 19-listopad 03

Napisano 04 luty 2005, 16:09

I tak wlasnei wyglada moja znajomosc pascala :cheesy:

Got root ?
0

#18 Użytkownik nie jest zalogowany   rzarajczyk 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 85
  • Rejestracja: 24-kwiecień 04

Napisano 05 luty 2005, 14:27

cytat:
rObO87 napisał:

napisałem coś takiego:

program srednia_ocen;
uses crt;
type
raport=text;
var
przedmioty: array [1..13] of string;
suma,srednia:real;
i,j,k:byte;
w:raport;

begin
clrscr;
assign(w,'c:raport.txt');
rewrite(w);
suma:=0;
srednia:=0;
j:=0;
przedmioty[1]:='jezyk polski';
przedmioty[2]:='I jezyk obcy';
przedmioty[3]:='II jezyk obcy';
przedmioty[4]:='historia';
przedmioty[5]:='matematyka';
przedmioty[6]:='fizyka';
przedmioty[7]:='chemia';
przedmioty[8]:='biologia';
przedmioty[9]:='geografia';
przedmioty[10]:='informatyka';
przedmioty[11]:='wychowanie fizyczne';
przedmioty[12]:='przysposobienie obronne';
przedmioty[13]:='wiedza o spoleczenstwie';
writeln(' Program obliczajacy srednia ocen szkolnych');
writeln;
writeln('Wpisz oceny z poszczegolnych przedmiotow');
writeln('UWAGA! Gdy nie uczysz sie jakiegos przedmiotu wpisz "0"');
writeln('Wykaz ocen i srednia znajsziesz w pliku RAPORT na dysku C');
for i:=1 to 13 do begin
writeln;
write(przedmioty[i],': ');
read(k);
if k=0 then j:=j+1;
if (k<0) or (k>6) then writeln('Wpisales niewlasciwa liczbe! Powtorz wpisywanie ocen!');
suma:=suma+k;
writeln(w,przedmioty[i],': ',k);
end;
srednia:=suma/(13-j);
writeln(w);
writeln('Twoja srednia ocen to: ',srednia:1:2);
writeln(w,'Twoja srednia ocen to: ',srednia:1:2);
readln;
end.

działa dobrze tylko dlaczego nie wyświetla mi się średnia i program odrazu się wyłącza? co należało by zrobić by po wpisaniu błędnej oceny program rozpoczął jeszcze raz proces wpisywania ocen, czyli od nowa?



Prawdopodobnie chodzi o Read(k)
Na moje oko ten program w ogóle nie powinien poprawnei wczytywac danych.
Zauważ, że oceny wczytujesz za pomocą Read, a nie Readln.
Obie procedury czekaja na wpisanie z klawiatury ciągu znaków i zaakceptowanie go enterem. Wtedy wrzuca go do bufora i interpretuje. I tutaj jest różnica pomiedzy tymi porcedurami: Readln usuwa znaczek końca linii z bufora, a Read nie.
I jak następnym razem (po Read) wywołujesz Readln, to w buforze jest znaczek końca linii. I dlatego Readln widzi już znaczek końca linii i nie czeka na naciśnięcie entera.
Dlatego program się wyłącza. Po prostu zamiast Read(k) użyj Readln(k)

a dlaczego po wpisaniu włędnej oceny program ma od nowa prosić o wpisanie wszystkich ocen? lepiej umożliwić poprawienie ostatniej wpisanej oceny w pętli zaporowej:

Readln(k);

while (k>6) or (k<1) do { dopoki ocena jest niepoprawna }

  begin

    Writeln('Podales nieprawidlowa ocene');

    Write('Podaj poprawna ocene: ');

    Readln(k);

  end;



jeżeli jednak chcesz, żeby można było przerwać całe wczytywanie w dowolnym momencie, to musisz to zrobić nie pętla for, ale while (lub repeat)

kontynuuj := true;

licznik := 1;

while kontynuuj do

  begin

    { wczytanie oceny }

    if (k in [1..6]) and licznik < 13 then { jezeli ocena jest porawna i nie osiagnieto ostatneigo elementy }

      inc(licznik);

  end;



a jeżeli chcesz miec możliwość poprawienia ocen, to cały powiższy kod musisz wepchnąć do jeszcze jednej pętli, i od jakiejś zmiennej roboczej uzależnić jej wykonanie:
[code]
wczytuj_oceny := true;
while wczytuj_oceny do
begin
{ wczytanie ocen w petli.
w przypadku powodzenia ostawia zmienna wczytuj_oceny na false - petla sie konczy.
w przypadku porazki zostawia wczytuj oceny = true; petla wczyta oceny raz jeszcze }
end;
0

#19 Użytkownik nie jest zalogowany   rzarajczyk 

  • Nowy Uczestnik
  • Grupa: Czytelnicy
  • Postów 85
  • Rejestracja: 24-kwiecień 04

Napisano 05 luty 2005, 14:28

cytat:
rzarajczyk napisał:
Prawdopodobnie chodzi o Read(k)
Na moje oko ten program w ogóle nie powinien poprawnei wczytywac danych.


Sorry, jednak wczytuje dane :-) Mój błąd.
Jednak to i tak wina Read. Zmień na Readln.
0

Strona 1 z 1
  • Nie możesz napisać tematu
  • Temat jest zamknięty

Użytkownicy przeglądający ten temat: 1
0 użytkowników, 1 gości, 0 anonimowych


Zmień widoczność shoutboxa Shoutbox

wojtek0569  : (17 grudzień 2014 - 16:05) No i znowu atak botów :(
dawido90  : (14 grudzień 2014 - 08:25) również pozdrawia ;)
Uno  : (09 grudzień 2014 - 12:53) I ja pozdrawiam :)
Pretender  : (06 grudzień 2014 - 21:24) pozdrawiam dziadków :))))
Pretender  : (06 grudzień 2014 - 21:24) elitarne forum przestało istniec ;)
Pretender  : (06 grudzień 2014 - 21:24) nudy nudy :))) nic sie nie zmieniło
wojtek0569  : (04 grudzień 2014 - 22:19) Bywa :D
rzeznia22  : (04 grudzień 2014 - 09:57) Nie wiedziałem, że tu jeszcze zajrzę ;) Masa czasu...
rzeznia22  : (04 grudzień 2014 - 09:51) ohoho, widzę jeszcze są ludzie ze starej ekipy! :D
wojtek0569  : (17 październik 2014 - 19:19) Spamerzy generują ruch na forum :D
tomek10861  : (10 październik 2014 - 20:54) Że też ktoś płaci za serwer
tomek10861  : (10 październik 2014 - 20:54) Lat minęło a forum dalej istnieje :)
wojtek0569  : (10 październik 2014 - 18:29) :) Ho!
Grejpfrut14  : (09 październik 2014 - 19:10) hoho
wojtek0569  : (08 październik 2014 - 15:37) OGŁOSZENIE: Ludzie! Nie odkopujcie tematów które maja po 2lata!
wojtek0569  : (08 październik 2014 - 15:36) Podobno do końca roku fora moja być połączone :)
Ferrari  : (04 październik 2014 - 23:48) Tylko pozycjonerzy ratują to forum i piszą posty :lol:
dawido90  : (29 wrzesień 2014 - 21:19) ja 'zaledwie' 7
dawido90  : (29 wrzesień 2014 - 21:17) Już ponad 10 lat :D
EnDrJu_G  : (29 wrzesień 2014 - 17:42) Tylko ten nick mógłbym zmienić :D
Rozszerz pole shoutboxa

DIGDIP