Nerozumím rozdílu mezi standardním programem v pascalu a v pascalu OOP – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Nerozumím rozdílu mezi standardním programem v pascalu a v pascalu OOP – Pascal – Fórum – Programujte.comNerozumím rozdílu mezi standardním programem v pascalu a v pascalu OOP – Pascal – Fórum – Programujte.com

 

Gooo0
Newbie
19. 4. 2015   #1
-
0
-

Dobrý den

Vytvářím korespondenční úkoly do OOP a zjišťuji, že jej nechápu, respektive nechápu princip OOP. V prezentacích z přednášek, ale také v seriálech na internetu, je základní informace:

Objektově orientované programování vychází z běžného života, kde jsou různé objekty (lidé, věci, zvířata...), které mají své vlastnosti a metody (věk, barva...). Toliko chápu. Nechápu ale praktickou část a pokusím se uvést příklad:

Jako úkol mám vytvořit hodiny, kde se pohybuje alespoň jeden objekt. OK. V klasickém pascalu jsem si udělal program, kde zjednodušeně:

  • vytvořím si rámeček hodin
  • vytvořím si ciferník
  • vytvořím si číslice 3, 6, 9 a 12 a umístím na ciferník, aby to vypadalo jako hodiny
  • vytvořím si ručičku hodin

Tohle jsou tedy nějaké 4 objekty?

Něco by se v programu mělo hýbat, tedy zvolil jsem si ručičku. Ta je vytvořena úsečkou, která má nějaké počáteční a koncové souřadnice. Počáteční je vždy ve středu hodin. Napadlo mě vypočítat 60 souřadnic, které jsou po obvodu a výsledky vložit do umístění cílových souřadnic. Tato výsledná ručička se zobrazí na deelay (1000);, pak se vytvoří nová s novými cílovými souřadnicemi. Ve finále se ještě udělá druhá ručička s barvou pozadí, takže se vykreslí, vydrží sekundu a překreslí se novou v barvě pozadí.

OK. Zadání jsem splnil. Až na to, že to není řešeno jako OOP. Poradí mi někdo (prosím nějak polopatě, už jsem starší člověk a s pochopením mám fakt problém), jak z toho udělám to co mám. Mám tu ještě dva úkoly, tak kdyby se mi povedlo to pochopit, ty zbylé bych se pokusil už dělat správně...

Nahlásit jako SPAM
IP: 178.72.244.–
peter
~ Anonymní uživatel
4014 příspěvků
20. 4. 2015   #2
-
0
-

" Zadání jsem splnil. Až na to, že to není řešeno jako OOP." - To se dost spatne vysvetluje rozdil, kdyz si nechas reseni pro sebe.

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:3187:29...–
Gooo
~ Anonymní uživatel
50 příspěvků
20. 4. 2015   #3
-
0
-

Dekuji za reakci. Ja moc zadani psat nechtel, protoze to potrebuji vysvetlit nejak obecne. Ten priklad jsem pouzil proto, abych nevypadal ze se kouknu na zadani, reknu si ze nevim a bouchnu to na forum, kde mi to nekdo vyresi, ale ze jsem na tom delal.

Priklady, ktere mame v podpore, jsou ale charakteru ze se OOP primo nabizi ( vyuziva se dedicnost a tak), ale v tomto pripade si ty informace nejak neumim promitnout do toho.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 212.47.18.–
KIIV
~ Moderátor
+43
God of flame
20. 4. 2015   #4
-
0
-

Rozdil je v tom, ze standardni program mas vetsinou relativne natvrdo napsanej, maximalne pouzivas nejakou proceduru nakresli_hodiny(x,y,velikost). Pokud jich chces vic, tak musis pokazde zavolat nakresli hodiny se spravnymi parametry.

Naproti tomu objekt jen vytvoris s parametry jako pozice, velikost, casova zona, tvar a muzes je vytvorit treba v poli. Pak uz jen zavolas metodu vykresli a o vic se nestaras. U pole to volas v cyklu. U oop je hlavni prednost takzvany polymorfizmus (nevim jak je to zrovna v tvem prekladaci, free pascal a delphi by to umet mel) - kdy vytvoris zakladni tridu, ktera urci rozhrani zdedenych objektu a od ni pak zdedis tridy jako  "kulate_hodiny", "ctvercove_hodiny", "digitalni_hodiny", "binarni_hodiny" a z nich pak vytvoris objekty a ulozis do jednoho pole (o typu zakladni tridy). Pak zase cyklem volas metodu zobraz a objekty se uz postaraji o to, aby se zobrazily spravne.

