Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke A programozás alapjai 1. (VIEEA100) 9. előadás.

Hasonló előadás


Az előadások a következő témára: "Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke A programozás alapjai 1. (VIEEA100) 9. előadás."— Előadás másolata:

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


Letölteni ppt "Budapesti Műszaki és Gazdaságtudományi Egyetem Elektronikus Eszközök Tanszéke A programozás alapjai 1. (VIEEA100) 9. előadás."

Hasonló előadás


Google Hirdetések