Programozás 6. Dr. Iványi Péter
1
Makrók • Előfeldolgozás része – 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( , <mód >);
Alapesetben háromféle megnyitási módról beszélhetünk : 1. Megnyitás olvasásra: File pointer az állomány elejére áll. 2. Megnyitás írásra: File pointer az állomány elejére áll. 3. Megnyitás hozzáfűzésre:
"r" "w" "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ámokat kií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 int int int int int int
isalpha(int islower(int isupper(int isspace(int isdigit(int toupper(int tolower(int
ch); ch); ch); ch); ch); ch); 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
Nem tárgyaltuk • Függvény mutatók – 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