2011 m. balandžio 13 d., trečiadienis

Daugybos "matmintiniškas" treniruočių poligonas

Šiaip ne taip pavykusi programa, skirta "mokytis" daugybos (2011-04-03).
Tai paprasčiausias random užduočių išmetimo programa, kuri prašo sudauginti du skaičius iki 30, ir sulygina su teisingu atsakymu.
Be to, kad programa pateikia laiką, kiek buvo spręstas uždavinys, jis dar tą laiką įsirašo į sukuriamą failą, ir saugo jį ten dviem parametrais: vidutinis tam tikros užduoties (vienos iš 30x30 užduočių) sprendimo laikas , ir kiekis, kiek kartų toji užduotis buvo pateikiama.
Prieš pradedant žaisti, reikia nueiti į žaidimo opcijas ir pasirinkti sukurti naują failą, po failo sukūrimo, jis jau tampa užpildytas defaultinėmis reikšmėmis, kur vidutinis užduoties alikimo laikas įrašytas kaip 2 sekundės, o užduoties pateikimo kiekis - 1. Dar galima failą sukurti taip, kad defaultiniai užduočių sprendimo laikai būtų mažesni lengvesniems uždaviniams, ir didesni - sunkesniems.
Programa pateikia užduotį ne visai random būdu, o randomina 5 atsitiktines užduotis ir sulygina, kuri iš j sunkiausia žaidėjui, ir tą ir pateikia. Dėl to antrojo būdo failo sukūrimas su "progresyviniais" defaultiniais nustatymais privers programą dažniau mėtyti sudėtingesnius uždavinius, t.y. dažniausiai prašys sudauginti du skaičius iš intervalų [20..30].
Lengvesnes užduotis išsprendus per trumpesnį laiką, rezultatas įsirašo į failą, ir vėliau toji užduotis bus išmetama gerokai rečiau.
Programą išjungus, rezultatai išlieka, kadangi jie rašomi į sukurtą failą, kuris yra toje pačioje direktorijoje kur ir programos failas.

Taigi: screenshot'ai ir programos kodas:





program mult;
uses crt, dos;

procedure defreiksmes(var r, p: integer);
begin r:=10; p:=100; end;

