vypis vysledkov v TP

Programovacie jazyky, rady, poradňa...
Pman
Novice
Novice
Príspevky: 7
Registrovaný: 12 apr 2008, 23:52

vypis vysledkov v TP

Príspevok od používateľa Pman »

Dobry den, potreboval by som poradit ohladne jedneho vypisu;

Je dany program, v ktorom z jedneho miesta odstartuje x objektov, vsetky prejdu cielovou rovinou a program vypise, ktore z nich sa umiestnilo prve,druhe,tretie...n-te

ak by ste mi vnukli nejaku myslienku, ako zistit, ako sa objekty umiestnili, bol by som vdacny :)

Kód: Vybrať všetko

program grafiker;
uses crt,graph;
var n,i,min,pomoc, grd,grm,krok : integer;
x: array [1..100] of integer;
retazec:string;
procedure grafika;
begin
detectgraph(grd,grm);
initgraph(grd,grm,'F:\Programy\TP\bgi');
end;


procedure max_pola;
begin;
for i:=1 to n do
if x[i]<x[i-1] then min:=x[i];
end;

procedure balon(x,y,f:integer);
begin
setcolor(f);
circle(x,y,10);

end;

begin
clrscr;
writeln('Kolko gul postavime na trat?');
readln(n);
grafika;
setcolor(yellow);
line (490,0,490,480);
line (100,0,100,480);
for i :=1 to n do begin x[i] :=150;
                        balon(x[i],20*i,i);
                        end;
readkey;

repeat
for i:=1 to n do begin
balon(x[i],20*i,0);
x[i]:=x[i]+random(5)+1;
balon(x[i],20*i,i);
delay(5);

end;  max_pola
until (keypressed) or (min>=getmaxx-150);

readkey;
closegraph;
for i:=1 to n do begin
writeln(x[i]);  end;


readkey;
closegraph;
end.
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

s pascalom som uz davno nerobil ale mam par postrehov:
1) procedura sa vola max_pola a ukladas do premennej min :? radsej spav ako funkiu co vrati danu hodnotu. bude sa ti to aj lepsie pouzivat a premenovat ju na min_pola
2) mam pocit ze ti tam chyba volanie randomize. inak ti ten random nebude fungovat

3) ako riesit ich poziciu: asi by som vyuzil nejake dalsie pole a nejaku integer premennu. mozno nie moc efektivne ale asi je to to co postacuje
nejaky pseudokod co upravuje tvoj repeat while:

Kód: Vybrať všetko

1  repeat
2   for vsety balony
3     vykresli balony
4     if neni dany balon za hranicou
5       nahodne pripocitaj hodnotu
6       if hodnota cez pozadovanu hranicu
7          pridaj na koniec druheho pola
8          +1 k premmennej urcujucej index posledneho prvku
9  while nebola stlacena klavesa a minimalna pozicia balonov nie je za pozadovanou hranicou
10 vykresli vsetky balony 
begin a end boli nahradene formatovanim ;)
// edit: ocislovane riadky
Pman
Novice
Novice
Príspevky: 7
Registrovaný: 12 apr 2008, 23:52

Príspevok od používateľa Pman »

asi sme sa celkom nepochopili alebo som to mozno napisal nejak zlozito :)

s vykreslenim tych balonov neni problem, ja potrebujem vypisat vysledky, teda musim nejako zistit, ktory balon prisiel do ciela prvy, druhy, treti a nasledne tieto vysledky vypisat;

teda za samotnymi pretekmi by mi vyskocila nejaka tabulka, v ktore by bolo napisane :
1.balon, ktory prekrocil cielovu hranicu bol balon #4
2.balon, ktory prekrocil cielovu hranicu bol balon #1
...
1)
k tomu max_pole a premenna min - sluzi na to, aby sa preteky zastavili, ked cielovu hranicu prekroci posledne auto, najprv som to mal opacne - preteky sa zastavili, ked cielom preslo prve auto, preto max_pole a premenna min - dik za pripomienku :)
2) j, randomize sa hodi :) len som sa cudoval, ze to az taky rozdiel nespravilo...
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Najskôr som sa čudoval, načo tam tú premennú min vlastne máš. Až teraz (keď si napísal, že to vlastne aj funguje) som si všimol, že ju nastavuješ vo funkcii. Normálnejšie riešenie by asi bolo, keby tá funkcia to číslo vrátila (a nenastavovala by globálnu premennú).
Pman
Novice
Novice
Príspevky: 7
Registrovaný: 12 apr 2008, 23:52

