Documente Academic
Documente Profesional
Documente Cultură
Tablouri şi funcţii
PCLP CURS 3 2
PCLP CURS 1 1
10/18/2015
• Exemple:
ndigit[i]
ndigit[7]
ndigit[c-'0'], unde int c; este un
caracter din codul ASCII
PCLP CURS 3 11 PCLP CURS 3 12
PCLP CURS 1 2
10/18/2015
if (condiţie1)
instrucţiune1
• Dacă ultimul else şi instrucţiunea Instrucţiunea switch
de după el nu există, nu se face
else if (condiţie2) nimic.
instrucţiune2 • care va fi discutată ulterior, furnizează un alt mod
... • Pot fi oricâte grupuri de de a scrie o structură decizională cu multe
... else if(condiţie) ramificaţii,
else instrucţiune
instrucţiunen • dar ea este în special adecvată când condiţia
între if-ul iniţial şi else-ul final.
caută potrivirea unei expresii întregi sau caracter
• Se recomandă respectarea stilului de scriere a construcţiei
într-un set de constante.
cum s-a arătat mai sus;
• altfel dacă fiecare if ar fi fost indentat spre dreapta în • O versiune cu switch a programului anterior va
raport cu else-ul anterior, secvenţa de decizii s-ar fi fi prezentată când se va discuta instrucţiunea
întins mult spre marginea din dreapta a paginii. switch.
PCLP CURS 3 17 PCLP CURS 3 18
PCLP CURS 1 3
10/18/2015
Funcţii
• O funcţie furnizează un mod convenabil pentru a încapsula
anumite calcule şi apoi
• poate fi utilizată fără nicio grijă asupra modului cum a fost
implementată.
• Cu funcţii proiectate corect este posibil
să ignori cum a fost realizată o sarcină;
este suficient să ştii doar ce a fost realizat.
• C face utilizarea funcţiilor facilă, comodă şi eficientă;
II. FUNCŢII • de multe ori o funcţie mică face mai clară o bucată de cod.
• Până acum am utilizat doar funcţii predefinite furnizate de
limbaj, ca printf, getchar şi putchar ;
• acum vom învăţa să scriem propriile noastre funcţii.
PCLP CURS 3 19 PCLP CURS 3 20
#include <stdio.h>
SUMA A DOUĂ NUMERE
tipul valorii numele
int suma(int ,int ); /* prototipul functiei */
returnate funcţiei parametrii formali
int main() main: funcţie apelantă
{
apelul funcţiei suma de funcţie parametrii de intrare
int x, y, adunare;
x = 3;
parametrii actuali (efectivi) int suma(int a, int b)
y = 4; {
adunare = suma(x, y); parametrii actuali variabilă locală
printf("suma = %d\n",adunare); coincid cu cei formali
int s;
return 0; s = a + b; CORPUL FUNCŢIEI
}
ca
• număr, return s;
int suma(int a, int b)
{ • poziţie şi a, b suma suma
int s;
suma: funcţie apelată • tip de dată }
s = a + b;
NU coincid ca nume
return s; valoarea returnată de funcţie
}
PCLP CURS 3 21 PCLP CURS 3 22
}
return 0; Completaţi }
return 0;
PCLP CURS 1 4
10/18/2015
return s; return s;
7.a,b 9.suma
8. suma
} 7. … 8. … 9. … }
#include <stdio.h>
ÎNTREBARE int suma(int ,int ); /* prototipul functiei */
int main()
{
• Scrieţi un program care apelează o funcţie int x, y, adunare;
care calculează suma a două numere întregi x = 3;
y = 4;
adunare = suma(x, y);
printf("suma = %d\n",adunare);
return 0;
}
#include <stdio.h>
int power(int m, int n);
int main()
{
base, power power
int i; n
for (i = 0; i < 10; ++i)
printf("%d %d %d\n", i, power(2,i), power(-3,i));
return 0;
}
int power(int base, int n) /* power: raise base to n-th power; n >= 0 */
Aplicaţie {
int i, p; Programul conţine o funcţie
PROGRAM PENTRU RIDICAREA LA O p = 1;
power(m,n) pentru a ridica
un întreg m la o putere întreagă
for (i = 1; i <= n; ++i)
PUTERE ÎNTREAGĂ POZITIVĂ p = p * base;
pozitivă n. Adică valoarea
returnată de power(2,5)
return p;
} este 32.
PCLP CURS 1 5
10/18/2015
PCLP CURS 1 6
10/18/2015
• Parametrii actuali (efectivi) şi cei formali • Parametrii actuali (efectivi) şi cei formali
trebuie să corespundă ca trebuie să corespundă ca
poziţie, ……….,
număr şi ………… şi
tip de dată. …………...
• Parametrii actuali (efectivi) substituie la apel • Parametrii … (...) substituie la apel parametrii
parametrii formali. ………. .
return expresie;
Răspuns
• Valoarea pe care funcţia power o calculează este
• Parametrii actuali (efectivi) şi cei formali returnată funcţiei main prin instrucţiunea
trebuie să corespundă ca return.
poziţie, • După return poate urma orice expresie
număr şi • Nu este obligatoriu ca o funcţie să returneze o
tip de dată. valoare.
• Să observăm că există o instrucţiune return la
• Parametrii actuali (efectivi) substituie la apel finalul lui main.
parametrii formali. • Deoarece main este o funcţie ca oricare alta, ea
poate returna o valoare către apelantul său aflat în
mediul în care programul a fost executat.
PCLP CURS 3 39 PCLP CURS 3 40
PCLP CURS 1 7
10/18/2015
Prototipul funcţiei
• Se semnalează eroare dacă definiţia unei funcţii sau
orice utilizare a ei nu este în conformitate cu
prototipul său.
• Numele parametrilor nu trebuie să se conformeze.
• Numele parametrilor sunt opţionali în prototipul
funcţiei, aşa că pentru prototip putem scrie şi aşa: II.1 APELUL PRIN VALOARE
int power(int, int);
În C toate argumentele sunt transmise /* power: raise base to n-th power; n >= 0; version 2 */
PCLP CURS 1 8
10/18/2015
Aplicaţie
PCLP CURS 1 9
10/18/2015
STRUCTURA PROGRAMULUI
/* copy: copy 'from' into 'to'; assume to is big enough */
#include <stdio.h>
void copy(char to[], char from[]) #define MAXLINE 1000/* maximum input line length */
{
int getline(char line[], int maxline);
int i; void copy(char to[], char from[]);
Funcţiile getline şi copy sunt declarate
i = 0; main()
la începutul programului, care presupunem
{…} că este conţinut într-un singur fişier.
while ((to[i] = from[i]) != '\0')
++i; int getline(char s[],int lim)
{…}
} copy se bazează pe faptul că argumentul său de intrare (char
from[]) este terminat cu un '\0' şi copiază acest caracter pe void copy(char to[], char from[])
ieşire (char to[]). {…}
PCLP CURS 3 59 PCLP CURS 3 60
PCLP CURS 1 10
10/18/2015
int getline(char s[], int lim) void copy(char to[], char from[])
• Unele funcţii returnează valori utile.
• Această linie spune că primul argument formal, s,
e un tablou, iar al doilea, lim, e un întreg. • Altele, precum copy, sunt utilizate numai pentru
ceea ce fac şi nu returnează nicio valoare.
• Declară că getline returnează un int
• Deoarece int este tipul implicit returnat, el putea • Tipul returnat de copy este void, care afirmă
explicit că nu este returnată nicio valoare.
fi omis.
• Adică linia • Cu toate acestea, funcţia returnează către main şirul
int getline(char s[], int lim) to[] în care a copiat şirul from[], dar prin
intermediul parametrilor de ieşire - de tip adresă -
• putea fi substituită de linia adrese care, în cazul tablourilor, sunt tot una cu
getline(char s[],int lim) numele lor.
PCLP CURS 3 63 PCLP CURS 3 64
PCLP CURS 1 11
10/18/2015
EXEMPLIFICARE CU “AFIŞAREA
II.2 VARIABILE EXTERNE ŞI CELEI MAI LUNGI LINII CITITE PE
DOMENIUL DE VIZIBILITATE INTRARE”
PCLP CURS 1 12
10/18/2015
• Acesta este motivul pentru care astfel de variabile • Deoarece variabilele automate apar şi dispar la
sunt numite de obicei variabile automate apelul funcţiei:
(automatic variables) urmând terminologia din ele nu reţin valorile lor între două apeluri ale funcţiei
alte limbaje de programare. trebuie să fie setate explicit la fiecare intrare.
• Vom utiliza termenul automat de aici înainte • Dacă ele nu sunt setate, aceste variabile vor
pentru a ne referi la aceste variabile locale. conţine resturi de memorie (garbage).
PCLP CURS 3 73 PCLP CURS 3 74
PCLP CURS 1 13
10/18/2015
Răspunsuri
1. automată
2. externă
Aplicaţie
PCLP CURS 1 14
10/18/2015
#include <stdio.h>
Variabile externe
#define MAXLINE 1000 /* maximum input line size */
• Din punct de vedere sintactic, definirile de variabile
int max; /* maximum length seen so far */
externe
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */ sunt exact ca şi definiţiile de variabile locale, dar
datorită faptului că ele apar în afara funcţiilor, variabilele
int getline(void);
sunt externe.
void copy(void);
Variabilele externe din • Înainte ca o funcţie să poată utiliza, în partea sa de
main() main, getline şi copy
{…} instrucţiuni, o variabilă externă,
Se specifică tipul lor şi se numele variabilei trebuie să fie făcut cunoscut funcţiei în
int getline(void) determină să le fie alocat
partea sa de declaraţii;
{…} spaţiu de stocare.
void copy(void) • declaraţia este asemănătoare cu cea anterioară cu
{…} excepţia faptului că apare cuvântul cheie extern.
PCLP CURS 3 85 PCLP CURS 3 86
PCLP CURS 1 15
10/18/2015
PCLP CURS 1 16
10/18/2015
int getchars(char s[], int lim) void detab(char s1[], char s2[], int w)
{
{ int i, j, l, c, blanks; blanks:
int c, i, l; numărul de
i = 0; /* contorul lui s1[] */
blank-uri ce
l = 0; /* contorul lui s2[] */
while ((c = s1[i++]) != '\0') { substituie
for (i = 0, l = 0; (c = getchar()) tab-ul
if (c == '\t') {
!= EOF && c != '\n'; ++i)
blanks = w - l % w;
if (i < lim - 1) for (j = 0; j < blanks; ++j)
s[l++] = c; s2[l++] = ' ';
Se pun caractere în s[]
} else {
s[l] = '\0'; cât timp i < MAXLINE
s2[l++] = c; Se copiază caracterele din
din acel moment l nu
} s1[] în s2[] înlocuind
mai creşte, dar
return l; } fiecare tab cu un număr
caractere se citesc în
s2[l] = '\0'; corespunzator de blank-uri
} continuare
}
PCLP CURS 3 101 PCLP CURS 3 102
PCLP CURS 1 17
10/18/2015
ÎNLOCUIREA BLANK-URILOR CU UN
NUMĂR MINIM DE
TAB-URI ŞI BLANK-URI
PCLP CURS 3 103 PCLP CURS 3 104
int getchars(char s[], int lim) /* copiaza caracterele din s1 in s2 si inlocuieste spatiile cu tab-uri */
void entab(char s1[], char s2[], int w)
{ {
int c, i, l; int i, j, l, c, blanks;
int blanksenough;
for (i = 0, l = 0; (c = getchar()) /* ia valorile 1 sau 0 dupa cum in momentul intalnirii unui spatiu dupa el
sunt numai spatii pana la urmatorul tab stop, sau nu */
!= EOF && c != '\n'; ++i)
if (i < lim - 1) i = 0; /* contorul lui s1[] */
l = 0; /* contorul lui s2[] */
s[l++] = c;
while ((c = s1[i]) != '\0') {
s[l] = '\0'; if (c == ' ') {/* la intalnirea unui spatiu in s1 */
blanksenough = 1;
return l; /* consideram ca exista numai spatii pana urmatorul tab stop */
} blanks = w - i % w;
/* calculam cate spatii ar trebui sa fie pana la urmatorul tab stop */
PCLP CURS 1 18
10/18/2015
#include <stdio.h>
int main(void)
{ int getline(char s[], int lim)
int len, i;
char s[MAXLENGTH]; {
while ((len = getline(s, MAXLENGTH)) > 0) { int c, i, l;
printf("\nRezultat:\n");
i = 0;
while (s[i] != '\0') {
if (s[i] == '/' && s[i+1] == '*') { for (i = 0, l = 0; (c = getchar()) != EOF; ++i)
i += 2;
while (s[i] != '\0' && s[i+1] != '\0' && (s[i] != '*' || s[i+1] != '/'))
if (i < lim - 1)
++i; s[l++] = c;
if (s[i] != '\0' && s[i+1] == '\0')
++i; s[l] = '\0';
if (s[i] == '*' && s[i+1] == '/’)
i += 2;
} else
putchar(s[i++]);
return l;
}
}
}
return 0;
}
PCLP CURS 1 19
10/18/2015
#include <stdio.h>
if (c == '/') {
#define NOTHING 0 do
#define COMMENT 1
#define DOUBLE_QUOTE 2
if ((c = getchar()) == '*')
#define SINGLE_QUOTE 3 state = COMMENT;
while (c == '/');
int line;
void print_error (char s[]); }
else {
int main ()
if (c == '\"')
{
int state, parentheses, brackets, braces, c; state = DOUBLE_QUOTE;
line = 1; else if (c == '\'')
state = NOTHING;
state = SINGLE_QUOTE;
parentheses = brackets = braces = 0; /* ( [ { */ else if (c == '\n')
while ((c = getchar()) != EOF) line++;
if (state == NOTHING) {
PCLP CURS 1 20
10/18/2015
#include <stdio.h>
void print_error(char s[])
{ #define NOTHING 0
#define COMMENT 1
printf("Eroare (%d): %s!\n", #define DOUBLE_QUOTE 2
line, s); #define SINGLE_QUOTE 3
} int line;
void print_error (char s[]);
int main ()
{…}
void print_error(char s[])
{…}
Bibliografie
PCLP CURS 1 21