Documente Academic
Documente Profesional
Documente Cultură
Limbaje de Programare
Limbaje de Programare
Cuprins
Structura unui program C
Secvențierea
Operații simple de citire/scriere
Operatori relaționali
Operatori logici
Operatorul condițional
Instrucțiuni condiționale
Instrucțiuni de ciclare
Bibliografie selectivă
Structura unui program C
Directive de precompilare #include <stdio.h>
int suma(int x, int y)
Declaratii si definitii de functii { return (x + y);
Functia main }
void afisare_suma(int x, int y)
{ printf("Suma=%d", x + y);
}
int main()
{ int x= 5 , y=7, s;
y = 7;
s = suma(x, y);
printf("Suma este %d\n", s);
afisare_suma(x, y);
return 0;
}
Secvențierea
Instrucțiunile într-o funcție se scriu una după alta (secvențial)
Instrucțiunea compusă: mai multe instrucțiuni între acolade { }
Corpul unei funcții este o instrucțiune compusă (bloc).
{
instrucțiune
...
instrucțiune
}
Secvențierea
Exemplu:
{
int x,y,z;
scanf(”%d %d”,&x,&y);
z=x+y;
printf(”%d+%d= %d”,x,y,z);
}
Instrucțiunea compusă este considerată o singură instrucțiune.
Poate conține și declarații: oriunde (C99)/la început (ANSI C).
Operații simple de citire/scriere
Să ne amintim! #include <stdio.h>
printf:
◦ o funcție standard int main()
◦ nu este instrucțiune sau cuvânt cheie {
◦ este apelată aici cu un parametru șir de caractere printf("Hello world!\n");
◦ constantele șir de caractere sunt incluse între ghilimele " " return 0;
◦ \n este notația pentru caracterul de linie nouă }
Prima linie din program este o directivă de preprocesare,
include fișierul stdio.h cu declarațiile funcțiilor standard de
intrare / ieșire
Declarația = tip, nume, parametri: necesară pentru folosire
Implementarea (codul obiect, compilat): într-o bibliotecă din
care compilatorul ia cele necesare la generarea programului
executabil
Operații simple de citire/scriere
Pentru a tipări valoarea unei expresii, printf #include <stdio.h>
primește două argumente: int sqr (int x)
◦ un șir de caractere (specificator de format): %d {
(pentru întreg, zecimal), %f (pentru real, floating return x * x;
point) }
◦ expresia, al cărei tip trebuie să fie compatibil cu cel int main()
indicat (verificarea cade în sarcina programatorului {
!!!) int a;
scanf primește tot două argumente: printf("dati o valoare (numar intreg) ");
◦ primul argument este la fel cu cel primit de către scanf("%d",&a);
funcția printf printf("%d la patrat = %d\n", a, sqr(a));
◦ al doilea argument este asemănător cu diferența return 0;
ca numele de variabile sunt prefixate de simbolul }
& (ceea ce însemnă adresa variabilei)
Operatori relaționali
Să ne amintim!
Operatorii pot fi: aritmetici, relaţionali, logici, etc.
Operatorii sunt caracterizați de numarul de operanzi pe care se aplică, de clasa de precedență și
de regula de asociativitate.
Funcția modul:
x
𝑥𝑥, 𝑥𝑥 ≥ 0
abs: Z->Z abs(x)=�
−𝑥𝑥, 𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎𝑎
x>=0
da nu
rezultat=x rezultat=-x
rezultat
stop
Instrucțiuni condiționale start
int abs(int x)
{ x>=0
if (x >= 0) da nu
return x ;
else return −x ; //atenție la indentare!
} rezultat=x rezultat=-x
rezultat
stop
Instrucțiuni condiționale
Atenție: O funcție de tip non-void trebuie sa returneze o valoare in toate cazurile!
Programul următor va compila (cu avertismente...), dar valoarea returnata de funcție pe ramura
respectivă rămâne nedefinită, poate fi orice!
Instrucțiuni de ciclare {
int x = 0, cnt = 0, s=0;
while (cnt < n)
Exemplu de calcul start {
pentru suma a n printf("Dati un numar");
numere (citite de la n scanf("%d", &x);
tastatură), folosind //citim numarul si apoi il adunam la suma partiala
s=0
instrucțiunea while: cnt=0 s += x;//sau s=s+x
cnt++;
da }
cnt<n return s;
Citeste
nu x }
s=s+x int main() {
int n;
cnt=cnt+1 printf("Introduceti valoarea pentru n (>=0):");
s scanf("%d", &n);
printf("Suma numerelor citite este %d\n", sum_n(n));
stop return 0;
}
Instrucțiuni de ciclare
Instrucțiunea for:
O altă formă de ciclu cu test inițial.
Sintaxa: for ( expr_initializare ; expr_conditie ; expr_actualizare ) instrucțiune
poate fi rescris cu while astfel:
expr_initializare ; while ( expr_conditie ) expr_actualizare
Observații:
◦ oricare din cele 3 expresii (init., cond., act.) poate lipsi, dar cele 2 ; rămân (putem aveam
for(;;))
◦ daca lipsește expr_conditie ⇒ ciclu infinit
#include <stdio.h>
int sum_n(int n)
Instrucțiuni de ciclare {
int x = 0, cnt, s=0;
for (cnt = 0; cnt < n; cnt++)
Exemplu de calcul pentru suma a n {
numere (citite de la tastatură), folosind printf("Dati un numar");
instrucțiunea for: scanf("%d", &x);
//citim numarul si apoi il adunam la suma partiala
s += x;//sau s=s+x
}
return s;
}
int main() {
int n;
printf("Introduceti valoarea pentru n (>=0) :");
scanf("%d", &n);
printf("Suma numerelor citite este %d\n", sum_n(n));
return 0;
}
Instrucțiuni de ciclare
Instrucțiunea do-while:
◦ Implementează ciclu cu test final.
◦ O folosim dacă știm sigur că un ciclu trebuie executat cel puțin odată.
Sintaxa: do
Instrucțiune while ( expresie ) ;
Semantica instrucțiunii do while:
◦ se execută instrucțiunea (sau setul de instrucțiuni)
◦ se evaluează expresia
◦ dacă e adevărată ⇒ se revine la începutul ciclului, la re-executarea corpului ciclului
◦ dacă e falsă ⇒ nu se mai execută nimic!
#include <stdio.h>
int sum_n(int n)
Instrucțiuni de ciclare {
int x = 0, cnt=0, s=0;
do
Exemplu de calcul pentru suma a n {
numere (citite de la tastatură), folosind printf("Dati un numar");
instrucțiunea do-while: scanf("%d", &x);
//citim numarul si apoi il adunam la suma partiala
Atenție: prima iterație se efectuează s += x; //sau s=s+x
indiferent de valoarea lui cnt, deci cnt++;
programul funcționează doar pentru } while (cnt < n);
valori ale lui n strict pozitive! return s;
}
int main() {
int n;
printf("Introduceti valoarea pentru n (>0):");
scanf("%d", &n);
printf("Suma numerelor citite este %d\n", sum_n(n));
return 0;
}
Instrucțiuni de ciclare
Cum gândim ciclurile?
1. identificăm ce variabile se modifică în fiecare iterație
2. identificăm condiția de ieșire din ciclu
3. avem grijă să actualizăm valoarea variabilei/variabilelor pentru a ne apropia de condiția de
ieșire (altfel ciclul devine infinit!)
Instrucțiuni de ciclare
Instrucțiunea break:
Produce ieșirea din corpul ciclului imediat înconjurător.
O folosim dacă nu dorim să continuăm restul prelucrărilor din ciclu.
Sintaxa: break;
De regulă, ieșirea din ciclu se face condiționat:
if (conditie) break;
#include <stdio.h>
int sum_n(int n)
{
Instrucțiuni de ciclare
int x = 0, cnt=0, s=0;
while (1) //conditie mereu adevarata
//Atentie fara break=>ciclu infinit
Exemplu de calcul pentru suma a n {
numere (citite de la tastatură), folosind if (cnt >= n)
instrucțiunea while si break: break;
printf("Dati un numar");
scanf("%d", &x);
//citim numarul si apoi il adunam la suma partiala
s += x;//sau s=s+x
cnt++;
}
return s;
}
int main() {
int n;
printf("Introduceti valoarea pentru n (>=0):");
scanf("%d", &n);
printf("Suma numerelor citite este %d\n", sum_n(n));
return 0;
}
Instrucțiuni de ciclare
Instrucțiunea continue
Produce ieșirea din iterația curentă a ciclului imediat înconjurător și trecerea la începutul
iterației următoare a acestuia, sărind peste restul instrucțiunilor.
O folosim dacă nu dorim să continuăm restul prelucrărilor din iterația curentă, dar dorim să
continuăm ciclul.
Sintaxa: continue;
De regulă, saltul la iterația următoare se face condiționat:
if (conditie) continue;
#include <stdio.h>
int sum_n(int n)
{
Instrucțiuni de ciclare
int x = 0, cnt=0, s=0;
while (cnt<n)
{
Exemplu de calcul pentru suma printf("Dati un numar");
numerelor pozitive din n numere citite de scanf("%d", &x);
la tastatură, folosind instrucțiunea while //citim numarul si apoi il adunam la suma partiala
si continue: if (x < 0)
continue;
s += x; //sau s=s+x
cnt++;
}
return s;
}
int main() {
int n;
printf("Introduceti valoarea pentru n (>=0):");
scanf("%d", &n);
printf("Suma numerelor citite este %d\n", sum_n(n));
return 0;
}
switch (op)
{
case 1:
Instrucțiuni de ciclare printf("Ati ales optiunea 1\n");
//functie 1
break;
case 2:
Exemplu: Meniu text printf("Ati ales optiunea 2\n");
//functie 1
void meniu(void) break;
{ case 3:
int op; printf("Ati ales optiunea 3\n");
do //functie 1
{ break;
printf("\nMeniu\n\nAlegeti una din case 0:
optiunile urmatoare\n"); return;
printf("1. Optiunea 1\n"); default:
printf("2. Optiunea 2\n"); printf("Optiune invalida\n");
printf("3. Optiunea 3\n"); }
printf("0. Exit\n"); } while (op != 0);
scanf("%d", &op); }
Exerciții
E3_1: Realizați câte un proiect cu exemplele de cod din acest curs și urmăriți cu ajutorul
depanatorului de programe (debugger) execuția programelor linie cu linie.
E3_2: Scrieţi în două moduri diferite câte o funcţie care returnează 1 dacă o valoare număr
natural primită ca parametru reprezintă un an bisect şi returnează 0 în caz contrar.
E3_3: Scrieţi în două moduri diferite câte o funcţie care calculează media numerelor negative din
n numere citite de la tastatură.
Pentru mai multe informații cu privire la subiectele acoperite de acest curs, parcurgeți capitolul
3 (sectiunile 3.1-3.7) din:
◦ Kernighan, B. W., & Ritchie, D. ”The C programming language - Second edition”, 1988
Prentice Hall Software Series
Bibliografie selectivă
◦ Kernighan, B. W., & Ritchie, D. ”The C programming language - Second
edition”, 1988 Prentice Hall Software Series
◦ Minea, M., Limbaje de programare, materiale de curs
http://staff.cs.upt.ro/~marius/curs/lp/index.html
◦ Holotescu, C., Limbaje de programare, materiale de curs
http://labs.cs.upt.ro/~oose/pmwiki.php/LP/Lectures
◦ Iorga,V., Programarea Calculatoarelor, materiale de curs
http://andrei.clubcisco.ro/cursuri/anul-1/semestrul-1/programarea-
calculatoarelor.html