Začíname s pascalom- jednoduchší algoritmus?

Programovacie jazyky, rady, poradňa...
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Začíname s pascalom- jednoduchší algoritmus?

Príspevok od používateľa Mr-Freek »

Zdravíčko, som začiatočník v pascale a napredujem podla školskej literatúry. Dnes som dostal zadanie vytvoriť šachovnicu 8x8 na ktorej sa budú striedať 2 farby. Daná úloha bola pri kapitole "Podmienený príkaz" ale moje riešenie ho obsahuje len okrajovo a celkovo som sa s tým trápil asi 20 minút čo sa mi zatiaľ nestalo. Preto sa chcem spýtať či sa dá pomocou podmienok napísať jednoduchší algoritmus. D pozdravom.

Kód: Vybrať všetko

var x,y,i,j,n,m,o:integer;
begin
  x:=0;
  y:=175;
  N:=1;
  for I:= 1 to 8 do
  begin
    if I mod 2=0 then
       image1.canvas.brush.color:=clBlue
    else image1.canvas.brush.color:=clRed;
      for J:= 1 to N do
      begin
        image1.canvas.rectangle(x,y,x+25,y+25);
        y:=y+25;
        x:=x+25
      end;
    y:=y-(25+(n*25));
    x:=x-n*25;
    N:=N+1;
  end;

  y:=0;
  x:=25;
  N:=7;
  image1.canvas.brush.color:=clBlue;
  for M:= 1 to 8 do
  begin
    if M mod 2=0 then
      image1.canvas.brush.color:=clBlue
    else image1.canvas.brush.color:=clRed;
      for O:=1 to N do
      begin
        image1.canvas.rectangle(x,y,x+25,y+25);
        y:=y+25;
        x:=x+25;
      end;
    x:=x+25-n*25;
    y:=y-n*25;
    n:=n-1;
  end;
end;  
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Začíname s pascalom- jednoduchší algoritmus?

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

to vykreslovanie robíš zbytočne zložito, stačí nakresliť jeden veľký štvorec, a potom v jednom cykle od 1 po 7 robiť čiary od 0 po rozmer_stvorca. A to v tom cykle spravíš dvakrát, len raz vymeníš x-ové súradnice za y-onové. Vždy posun o rozmer_stvorca / 8.

Potom skáčeš v cykle od 0 po 63, pričom aktuálnu súradncu získaš ako y=i div 8 a x=i mod 8. Farbu získaš ako i mod 2. Tie súradnice máš šachovnicové, takkže aby si to mohol vyfarbovať potom x aj y prenásobiš šírkou štvorčeka.
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Začíname s pascalom- jednoduchší algoritmus?

Príspevok od používateľa Mr-Freek »

To vykreslenie chápem ale tú aktuálnu súradnicu vôbec.. pod I myslíš počítadlo cyklu? farbu som vlastne získal rovnako aj ja.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Začíname s pascalom- jednoduchší algoritmus?

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

áno, počítadlo cyklu. Je to iba matematika. I div 8 ti povie, v ktorom riadku si (lebo v každom ich je osem). A i mod 8 ti povie, koľko v tom riadku presahuješ od nuly, teda aktuálny stlpec
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Začíname s pascalom- jednoduchší algoritmus?

Príspevok od používateľa Mr-Freek »

Stále som to nechápal tak som to skúsil napísať ale nefunguje to, zatiaľ to nechám tak ale ak by si si náhodou našiel čas vysvetlil by si mi ten princíp súkromne? buď sa na to riešenie pozerám zo zlého uhlu (prípadne je to zatiaľ mimo moje znalosti) alebo som príliš hlúpy :D dúfam že je to prvý dôvod aj keď bohvie. tak či tak ďakujem za pomoc
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Začíname s pascalom- jednoduchší algoritmus?

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

