350 likes | 512 Views
Programiranje 1 programski jezik c. Staša Vujičić Čas 10. Funkcije. Globalne promenljive. Broja č karaktera Program č ita tekst sa ulaza i broji velika i mala slova, c ifre, beline i redove. Program demonstrira kori šć enje globalnih podataka. #include <stdio.h>
E N D
Programiranje 1 programski jezik c Staša Vujičić Čas 10
Funkcije. Globalne promenljive. • Brojač karaktera Program čita tekst sa ulaza i broji velika i mala slova, cifre, beline i redove. Program demonstrira korišćenjeglobalnih podataka.
#include <stdio.h> /* Deklaracija funkcije prebroj */ void prebroj(); /* Globalni brojaci. Podrazumevano su inicijalizovani nulom. */ int br_malih, br_velikih, br_cifara, br_belina, br_redova;
/* main funkcija */ int main() { /* Pozivamo funkciju za prebrojavanje */ prebroj(); /* Prikazujemo vrednosti globalnih brojaca, koje je funkcija prebroj() izmenila */ printf("Broj malih slova: %d\n", br_malih); printf("Broj velikih slova: %d\n", br_velikih); printf("Broj cifara: %d\n", br_cifara); printf("Broj belina: %d\n", br_belina); printf("Broj redova: %d\n", br_redova); }
/* Definicija funkcije prebroj */ void prebroj() { int c; while((c = getchar()) != EOF) { if(c >= 'a' && c <= 'z')br_malih++; else if(c >= 'A' && c <= 'Z')br_velikih++; else if(c >= '0' && c <= '9')br_cifara++; else if(c == '\n' || c == '\t' || c == ' ') { br_belina++; if(c == '\n') br_redova++; } } }
pokazivači • Pokazivač je promenljiva koja sadrži adresu neke druge promenljive. • int x=1, y=1; 1 x 1 y
pokazivači • int *ip; /* ip je pokazivac na int, odnosno *ip je tipa int */ ip = &x; /* ip sada pokazuje na x */ 1 x ip 1 y
pokazivači • y=*ip; /* y je sada 1 */ *ip = 0; /* x je sada 0 */ 0 x ip 1 y
pokazivači • *ip+=10; /* x je sada 10*/ 10 x ip 1 y
pokazivači • ++*ip; /* x je sada 11*/ 11 x ip 1 y
pokazivači (*ip)++; /* x je sada 12, zagrada neophodna zbog prioritetaoperatora*/ 12 x ip 1 y
Pokazivači- primer 1 - • Program demonstrira jednostavnu upotrebu pokazivača. #include <stdio.h> /* main funkcija */ int main() { int a = 2;
int *pi; /* Prikaz vrednosti a pre izmene */ printf("Vrednost promenljive a: %d\n", a); /* Vrednost promenljive a: 2*/ /* Promena vrednosti promenljive a preko pokazivaca */ pi = &a; izraz &a se može čitati kao: "adresa od a". Uopšte, ako je data deklaracija T a; gde je T proizvoljan tip, tada je • Tip izraza &a tip (T *) (pokazivač na tip T). • Vrednost izraza &aje adresa bajta u memorijiod koga počinje zapis podatka a.
*pi = *pi + 2; • Izraz *pi se može čitati kao: "ono na šta pokazuje pi". Ovaj izraz se može koristiti i kao leva i kao desna vrednost. • Ako je definisan pokazivačT *p; gde je T proizvoljan tip, tada je • tip izraza *pupravo tip T • vrednost izraza *pjevrednost podatka na adresi na kojupokazuje p, tumačen kao podatak tipa T. • Ako se izraz *p koristi kao leva vrednost, tada se vrednost na desnoj strani operatora dodele upisuje u memorijsku lokaciju na koju pokazuje p, prethodno konvertovana po potrebi u tip T.
/* Prikaz vrednosti promenljive a nakon izmene */ printf("Vrednost promenljive a: %d\n", a); } /* Vrednost promenljive a: 4*/
Pokazivači- primer 2 - #include <stdio.h> main() { int x = 3; /* Adresu promenjive x zapamticemo u novoj promenljivoj.Nova promenljiva je tipa pokazivaca na int (int*) */ int* px;
printf("Adresa promenljive x je : %p\n", &x); printf("Vrednost promenljive x je : %d\n", x); /* Adresa promenljive x je : 0012FF88 Vrednost promenljive x je : 3 */ px = &x; printf("Vrednost promenljive px je (tj. px) : %p\n", px); printf("Vrednost promenljive na koju ukazuje px (tj. *px) je : %d\n", *px); /*Vrednost promenljive px je (tj. px) : 0012FF88 Vrednost promenljive na koju ukazuje px (tj. *px) je : 3*/
/* Menjamo vrednost promenljive na koju ukazuje px */ *px = 6; printf("Vrednost promenljive na koju ukazuje px (tj. *px) je : %d\n", *px); /*Vrednost promenljive na koju ukazuje px (tj. *px) je : 6 /* Posto px sadrzi adresu promenljive x, ona ukazuje na x tako da jeposredno promenjena i vrednost promenljive x */ printf("Vrednost promenljive x je : %d\n", x); } /* Vrednost promenljive x je : 6*/
Pokazivači – primer 3 - #include <stdio.h> /* main funkcija */ int main() { double x = 2.1, *px = &x; /*px pokazuje na adresu od x*/ double y = 0.1, *py = &y; /*py pokazuje na adresu od y*/
/* Prikazujemo vrednosti pokazivaca. %p specifikator u printf()-u ispisuje vrednost pokazivaca u heksadekadnoj notaciji. */ printf("Vrednost pokazivaca px je %p\n", px); printf("Vrednost pokazivaca py je %p\n", py); /* Vrednost pokazivaca px je 0xbfe7caa0 Vrednost pokazivaca py je 0xbfe7ca98*/ /* Ispisujemo vrednosti na koje pokazuju pokazivaci */ printf("px pokazuje na vrednost: %f\n", *px); printf("py pokazuje na vrednost: %f\n", *py); /* px pokazuje na vrednost: 2.100000 py pokazuje na vrednost: 0.100000 */
/* Ispitujemo da li su pokazivaci jednaki, tj. da lipokazuju na isti objekat u memoriji */ if(px == py) printf("Pokazivaci px i py pokazuju na isti objekat\n"); else printf("Pokazivaci px i py ne pokazuju na isti objekat\n"); /* Pokazivaci px i py ne pokazuju na isti objekat */ py = px;
/* Prikazujemo vrednosti pokazivaca. %p specifikator u printf()-u ispisuje vrednost pokazivaca u heksadekadnoj notaciji. */ printf("Vrednost pokazivaca px je %p\n", px); printf("Vrednost pokazivaca py je %p\n", py); /* Vrednost pokazivaca px je 0xbfe7caa0 Vrednost pokazivaca py je 0xbfe7caa0 */ /* Ispisujemo vrednosti na koje pokazuju pokazivaci */ printf("px pokazuje na vrednost: %f\n", *px); printf("py pokazuje na vrednost: %f\n", *py); /* px pokazuje na vrednost: 2.100000 py pokazuje na vrednost: 2.100000 */
/* Ispitujemo da li su pokazivaci jednaki, tj. da li pokazuju na isti objekat u memoriji */ if(px == py) printf("Pokazivaci px i py pokazuju na isti objekat\n"); else printf("Pokazivaci px i py ne pokazuju na isti objekat\n"); /* Pokazivaci px i py pokazuju na isti objekat*/ px = &y;
/* Prikazujemo vrednosti pokazivaca. %p specifikator u printf()-u ispisuje vrednost pokazivaca u heksadekadnoj notaciji. */ printf("Vrednost pokazivaca px je %p\n", px); printf("Vrednost pokazivaca py je %p\n", py); /* Vrednost pokazivaca px je 0xbfe7ca98 Vrednost pokazivaca py je 0xbfe7caa0 */ /* Ispisujemo vrednosti na koje pokazuju pokazivaci */ printf("px pokazuje na vrednost: %f\n", *px); printf("py pokazuje na vrednost: %f\n", *py); /* px pokazuje na vrednost: 0.100000 py pokazuje na vrednost: 2.100000 */
/* Ispitujemo da li su pokazivaci jednaki, tj. da li pokazuju na isti objekat u memoriji */ if(px == py) printf("Pokazivaci px i py pokazuju na isti objekat\n"); else printf("Pokazivaci px i py ne pokazuju na isti objekat\n"); } /* Pokazivaci px i py ne pokazuju na isti objekat */
Pokazvači- primer 4 - • Zamena promenljivih Program unosi vrednosti dve promenljive i zatim uposebnoj funkciji zamenjuje njihove vrednosti. Program demonstrira neispravnu i ispravnu verzijuove funkcije (primenom pokazivača).
#include <stdio.h> /* Ova funkcija zamenjuje vrednosti lokalnih podataka a i b, sto nije ono sto zelimo da uradimo */ void swap1(int a, int b) { int t; t = a; a = b; b = t; }
/* Ova funkcija zamenjuje vrednosti promenljivih na koje pokazuju lokalne pokazivacke promenljive a i b. Ovo je upravo ono sto zelimo */ void swap2(int *a, int *b) { int t; t = *a; *a = *b; *b = t; }
/* main funkcija */ int main() { int x, y; printf("Uneti X i Y: "); scanf("%d%d", &x, &y); printf("X: %d\nY: %d\n", x, y); /* X: 2 Y: 4 */ swap1(x,y); /* NE RADI */ printf("Nakon poziva swap1(x,y):\n"); printf("X: %d\nY: %d\n", x, y);
/* Nakon poziva swap1(x,y): X: 2 Y: 4 */ swap2(&x,&y); /* RADI */ printf("Nakon poziva swap2(x,y):\n"); printf("X: %d\nY: %d\n", x, y); } /* Nakon poziva swap2(x,y): X: 4 Y: 2 */
Pokazivači- primer 5 - • Brojanje karaktera Program učitava tekst sa ulaza i broji mala i velika slova, cifre, beline i redove. Program demonstrira prenos parametara po adresi, primenompokazivača.
#include <stdio.h> /* Deklaracija funkcije prebroj */ void prebroj(int * br_malih, int * br_velikih, int * br_cifara, int * br_belina, int * br_redova); /* main funkcija */ int main() { int br_malih = 0, br_velikih = 0, br_cifara = 0, br_belina = 0, br_redova = 0;
/* Pozivamo funkciju za prebrojavanje */ prebroj(&br_malih, &br_velikih, &br_cifara, &br_belina, &br_redova); /* Prikazujemo vrednosti globalnih brojaca, koje je funkcija prebroj() izmenila */ printf("Broj malih slova: %d\n", br_malih); printf("Broj velikih slova: %d\n", br_velikih); printf("Broj cifara: %d\n", br_cifara); printf("Broj belina: %d\n", br_belina); printf("Broj redova: %d\n", br_redova); }
/* Definicija funkcije prebroj */ void prebroj(int * br_malih, int * br_velikih, int * br_cifara, int * br_belina, int * br_redova) { int c; while((c = getchar()) != EOF) { if(c >= 'a' && c <= 'z‘) (*br_malih)++; else if(c >= 'A' && c <= 'Z‘) (*br_velikih)++; else if(c >= '0' && c <= '9‘) (*br_cifara)++; else if(c == '\n' || c == '\t' || c == ' ') { (*br_belina)++; if(c == '\n') (*br_redova)++; } } }