Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaAndrea Horváthné Megváltozta több, mint 10 éve
1
http://www.eet.bme.hu/vieea100 Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke A programozás alapjai 1. (VIEEA100) 9. előadás Dr. Poppe András Pohl László
2
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Ismétlés ► Bináris fájlok Bármilyen fájl kezelésére: bájtok sorozatának tekintjük a fájlt. Írás: fwrite Olvasás: fread ► A main változatai int main(void) int main(int argc, char *argv[]) => parancssori paraméterek // int main(int argc)
3
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Ismétlés ► Preprocesszor #include #define => szimbólum => konstans => makró #undef #if, #else, #elif, #endif #ifdef, #ifndef #error #pragma Előre definiált konstansok: __DATE__, __TIME__, __TIMESTAMP__, __FILE__, __LINE__
4
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Ismétlés ► Több forrásfájlból álló programok Header fájlok a prototípusoknak ► Lokalitás: lokális és globális változók ► Láthatóság ► Változók élettartama ► Tárolási osztályok auto register static extern
5
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Nagyobb programok készítése ► Algoritmus: elemi utasítások sora, amely véges lépésben eredményre vezet. ► Specifikáció: a program feladatának részletes definiálása, beleértve a bemeneti és kimeneti adatok formátumát. => Például a ZH és vizsga feladatok. ► Algoritmus választása: a program felépítésének megtervezése a program megírásához szükséges részletességgel. ► Fontos szempont => a hatékonyság (műveletvégzés, elvi korlátok, memóriaigény futás közben), => a program mérete, => a programfejlesztés sebessége.
6
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Nagyobb programok készítése ► Adatszerkezet megválasztása: => a feladathoz leginkább megfelelő adatstruktúra megtervezése (pl. tömb, lista, fa?) ► A feladatnak leginkább megfelelő nyelv. Pl. website fejlesztéshez alkalmasabb a php, mint a C. ► Kódolás, tesztelés, hibajavítás: => ezek a lépések egymást váltogatják => Nagy programoknál jellemző, hogy hibakereséssel több idő megy el, mint a programozás összes többi tevékenységével együttvéve.
7
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Nagyobb programok készítése ► Dokumentáció elkészítése Programozói (fejlesztői) dokumentáció: legfontosabb eleme a kommentezett forráskód => specifikáció, adatszerkezetek (beleértve a fájlok formátumát), algoritmusok leírása, diagramok => Doxygen Tesztelési dokumentáció: mit teszteltünk, milyen adattal Felhasználói dokumentáció: használati utasítás
8
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Programstruktúra megtervezése ► Meg kell tervezni a programot: tervezés közben hamar kiderülnek az előzetes elképzelésünkben rejlő legnagyobb strukturális hibák, melyek ilyenkor még egyszerűen javíthatók. ► A tervezés során kétféle módszert használunk: top-down (felülről lefelé) tervezés: A specifikáció alapján meghatározzuk a program fő részeit, tisztázzuk, hogy melyik rész mit csinál (=specifikáció a részekhez), majd az egyes részeket bontjuk kisebb részekre. bottom-up (alulról felfelé) tervezés: Ha egy adott blokkban világos a feladat, akkor nekiállunk elemi részekből összerakni a blokkot. A bottom-up tervezés nem mindig válik el a kódolástól, hiszen a kódolás során általában ugyanazok az alapegységek, mint a bottom-up tervezésnél.
9
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Algoritmus megadása ► A tervezést segítő módszerek ► Pszeudokód: Az algoritmusok leírására használt olyan mesterséges formális nyelv, mely változókból és néhány állandó jelentésű szóból („foglalt” konstansok) áll, és (szándékosan) hasonlítanak a számítógépes programozási nyelvekre. ► Algoritmus programnyelvtől független bemutatására alkalmas. ► Ha már tudjuk a nyelvet, és nem szükséges a nyelvtől független bemutatás, egyszerűbb az adott nyelven kódolni.
10
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Algoritmus megadása ► Folyamatábra Grafikus megjelenítés => könnyebben áttekinthető
11
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Folyamatábra – faktoriális
12
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Algoritmus megadása ► Struktogram Strukturált programokhoz jobb, kevésbé látványos
13
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Struktogram – faktoriális 1
14
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Faktoriális ► int main(){ int i,j,n; scanf("%d”,&n); for(i=j=1;i<=n;j*=i,i++); printf("%d\n”,j); return 0; }
15
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke A verem (stack) adatszerkezet push pop
16
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Egyszerű verem C nyelven ► int t_verem[100], n=0; ► void push(int uj) { t_verem[n++]=uj; } ► int pop() { return t_verem[--n]; } ► int main(void){ push(5); push(13); push(8); printf("%d\n", pop() ); // 8 printf("%d\n", pop() ); // 13 printf("%d\n", pop() ); // 5 return 0; }
17
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Függvényhívás verem segítségével ► A legtöbb számítógépen a függvények verem segítségével kapják a paramétereket adják vissza a visszatérési értéket tárolják a lokális változókat tárolják a visszatérési címet ► Minden programnak saját verme van ► A Visual C++ alapértelmezés szerint 1MB-os vermet rendel a programhoz => Módosítás: Properties - Configuration Properties - Linker - System - Stack Reserve Size
18
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke A programverem tartalma (egy megvalósítás)
19
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Például ► int masodfok(int a, int b, int c, int x){ int res = a*x*x; res += b*x+c; return res; } ► int main(void){ int y, x=5; y=masodfok(2, 6, 3, x); printf("%d\n", y); return 0; }
20
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke A main
21
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke A masodfok
22
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke A rekurzió ► Rekurzió az, amikor egy függvény közvetlenül vagy közvetett módon önmagát hívja. ► Önrekurzió: amikor egy függvény közvetlenül hívja saját magát. ► Kölcsönös rekurzió: amikor a függvény egy másik függvényt hív, a másik függvény pedig az eredetit. ► A rekurzió megadása hasonló a teljes indukciós bizonyítási módszernél megismerthez (ha tetszik, az egy rekurzív módszer): Leállási feltétel: ha teljesül, nem hívja magát Szétbontja a problémát, a részproblémá(k)ra meghívja magát
23
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Például: faktoriális ► Számítsuk ki n faktoriálisát! ► Ha n<=1, akkor n! értéke1 (leállási feltétel) ► Ha n>1, akkor n! értéke n*(n-1)! ► Megvalósítás C-ben: int fakt(int n){ int v; if(n<2)v = 1; else v = n * fakt(n-1); return v; } ► printf("4 faktorialisa=%d\n",fakt(4));
24
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Hogyan kell elképzelni a működést? ► printf("4 faktorialisa=%d\n",fakt_4(4)); int fakt_4(int n_4){ int v_4; if(n_4<2)v_4 = 1; else v_4 = n_4 * fakt_3(3); return v_4; } int fakt_3(int n_3){ int v_3; if(n_3<2)v_3 = 1; else v_3 = n_3 * fakt_2(2); return v_3; } int fakt_2(int n_2){ int v_2; if(n_2<2)v_2 = 1; else v_2 = n_2 * fakt_1(1); return v_2; } int fakt_1(int n_1){ int v_1; if(n_1<2)v_1 = 1; return v_1; }
25
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Miért képzelhetjük így => verem | v | | visszatérési cím | | visszatérési érték helye | | n=1 | | v | | visszatérési cím | | visszatérési érték helye | | n=2 | | v | | visszatérési cím | | visszatérési érték helye | | n=3 | | v | | visszatérési cím | | visszatérési érték helye | |n=4 |
26
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke További példák 1/2 ► Írjon függvényt, amely két pozitív egész számot kap paraméterként, és az elsőt a másodikkal megadott számrendszerben írja ki! A számrendszer 2-10 között lehet. ► Rekurzió: 1.Írd ki a szám elejét 2. Írd ki az utolsó számjegyet ► void szamrendszer(int x,int n){ if(x<n)printf("%d",x); else{ szamrendszer( x/n, n ); // jó sorrendben írja ki printf("%d", x%n ); } }
27
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke További példák 2/2 ► Írja ki fordítva a paraméterként kapott sztringet! ► void fordit(char t[]){ if(t[0]==0)return; fordit(t+1); putchar(t[0]); // vagy printf("%c",t[0]); }
28
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Mikor használjuk? ► Minden ciklus átalakítható rekurzióvá ► Ami ciklussal is megoldható: álrekurzió ► Probléma: nagy rekurziómélységnél sok stacket használ => elfogyhat. Pl. írjunk ki egy int tömböt fordítva void ford1(int t[],int n){ if(n){ ford1(t+1,n-1); printf("%d",t[0]);}} void ford2(int t[],int n){int i; for(i=n-1;i>=0;i--)printf("%d",t[i]);} ► Pl. 1000 elemű tömbbel hívva ford1 legalább 1000×12 bájt helyet foglal a stacken (32 bites rendszerben) ► ford2 csak 16 bájtot ► Van, amikor ez a legjobb megoldás. Pl. fabejárás
29
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Függvénypointerek ► Írjunk függvényt, amely kiszámítja egy tetszőleges egyváltozós valós függvény integrálját az [a,b] zárt intervallumban, n osztásközzel! double teglalap(double a,double b,int n,double (*fv)(double)){ double dx=(b-a)/n, sum=0; int i; for(i=0; i<n; i++) sum += fv( a+dx*i ); return sum; } printf("I=%g\n", teglalap(0,1,100,sin) ); ► A fv( a+dx*i ); helyett írhattuk volna: (*fv)( a+dx*i ); ► Függvénypointer: egy függvény első utasításának címe.
30
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Függvénypointerek ► #include ► void main(){ ► double (*t[4])(double), d; ► int n; ► ► t[0]=sin; t[1]=cos;t[2]=exp;t[3]=tan; ► printf("Kerek egy valos szamot: "); scanf("%lg",&d); ► printf("Mit szamoljak?\n1. sin\n2. cos\n3. exp\n4. tan\n"); ► scanf("%d",&n); ► if(n 4)return; ► printf("Eredmeny: %g\n",t[n-1](d)); ► }
31
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Függvénypointerek ► Áttekinthetőbb typedef segítségével: ► typedef double func(double); ► void main(){ ► func t[4]; ► double d; ► int n; ► ► t[0]=sin; t[1]=cos;t[2]=exp;t[3]=tan; ► …
32
Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke Mára elég ennyi
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.