Samozrejme objekt by nemel mit metodu zobraz jen ve stylu: kresli kruh((x+velikost)/2,(y+velikost)/2,velikost/2), a tak podobne. O to by se uz mohly starat dalsi objekty (nejmene tri: cifernik, mala a velka rucicka) a jen zase zavolat. Pak muzes stejnou rucicku pouzit jak pro kulate, tak pro ctvercove hodiny a jen nakreslit caru o nejakem mensim polomeru nez je polovina velikosti a urcitem uhlu (vyuzit stred_x+r_mala*cos(uhel_rad), stred_y+r_mala*sin(uhel_rad))

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
peter
~ Anonymní uživatel
4014 příspěvků
20. 4. 2015   #5
-
0
-

Objekty se pouzivaji pro zjednoduseni prace, propojeni toho, co k sobe patri. U tech hodin bys udelal procedury
hodinyKresli: hodinyCifernik(), hodinyRucicky(hodina);
hodinyKresliPosun(hodina): hodinyRucicky(hodina);
hodinyCifernik
hodinyRucicky(hodina): x = funkce(hodiny_poloha.x), y = funkce(hodiny_poloha.y), uhel = funkce(hodina)
hodiny_poloha: x,y

Nebo treba, kdyz resis uzivatele. Taky mas registrace, prihlasit, odhlasit. V tom objektu to mas pekne vsechno pohromade. Kdyz to budes chtit zkopirovat, tak to jen oznacis a zkopirujes. Nebo si to uloz jako "Unit" soubor.
Samozrejme si to muzes takhle krasne pojmenovat, aby ses v tom vyznal, ale pak se ti ten nazev muze s necim bit. Tahle by se ti bil jen jeden nazev, treba hodiny nebo uzivatel.

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:3187:29...–
Gooo0
Newbie
20. 4. 2015   #6
-
0
-

#5 peter
OK, můj program vypadá takto: (sorry za to okomentování, já si tím vlastně sám vysvětluji, co chci dělat)

program hodiny;
uses graph, crt;
var gd,gm: smallint;
    stredx, stredy, velikost, Z, Y, R, P, C: integer;

   procedure Ramecek;
   begin
      SetFillStyle (1,8);
      FillEllipse (stredx, stredy,velikost + 25,velikost + 25);
   end;

   procedure Cifernik;
   begin
      SetFillStyle (1,15);
      FillEllipse (stredx, stredy, velikost, velikost);
   end;

   procedure Stred;
   begin
      SetFillStyle (1,0);
      FillEllipse (stredx, stredy, velikost-190, velikost - 190);
   end;

   procedure dvanact;
   begin
      SetTextStyle(0,0,3);
      OutTextXY(stredx-20,stredy-180,'12');
   end;

   procedure tri;
   begin
      SetTextStyle(0,0,3);
      OutTextXY(stredx+160,stredy-10,'3');
   end;

   procedure sest;
   begin
      SetTextStyle(0,0,3);
      OutTextXY(stredx-10,stredy+160,'6');
   end;

   procedure devet;
   begin
      SetTextStyle(0,0,3);
      OutTextXY(stredx-180,stredy-10,'9');
   end;

begin
   stredx := 400;                              // Souřadnice středu hodin v ose x
   stredy := 400;                              // Souřadnice středu hodin v ose y
   velikost := 200;                            // Velikost hodin
   detectgraph (Gd,Gm);                        // Detekce grafického režimu
   initgraph(Gd,Gm, '');                       // Přepnutí do grafického režimu
   setcolor(0);                                // Barva pro kreslení čar nastavena

   Ramecek ();                                 // Vykreslení Rámečku
   Cifernik ();                                // Vykreslení ciferníku
   Stred ();                                   // Vykreslení středu hodin
   dvanact ();                                 // Vykreslení číslic
   tri ();
   sest ();
   devet ();

repeat
 Z:=round(150*sin(C*3.14/180));                // Vydělím a zaokrouhlím hodnotu první souřadnice, kde bude končit úsečka. Musí být kratší, aby nepřemazával číslice!
 Y:=round(150*cos(C*3.14/180));                // Vydělím a zaokrouhlím hodnotu druhé souřadnice, kde bude končit úsečka. Musí být kratší, aby nepřemazával číslice!
 R:=stredx+Z;                                  // Souřadnice linky
 P:=stredy-Y;                                  // Souřadnice linky
     SetLineStyle(0,0,3);                      // SetLineStyle(typcary,maska,tloustka)
     setcolor(4);                              // Nastavení barvy, která bude zobrazena
     line(stredx,stredy,R,P);                  // Úsečka vedena z počátečních souřadnic do koncových souřadnic
     delay (100);                              // Doba zobrazení ručičky. 1000 znamená sekunda, ale pro předvedení jsem zrychlil desetkrát

     {Překreslení ručičky na barvu ciferníku}
     setcolor (15);                            // Nastavení barvy, která překreslí ručičku na barvu pozadí
     line(stredx,stredy,R,P);
     setcolor(white);
     line(stredx,stredy,R,P);
     C:=C+6;                                   // Rozdělení na šedesát intervalů (sekund)
   until C>360;                                // Po uplynutí šedesáti sekund (otočení ručičky), se program ukončí