Mr-Freek napísal:Stále som to nechápal tak som to skúsil napísať ale nefunguje to, zatiaľ to nechám tak ale ak by si si náhodou našiel čas vysvetlil by si mi ten princíp súkromne? buď sa na to riešenie pozerám zo zlého uhlu (prípadne je to zatiaľ mimo moje znalosti) alebo som príliš hlúpy :D dúfam že je to prvý dôvod aj keď bohvie. tak či tak ďakujem za pomoc
áno, počítadlo cyklu. Je to iba matematika. I div 8 ti povie, v ktorom riadku si (lebo v každom ich je osem). A i mod 8 ti povie, koľko v tom riadku presahuješ od nuly, teda aktuálny stlpec
img044.jpg
Tie súradnice máš šachovnicové, takkže aby si to mohol vyfarbovať potom x aj y prenásobiš šírkou štvorčeka.
súradnica napríklad [2,3] ti hovorí ktorý je to štvorec, ale aby si vedel kde presne začína, tak to bude [2*šírka štvorčeka, 3*šírka štvorčeka] lebo pred nimi sú dva riadky a tri stlpce
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Začíname s pascalom- jednoduchší algoritmus?

Príspevok od používateľa Mr-Freek »

Pochopené, ďakujem za ochotu a pomoc. Teraz mi to príde jednoduché ale sám by som s podobným riešením neprišiel.. buď sa na programovanie nehodím alebo to chce cvik a prax. Ukáže čas :)

//autoeditácia príspevku (15 Júl 2014, 21:05)
Pridávam ďalší program, funguje v poriadku, očakávam dotazy k zložitosti algoritmu pretože ak ma skúsenejší poučia veľa sa z toho naučím. Program mal rozdeliť plochu na 4 pásy rôznych farieb a následne podla toho v ktorom páse sa bude nachádzať vygenerovaná súradnica sa nakreslí útvar. Tie som písal ako procedúry a zbytočne ich sem nedávam. Ak sa moje postovanie programov a čakanie komentárov ráta ako SPAM upozornite ma prosím, ja to robím s dobrým úmyslom.

Kód: Vybrať všetko

begin
  image1.canvas.Brush.color:=rgbtocolor(102,178,255);
  image1.canvas.Rectangle(0,0,image1.width,image1.height);
  image1.canvas.brush.color:=rgbtocolor(128,255,0);
  image1.canvas.rectangle(0,image1.Height div 4,image1.width,image1.height);
  image1.canvas.Brush.color:=rgbtocolor(0,102,204);
  image1.canvas.rectangle(0,(image1.Height div 4)*2,image1.width,image1.height);
  image1.canvas.brush.color:=rgbtocolor(153,76,0);
  image1.canvas.rectangle(0,(image1.height div 4)*3,image1.width,image1.height);

  image1.canvas.pen.color:=clBlack;
  image1.canvas.pen.width:=1;
  y:=random(500);
  x:=random(500);

  case y div (image1.height div 4) of
  0:vtak(x,y);
  1:strom(x,y);
  2:ryba(x,y);
  3:dom(x,y);
  end;
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Začíname s pascalom- jednoduchší algoritmus?

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

Kód: Vybrať všetko

image1.canvas.Brush.color:=rgbtocolor(102,178,255);
  image1.canvas.Rectangle(0,0,image1.width,image1.height);
  image1.canvas.brush.color:=rgbtocolor(128,255,0);
  image1.canvas.rectangle(0,image1.Height div 4,image1.width,image1.height);
  image1.canvas.Brush.color:=rgbtocolor(0,102,204);
  image1.canvas.rectangle(0,(image1.Height div 4)*2,image1.width,image1.height);
  image1.canvas.brush.color:=rgbtocolor(153,76,0);
  image1.canvas.rectangle(0,(image1.height div 4)*3,image1.width,image1.height);
túto časť vieš zapísať pekne v cykle, lebo sa tam mení iba jeden parameter (okrem farby). V podstate na tom nie je nič zlé, no ak by tých pásov bolo viac, tak by to bol celkom pekný chaos, keď to môže byť zapísané takto pekne:

Kód: Vybrať všetko

for i:=0 to 4 do begin
   image1.canvas.Brush.color:=farba[i];
   image1.canvas.rectangle(0,(image1.Height div 4)*i,image1.width,image1.height);
end;
  
a farby pekne pokope definované v poli farba. No a aby sa ti tam neopakovalo toľkokrát to image1.canvas, tak ešte:

Kód: Vybrať všetko

for i:=0 to 4 do begin
   with image1.canvas do begin
      Brush.color:=farba[i];
      rectangle(0,(image1.Height div 4)*i,image1.width,image1.height);
   end;
