NAPOMENA: U ovom zadatku trebalo je naci M-ti broj po velicini (kao sto je che.guevara i rekao), ali je takodje trebalo ispisati i koliko se taj broj puta ponavlja! (Ovaj program ispisuje X,Y gdje je X=M-ti broj po velicini a Y=broj ponavljanja istog broja u unesenom nizu)
Prvo i ja sam bio u nedoumici kako da rijesim taj zadatak jer nizovi nisu dozvoljeni a "nisu dozvoljeni ni stringovi" (mada ce se kasnije ispostaviti drugacije). Jedina ideja koja mi je pala na pamet bila je ideja da pisem u fajl i da odatle manipulisem podacima. Kao glavno varijablu koristio sam varijablu tipa char (dakle samo jedan znak, nije niz). Za ovaj zadatak dobio sam svih 30 (od mogucih 30) bodova, znaci 100%, dakle rjesenje je validno!
Kod:
program prvi_zadatak;
uses wincrt;
var
f:text;
count,tm,tempmax,x,M,N,q:longint;
t:char;
maxtm,max,maxm,tmax: char;
function chtoint(c:char): longint;
begin
case c of
'0': chtoint:=0;
'1': chtoint:=1;
'2': chtoint:=2;
'3': chtoint:=3;
'4': chtoint:=4;
'5': chtoint:=5;
'6': chtoint:=6;
'7': chtoint:=7;
'8': chtoint:=8;
'9': chtoint:=9;
end;
end;
function inttoch(i: longint): char;
begin
case i of
0: inttoch:='0';
1: inttoch:='1';
2: inttoch:='2';
3: inttoch:='3';
4: inttoch:='4';
5: inttoch:='5';
6: inttoch:='6';
7: inttoch:='7';
8: inttoch:='8';
9: inttoch:='9';
end;
end;
function readbr(n:longint):char;
var
i:integer;
a,c:char;
begin
Reset(f);
for i:=1 to n do readln(f,c);
readbr:=c;
end;
function exif(c:char):boolean;
var
temp:boolean;
i:longint;
begin
temp:=false;
for i:=1 to N do if readbr(i)=c then temp:=true;
exif:=temp;
end;
begin
Assign(f,'prvi_zad');
Rewrite(f);
write('Unesite N (broj cifara): ');
readln(N);
write('Unesite M (za M-ti broj po velicini): ');
readln(M);
max:='0';
for x:=1 to N do
begin
write('Broj ',x,' = ');
readln(t);
if chtoint(t)>chtoint(max) then max:=t;
writeln(f,t);
end;
tmax:=inttoch(chtoint(max)-(m-1));
tempmax:=chtoint(tmax);
tm:=1;
x:=chtoint(max)-1;
while (x>=0) do
begin
if exif(inttoch(x))=true then tm:=tm+1;
if (tm=m) and (exif(inttoch(x))=true) then maxm:=inttoch(x);
x:=x-1;
end;
count:=0;
for x:=1 to n do if readbr(x)=maxm then count:=count+1;
writeln;
writeln(maxm,',',count);
Close(f);
end.
Gornji kod pravi na disku fajl prvi_zad (bez ekstenzije) i u njega upisuje brojeve. Nisam siguran da li u pascalu postoji funkcija koja jedan broj pretvara u char (znam da postoji koja pretvara u string) pa sam sam napravio dve funkcije (longint->char i char->longint). Dalje je sve lako i cini mi se dosta razumljivo.
Ovo jeste jedno dosta nezgrapno rjesenje (mislim, koliko je bezveze koristenje jednog fajla da se u njega zapise 6 varijabli???) ali je jedino koje mi je palo na pamet, a i isplatilo se.
Sto se tice stringa, stvarno nije u redu sto su ljudima koji su radili sa stringom priznali 25 (od mogucih 30) bodova. Pa dajte jebote, mogao sam i ja uraditi preko stringa, zadatak bi bio duplo kraci. Ne isplati se ovoliki trud za 5 bodova! Molim lijepo.... Nabijem vas na k...c!
P.S. Iako se na takmicenju radilo u Borland Turbo Pascal 7 za DOS, ja sam ovaj zadatak postovao u varijanti za Windows Pascal, ali mislim da nema neke velike razlike, glavna ideja je tu...