Príspevok od používateľa Pman »

chrono napísal:Najskôr som sa čudoval, načo tam tú premennú min vlastne máš. Až teraz (keď si napísal, že to vlastne aj funguje) som si všimol, že ju nastavuješ vo funkcii. Normálnejšie riešenie by asi bolo, keby tá funkcia to číslo vrátila (a nenastavovala by globálnu premennú).
to je sice pravda, ale aj tak to neriesi ten problem s konecnym postavenim balonov
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

To je síce pravda, ale keď to niekto urobí za teba, nič sa pri tom nenaučíš. ;)

Už si aspoň rozmýšľal, ako by sa to dalo urobiť? Skús sa zamyslieť a určite ti niekto potom poradí, ako to prípadne vylepšiť.
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

skus sa este raz pozriet na ten pseudokod :wink:
a zameraj sa na riadok c.7 ...co by bolo dobre ulozit do toho druheho pola a co potom bude to druhe pole obsahovat ked do neho budes zapisovat pomocou tej premennej z 8ho riadku?
a riadok c.8 len pre indexaciu toho druheho pola a obsahuje kolko prvkou uz bolo vlozenych (inicializaciu si urobis hadam aj sam)
Pman
Novice
Novice
Príspevky: 7
Registrovaný: 12 apr 2008, 23:52

Príspevok od používateľa Pman »

no teorie som mal, akurat som mal problem s ich vyuzitim v praxi :) ;
konkretne :
na konci je vypis, ako daleko sa ktory balon dostal ( v pixeloch), z toho, by som urcil najvacsieho clena a napisal jeho poziciu, potom by som urcil druheho najvacsieho clena a napisal jeho poziciu atd
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Ak by si to urobil tak ako píšeš, nemuselo by byť to poradie správne (poradie sa mohlo zmeniť až po cieľovej čiare).
Asi najjednoduchšie bude to, čo písal tuti. Teda, že budeš mať premennú poradie a pole, do ktorého si poznačíš v akom poradí prišli tie objekty.
Ak teda prekročí cieľ prvý objekt, do prvého prvku toho pola si uložíš číslo objektu a premennú poradie zvýšiš o 1. (teda niečo ako pole[poradie] = cislo_objektu; poradie++;)
Podmienku, pri ktorej sa to vloží do poľa budeš musieť urobiť tak, aby sa to tam vložilo iba raz (v tom momente, keď sa prekročí tá cieľová čiara).
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

chrono : preto je to if tam kde je

inak tie balony sa po prejdeni hranice zastavia a este to ma obmedzenie ze ak prejdu dva balony v jednom cykle naraz ciaru tak sa bere tem skorej spracovany a nie ten co je rychlejsi a zasiel dalej ale to by bolo asi na dlhsie tak robit
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Viem, že to tak máš, ale trochu sa to skomplikuje tým vymazávaním a kreslením balónov (ak majú byť zobrazené aj po tom, ako prekročia cieľ).

// chrono: Vlastne keď tak nad tým premýšľam, príliš sa to neskomplikuje (stačí dať to zobrazovanie až za tie podmienky).
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

ja viem ale povodne tam mal ze najskor vykreslil balony a potom pomenil a znova vykreslil tak som chcel ze nech sa najskor vykreslia a kreslia sa priebezne a vykresi sa nakoniec vysledok
Pman
Novice
Novice
Príspevky: 7
Registrovaný: 12 apr 2008, 23:52

Príspevok od používateľa Pman »