end;
Boccaccio
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1097
Registrovaný: 01 mar 2014, 14:00
Bydlisko: Bratislava

Re: Začíname s pascalom- jednoduchší algoritmus?

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

Mr-Freek napísal:Pochopené, ďakujem za ochotu a pomoc. Teraz mi to príde jednoduché ale sám by som s podobným riešením neprišiel.. buď sa na programovanie nehodím alebo to chce cvik a prax. Ukáže čas :)
chce to cvik a prax :smt006
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Začíname s pascalom- jednoduchší algoritmus?

Príspevok od používateľa Mr-Freek »

zatiaľ neovládam polia takže som to nevedel dať do cyklu aj keď som o tom rozmýšlal a ten príkaz s "with image1.canvas do" mali v mojej literatúre spomenúť už dávno.. asi sú tam medzery. ďakujem
dykeer
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 102
Registrovaný: 02 jan 2011, 21:21
Kontaktovať používateľa:

Re: Začíname s pascalom- jednoduchší algoritmus?

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

OT: raz bola na nemenovanej VŠ študentská súťaž v programovaní a úloha bola napísať algoritmus na vykreslenie šachovnice. Viete koľko veľa riešení má táto úloha ?

Ak si raz vymyslíš funkčný algoritmus....zamysli sa, ako by sa dal zjednodušiť...tomu sa hovorí optimalizácia.
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Začíname s pascalom- jednoduchší algoritmus?

Príspevok od používateľa Mr-Freek »

Neskôr sa nad takýmto typom úlohy určite ešte pozastavím ale zatiaľ chcem ísť ďalej a učiť sa nové príkazy/typy premenných možno aj programovacie jazyky aby som tú nazvime to zjednodušenú verziu vedel aj napísať nie len vymyslieť. Mne skôr ide o ten pohľad na zaužívané algoritmy vytvorené skúsenejšími. Určite si z nich niečo zoberiem a sám tak vylepším svoje zmýšľanie čo sa týka riešenia úloh.

//autoeditácia príspevku (16 Júl 2014, 20:26)
Výsledok dnešnej "roboty". Semafór ktorý po určitom čase zmení farbu ako to väčšinou semafór robí. Nastavil som 3 časovače z čoho bol zapnutý len druhý. Všetky kreslili jeden kruh farebný a ostatné na šedo + vypínali časovač za sebou a zapínali pred sebou. Semafór a prvý červený kruh som nechal nakresliť do procedúry ktorá sa vykoná spolu so zapnutím programu (dvojklik na prázdne miesto, názov mi uniká). Každý časovač bol nastavený na dobu ktorú má na semafóre pobudnúť farba časovača pred ním. Zaujíma ma hlavne či sa to nedalo spraviť pomocou jedného časovača.. v literatúre som ale nemal príkaz na zmenu intervalu časovača.


semafór
Spoiler

Kód: Vybrať všetko

begin
  image1.canvas.brush.color:=clWhite;
  image1.canvas.fillrect(image1.clientrect);
  with image1.canvas do
  begin
    brush.color:=rgbtocolor(160,160,160);
    rectangle(95,450,145,630);
    rectangle(35,52,205,452);
    brush.color:=clRed;
    ellipse(75,72,165,172);
    brush.color:=rgbtocolor(32,32,32);
    ellipse(75,192,165,292);
    ellipse(75,312,165,412);
  end;
end;     
Časovač (konkrétne prvý)
Spoiler

Kód: Vybrať všetko

begin
  timer3.enabled:=false;
  timer2.enabled:=true;
  with image1.canvas. do
  begin
    brush.color:=clRed;
    ellipse(75,72,165,172);
    brush.color:=rgbtocolor(32,32,32);
    ellipse(75,192,165,292);
    ellipse(75,312,165,412);
  end;
end;          
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Začíname s pascalom- jednoduchší algoritmus?

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

samozrejme že dá, ja si to z hlavy už nepamätám a nechce sa mi hladať, ale tipujem že sa to bude volať interval alebo limit alebo niečo podobné :) Ten čas si predsa musel definovať (nastaviť mu premennú), len si to asi spravil cez object inspectora. Takže nechápem čo sa vlastne pýtaš, lebo tvoja otázka je "neviem ako sa volá vlastnosť, ktorú som zmenil a píše mi ju tam"
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Začíname s pascalom- jednoduchší algoritmus?

