2010. június 30., szerda

Ismerkedés a C#-al és a .NET Framework-el

Mivel ősztől az egyetemen .NET programozás kapcsán a C# nyelvet fogjuk tanulni, ezért egy picit elébe megyek a dolgoknak és elkezdek ismerkedni ezzel a nyelvvel és a platformmal.
Itt a blogban a C# és .NET cimkékkel ezeket a bejegyzéseket fogom jelölni.
Alapjaiban az egészet talán onnan érdemes megközelíteni hogy a Sun megtiltotta a Microsoftnak hogy a nagy sikereket elért JAVA-t a - JRE-t és a JDK-t - beintegrálja a Windows XP telepítőkészletbe. Ezért a Microsoft elkezdett fejleszteni egy hasonló dolgot mint a Java. Azaz egy virtuális gépet, egy programozói és egy futtató környezetet jól kidolgozott és átgondolt osztályhierarchiával. Ez lett a .NET Framework. A nagy különbség hogy ez szinte minden most futó windowson integrált része az operációs rendszernek, így mindenhol rendelkezésre áll, míg a Javát telepíteni kell (ez sem ördöngősség, de mégis foglalkozni kell vele). A másik különbség, hogy ugyan platformfüggetlennek tervezték a .NET-et de gyakorlatilag csak a Microsoft rendszereiben valósult meg (vannak kivételek MONO, vagy a DOTGNU).
Segítségével gyors és hatékony Windows programokat lehet készíteni a legmodernebb technikákkal.
A .Net-et jellemzően a C# nyelvvel lehet programozni, de a Visual Studio össze eszköze már erre is használható (Visual Basic.NET és a J#).
A C# - ez a blog alapja végülis - egy C++ szerű teljesen objektum orientált programnyelv. Nagy hasonlóságok fedezhetők fel a Java nyelvvel való összehasonlítás kapcsán.

2010. június 23., szerda

Az adatok

Az algoritmusok utasítások sorozata, melyet az adott programozási nyelv lehetőségeit és eszközkészletét felhasználva a bemenő adatokból a kívánt kimenetet adja.
Beszéltünk már a strukturális programozás vezérlési szerkezeteiről. Ezek utasítások, azok ismételgetése stb. Az utasítások azonban adatokon dolgoznak. De mik ezek az adatok? Milyen típusai vannak? Számít-e a típus? Ezek a kérdések felmerülhetnek az adatokkal kapcsolatban.
Először próbáljunk felsorolni néhány adatot.
  • a háromszög oldalának hossza
  • a felhasználó neve
  • a kedvenc színünk
Ezek az adatokat a számítógépen kezelnünk kell tudni. Ehhez az kell hogy a számítógép tárolni (ábrázolni) tudja ezeket. Az adatok egyik legfontosabb tulajdonsága a típusa. Ez határozza meg hogy az adatokkal milyen műveleteket tudunk végrehajtani, illetve adott műveletek eredménye milyen típusú adatot szolgáltat.
Az alapvető típusok:
egész számok
lebegőpontos számok
karakter
szöveg
logikai érték
A programozási nyelvekben általában ezek rendelkezésre állnak és ráadásul többféle megvalósításban. Ugyanis a típus mellett a másik fontos tulajdonsága az adatoknak az ábrázolható tartomány. Egész szám pl az 5 vagy a -531, de a 1232145 is. A különböző megvalósítások általában figyelembe veszik hogy pozitív számokat vagy előjeles számokat akarunk tárolni. A tárolás alapegysége a byte, ami 8 bitet jelent. Ezen a legnagyobb ábrázolható pozitív egész szám a 255. Ennél nagyobb számokat úgy tudunk ábrázolni ha több bájtot összefogunk. Ugyan ez érvényes a lebegőpontos számokra is, amik ráadásul speciálisan vannak tárolva (ezzel nem akarok most itt foglalkozni). Egy karaktert ASCII kódjával tárolunk, ami 0-255 közötti egész szám. Egy szöveg több karakter egymás után írása, azaz karaktersorozat. Ezt annyi bájton tároljuk ahány karakterből áll és speciálisan tárolni kell a hosszát, vagy jelölni kell a végét.