ak som to spravne pochopil, tak :

Kód: Vybrať všetko

repeat
 for i:=1 to n do begin
   balon(x[i],i*30,0);
   delay(5);
   if x[i] <= getmaxx-150 then begin
     x[i]:=x[i]+random(6);
     balon(x[i],i*30,i);
     if x[i] > getmaxx-150 then begin
      a[n-i+1]:=i; end;end;end;
 readkey;
until keypressed or (x[i]>= getmaxx-150);
kde v "A" bude ulozena pozicia vitaznych balonov?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

1. Zobrazovanie by som dal až za tie podmienky (aby sa ten balón vykresloval vždy).
2. Čo je v tej premennej n? Ak tam chceš mať aktuálne poradie, tak tam môžeš použiť a[n]:=i; n:=n+1;
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

n je pocet balonov takze zle ...
ty musis mat este jednu premennu kde bude pocet balonov ktore presli za cielovu liniu...takze namiesto toho n co daval chrono tam taj premennu "finished" alebo tak nejako

namiesto riadku a[n-i+1]:=i;
Pman
Novice
Novice
Príspevky: 7
Registrovaný: 12 apr 2008, 23:52

Príspevok od používateľa Pman »

povodne som to mal s druhou pomocnou premennou(finished napr), lenze mi to robilo aj tak chybu, ktoru som nasiel az teraz (taka ta tradicna drobna blbost, ktoru hladate 2 hodiny :) )

program uz v podstate funguje, lenze : Ked zadam 3,6,7,9,.. balonov, tak sa prog zasekne a do pola "A" sa nezapisuju cisla balonov

/edit : program

Kód: Vybrať všetko

program balon;
uses crt,graph;
var n,j,i,k, grd,grm : integer;
x,a: array [1..100] of integer;

procedure grafika;
begin
detectgraph(grd,grm);
initgraph(grd,grm,'F:\Programy\TP\bgi');
end;

procedure balon(x,y,f:integer);
begin
setcolor(f);
circle(x,y,10);
rectangle(x+5,y+20,x-5,y+15);
line(x+5,y+15,x+10,y);
line(x-5,y+15,x-10,y);
line(x,y,x,y+15);
end;

begin
clrscr;
writeln('Kolko balonov postavime na trat?');
readln(n);
grafika;
setcolor(red);
line (getmaxx-180,0,getmaxx-180,480);
line (100,0,100,440);
for i :=1 to n do begin x[i] :=100;
                        balon(x[i],30*i,i);
                        end;
readkey;
k:=1;
repeat
 for i:=1 to n do begin
   balon(x[i],i*30,0);
   if x[i] <= getmaxx-150 then begin
     x[i]:=x[i]+random(6);
     balon(x[i],i*30,i);
     delay(10);
     if x[i] > getmaxx-150 then begin
      a[k]:=i;
      k:=k+1;
      balon(x[i],i*30,i);
      delay(5);
      end;
    end;
 end;
for i:=1 to n do balon(x[i],i*30,i);
until keypressed or (x[i]>= getmaxx-150);
readkey;
closegraph;
for i:=1 to n do write(a[i]:4);

readkey;
end.
tuti
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 740
Registrovaný: 01 okt 2006, 19:23
Bydlisko: Prievidza

Príspevok od používateľa tuti »

tak na to sa da povedat len ...hmmm divne... asi tam bude este nejaka jedna blbost
Pman
Novice
Novice
Príspevky: 7
Registrovaný: 12 apr 2008, 23:52

Príspevok od používateľa Pman »

problem solved :)

problem bol v repeat until, pretoze program bezal dovtedy, kym nedosiel do ciela n-ty balon, ktory vsak nemusel byt posledny, tak som si pridal jedno pole, do ktoreho som ukladal pozicie balonov. podmienka teda bola :

repeat
bla bla
until pozicia[posledneho_balona] = getmaxx-150
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Stačilo tam kontrolovať, či je k rovné celkovému počtu.
Napísať odpoveď