Programozás 6. Dr. Iványi Péter 1
Előfeldolgozás része Makrók A forrás kódban elvégzi a helyettesítéseket a fordító Csak egyszer végez helyettesítést Nem olyan makrók, mint a LISP vagy Scheme esetén Csak szintaktikai helyettesítést lehet megadni #define PI 3.1415 kor_terulet = r * r * PI; kor_terulet = r * r * 3.1415; 2
Makrók mint függvények #define SQUARE(z) z * z y = SQUARE(x); y = x * x; /* működik */ 3
Makrók mint függvények #define SQUARE(z) z * z y = SQUARE(x+1); y = x+1 * x+1; /* nem jó */ y = x + (1*x) + 1; /* kellene */ y = (x+1) * (x+1); 4
Makrók mint függvények #define SQUARE(z) (z) * (z) y = SQUARE(x+1); y = (x+1) * (x+1); /* működik */ az argumentumot tegyük zárójelbe 5
Makrók mint függvények #define SQUARE(z) (z) * (z) /* és most mi lesz */ q = 1 / SQUARE(x); q = 1 / (x) * (x); /* vagy */ q = (1 / (x)) * (x); /* szintén hibás */ 6
Makrók mint függvények #define SQUARE(z) ((z) * (z)) q = 1 / SQUARE(x); q = 1 / ((x) * (x)); /* működik */ 7
Makrók mint függvények #define SQUARE(z) ((z) * (z)) q = SQUARE(x++); q = ((x++) * (x++)); /* kétszer végez növelést!!!! */ 8
Makrók mint függvények Óvatosab bánjunk a makrókkal ha függvényként akrjuk őket használni!!! 9
Előre definiált makró DATE TIME FILE LINE STDC : Fordítás dátuma szövegesen : Fordítás ideje szövegesen : A forrás file neve szövegesen : A forrás file aktuális sorának sorszáma szövegesen : Értéke 1, ha ANSI C fordító 10
Feltételes fordítás double osztas(double a, double b) { #ifdef TESZT printf( Argumentumok: %d %d, a, b); #endif return(a/b); } 11
Feltételes fordítás 1. #define TESZT double osztas(double a, double b) { printf( Argumentumok: %d %d, a, b); return(a/b); } 12
Feltételes fordítás 2. /* #define TESZT */ double osztas(double a, double b) { return(a/b); } 13
Parancssori argumentumok #include <stdio.h> /* parancssor feldolgozasa */ int main(int argc, char **argv) { int j; printf( Argumentumok szama: %d\n, argc); for(j = 0; j < argc; j++) { printf( %d. argumentum: %s\n, j, argv[j]); } return 0; } 14
Fájl kezelés A fájlokat egy struktúrán keresztül, függvénnyekkel tudjuk elérni. A struktúra: FILE Nincs szükség a struktúra szerkezetének ismeretére (obscure/opaq) 15
Fájl megnyitása <állománymutató> = fopen( <filenév>, <mód >); Alapesetben háromféle megnyitási módról beszélhetünk : 1. Megnyitás olvasásra: "r" File pointer az állomány elejére áll. 2. Megnyitás írásra: "w" File pointer az állomány elejére áll. 3. Megnyitás hozzáfűzésre: "a" File pointer az állomány végére áll. 16
Fájl megnyitása r mód esetén a fájlnak léteznie kell w mód esetén, ha már létezik a fájl akkor felülíródik (eredeti fájl tartalom elveszik) w mód esetén, ha a fájl nem létezik egy új fájl jön létre A megnyitási módot lehet módosítani t : ASCII, text fájl (alapeset) b : bináris fájl 17
Példa { FILE *fp; fp = fopen("adatok.txt","rt"); if(fp == NULL) { /* error */ }... 18
Írás, olvasás és lezárás Írás: fprintf(file_ptr, formátum,...); Olvasás: fscanf(file_ptr, formátum,...); Lezárás: fclose(file_ptr); 19
Példa A program a beolvasott számokatkiírja egy fileba. A beolvasás véget ér, ha negatív számot gépelünk be. 20
#include <stdio.h> int main() { FILE *fp; int szam; fp = fopen( szamok.dat, w ); if(fp == NULL) exit(1); while(1) { scanf( %d, &szam); if(szam < 0) break; fprintf(fp, %d\n, szam); } fclose(fp); return 0; } 21
Rekurzió void count_to_ten ( int count ) { printf( %d\n, count); if ( count < 10 ) { count_to_ten( count + 1 ); } } int main() { count_to_ten ( 0 ); } 22
Include file stdio.h : adat beolvasás és kiírás ctype.h : karakterkészletek kezelése string.h : szöveg kezelő függvények stdlib.h : standard függvények, memória kezelés, véletlen szám generálás, stb... math.h : matematikai függvények, pl: sin, cos 23
stdio.h FILE* fopen(char *fname, char *mode); int fclose(file *file); int fgetc(file *in_file); int fputc(int ch, FILE *out_file); int printf(char *format,...); int scanf(char *format,...); int fprintf(file *fp, char *format,...); int fscanf(file* fp, char *format,...); 24
ctype.h int isalpha(int ch); int islower(int ch); int isupper(int ch); int isspace(int ch); int isdigit(int ch); int toupper(int ch); int tolower(int ch); 25
string.h int strlen(char *string); char *strcpy(char *hova, char *honnan); char *strcat(char *hova, char *mit); int strcmp(char *a, char *b); char *strncpy(char *hova, char *honnan, int n); char *strchr(char *miben, char mit); char *strstr(char *miben, char *mit); 26
stdlib.h int rand(); void srand(unsigned int seed); void *malloc(int size); void free(void *ptr); void exit(int status); 27
Függvény mutatók Nem tárgyaltuk A függvények címét is lehet mutatóban tárolni Változó hosszúságú argumentumok Például: printf, scanf Unió És még néhány dolgot 28