Egyelőre ennyit az egyszerű adattípusokról. Apropó! Ugyanis vannak összetett adattípusok is, de erről kicsit később beszélünk.

A vezérlési szerkezetek

Az előző cikkekben volt néhány nagyon egyszerű példa, amiknek a szerkezete valami ilyesmi volt:
START -> ADATBEKÉRÉS -> MATEMATIKAI MŰVELETEK -> ADATKIÍRÁS -> STOP

Az ilyen szerkezetet hívják szekvenciának, azaz sorozatnak. Elkezdődik valahol és egyenesen elágazás nélkül halad a cél felé. De mi van akkor ha nem ilyen egyértelmű a dolog? Mondjuk ellenőrizni kell valamit és az ellenőrzés eredményétől függően halad tovább a végrehajtás? Mondjuk ellenőrizni akarjuk a háromszög kerületszámoló programunkban, hogy a megadott oldalhosszakkal valóban lehet háromszöget rajzolni. (ezt a példát is meg fogjuk később csinálni)
A másik probléma az hogy mit csináljunk akkor ha egy adott tevékenységsorozatot többször végre kell hajtani? Például ki akarjuk íratni a számokat 1-100 között. Persze megcsinálhatjuk úgy is hogy írunk 100 db kiírató utasítást, csak egyrészt ez nem igazán programozás, másrészt ha vizsgán ilyet csinálnál akkor gondolkozás nélkül vágnának ki, pedig működik a program.....


Ezeket a fentebb vázolt dolgokat nevezik vezérlési szerkezeteknek. Ezeket tekintjük most át.
Egy programozási nyelv vezérlési szerkezetei (és adatszerkezeti) határozzák meg hogy az adott nyelvven milyen stílusú programozás valósítható meg. A legáltalánosabban használt programozási módszer a struktúrális programozás. Ennek lényege hogy szekvenciákkal (soronkénti végrehajtás), iterációkkal (ciklusok szervezése) és szelekciókkal (feltételes elágazások) minden probléma megoldható.

  • Szekvencia: utasítások egymásutáni végrehajtását jelenti elágazások és ismétlések nélkül.
  • Szelekció: egy logikai feltétel eredményétől függően elágazik a program végrehajtása.
  • Iteráció: egy logikai kifejezés eredményétől függően ismételten végrehajtunk egy programrészt.Ezt nevezzük ciklusnak is.
Ezeket nézzük meg hamarosan részletesebben.

2010. június 22., kedd

Írjuk le saját szavakkal a programot

Megkérdezheted hogy mire jó ez az egész, hogy ilyen baromságokkal foglalkozom és nem valamilyen programnyelven keresztül mutatom be a programozást. Nos a válasz az, hogy mellékes dolog az ha egy problémát leprogramozol (meghatározod az input és output adatokat, a rajtuk végzendő műveleteket) azt milyen eszközzel jegyzed le. Az elején ha elkezdjük egy adott jól ismert programnyelv használatát, akkor arra fogunk koncentrálni, hogy a nyelvnek mik a lehetőségei, milyen korlátai vannak, mik a szabályok amit be kell tartani, előtérbe kerül maga a fordító program is és elveszik a lényeg: a programozás, az algoritmizlás, az analizálás az optimalizálás. Pedig a lényeg éppen ez. Nem az a fontos hogy milyen eszközzel jegyezzük le a programot, hanem az hogy meg tudjuk fogalmazni magunknak, rendszerezni tudjuk és logikus érthető formában álljon rendelkezésre. A későbbiekben nem fogod természetesen lejegyezni így a programterveidet, de most az elején szükséges hogy ennek segítségével a lényegre koncentrálj.


Ha meg tudod fogalmazni egyszerű mondatokkal az elkészítendő programot, akkor a nehezén túl vagy. Ebben kell gyakorlatot szerezni, aztán a kódolás már gyerekjáték lesz.

Absztrakció - lépjünk közelebb a kódoláshoz

