Kezdőoldal » Számítástechnika » Programozás » Könnyű program Free Pascal-al,...

Könnyű program Free Pascal-al, mégis adódik gondom, Hogy kéne?

Figyelt kérdés

Tudom hogy tettek már fel kérdést erről a példáról. Viszont nekem nem ugyanaz a gondom.

A Feladat:

Készítsünk programot, amely ki fogja kérdezni a matematikát (két szám összeadását, kivonását és szorzását az <1,10> intervallumból). A két számot és a műveletet a számítógép véletlenszerűen válassza ki. A program akkor fejeződjön be, ha a felhasználó 10 példát kiszámolt helyesen. Rossz válasz esetén kérdezze újra ugyanazt a példát. A program végén írjuk ki az eredményességet százalékokban.


Programom:


var l,f,s1,s2,m,osszeg,szam:integer;

osszes,szazalek,nemjo,jo:integer;


begin

randomize;

l:=0;

f:=0;

nemjo:=0;

jo:=0;

repeat

f:=f+1;

s1:= 1 + random(10);

s2:= 1 + random(10);

m:= 1 + random(3);

if m=1 then begin

repeat

write(f ,'. Feladat: ', s1,' + ', s2,' = ');

readln(szam);

osszeg:=s1 + s2;

if szam=osszeg then begin

writeln('Jo a megoldasod');

jo:=jo+1;

end

else begin

writeln('Nemjo a megoldasod, probald ujra');

nemjo:=nemjo+1;

end;

writeln;

until szam=osszeg;

end;

if m=2 then begin

repeat

write(f ,'. Feladat: ', s1,' - ', s2,' = ');

readln(szam);

osszeg:=s1 - s2;

if szam=osszeg then begin

writeln('Jo a megoldasod');

jo:=jo+1;

end

else begin

writeln('Nemjo a megoldasod, probald ujra');

nemjo:=nemjo+1;

end;

writeln;

until szam=osszeg;

end;

if m=3 then begin

repeat

write(f ,'. Feladat: ', s1,' * ', s2,' = ');

readln(szam);

osszeg:=s1 * s2;

if szam=osszeg then begin

writeln('Jo a megoldasod');

jo:=jo+1;

end

else begin

writeln('Nemjo a megoldasod, probald ujra');

nemjo:=nemjo+1;

end;

writeln;

until szam=osszeg;

end;

if f=10 then l:=1;

until l=1 ;

osszes:=jo+nemjo;

szazalek:=(100 div osszes)*10;

writeln('A feladatsort sikeresen vegigvitted, gratulalok. ');

writeln('Az eredmenyesseged szazalekba a kovetkezo: ', szazalek,'%');

readln;

end.


Tudom kicsit túlbonyolítottam, de szeretem ha csinos a program :D A gond az arány számolásával lenne...

Mivel az én megoldásommal a rossz válaszokat (ha 1 feladatot 3x rosszul adsz meg azt 3x rossznak számolja)

is beleszámolja az összesbe és utána abból számítja az arány. Szerintem úgykéne számolnia az arányt hogy 10 feladatból hány feladatot oldunk meg 1.-re hibásnak. Ezzekkel a ciklusokkal meglehet ezt így oldani ??



2013. szept. 30. 18:33
 1/8 anonim ***** válasza:
Most hirtelen úgy csinálnám, hogy egy 'pont' változóba tenném a feladat pontértékét (1), ha eltalálja akkor megkapja és nullázódik, ha nem találja el akkor csak nullázódik. Természetesen minden feladat elején visszakapja az értékét.
2013. szept. 30. 19:07
Hasznos számodra ez a válasz?
 2/8 A kérdező kommentje:
Nem rossz gondolat, de ha jól értelmezem amit írtál, akkor az azért nem lenne jó, mert mindenféleképpen megkapja a pontot mivel egy adott feladattól csak akkor léphet tovább ha eltalálja az eredmény (repeat..until átka szerintem). Így mindig megkapná a pontot. Persze ha te nem így gondoltad akkor lehet hogy jólenne. :D
2013. szept. 30. 19:37
 3/8 anonim ***** válasza:

Úgy valósítod meg ahogy szeretnéd, erről szól a programozás. Én így gondoltam:


jo = jo + pont;

pont = 0;

end

else

begin

writeln('nemjó,..');

nemjo = nemjo+pont;

pont = 0;

end;

2013. szept. 30. 19:42
Hasznos számodra ez a válasz?
 4/8 SimkoL ***** válasza:

'Tudom kicsit túlbonyolítottam, de szeretem ha csinos a program' Én is :))


program kikerdez;

var feladat, jo, rossz, hibas, s1, s2, melyik : integer;


function osszead(f, a, b : integer) : boolean;

var eredmeny, hiba : integer;

s: string;

begin

hiba := 1;

while hiba <> 0 do

begin

Write(f, '.Feladat: ', a, ' + ', b, ' = ');

ReadLn(s);

Val(s, eredmeny, hiba);

if hiba <> 0 then WriteLn('Csak szamot adhatsz meg !');

end;

if (a + b) = eredmeny then osszead := True else osszead := False;

end;


function kivon(f, a, b : integer) : boolean;

var eredmeny, hiba : integer;