closegraph;                                    // Ukončení grafického režimu
end.

Zadání úkolu je:

Pomocí knihovny objektů a případně dědičnosti vytvořte barevný obrázek hodin. Definujte k němu metody a alespoň jeden pohyb, který zopakujete několikrát.

Jak jsem to nyní pochopil:

Hodiny se skládají z pěti objektů (rámeček hodin, ciferník s čísly, střed hodin, ručičku černou a ručičku v barvě ciferníku). Takže každý z těchto dílů tedy mohu vytvořit jako objekt. Tyto objekty vložím do knihovny, kterou si vytvořím a do programu budu jen volat. Jde v tomto případě nějak využít dědičnosti?

Edit: Ještě mě napadlo jinak. Mít jen tři objekty.

TRamecek - jen procedura na vykreslení rámečku

TCifernik - procedury číslic po obvodu, samotný ciferník a střed

TRucicka - jedna viditelná ručička a jedna přemazávající

Nahlásit jako SPAM
IP: 178.72.244.–
peter
~ Anonymní uživatel
4014 příspěvků
21. 4. 2015   #7
-
0
-

No, podivej. Objekt je jako celek. Pokud nema smysl vytvaret objekt, tak ho nedelej. V tomto pripade je hlavni objekt hodiny. Vsechno ostatni je pak uz jeho soucasti. Samozrejme muzes mit i objekty jako cifernik.
google = pascal object example, http://www.tutorialspoint.com/…_classes.htm
google = pascal type declaration example, http://www.tutorialspoint.com/…ta_types.htm

 Si myslim, ze si to ucitel predstavuje nejak takto:

{$mode objfpc} // directive to be used for defining classes
{$m+}		   // directive to be used for using constructor

program hodinyClass;

type
   Hodiny = class
   private
      stredx, stredy, velikost, Z, Y, R, P: integer;
   public
      constructor create(x, y, size: integer);
      procedure Ramecek();
      procedure Cifernik();
      procedure Posun(C);
end;

constructor Hodiny.create(x, y, size: integer);
begin
   stredx := x;
   stredy := y;
   velikost := size;
   C := 0;
   Ramecek ();                                 // Vykreslení Rámečku
   Cifernik ();                                // Vykreslení ciferníku
   Stred ();                                   // Vykreslení středu hodin
   dvanact (); 
end;

procedure Hodiny.neco(...);
begin
   ...
end;

procedure Hodiny.tikej();
begin
   repeat
     hhh.smaz(); // smaz rucicky
     hhh.kresli(C); // kresli nove rucicky
     delay (1000);
     C:=C+6;
   until C>360; 
end;

var
   hhh: Hodiny;

begin
   hhh := Hodiny.create(400, 400, 200);
   hhh.tikej();
end.
Nahlásit jako SPAM
IP: 2001:718:2601:1f7:a942:c2...–
Gooo0
Newbie
21. 4. 2015   #8
-
0
-

#7 peter
Pěkně udělané. Děkuji za zdroják. Já se to nejlépe naučím, když uvidím jak to má vypadat a nyní se pokusím to rozjet. Děkuji, jdu na to.

Nahlásit jako SPAM
IP: 178.72.244.–
peter
~ Anonymní uživatel
4014 příspěvků
22. 4. 2015   #9
-
0
-

No, opatrne, ja uz v packalu nedelam (php, javascript). Takze tam bude fura chyb.

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:8c5a:16...–
Gooo0
Newbie
22. 4. 2015   #10
-
0
-

#9 peter

aha a já pořád přemýšlím, co ještě smazat, aby to fungovalo :o). 

Nahlásit jako SPAM
IP: 178.72.244.–
Kit+15
Guru
22. 4. 2015   #11
-
0
-

#10 Gooo
Zkus ještě změnit názvy metod na slovesa. Dost to pomáhá chápání OOP.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:221:5...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Gooo0
Newbie
28. 4. 2015   #12
-
0
-