A programozással készen is vagyunk. Ha meg tudsz fogalmazni ilyen módon problémákat (bemenet, kimenet, adatok, műveletek) akkor már tudsz programozni. Nagyon fontos hogy leírd ezeket, mert különben azt hiszed hogy tudod és mikor vizsgán valóban adoptálni kell akkor meg lesünk ki a fejünkből és nem tudjuk miért nem megy.
Szóval még néhány példa:

Két bekért számról döntsük el hogy mennyi a különbségük. Ezt írjuk is ki.
Kérjük be az első számot (SZ1)
Kérjük be a második számot (SZ2)
Vonjuk ki az elsőből a másodikat, majd vegyük annak abszolút értékét. (K=ABS(SZ1-SZ2))
Írjuk ki a különbséget (K)
Kérjük be egy személy születési évét, majd írjuk ki hogy hány éves:
Kérjük be a születési évet (SZULEV)
Vonjuk ki az aktuális évből a születési évet és tároljuk (KOR=YEAR()-SZULEV)
Írjuk ki a kiszámolt értéket (KOR)
Nem ragozom tovább.
Mint láthatod vannak általában használható egyéb műveletek is. Ilyen az ABS() és a YEAR(). Ezek olyan dolgok amit feltételezünk hogy rendelkezésre állnak. Mindig utána kell járni hoyg valóban léteznek-e. (Nekünk a Széchenyi Egyetemen egy absztrakt pszeudó nyelvet találtak ki és abban léteztek ilyen funkciók. Ezt ki is emelték és alkalmazhattuk! A dokumentációban szerepelt.)

És akkor nézzünk egy picit absztraktabb úgynevezett pszeudó nyelven megfogalmazott példát.
Először természetesen a kerületszámoló algoritmust nézzük:
Be: A
Be: B
Be: C
K<- A+B+C
Ki: K
Két szám különbsége (fenti első példa):
Be: SZ1
Be: SZ2
K<-ABS(SZ1-SZ2)
Ki: K
Életkor kiírása:
Be: SZULEV
KOR<-YEAR()-SZULEV
Ki: KOR
Hú mennyi programot írtunk hirtelen.....
Ezek nagyon egyszerű dolgok, de ne felületesen kezeld ezeket. Legalább 10 problémát keress, fogalmazd meg és írd le ilyen pszeudó kóddal.
Eleve az hogy keresel magadnak feladatot az is nagyon sokat segít, hiszen már analitikusan vizsgálod a körülötted lévő világot. Azon gondolkodsz vajon mi az amit ilyen módon algoritmizálni lehet?

Első program

Az első postban írtam hogy életem első önálló programja egy háromszög kerület számoló program volt. Hogyan is nézett ki ez a program? Íme:

Kérd be az A oldal hosszát (A)
Kérd be a B oldal hosszát (B)
Kérd be a C oldal hosszát (C)
Számold ki a kerületet (K=A+B+C)
Írd ki a háromszögkerületét (K)

Ennyi. Ez azon lépések sorozata mely a bemeneti adatokon műveletek elvégzése után a kívánt kimenetet adja.
Szerintem másra számítottál. Talán valamiféle programnyelven (Pascal, C, Basic) elkészített forrásszövegre. Nos ez az utolsó ám nagyon fontos lépés lesz!
A programozáshoz először egyfajta gondolkodásmódot kell kézség szinten elsajátítani.
Egyetemi tanulmányaim során találkoztam azzal a megdöbbentő ténnyel, hogy a mérnök informatikus szakra jelentkező hallgatóknál ez a gondolkodásmód nincs meg. A kb 60 fős induló évfolyamlétszámból a negyedik félév végére négyen maradtunk. A bukások két tárgyra vezethetők vissza. A programozásra és a matematikára. Mindkettő alapvetően fontos a programozáshoz.
A rendszerszemlélet, az algoritmizálás, az alapvető optimalizációs készség és egyáltalán az alapvető algoritmusokban való tájékozottság. Nem az algoritmus ismeretéről beszélek, hanem arról hogy tudjon róla  a programozó hogy létezik, találja meg és tudja értelmezni, alkalmazni algoritmizálni.
Ezek az alapvető dolgok amik ahhoz kellenek hogy valaki programozni tudjon. Persze ezek a készségek is "feltuningolhatók" vizsgaidőszakra és a sok gyakorlás amolyan készséggé tud átmenetileg alakulni. Ha pedig nem marad abba a gyakorlás akkor előbb-utóbb rögzül, reflex-é válik. Ezzel csak azt akarom mondani, hogy fel tudsz készülni a vizsgára! Kellő szorgalommal és rendszerességgel nem lehet probléma.

