ana zekovi ć zasnovano na primerima sa stranic e : matf.bg.ac.yu /~ jtomasevic

39
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

Upload: maura

Post on 02-Feb-2016

43 views

Category:

Documents


0 download

DESCRIPTION

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. - PowerPoint PPT Presentation

TRANSCRIPT

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

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

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

Demonstracija prenosa parametara po vrednosti

Preneti parametri se NE mogu menjati

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

void f(int x){

x++;}

main(){

int x=3;f(x);printf("%d\n", x);

}

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

Izlaz:

3

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

Prvi način rešavanja problema:

X se prenosi preko adrese

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

#include <stdio.h>

void f( int *x){

( *x )++;}

main(){

int x=3;f( &x );printf("%d\n", x);

}

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

Izlaz:

4

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

Drugi način rešavanja problema:

Vrednost privremene promenljive x u okviru funkcije f vrati kao

rezultat rada funkcije:

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

#include <stdio.h>

int f(int x){

return x++;}

main(){

int x=3;printf("%d\n", f(x));

}

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

Izlaz:

4

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

Treći način rešavanja problema:

x se prenosi preko globalne promenljive

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

#include <stdio.h>int x=3;

void f(){

x++;}

main(){

f();printf("%d\n", x);

}

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

Izlaz:

4

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

/* POGRESNO!!!!!!!! */

void razmeni( int x, int y ) {

int pom;

pom = x;x = y;y = pom;

}

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

/* Zameni *px i *py */

void razmeni( int *px, int *py){

int pom;

pom = *px;*px = *py;*py = pom;

}

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

Poziv funkcije sada izgleda:

razmeni( &a, &b );

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

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

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

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);

}

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

Izlaz u konkretnom slucaju:

Adresa promenljive div je 0012FF88Adresa promenljive mod je 0012FF84Kolicnik postavljam na adresu : 0012FF88Ostatak postavljam na adresu : 0012FF84Vrednost promenljive div je 2Vrednost promenljive mod je 1

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

Prenos niza u f-ju

• Nizovi se prenose u funkciju tako što se prenese adresa njihovog početka. Iz tog razloga oni se MOGU MENJATI u okviru funkcije.

• Sve nizove osim niski karaktera (stringova) neophodno je prenositi zajedno sa dimenzijom niza !!!

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

Funkcija za ispis niza brojeva - demonstracija prenosa niza brojeva u

funkciju

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

#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 promenljiva tipa 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) );

}

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

Izlaz:sizeof(a) - u okviru main : 361 2 3 4 5 6 7 8 9sizeof(a) - u okviru fje : 4

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

Primer funkcije koja računa skalarni proizvod dva niza brojeva

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

#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;

}

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

Izlaz:Skalarno a*b= 98

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

Funkcije za rad sa niskama (stringovima)

Niska karaktera ili string je niz karaktera koji se završava karakterom '\0'.

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

#include <stdio.h>/* Uz nisku karaktera nije potrebno prenositi dimenzijuukoliko se postuje dogovor da 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’’ );}

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

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.

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

#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);

}

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

Da li bi bio ispravan sledeći program?

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

#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);

}

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

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

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

#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;

}

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

/* 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; ...*/

}

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

main(){

char s[ ] = "Zdravo svima";obrni_string(s);printf("%s\n", s);

}

Izlaz:amivs ovardZ

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

Primer fukcije koja uklanja beline, tabulatore ili

znak za kraj reda sa kraja stringa

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

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;

}

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