Zdravím

Děkuji za podporu. První ze tří příkladů se mi povedlo udělat a hodiny tak nějak fungují ve verzi OOP. Možná to někomu v budoucnu pomůže, tak níže přikládám zdrojový kód.

Jako doplňující dotaz se chci zeptat na nějakou online diskuzi. Kdysi ještě za CZFRee jsme komunikovali na kanálu IRC. Vyřešilo se vše online a mnohem rychleji a to včetně maličkostí, jež není vhodné řešit na fóru. Nevíte zda existuje nějaká taková možnost online diskuze i dnes u tématu programování. Mám nyní třeba další dva příklady a u jednoho vůbec nechápu zadání. Je možné, že programátor má na tohle jiný pohled a jen by se koukl a věděl by, takže by mě trochu nakopl.

program Hodiny;
uses crt, graph, UHodiny;
var gd,gm: smallint;
    stredx, stredy, velikostx, Z, Y, R, P, C: integer;
    Hodiny: THodiny;
    Rucicka: TRucicka;
begin
   detectgraph (Gd,Gm);               // Detekce grafického režimu
   initgraph(Gd,Gm, '');              // Přepnutí do grafického režimu
   setcolor(0);                       // Barva pro kreslení čar nastavena

   Hodiny.Init (500,500,200);
   Hodiny.Ramecek ();                 // Vykreslení Rámečku
   Hodiny.Cifernik ();                // Vykreslení ciferníku
   Hodiny.Stred ();                   // Vykreslení středu hodin
   Hodiny.Dvanact ();                 // Vykreslení číslic
   Hodiny.Tri ();
   Hodiny.Sest ();
   Hodiny.Devet ();


   Rucicka.Init (500,500,200);        // Souřadnice linky
   Rucicka.Tikej;
closegraph;                           // Ukončení grafického režimu
end.
Unit UHodiny;
interface
uses crt, graph;
type
   THodiny = object                                                     // Vytvoření objektu
   stredx, stredy, velikostx: integer;                                  // Lokální proměnné pro potřeby objektu
      constructor Init (stred_x, stred_y, velikost_x: integer);         // Metoda pro naplnění proměnných hodnotami
      procedure Ramecek;                                                // Metoda pro vykreslení rámečku
      procedure Cifernik;                                               // ...
      procedure Stred;
      procedure Dvanact;
      procedure Tri;
      procedure Sest;
      procedure Devet;
   end;

   TRucicka = object (THodiny)                                          // Vytvoření objektu
      constructor Init (stred_X, stred_Y, velikost_X: integer);         // Metoda pro naplnění proměnných hodnotami
      procedure Rucicka_1 (stred_X, stred_Y, R, P: integer);            // Rucicka zobrazena
      procedure Rucicka_2 (stred_X, stred_Y, R, P: integer);            // Rucicka v barve ciferniku
      procedure Tikej;                                                  // Metoda pro posun ručičky
   end;

implementation
   constructor THodiny.Init (stred_x, stred_y, velikost_x: integer);
      begin stredx := stred_x; stredy := stred_y; velikostx := velikost_x; end;

   constructor TRucicka.Init (stred_X, stred_Y, velikost_X: integer);
      begin stredx := stred_x; stredy := stred_y; velikostx := velikost_x; end;

   procedure TRucicka.Rucicka_1 (stred_X, stred_Y, R, P: integer);
      begin SetLineStyle(0, 0, 3); Setcolor(4); Line(stred_x, stred_y, R, P); delay (100); end;

   procedure TRucicka.Rucicka_2 (stred_x, stred_y, R, P: integer);
      begin SetLineStyle(0, 0, 3); Setcolor(15); Line(stred_x, stred_y, R, P); end;

   procedure TRucicka.Tikej;
   var Z, Y, R, P, C: integer;
      begin C := 0;
         repeat
            Z := round(150 * sin(C * 3.14 / 180));                      // Vydělím a zaokrouhlím hodnotu první souřadnice, kde bude končit úsečka. Musí být kratší, aby nepřemazával číslice!
            Y := round(150 * cos(C * 3.14 / 180));                      // Vydělím a zaokrouhlím hodnotu druhé souřadnice, kde bude končit úsečka. Musí být kratší, aby nepřemazával číslice!
            R := stredx + Z;                                            // Souřadnice linky
            P := stredy - Y;                                            // Souřadnice linky
            Rucicka_1(stredx, stredy, R, P);
            Rucicka_2(stredx, stredy, R, P);
            C := C + 6;                                                 // Rozdělení na šedesát intervalů (sekund)
         until C > 360;                                                 // Po uplynutí šedesáti sekund (otočení ručičky), se program ukončí
      end;

   procedure THodiny.Ramecek;
   begin SetFillStyle (1,8); FillEllipse (stredx, stredy, velikostx + 25,velikostx + 25); end;

   procedure THodiny.Cifernik;
   begin SetFillStyle (1,15); FillEllipse (stredx, stredy, velikostx, velikostx); end;

   procedure THodiny.Stred;
   begin SetFillStyle (1,0); FillEllipse (stredx, stredy, velikostx -190, velikostx -190); end;

   procedure THodiny.Dvanact;
   begin SetTextStyle(0,0,3); OutTextXY(stredx -20, stredy -180,'12'); end;

   procedure THodiny.Tri;
   begin SetTextStyle(0,0,3); OutTextXY(stredx +160, stredy -10,'3'); end;

   procedure THodiny.Sest;
   begin SetTextStyle(0,0,3); OutTextXY(stredx -10, stredy +160,'6'); end;

   procedure THodiny.Devet;
   begin SetTextStyle(0,0,3); OutTextXY(stredx -180,stredy -10,'9'); end;