Príspevok od používateľa Mr-Freek »

áno upravil som to cez object inspector ale nevedel som ako sa to píše v kóde. Vlastne stále neviem :) neprišlo mi ako jasná súvislosť že keď sa niečo dá zmeniť v object inspector pôjde to aj v kóde.. ale tak či tak info som dostal a strýko google mi už príkaz hádam pomôže nájsť. Ak bola moja otázka smerovaná naozaj tak zle tak ma to mrzí, ospravedlnujem sa.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Začíname s pascalom- jednoduchší algoritmus?

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

ak sa tá vlastnosť volá interval, a timer sa volá Timer1, tak to bude Timer1.interval := 1000; pre sekundu, napríklad.
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Začíname s pascalom- jednoduchší algoritmus?

Príspevok od používateľa Mr-Freek »

áno je to presne tak, použil som to naschvál v ďalšom programe. Kým sem hodím ďalší kód tak si najprv premyslím otázky ;)

//autoeditácia príspevku (16 Júl 2014, 23:38)
Posledná úloha na precvičenie časovaču v pascale.. doteraz bola posledná vždy najťažšia. Pridávam len pre pobavenie ako to vyzerá keď sa už autorom knihy nechce :D
Napíšte program, ktorý každých päť sekúnd zmaže obrazovku a veľkými písmenami napíše jedno zo známych slovenských porekadiel. Porekadlo vyberie z niekolkých predpripravených (aspoň troch).
dykeer
Medium Expert
Medium Expert
Používateľov profilový obrázok
Príspevky: 102
Registrovaný: 02 jan 2011, 21:21
Kontaktovať používateľa:

Re: Začíname s pascalom- jednoduchší algoritmus?

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

Mr-Freek napísal:áno je to presne tak, použil som to naschvál v ďalšom programe. Kým sem hodím ďalší kód tak si najprv premyslím otázky ;)

//autoeditácia príspevku (16 Júl 2014, 23:38)
Posledná úloha na precvičenie časovaču v pascale.. doteraz bola posledná vždy najťažšia. Pridávam len pre pobavenie ako to vyzerá keď sa už autorom knihy nechce :D
Zachytávaj fakty (5 sekúnd, zmaže obrazovku, veľké písmená, vyberie, porekadlá) = (Timer, clear, UpperCase, random, array of string)

Inak najlepšie je, keď si nejakú úlohu vymyslíš sám. Niečo, čo ťa baví. Na tom sa najlepšie naučíš.
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Začíname s pascalom- jednoduchší algoritmus?

Príspevok od používateľa Mr-Freek »

Mne je jasné že človek potrebuje určité znalosti ale keď si to porovnáš s úlohou kde sa guľa určitým smerom pohybuje po ploche a pri image1.height a width sa odrazí a zmení smer mi to prišlo smiešne. Väčšinou si úlohy nevymýšlam sám ale vylepšujem tie zadané. Zabávam sa s tým :)
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Začíname s pascalom- jednoduchší algoritmus?

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

Tak ano, opengl aby si mohol v delphi spravit 3d gulu je uz vyssi level
Mr-Freek
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 469
Registrovaný: 14 júl 2014, 13:23

Re: Začíname s pascalom- jednoduchší algoritmus?

Príspevok od používateľa Mr-Freek »

Bodaj by bola 3D :) asi by sa skôr hodilo pomenovanie kruh aby nevznikal dojem že viem, niečo čo (zatiaľ) neviem.

//autoeditácia príspevku (18 Júl 2014, 11:48)
Dnes otázka bez kódu, ako zakážem Lazarusu vytvárať pri spustení už napísaného programu .exe súbor? Alebo sa dá zmenšiť na menej ako 15mb? ďakujem za pomoc, google nepomohol.

//autoeditácia príspevku (29 Júl 2014, 10:26)
Zdravíčko, potreboval by som menšie vysvetlenie, jedná sa o to že neviem pochopiť fungovanie cyklu

Kód: Vybrať všetko

for B:= X=1 to X=2 do
za predpokladu že b:boolean; x:integer; a x:= 0, 1 alebo 2. Dostal som úlohu logicky určiť koľko krát sa cyklus zopakuje.. ďakujem za vysvetlenie.
Napísať odpoveď