Elemezzük a háromszög kerületszámító problémát a Program számítástechnikai értelemben című cikkemben megfogalmazottak szerint!
Input adat: három input adatunk van. A háromszög A, B és C oldalának hossz.
Output adat: a háromszög kerülete, amit megjelenítünk
Művelet: egy picit több van mint elsőre gondolható. A triviális művelet a háromszög kerületének kiszámítása. Ez egy összeadás, ráadásul nem is egy, hanem kettő (két összeadás jel van) és rögtön értékül is adjuk az eredményt (egyenlőségjel). Ezek mellett tekintsük műveletnek, vagy tevékenységnek az adat bekérést (ebből három van) és az adatkiírást (ebből egy van).
Van három bemenő adatunk amit bekérünk egyesével, elvégezzük a számítási műveletet,majd megjelenítjük a kiszámolt kerületet.
Csupán annyit tettünk, hogy a teljesen természetes módon keletkező gondolatainkat megfogalmaztuk mondatokba és azt leírtuk. Azaz nem csupán végrehajtottuk a bemagolt formulát, ami így szól: "ká egyenlő á plusz bé plusz cé" hanem azt átírtuk matematikai formába K=A+B+C. Mivel szükségesek az oldalhosszak a képlethez ezért azokat meg kell tudnunk, azaz be kell kérnünk. Ezt is megtettük. Leírtuk hogy kérjük be. Hú de triviális ugye! Nem tettünk semmi csodát, csak leírtuk....
Picit gondolkozzatok el ezen, hogy mennyire gáz ez az egész és mennyire egyszerű is ez.

A program (számítástechnikai értelemben)

Próbáljuk megfogalmazni az előző általánosítás segítségével a számítástechnikai program fogalmát. Valahogy így szólhat:
A program olyan lépések sorozata, mely egy előre kigondolt, megtervezett műveletsorozat végrehajtásával a bemenő adatokból valamiféle kimenetet ad.
Nézzük csak az új fogalmakat.
Műveletsorozat. Programozásban elsősorban matematikai műveletekre kell gondolni, de ilyenek a nem szám jellegű adatokon végzett tevékenységek is. Hogy érthető legyen gondolj pl egy név megkeresésére egy adathalmazban. A keresés is egy művelet, de nem számokon alapszik. Vagy egy másik példa: a "Helló világ!" szöveg első három betűjének lekérdezése is egy művelet. A lényeg hogy valamiféle adaton értelmezett tevékenység.
A művelet mellett az adat a másik fogalom amit ismerni és tudni kell értelmezni ha programozást szeretnénk tanulni.
Az adatot fogjuk fel úgy hogy nem más mint egy információ, számítógépen ábrázolt és értelmezhető formában.
Művelet és adat egymástól elválaszthatatlan dolog a programozásban. A program adatokkal dolgozik. Adat nélkül nincs értelme a programnak. Az adatokon műveleteket hajtunk végre. Ha nincs adat akkor a műveletnek sincs sok értelme. Gondoljunk csak bele.Mit csinál az a program amiben nincs adat? Próbáljunk kitalálni egy ilyet. Nagyon nehéz.... Szinte lehetetlen...
Nincs olyan program amiben nincs adat és nincs olyan program, amiben nincsenek műveletek.
Picit összemosódott a program és a művelet fogalmak. Ez nem baj, hiszen a program nem más mint műveletek sorozata, tehát ha úgy tetszik egy összetett művelet (....ami természetesen adatokon dolgozik...)
Adós vagyok még két fogalommal a fenti meghatározásból. Bemenet és kimene.
A bemenet a mosógépes példa esetében a piszkos ruha, a kimenet pedig a tiszta ruha. Éppen ez volt a célunk. A bemenő adatokon (piszkos ruha) végrehajtottuk lépésről-lépésre a műveleteket (áztatás, mosás, centrifugálás) és megkaptuk a kimenetet/kimenő adatot (tiszta ruha).
A bemenetet az idegennyelvű szakirodalom inputnak a kimenetet outputnak nevezi.
Tartsuk ezeket a fogalmakat szem előtt mindvégig. Értsük és tudjuk hogy mit jelentenek pontosan!
Bement (Input), Kimenet (Output), Művelet, Adat, Program

A program (általánosítás)

Mit is jelent ez a szó: Program?
Próbálom általánosítva megfogalmazni: a program egy olyan tevékenységsorozat amit végrehajtva a kiinduló helyzetből egy új helyzet (amit szeretnénk elérni) áll elő.
Néhány egyszerű hétköznapi példa a programra:
  • Egy politikai párt választási programja olyan intézkedéstervek halmaza amit az adott párt végre szeretne hajtani, ha kormányra kerül.
  • Egy vállalat gazdasági programja olyan jól átgondolt hosszútávú terv, aminek lépésről lépésre történő végrehajtásával a vállalat eléri gazdasági célját.
  • Egy mosógép programja olyan lépések sorozata, melyet ha elindítunk és végrehajtja a mosógép akkor tiszta mosott ruhát kapunk (áztatás, mosás, centrifugálás). Ha közben hiba adódik akkor a mosóprogram leáll.
  • TV műsorprogram egy sorrend, amit a televíziócsatorna szépen sorban egymás után sugároz.

Kiemeltem néhány szót, ami nagyon fontos és talán alapvető hogy megértsük és mögé tudjunk gondolni.
Intézkedésterv: jól átgondolt még meg nem valósított lépések sorozata.
Végrehajtás: utasítások, műveletek elvégzése
lépésről-lépésre történő végrehajtás: egyszerre egy lépés elvégzése, annak eredményétől függően, vagy éppen attól függetlenül egy következő lépés végrehajtása esetleg ugyan azon lépés ismétlése.
lépések sorozata: (lásd előző pont)
elindítunk és végrehajtja: start - stop. Elejétől a végéig lépkedünk egyesével.
Hiba adódik, leáll: hibajelenség kapcsán leáll a végrehajtás. Tegyük hozzá hogy jó esetben. Mert sajnos a legjellemzőbb probléma hogy a program fut tovább és egyre nagyobb hibák keletkeznek, így a végeredmény sem lehet helyes.

Hogyan kerültem kapcsolatba a számítógéppel?