end.
Nahlásit jako SPAM
IP: 212.47.18.–
peter
~ Anonymní uživatel
4014 příspěvků
28. 4. 2015   #13
-
0
-

Kdyz na vykresleni hodin mas 7 ruznych procedur, tak je asi neco spatne :) Normalne bys to vykresloval treba jednim obrazkem na pozadi. Pro zajimavost, bitmapa 400x3 pixelu x 3/2 pro base64 ma 1800 znaku, jako gifik treba 300.  Kdybys umel s gifem nebo bmp pracovat.

Pascal tusim umi nejak vykreslovat celou plochu, kdyz si ji ulozis nebo vykreslis do jakehosi druhu promenne. Uz si presne nevzpomenu, pac je to 10 let, co sem pracoval s packalem. Tez jsme ve skole pouzivali jakesi vykreslovani pres pameti. Ze se to vykreslilo do jakesi ze 4 pameti a pak se vybralo kterou z nich ma pouzivat pro zobrazeni na monitoru. Otazkou je, zda je to packal nebo napodobenina jako treba free-packal, tam se uz tyhle veci neresi.

Kdyby ti zalezelo na rychlosti, lze si predpocitat sin, cos, deleni, proste vsechny data z toho pocitano do tabulky. Nebo aspon jejich cast. Nacteni z pameti byva rychlejsi nez treba deleni, sinus, kosinus...

Jinak pekne, jestli ti to funguje.

Pokud nerozumis zadani, zkus ho sem napsat. A pripis, ze bys treba chtel zadani vysvetlit. Nebo, ze te zajima i reseni. Ten, kdo dela zadani, ho vetsinou neumi napsat. S tim se setkas v praci dost casto, pokud nejsi ve specializovane firme, kde uz maji sve postupy a zadani pretlumoci ten, ktery prevezme zakazku :) casto takove zadani zni treba newsletter. Nemas tuseni, co si pod tim zakaznik predstavuje. Asi, ze to bude delat vsechno samo. Ale, kde to veme informace? Aby tam ty informace nemusel nikdo zadavat. A kde to veme tedy ty informace nebo ty, ktere tam budou chybet? :) Treba tady ve firme je desnej problem udelat kontakty na zamestnance. Ruzna oddeleni si prijmou koho chteji. Jde to pres personalni, ale zadna zpetna vazba k IT. Takze tam nemame spoustu lidi, telefonu, zmeny (titul, prijmeni, ...). Nikdo za to nechce zodpovidat. Nikdo nechce vydat presne pokyny, kdo ma koho kdy kontaktovat. Co je proti tomu tve neuplne zadani? :)

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:6541:d6...–
Mircosoft+1
Věrný člen
5. 5. 2015   #14
-
0
-

#12 Gooo
K té online diskusi: doporučuji zapátrat po termínech "chat" nebo "instant messenger" - to jsou prostředky, které umožňují rychlou textovou (případně i jinou) komunikaci. Ale už neporadím, kde konkrétně hledat nějakou skupinu lidí, kteří by se bavili zrovna o programování.

Nahlásit jako SPAM
IP: 94.113.255.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

OOP v Pascalu — založil Garret Raziel

Os v Pascalu — založil Honza

Z C do Pascalu — založil Momok

Kniha o pascalu? — založil raddino

Příklad v pascalu — založil Lolo24

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý