Kezdő programozók hibái Azok a buktatók, amikről ha nem tudsz, napokat töprenghetsz hiába programozás-tanulás közben

Hasonló dokumentumok
Kezdő programozók hibái

A C# programozási nyelv alapjai

Java programozási nyelv

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

Webprogramozás szakkör

Informatika terméktervezőknek

Internet programozása. 3. előadás

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Java II. I A Java programozási nyelv alapelemei

Vezérlési szerkezetek

Szoftvertechnológia alapjai Java előadások

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós február 18. Széchenyi István Egyetem, Gy r

A C programozási nyelv II. Utasítások. A függvény.

6. fejezet: Ciklusok

Java II. I A Java programozási nyelv alapelemei

Kifejezések. Kozsik Tamás. December 11, 2016

Óbudai Egyetem. C programozási nyelv

Alprogramok, paraméterátadás

Szoftvertervezés és -fejlesztés I.

Programozás BMEKOKAA146. Dr. Bécsi Tamás 2. előadás

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

GYAKORLATIAS JAVA MINTA

Programozás II. 4. Dr. Iványi Péter

Bevezetés a programozásba Előadás: A const

Programozás I. 5. Előadás: Függvények

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Osztályok. 4. gyakorlat

Adattípusok, vezérlési szerkezetek. Informatika Szabó Adrienn szeptember 14.

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Programozási nyelvek JAVA EA+GY 1. gyakolat

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

C++ programozási nyelv Konstruktorok-destruktorok

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 3. előadás

ISA szimulátor objektum-orientált modell (C++)

Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Bevezetés a programozásba I.

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 2. előadás

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

A C# PROGRAMOZÁSI NYELV

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

1. Bevezetés szeptember 9. BME Fizika Intézet. Szám. szim. labor ea. Tőke Csaba. Tudnivalók. feladat. Tematika. Moodle Házi feladatok

Java programozási nyelv 4. rész Osztályok II.

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

3. Osztályok II. Programozás II

Programozási nyelvek Java

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Mintavételes szabályozás mikrovezérlő segítségével

A C programozási nyelv I. Bevezetés

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

1. Alapok. #!/bin/bash

C++ programozási nyelv

A C programozási nyelv I. Bevezetés

Programozás BMEKOKAA146. Dr. Bécsi Tamás 3. előadás

Objektum orientált kiterjesztés A+ programozási nyelvhez

PHP. Telepítése: Indítás/újraindítás/leállítás: Beállítások: A PHP nyelv

és az instanceof operátor

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

C++ programozási nyelv

Forráskód formázási szabályok

Programozás C és C++ -ban

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Algoritmizálás + kódolás C++ nyelven és Pascalban

Vezérlési szerkezetek. Szelekció Ciklusok

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

BASH script programozás II. Vezérlési szerkezetek

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Gyakorló feladatok Gyakorló feladatok

Pénzügyi algoritmusok

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Objektumorientált Programozás III.

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Programozás II. 2. Dr. Iványi Péter

A C programozási nyelv III. Pointerek és tömbök.

C programozás. 1 óra Bevezetés

Komputeralgebra Rendszerek

C# gyorstalpaló. Készítette: Major Péter

Programozási nyelvek Java

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Vezérlési szerkezetek

C programozási nyelv

OOP: Java 8.Gy: Abstract osztályok, interfészek

Kivételek, kivételkezelés a C++ nyelvben

Gregorics Tibor Modularizált programok C++ nyelvi elemei 1

A C programozási nyelv III. Pointerek és tömbök.

Programozás II gyakorlat. 6. Polimorfizmus

C++ programozási nyelv Konstruktorok Gyakorlat

Járműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás

Apple Swift kurzus 3. gyakorlat

Programozás I. 1. előadás: Algoritmusok alapjai. Sergyán Szabolcs

9.fejezet: Függvények és külső eljárások

Szelekció. Döntéshozatal

Átírás:

Kezdő programozók hibái Azok a buktatók, amikről ha nem tudsz, napokat töprenghetsz hiába programozás-tanulás közben 2011.07.01. www.programozas-oktatas.hu Pasztuhov Dániel

Miért írom ezt az útmutatót? Programozás-oktatói pályafutásom alatt nagyon sokszor találkoztam olyanokkal, akik a nulláról akarnak megtanulni programozni. Egy idő után megfigyeltem, hogy szinte minden esetben belefut a tanítvány ugyanazokba a hibákba. Szinte kivétel nélkül mindenki, sőt, van, aki többször is. Az eredménye persze az, hogy utána órákat ha nem napokat a gép előtt görnyed és guglizik, hátha rátalál a megoldásra, de általában nem. Így aztán hozzáértő segítségét kell kérnie. Így aztán arra gondoltam, hogy elkezdem gyűjteni ezeket a hibákat, és összegyűjtök egy csokorra valót tanulságul azoknak, akik éppen most kezdenek programozni tanulni, hogy megspóroljak nekik néhány napnyi szenvedést és guglizást. Ez persze nem jelenti azt, hogy az anyag teljes lenne. Ezek csak azok a hibák, amiket az én feladataim kapcsán láttam rendszeresen előjönni, nyilván rengeteg másfajta hiba lehetséges még. Az anyag C-jellegű nyelvek (C, C++, Java, PHP) specialitásaira vonatkozik elsősorban, ugyanis nagyon sokan ilyen nyelveket felhasználva igyekeznek elsajátítani a programozást. Még ha egyébként mondjuk a Pascallal sokkal könnyebb dolguk lenne, de számos egyetem erőlteti, hogy C-jellegű nyelveken kell elkezdeni a programozás-oktatást. A vallásháborúba meg most hadd ne menjünk bele. Tartalomjegyzék Miért írom ezt az útmutatót?... 2 1. Az alapok csapdái... 3 a. A figyelem... 3 b. Az egészosztásról... 3 c. a = b, azaz b felveszi a értékét... 3 d. if (a = b)... 3 e. if, while, for törzsében több utasítás... 3 f. for végére pontosvessző?... 4 g. Hol van a laptopon a * billentyű?... 4 h. #define... 4 2. Függvények nyalánkságai... 5 a. Függvény meghívása és a deklarációja... 5 b. A függvény meghívásakor, ha változót használunk, akkor annak nevének meg kell egyeznie a (formális) paraméter nevével.... 5 c. Visszatérési érték... 5 d. Visszatérés logikai értékkel... 5 e. Hányszor lehet leírva a return egy függvényben?... 6 f. Függvényen belül lehet függvényt definiálni?... 6 g. Prímtulajdonság vizsgálata... 6 h. switch-case... 6 3. A C++ nyalánkságai... 7 a. Az osztály definíciója végére pontosvessző kell!... 7 b. Egy objektum függvényének meghívása... 7 c. Osztály tagfüggvényének átadni a tagváltozókat is... 7 Pasztuhov Dániel, 2011. 2 www.programozas-oktatas.hu

1. Az alapok csapdái a. A figyelem Sajnos sokszor előfordul, hogy szóról szóra elmondom a megoldását az adott problémának, majd rákérdezek újra, és a tanítvány csak néz, mint Rozi a moziban. Az alábbi tulajdonságokra természetesen fel szoktam hívni a hallgatóság figyelmét, ellenben általában ez nem sokat ér. A figyelem nagyon fontos, főleg, ha meg akarsz tanulni programozni! b. Az egészosztásról Adott ez a programrészlet: int c = 45; int f = 9 / 5 * c + 32; és a tanítvány nem tudja, miért kap 113 helyett 77-et. A magyarázat az osztás kétszínűségében rejlik. Ha mindkét paramétere egész, akkor az osztás matematikai eredményének egészrészét adja (egészként). Ha legalább az egyik paramétere törtszám (float, double), akkor pedig a matematikai eredmény lesz az értéke törtszámként. Tehát helyesen így lehetne (többek között): int c = 45; float f = 9.0f / 5 * c + 32; c. a = b, azaz b felveszi a értékét Nagyon sokan nem tudják elsőre megjegyezni, hogy az értékadás merről merre zajlik. Nos, nem balról jobbra, hanem JOBBRÓL BALRA. d. if (a = b) Az elágazás (if) tanulásánál nagyon gyakori ez a gubanc. A tanítvány feltehetőleg össze akarta hasonlítani a-t és b-t és ha megegyeznek, akkor akart valamit csinálni. Helyesen úgy lett volna, hogy if (a == b) de a tanítvány még nem tudja, hogy az = és a == operátorok között mi a különbség. Az = értékadás, míg az == összehasonlítás. A Java már szól azért, hogy ha ilyen hibát elkövetünk, de a C és C++ fordítók nem (feltétlenül), mert hiszen értelmes is lehetne. Mit is jelent? Előbb a-nak értékül adjuk b értékét, majd a kifejezés értékéről eldöntjük, hogy igaznak számít-e vagy hamisnak (azaz nem nulla vagy nulla). A kifejezés értéke pedig attól függ b milyen értéket vett fel. e. if, while, for törzsében több utasítás if (a == b) egyutasítás; mégegyutasítás; Pasztuhov Dániel, 2011. 3 www.programozas-oktatas.hu

