Sunteți pe pagina 1din 17

Introducere

?
?
?
?
Fia disciplinei
Coninut, cunotine anterioare necesare
Bibliografie manual, culegere de probleme
Evaluare
Seminar
Probe practice teme obligatorii (condiie de intrare)
Activitate
Examen
Diverse
prezen, recuperri, studiu individual, reguli, colaborare
Consultaii
Algoritmi i tehnici de programare
Subprograme (continuare)
Preluarea parametrilor din linia de comand
Subprograme cu numr variabil de parametri
Pointeri la funcii (subprograme)
Recursivitate
Biblioteci de subprograme

Parametri n linia de comand


Comanda
Parametri n linia de comand
Parametri n linia de comand
Memoria intern
Cuvnt 0 (nume program)
Cuvnt 1 (parametrul 1)
Cuvnt 2 (parametrul 2)
Cuvnt 3 (parametrul 3)

Cuvnt n-1 (parametrul n-1)

Adresa cuvnt 0
Adresa cuvnt 1
Adresa cuvnt 2
Adresa cuvnt 3
Adresa cuvnt n-1
iruri de caractere
adresa
vectorului
char**
Parametri n linia de comand
Parametri:
int argc
char* argv[]
void main ( int argc, char* argv[] )
Algoritm: se parcurge vectorul de cuvinte i se
preia fiecare parametru
Preluare conversie din ir de caractere n
formatul dorit (ex. sscanf )
E sarcina programatorului s valideze lista de
parametri i s o prelucreze

Parametri n linia de comand

Adunarea a dou numere reale preluate din linia de comand

#include <stdio.h>

void main(int argc, char* argv[])
{ float x,y;

if(argc!=3)
printf(\nNumar incorect de parametri!\n);

else
{ sscanf(argv[1],%f, &x);
sscanf(argv[2],%f, &y);

printf(\nProgramul executabil:%s\n,argv[0]);
printf(\nx= %6.2f\n,x);
printf(\ny= %6.2f\n,y);
printf(\nx+y=%6.2f\n,x+y);
}
}
Parametri n linia de comand

Sortarea unui ir de numere reale
#include <stdio.h>
void main(int argc, char* argv[])
{ float x[100],aux;
int i,j,n;
if(argc<2) printf("\nNumar incorect de parametri!\n");
else
{ n=argc-1;
for(i=1;i<argc;i++)
sscanf(argv[i],"%f", &x[i-1]);
printf("\n\nVectorul initial:\n");
for(i=0;i<n;i++)
printf("%6.2f",x[i]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(x[i]>x[j])
{ aux=x[i];
x[i]=x[j];
x[j]=aux;
}
printf("\n\nVectorul sortat:\n");
for(i=0;i<n;i++)
printf("%6.2f",x[i]);
printf("\n\n");
}
}
Subprograme cu numr variabil de parametri
Exemple
printf, scanf

Prototip
cu list fix de parametri
tip_rezultat nume(lista_parametri);

cu numr variabil de parametri
tip_rezultat nume(lista_parametri_fici, );
Subprograme cu numr variabil de parametri
Este sarcina programatorului s scrie cod care
preia i trateaz corect toi parametrii din lista
variabil de parametri !

Elemente definite n stdarg.h
va_list - tip de dat
va_start - funcie, iniializare lucru cu lista variabil
va_arg - funcie, extrage urmtorul parametru
va_end - funcie, ncheire lucru cu lista variabil

Subprograme cu numr variabil de parametri
va_list
o variabil local de tip va_list care reine adresa listei
de parametri variabili
va_list p;

void va_start(va_list p, ultim);
iniializeaz adresa listei variabile
ultim este numele ultimului parametru fix (uneori
reprezint numrul de parametri variabili)
Subprograme cu numr variabil de parametri
tip va_arg(va_list p, tip);
obine valoarea urmtorului parametru din lista variabil,
conform tipului cerut!

void va_end(va_list p);
ncheie lucrul cu lista variabil de parametri
Subprograme cu numr variabil de parametri
Algoritm

declarare variabil local de tip va_list
apelare va_start
bucl* de preluare/prelucrare a parametrilor cu va_arg
apelare va_end

Detectare numr parametri n list
Precizare numr parametri la apel (de obicei ultimul
parametru fix) bucl cu numr cunoscut de pai
O valoare convenional care marcheaz terminarea
listei variabile de parametri bucl condiionat
anterior
Subprograme cu numr variabil de parametri
void exemplu(int a, int b, );

exemplu(x, y, p1, p2, p3, p4, p5, p6);





va_list p;
va_start(p,b);

vl1=va_arg(p,double);
vl2=va_arg(p,int)


x y p1 p2 p3 p4 p5 p6
Subprograme cu numr variabil de parametri
Media unui ir de numere reale
double media(int nr, )
{ double suma=0; int i;
va_list p;
va_start(p, nr);
for(i=0;i<nr;i++)
suma+=va_arg(p, double );
va_end(p);
return(suma/nr);
}



int a, b, c;
double d, e, f, g;
d=media(3,a,b,c);
e=media(3,1,2,3);
f=media(3,1.0,2.0);
g=media(3,1.0,2.0,3.0,4.0);

x=media(3,4.0,6.0,9.0);
y=media(2,5.0,8.0);
z=media(4,4.0,5.0,6.0,7.0);
double media(float unu, )
{ double n, suma=unu; int cite=1;
va_list p;
va_start(p, unu);
n=va_arg(p, double);
while(n!=-1)
{ suma+=n;
cite++;
n=va_arg(p, double );
}
va_end(p);
return(suma/cite);
}


x=media(4.0,6.0,9.0,-1.0);
y=media(5.0,8.0,-1.0);
z=media(4.0,5.0,6.0,7.0,-1.0);
Atenie la tipurile parametrilor!
Subprograme cu numr variabil de parametri
Concatenarea unor iruri de caractere la un ir dat
void concat_var(char* sir, int nr, )
{ va_list p;
char* s;
int i;
va_start(p,nr);
for(i=0;i<nr;i++)
{ s=va_arg(p,char*);
strcat(sir,s);
}
va_end(p);
return sir;
}
void concat_var(char* sir, )
{ va_list p;
char* s;
va_start(p,sir);
s=va_arg(p,char*);
while(s)
{ strcat(sir,s);
s=va_arg(p,char*);
}
va_end(p);
return sir;
}