procedure help;
begin
writeln('RS, 2011-04-03, daugyba');
writeln(#249,' Is pradziu pasirinkite pavadinima, kuriuo pavadinsite faila (pvz. manof)');
writeln('Tada eikite i nustatymus (1). Ten pasirinkite 2');
writeln(#249,' Programa paklaus, kokiu budu uzpildyti faila: 1 arba 2.');
writeln('1 - panasi tikimybe visiems veiksmams, 2 - didesne tikimybe sunkesniems');
writeln(#249,' Failas bus perrasytas, arba jeigu tokiu pavadinimu failo nebuvo - sukurtas naujas');
writeln;
writeln(#249,' Jums skaiciuojant, jusu rezultatai pildosi i pasirinkta faila');
writeln(#249,' Kuo ilgiau prie uzduoties sugaistate laiko,');
writeln('tuo didesne tikimybe kita kart gauti sia uzduoti');
writeln(#249,' Is pradziu sis efektas silpnas, taciau pildantis uzduociu');
writeln('sprendimo istorijai, stipreja');
writeln(#249,' Uz klaidinga atsakyma prisideda 3 sek ir keliauja i statsitika');
writeln;
writeln(#249,' Pagal defaulta(nutylejima), tarp uzduociu daroma 0.1 sek pauze,');
writeln('zaidziate 10 uzdaviniu ciklais. Taciau siuos nustatymus ');
writeln('galite keisti kol programa ijungta');
writeln('Isjungus programa ir vel ijungus, atsistato defaultiniai nustatymai');
writeln(#249,' Sprendimu istorija niekur nedingsta, nes ji uzrasyta tekstiniuose failuose');
writeln('Ja galite pradanginti, jeigu ta faila perrasysite su opcija "sukurti nauja defaultini faila" ');
writeln;
writeln(#249,' Uzpilde faila antruoju defaultiniu budu,');
writeln('gausite didesne tikimybe sunkesniu uzduociu atsiradimams');
writeln(#249,' Po zaidimo, jusu paklaus, ar norite pamatyti zemelapi');
writeln(#249,' Zemelapyje pavaizduota daugybos lentele 30x30, ir kiekvienas langelis reiskia');
writeln('kiek vidutiniskai laiko sugaisote sprendziant ta uzdavini');
writeln('Taciau i rezultata issiskaiciuoja ir pirmasis - defaultinis rezultatas,');
writeln('atsirades kuriant faila');
writeln;
writeln(#249,' Pilka spalva zemelapyje dazniausiai reiks, kad to veiksmo');
writeln('nebuvo ne karto atlikta');
writeln(#249,' Programoje gali buti klaidu');
readln;
end;

procedure defaultas(vidg: integer; fa:string);
const ko = 30;
var t: text;
i,j,k, g: integer;
b: array [1..ko*ko] of integer;
begin
writeln('Pasirinkite default varianta: 1 arba 2. (1 - lygiai, 2 - progresyviai)');
readln(g);
assign(t, fa);
rewrite(t);
writeln(t, vidg);
for i:=1 to ko do
for j:=1 to ko do
begin
k:=j+(i-1)*ko;
b[k]:=vidg;
if g=2 then begin
if (i<11) or (j<11) then b[k]:=vidg-25;
if (i<11) and (j<11) then b[k]:=vidg-75;
if ((i>10) and (j>20)) or ((i>20) and (j>10)) then b[k]:=vidg+50;
if (i>20) and (j>20) then b[k]:=vidg+150;
end;
writeln(t, b[k]);
writeln(t, '1');
end;
close(t);
end;

const ko = 30;
var
i,j,k,l,ll: integer;
t:text;
fa:string;
vidg, r, p: integer;
kla: integer;
s,z : array [1..ko*ko] of string;
b,c : array [1..ko*ko] of integer;
val1, min, sek, mil : word;
val2, min2, sek2, mil2 : word;
dtime: longint;
ax, max, mx, ixj, kodas, ats: integer;
zaistidar: boolean;

begin
clrscr;
randomize;

vidg:=200;

defreiksmes(r, p);
kla:=10;

b[1]:=15; b[2]:=14; b[3]:=10; b[4]:=11; b[5]:=9; b[6]:=13; b[7]:=12;
for i:=1 to 7 do begin textcolor(b[i]); writeln('Labas'); end; textcolor(7);

writeln('Kuriame faile saugoti rezultatus?');
writeln('(iveskite esamo failo pavadinima arba suteikite pavadinima naujam)');
readln(fa);
fa:=fa+'.txt';

while kla = 10 do begin
writeln('Eikite i Informacija ivesdami "1", arba pradekite zaidima ivesdami kitka.');
readln(kla);

if kla = 1 then
repeat begin
writeln('Informacija');
writeln('Pasirinkite opcija (iveskite atitinkama skaiciu)');
writeln(' 0 - grizti');
writeln(' 1 - paskaityti apie programa');
writeln(' 2 - sukurti nauja defaultini faila');
writeln(' 3 - pasirinkti kartojimu skaiciu');
writeln(' 4 - pasirinkti uzduodamu veiksmu sunkumus');
writeln(' 5 - pasirinkti pauzes trukme (milisekundemis)');
writeln(' 6 - grazinti defaultinius nustatymus');
readln(kla);
if kla = 0 then kla:=10
else if kla = 1 then help
else if kla = 2 then defaultas(vidg, fa)
else if kla = 3 then begin writeln('iveskite kartojimu sk.'); readln(r); end
else if kla = 4 then
else if kla = 5 then begin writeln('iveskite pauzes trukme'); readln(p); end
else if kla = 6 then defreiksmes(r, p);
end; until kla=10;
end;

zaistidar:=true;
while zaistidar do begin

assign(t, fa);
reset(t);
readln(t, vidg);
for i:=1 to ko do
for j:=1 to ko do begin
k:=j+(i-1)*ko;
readln(t, s[k]);
readln(t, z[k]);
val(s[k], b[k], kodas);
val(z[k], c[k], kodas);
end;
close(t);

for l:=1 to r do
begin
writeln('uzduoties numeris: ',l);
delay(p);

max:=0;
for ll:=1 to 5 do begin
ax:=random(ko*ko)+1;
if b[ax]> max then begin max:=b[ax]; mx:=ax; end;
end;
i:= mx div ko + 1;
j:= mx mod ko;
if j=0 then j:=(mx-1) mod ko + 1 ;
ixj:= i*j;
writeln(i:2,' x ',j:2);

GetTime(val1, min, sek, mil);
readln(ats);
GetTime(val2, min2, sek2, mil2);
dtime:=(val2-val1)*360000+(min2-min)*6000+(sek2-sek)*100+(mil2-mil);
writeln('laiko galvota: ',dtime div 100,':',dtime mod 100:2);
if ixj=ats then writeln('tiesa')
else begin writeln('NEtiesa. Ats.: ',ixj); dtime:=dtime+300 end;

b[mx]:=round((c[mx]*b[mx]+dtime)/(c[mx]+1));
c[mx]:=c[mx]+1;
end;

assign(t, fa);
rewrite(t);
writeln(t, vidg);
for i:=1 to ko*ko do begin
writeln(t, b[i]);
writeln(t, c[i]);
end;
close(t);

writeln('Ar zaidziam toliau? (1 - taip)');
readln(kla);
if kla <> 1 then

begin

writeln('Ar parodyti zemelapi? (1 - taip)');
readln(kla);
if kla = 1 then
begin
write(' 0 - 150: '); textcolor(15); writeln(#219); textcolor(7);
write('150 - 200: '); textcolor(14); writeln(#219); textcolor(7);
write('200 - 250: '); textcolor(10); writeln(#219); textcolor(7);
write('250 - 300: '); textcolor(11); writeln(#219); textcolor(7);
write('300 - 400: '); textcolor(9); writeln(#219); textcolor(7);
write('400 - 500: '); textcolor(13); writeln(#219); textcolor(7);
write('500 - + : '); textcolor(12); writeln(#219); textcolor(7);
write(' ');
for i:=1 to 30 do
for j:=1 to 30 do
begin
k:=j+(i-1)*ko;
if b[k]<= 100 then ats:=15
else if b[k]<= 150 then ats:=14
else if b[k]<= 200 then ats:=10
else if b[k]<= 350 then ats:=11
else if b[k]<= 450 then ats:=9
else if b[k]<= 550 then ats:=13
else ats:=12;
if b[k]=200 then ats:=7;
textcolor(ats);
if j<> 30 then write(c[k])
else begin writeln(c[k]); if (i mod 10)=0 then writeln; end;
if (j mod 10) = 0 then write(' ');
end;

end;
textcolor(7);

writeln('Ar zaidziam toliau? (1 - taip)');
readln(kla);
if kla <> 1 then
zaistidar:=false;
end;

end;
writeln('Sekmes! (iseiti - enter)');
readln;
end.

Komentarų nėra:

Rašyti komentarą