A tanítvány azt szerette volna, hogy ha a és b értékei megegyeznek egymással, akkor lefusson mind egyutasítás, mind mégegyutasítás. De a blokkjelet elfelejtette körülük. Általában akkor jelentkezik ez a hiba, amikor először csak egy utasítás áll az if igaz ágában, majd hozzátesz még egyet, csak megfeledkezik a { } párról. És nem érti, miért nem fut le a második utasítás. Azért mert az if (és for, while) esetén a törzs vagy egy utasításból áll, vagy ha több utasításból áll, akkor kapcsos zárójelek közé kell tenni, azaz helyesen: if (a == b) { egyutasítás; mégegyutasítás; } f. for végére pontosvessző? Adott a következő sor: for (i = 6; i < 10; i++); { és a műveletek } és a tanítvány nem érti, hogy miért csak egyszer fut le, amit a blokkba tett. Hiszen már blokkban van! A rejtély kulcsa a pontosvessző, ami jelen esetben egy üres utasítást jelképez. a for-ciklus lefut négyszer, és lefuttatja az üres utasítást, majd hozzákezd a blokk végrehajtásához egyszer g. Hol van a laptopon a * billentyű? AltGr+ SHIFT melletti - (mínusz) jel. h. #define Adott a következő program: #define PI 3.14; int main() { printf("%lf", PI); return 0; } és minden rendben lévőnek is tűnik, hiszen mindenhol van pontosvessző a sorok végén. Miért gond mégis az, hogy a ; előtt ) kéne a 3. sorban? Hát ott van! Igen, de más is van ott. A kérdéses sorból ugyanis az előfeldolgozás után a következő sor keletkezik (miután a define-t behelyettesítettük): printf("%lf", 3.14;); Vagyis keletkezett bele egy nem várt pontosvessző, ami előtt kéne, hogy legyen még egy bezárójel. Egyszóval: #define végére nem kell (tilos!) a pontosvessző. Pasztuhov Dániel, 2011. 4 www.programozas-oktatas.hu

2. Függvények nyalánkságai a. Függvény meghívása és a deklarációja Sokan összekeverik a kettőt. Adott a függvény deklarációja: int fuggveny(int a, long b); valamint a függvény meghívása: x = fuggveny(c, d); Néha természetesen összekeveredik, így a meghívásba tesznek típusnevet Az ökölszabály: ha függvényt deklarálunk, van típusnév, ha meghívjuk, nincs. b. A függvény meghívásakor, ha változót használunk, akkor annak nevének meg kell egyeznie a (formális) paraméter nevével. Természetesen nem. Például az alábbi kóddal jól szemléltethető: int max(int a, int b) { return a > b? a : b; } int a,b,c,d, ab,cd; ab = max(a,b); cd = max(c,d); Hát már miért ne számolhatnánk ki c és d maximumát? c. Visszatérési érték Éppen megtanulta a tanítvány a függvények használatát, máris gondban lehet. Nem érti, hogy mikor meghívja a függvényt a visszatérési érték az mi a csuda, és hogy hogy kell azt kezelni. Gyakran láthatunk ilyesmit: egyfuggveny(p1, p2, p3); valtozo = egyfuggveny(p1, p2, p3); Azt gondolja, hogy az egyfuggveny valahogy magába szívja a visszatérési értéket, és bent tartja, amíg le nem írjuk a függvény nevét (rosszabb esetben teljes meghívását) újra, és akkor végre kieresztheti magából. Látszólag egyébként jól is működik a dolog. A szépséghiba az, hogy a függvény kétszer fut le. A másik lehetséges probléma, ha nem is tárolják a visszatérési értéket, csak gondolják, hogy majd visszajött valahogy, és majd felhasználjuk valahogy. d. Visszatérés logikai értékkel Ha egy függvénynek meg kell vizsgálnia egy feltételt és annak megfelelően vissza kell térnie egy igaz vagy hamis értékkel, azt sokan így csinálják: Pasztuhov Dániel, 2011. 5 www.programozas-oktatas.hu

if (a<b) return true; else return false; Pedig egyszerűbben is lehetne: return a < b; e. Hányszor lehet leírva a return egy függvényben? Van, aki szerint egyszer, de ő téved. A return akárhányszor le lehet írva a függvényben, de ha a vezérlés ráfut, akkor kilép a függvényből. Olyan, mint a rexasztal. Több lyuk is van rajta, de ha arra jár egy golyó, beleesik. f. Függvényen belül lehet függvényt definiálni? Nem. Bár jogos a felvetés, mert pl. Pascalban ez megengedett. C-ben nincs függvényen belül függvénydefiníció. Javaban is meg lehet oldani, de ez nem kezdőknek való téma. g. Prímtulajdonság vizsgálata Gondoljunk arra a feladatra, hogy el kell dönteni, hogy egy kártyacsomagban van-e piros lap. Végignézzük az összes lapot. Ha az, amit nézünk piros, akkor kész vagyunk, tudjuk, hogy van a pakliban piros lap. Ha nem piros, akkor még nem tudunk semmit, hiszen később lehet még piros. A tanítványok legtöbbje ezt elrontja, és azt írja a programba, hogy ha piros, akkor kész vagyunk, mert van a pakliban piros, ha nem piros, akkor pedig tudjuk, hogy nincs benne, valahogy így: for (i = 0; i < max; i++) { } if (piros) return true; else return false; A prímtulajdonság vizsgálata címet pedig azért kapta, mert ugyanez a helyzet akkor, ha meg kell állapítani egy számról, hogy prím-e. Ha találunk osztót 2 és a szám-1 (vagy a szám fele vagy a szám négyzetgyöke) között, akkor azonnal tudjuk, hogy nem prím. Ha az adott szám nem osztója, akkor bizony tovább kell menni. h. switch-case A leggyakoribb probléma az, hogy a case-ágak végén lemarad a break. Pasztuhov Dániel, 2011. 6 www.programozas-oktatas.hu

3. A C++ nyalánkságai a. Az osztály definíciója végére pontosvessző kell! Nincs mit magyarázni rajta. Ha elfelejted, nézheted órákig, de nem hinném, hogy rá fogsz jönni hamarabb. b. Egy objektum függvényének meghívása esetén nehezen esik le az aktuális objektum fogalma. Mármint az az objektum, amire a tagfüggvény futása esetén a this mutatni fog. c. Osztály tagfüggvényének átadni a tagváltozókat is Az objektum-orientált programozás nem tartozik a gyorsan megérthető részek közé. Az egyik gyakori hiba, hogy struktúrált programozásból váltva a tanítvány át akarja adni a tagfüggvénynek a tagváltozókat is, valahogy így: class Valami { int belsovaltozo; public: void tagfuggveny(int belsovaltozo, int parameter) { } }; Természetesen a tagfüggvény hozzáfér a tagváltozóhoz, így erre semmi szükség sőt, mindenféle objektum-orientált tervezési elvet sért, ha így teszünk. Pasztuhov Dániel, 2011. 7 www.programozas-oktatas.hu

Még az elején static-ra állítottam a pályát tároló tömböt -ki tudja már miért-, és így nem tudtam mentés-betöltéskor serializálni. Ezért nem frissült a pálya betöltés után. Pasztuhov Dániel, 2011. 8 www.programozas-oktatas.hu