Üdvözöllek a Programozz! blogomon. Ezt az oldalt azért hoztam létre, hogy ha valaki programozási nehézségekkel küzd az segítséget kaphasson.
Egy picit untatnálak a saját szakmai történetemmel is.
Jelenleg 39 éves vagyok és 13 éves korom óta foglalkozom programozással. Talán azt is gondolhatod hogy ez nem nagy szám, hiszen manapság a srácok 13-14 évesen simán programoznak. Ám ha utánaszámolsz, kiderül hogy 26 évvel ezelőtt voltam 13 éves és 26 éve éppen (2010-26) 1984-et írtunk. Ekkor jelent meg az első IBM PC, persze nem az akkori KGST országokban, hanem az USA-ban. Itthon Magyarországon ekkor még javában dúlt a szocializmus és a hírhedt COCOM lista (csúcstechnológiai termékeket tartalmazó fekete lista) bizony tiltotta az efféle eszközök behozatalát az országba. Most már ugye érthető hogy nem volt olyan természetes 13 évesen számítógép előtt gubbasztani és bármit is csinálni vele.
Szóval nem a mai PC architektúra volt az amin akkor "számítógépezni" lehetett, hanem inkább a kisebb játékgépek. Talán mondanak ezek a nevek valamit: Commodore 64 vagy ZX Spectrum. No nem ezeken tanultam programozni, hiszen ezek a gépek is szerepeltek a korábban említett COCOM listán. Voltak jófajta szovjet és magyar gyártmányok. Egy ilyen gép volt a Hiradástechnikai Szövetkezet által gyártott HT-1080Z (a linken megnézheted milyen is volt ez a gép, hogyan néztek ki az akkori menő játékok a Galaxy Invasion és a Kígyó) Érdekes lehet hogy ezen a szocialista országban gyártott gépen a Microsoft által fejlesztett Basic interpreter futott.
Szóval ez volt az a gép és platform amit akkor a kis vidéki falucska megkapott egy nyári szünetre a mosonmagyaróvári Agrártudományi Egyetemtől. Néhányan körbeültük a matematika tanárunkkal és ő megmutatta hogy mi is ez az egész. Ezt írta ki fekete fehéren a hozzá csatlakoztatott TV-re:
READY?
Emlékszem a tanár szavaira:
"Most azt jelzi hogy kész, várja a parancsaidat! Utasíthatod arra amit ismer és azt végrehajtja. Persze te magad is tudod tanítani és akkor már több mindent tud végrehajtani. Meg kell adni a bemenő adatokat és azt hogy azokkal milyen műveleteket végezzen, majd ki kell írni az eredményt. Ezt hívják programozásnak!"
Valahonnan innen indultam el és azt hiszem ez az első amit egy programozni megtanulni szándékozónak is meg kell jegyeznie. A számítógép mindent végrehajt amire utasítod és azt pontosan úgy teszi ahogy megtanítod neki. Ha hibás a program akkor azt a hibát te követted el és nem a gép!
Szóval 1984 júniusában megírtam életem első programját, ami bekérte egy háromszög oldalainak hosszát és kiszámolta a területét és a kerületét.
Meg tudod írni ezt a programot? Neeee! Ne kérdezd meg hogy milyen nyelven! A programozás nem nyelvfüggő. A programozási nyelv az egy eszköz aminek segítségével a számítógépet megmondod hogy az általad kitalált programot hogyan hajtsa végre. Itt most arra gondolok hogy, el tudod-e mondani szavakkal, magyarul, hogy hogyan is néz ki ez az egyszerű program. Na ezt egy külön cikkben fogjuk kitárgyalni hamarosan....
Ezután elkerültem középiskolába. A továbbtanulásomat alapvetően már a számítástechnika határozta meg. Mint fentebb írtam akkoriban nem volt jellemző hogy otthon bárkinek számítógépe lehessen, de még az iskolák sem rendelkeztek számítógépekkel, nem is beszélve a számítástechnika oktatásról. Azonban volt egy lehetőség Esztergomban (180 km-re a falumtól, akkoriban ez is nagyon nagy távolság volt).

Az I. István Híradástechnikai Szakközépiskola kapcsolatban állt a Sárisápi Termelőszövetkezettel ahol a magyar tervezésű és gyártású PRIMO számítógépet készítették, így akkor 1985-ben az iskola kb 20 számítógéppel rendelkezett és éppen tervezte bevezetni a számítástechnika oktatást. Ez a helyzet szinte példátlan volt abban az időben. Más középiskolában nem volt ilyen lehetőség a számítástechnika közelébe férkőzni. Nem volt kérdés, Esztergomba vezetett az utam. A számítástechnika órák ekkor nem abból álltak hogy megismerjük az Internetet (aminek híre-hamva sem volt akkor még), vagy hogy szövegszerkesztőt vagy táblázatkezelőt használjunk. A számítástechnika oktatás ekkor magát a programozást jelentette. A PRIMO is Basic interpreterrel volt felszerelve, így Basic programozási nyelven tanultam meg a programjaimat leírni először.
A számítástechnika órákon kisebb programokat, algoritmusokat készítettünk, audio kazettára mentettük az elkészült kódot és JUNOSZTY tv volt a monitorunk.
Aztán nemsokára megismerkedtünk a Z80 Assemblerrel is. A gép közeli programozás magának a mikroprocesszornak a megismerését jelenti. Véleményem szerint ez már nem tartozik a programozás témaköréhez, inkább a számítógép architektúrák, operációs rendszerek világa.
Szóval röviden ennyit a kezdetekről, a történetről.