1 / 39

Ana Zekovi ć Zasnovano na primerima sa stranic e : matf.bg.ac.yu /~ jtomasevic

Prenos parametara po vrednosti i preko pokaziva ča . Prenos ni z a u f - ju . F-je za rad sa niskama (stringovima). Ana Zekovi ć Zasnovano na primerima sa stranic e : www.matf.bg.ac.yu /~ jtomasevic. Demonstracija prenosa parametara po vrednosti Preneti parametri se NE mogu menjati.

maura
Download Presentation

Ana Zekovi ć Zasnovano na primerima sa stranic e : matf.bg.ac.yu /~ jtomasevic

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Prenos parametara po vrednosti i preko pokazivača.Prenos niza u f-ju.F-je za rad sa niskama (stringovima). Ana Zeković Zasnovano na primerima sa stranice: www.matf.bg.ac.yu/~jtomasevic

  2. Demonstracija prenosa parametara po vrednosti Preneti parametri se NE mogu menjati

  3. void f(intx) { x++; } main() { int x=3; f(x); printf("%d\n", x); }

  4. Izlaz: 3

  5. Prvi način rešavanja problema: X se prenosi preko adrese

  6. #include <stdio.h> void f( int *x) { ( *x )++; } main() { int x=3; f( &x ); printf("%d\n", x); }

  7. Izlaz: 4

  8. Drugi način rešavanja problema: Vrednost privremene promenljive x u okviru funkcije f vrati kao rezultat rada funkcije:

  9. #include <stdio.h> int f(int x) { returnx++; } main() { int x=3; printf("%d\n", f(x)); }

  10. Izlaz: 4

  11. Treći način rešavanja problema: x se prenosi preko globalne promenljive

  12. #include <stdio.h> int x=3; void f() { x++; } main() { f(); printf("%d\n", x); }

  13. Izlaz: 4

  14. /* POGRESNO!!!!!!!!*/ void razmeni(int x, int y) { int pom; pom = x; x = y; y = pom; }

  15. /* Zameni *px i *py */ void razmeni(int *px, int *py) { int pom; pom = *px; *px = *py; *py = pom; }

  16. Poziv funkcije sada izgleda: razmeni(&a, &b);

  17. Funkcija istovremeno vraća dve vrednosti - količnik i ostatak dva data broja. Ovo se postiže tako što se funkciji predaju vrednosti dva broja (x i y) koji se dele i adrese dve promenljive na koje će se smestiti rezultati

  18. void div_and_mod(int x, int y, int*pdiv, int*pmod) { printf("Kolicnik postavljam na adresu : %p\n", pdiv); printf("Ostatak postavljam na adresu : %p\n", pmod); *pdiv = x / y; *pmod = x % y; } main() { int div, mod; printf("Adresa promenljive div je %p\n", &div); printf("Adresa promenljive mod je %p\n", &mod); /* Pozivamo funkciju tako sto joj saljemo vrednosti dva broja (5 i 2 ) i adrese promenljvih div i mod na koje ce se postaviti rezultati */ div_and_mod(5, 2, &div, &mod); printf("Vrednost promenljive div je %d\n", div); printf("Vrednost promenljive mod je %d\n", mod); }

  19. Izlaz u konkretnom slucaju: Adresa promenljive div je 0012FF88 Adresa promenljive mod je 0012FF84 Kolicnik postavljam na adresu : 0012FF88 Ostatak postavljam na adresu : 0012FF84 Vrednost promenljive div je 2 Vrednost promenljive mod je 1

  20. Prenos niza u f-ju • Nizovi se prenose u funkciju tako što se prenese adresa njihovog početka. Iz tog razloga oni seMOGU MENJATI u okviru funkcije. • Sve nizove osim niski karaktera (stringova) neophodno je prenositi zajedno sadimenzijom niza !!!

  21. Funkcija za ispis niza brojeva - demonstracija prenosa niza brojeva u funkciju

  22. #include <stdio.h> void print_array(int a[], int n) { int i; for (i = 0; i < n; i++) printf("%d ",a[ i ]); putchar('\n'); /* Obratite paznju na ovo : Ispisace se broj bajtova koje zauzima promenljivatipa pokazivac na int */ printf("sizeof(a) - u okviru fje : %d\n", sizeof(a)); } main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; /* Ispisace se broj bajtova koje zauzima niz a */ printf("sizeof(a) - u okviru main : %d\n", sizeof(a)); print_array(a, sizeof(a)/sizeof(int)); }

  23. Izlaz: sizeof(a) - u okviru main : 36 1 2 3 4 5 6 7 8 9 sizeof(a) - u okviru fje : 4

  24. Primer funkcije koja računa skalarni proizvod dva niza brojeva

  25. #include <stdio.h> long mnozi(int x[],int y[],int n); main() { int a[]={1,2,3,4,5,6}, b[]={8,7,6,5,4,3}; printf("Skalarno a*b= %ld\n",mnozi(a,b,6)); } long mnozi(int x[ ],int y[ ],int n) { int i; long suma=0; for(i=0;i<n;i++) suma=suma+x[i]*y[i]; return suma; }

  26. Izlaz: Skalarno a*b= 98

  27. Funkcije za rad sa niskama (stringovima) Niska karaktera ili string je niz karaktera koji se završava karakterom '\0'.

  28. #include <stdio.h> /* Uz nisku karaktera nije potrebno prenositi dimenziju ukoliko se postuje dogovorda se svaka niska zavrsava karakterom '\0'.*/ void stampaj_nisku( char s[ ] ) { int i; for(i = 0; s[i]!=’\0’; i++)/* s[i] ce biti netacno samo kada bude jednako sa '\0' ciji je ASCII kod 0. Ovo je isto kao da smo napisali for (i = 0; s[i]; i++)*/ putchar(s[i]); } main() { stampaj_nisku( ’’Zdravo\n’’ ); }

  29. Funkcija za učitavanje reči sa ulaza u nisku karaktera. Funkcija ucitava rec sa standardnog ulaza i smesta je u niz karaktera s. Ovo uspeva zbog toga sto se po vrednosti prenosi adresa pocetka niza, a ne ceo niz.

  30. #include <stdio.h> #include <ctype.h> /* Potrebno je zbog funkcije isspace */ void ucitaj_rec(char s[]) { int c, i = 0; /* Funkcija isspace ispituje da li je karakter praznina(blanko, tabulator ili prelazak u novi red).Ona je definisana u okviru ctype.h */ while (!isspace(c=getchar())) s[i++] = c; s[i] = '\0'; } main() { /* Obavezno je alocirati memoriju za niz karaktera */ char s[100]; ucitaj_rec(s); /* Format za ispis stringa se zadaje kao %s */ printf(’’%s\n’’, s); }

  31. Da li bi bio ispravan sledeći program?

  32. #include <stdio.h> /* Funkcija ucitava ceo broj sa standardnog ulaza i smesta je u promenljivu x. */ void ucitaj_broj(int x) { scanf("%d", &x); } main() { int x; ucitaj_broj(x); printf("%d\n", x); }

  33. Primer funkcije ‘obrni string’ – obrće nisku karaktera.

  34. #include <stdio.h> /* Ova funkcija racuna duzinu date niske karaktera. Umesto nje, moguce je koristiti standardnu funkciju strlen .*/ int duzina_stringa(char s[]) { int i; for (i = 0; s[i]; i++); return i; }

  35. /* Funkcija obrce nisku karaktera */ void obrni_string(char s[]) { int i, j; for (i = 0, j = duzina_stringa(s)-1;i<j; i++, j--) { int pom = s[i]; s[i] = s[j]; s[j] = pom; } /* Napomena : razlikovati prethodnu petlju od dve ugnjezdjene petlje: for ( i = 0; ....) for ( j = duzina(s)-1; ... */ }

  36. main() { char s[] = "Zdravo svima"; obrni_string(s); printf("%s\n", s); } Izlaz: amivs ovardZ

  37. Primer fukcije koja uklanja beline, tabulatore ili znak za kraj reda sa kraja stringa

  38. int ukloni(char s[]) { int i; for (i = strlen(s)-1; i >= 0; i--) if (s[i] != ' ' && s[i] != '\t' && s[i] != '\n') break; s[i+1] = '\0'; return i; }

More Related