s: string;

begin

hiba := 1;

while hiba <> 0 do

begin

Write(f, '.Feladat: ', a, ' - ', b, ' = ');

ReadLn(s);

Val(s, eredmeny, hiba);

if hiba <> 0 then WriteLn('Csak szamot adhatsz meg !');

end;

if (a - b) = eredmeny then kivon := True else kivon := False;

end;


function szoroz(f, a, b : integer) : boolean;

var eredmeny, hiba : integer;

s: string;

begin

hiba := 1;

while hiba <> 0 do

begin

Write(f, '.Feladat: ', a, ' * ', b, ' = ');

ReadLn(s);

Val(s, eredmeny, hiba);

if hiba <> 0 then WriteLn('Csak szamot adhatsz meg !');

end;

if (a * b) = eredmeny then szoroz := True else szoroz := False;

end;


begin

feladat := 1;

jo := 0;

Randomize;

repeat

rossz := 0;

melyik := Random(3) + 1;

case melyik of

1: begin

s1 := Random(10) + 1;

s2 := Random(10) + 1;

while not osszead(feladat, s1, s2) do

begin

WriteLn('Hibas valasz !');

Inc(hibas);

Inc(rossz);

end;

if rossz = 0 then Inc(jo);

Inc(feladat);

WriteLn('Jo valasz !');

end;

2: begin

s1 := Random(10) + 1;

s2 := Random(10) + 1;

while not szoroz(feladat, s1, s2) do

begin

WriteLn('Hibas valasz !');

Inc(hibas);

Inc(rossz);

end;

if rossz = 0 then Inc(jo);

Inc(feladat);

WriteLn('Jo valasz !');

end;

3: begin

s1 := 0;

s2 := 1;

while s1 < s2 do

begin

s1 := Random(10) + 1;

s2 := Random(10) + 1;

end;

while not kivon(feladat, s1, s2) do

begin

WriteLn('Hibas valasz !');

Inc(hibas);

Inc(rossz);

end;

if rossz = 0 then Inc(jo);

Inc(feladat);

WriteLn('Jo valasz !');

end;

end;

until feladat > 10;

WriteLn('Feladatok szama: ', feladat - 1);

WriteLn('Probalkozasok szama: ', feladat + hibas - 1);

WriteLn('Elsore eltalaltak szama: ', jo);

WriteLn('Eredmenyesseg: ', (jo * 100) / (feladat - 1) :3:0, ' %');

end.

2013. szept. 30. 20:59
Hasznos számodra ez a válasz?
 5/8 ejbenjaro ***** válasza:

Ha már annyira csinosítgatjátok a programot, íme egy "csinosabb" verzió, amiben nincsenek fölöslges ismétlések (copy paste kódok).


program matek;


uses crt;


type

TMuvjel=(o,k,sz);


function muvelet(muvjel:TMuvjel; a,b:byte):boolean;

var

eredmeny, etmp: byte;

begin

writeln('Kerem irja be a muvelet eredmenyet!');

write(a);

case muvjel of

o: begin

write('+');

etmp:=a+b;

end;

k: begin

write('-');

etmp:=a-b;

end;

sz: begin

write('*');

etmp:=a*b;

end;

end;

write(b,'=');

readln(eredmeny);

if eredmeny=etmp then muvelet:=true

else muvelet:=false;

end;


procedure sorsol(muvjel: TMuvjel; var a,b: byte);

var ujra: boolean;

begin

ujra:=true;

while ujra do

begin

a:=random(10)+1;

b:=random(10)+1;

if muvjel=k then

begin

if a<b then ujra:=true

else ujra:=false;

end

else ujra:=false;

end;

end;


var jo, rossz, s1, s2, i, muv : byte;

mjel: TMuvjel;

frossz: boolean;


begin

randomize;

frossz:=false;

rossz:=0;

jo:=0;

for i:=1 to 10 do

begin

clrscr;

writeln(i,'/10. feladat');

muv:=random(3)+1;

case muv of

1 : mjel:=o;

2 : mjel:=k;

3 : mjel:=sz;

end;

sorsol(mjel,s1,s2);

while not muvelet(mjel,s1,s2) do

begin

if not frossz then

begin

frossz:=true;

inc(rossz);

end;

writeln('Hibas valasz!!!');

end;

Writeln('Gratulalok! Helyes a megoldas.');

if not frossz then inc(jo);

frossz:=false;

end;

writeln('A 10 feladatbol ',jo,' helyes valaszt adtal');

writeln('A teljesitmenyed: ', ((jo/10)*100):3:0,'%');

end.

2013. szept. 30. 22:30
Hasznos számodra ez a válasz?
 6/8 SimkoL ***** válasza:
Szépül, de a hibakezelésre nem gondoltál :)
2013. szept. 30. 22:42
Hasznos számodra ez a válasz?
 7/8 ejbenjaro ***** válasza:
SimkoL, valami kis munkát hagyjunk már a kérdezőnek is :).
2013. okt. 1. 11:33
Hasznos számodra ez a válasz?
 8/8 SimkoL ***** válasza:
Nem biztos, hogy tudja miről beszélünk :) A két programból minta megoldást csinálhatna csillagos ötösért :)
2013. okt. 1. 19:18
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!