Dorel Lucanu Algoritmica si programare
Curs 7 - Agenda
Limbajul Ctipuri elementareexpresiiinstructiunifunctii
Dorel Lucanu Algoritmica si programare
Primul program C
#include <stdio.h>
int main(){
printf("Eu sunt primul tau program C"); return 0;
}
Dorel Lucanu Algoritmica si programare
Tipuri de date fundamentale
char signed char unsigned charsigned short int unsigned short intsigned int unsigned intsigned long int unsigned long int
float double long doubleEchivalente
signed short int ≡ shortunsigned short int ≡ unsigned shortsigned int ≡ intunsigned int ≡ unsignedsigned long int ≡ longunsigned long int ≡ unsigned long
Dorel Lucanu Algoritmica si programare
Declarare variabile
char c;signed char sc;
int i;int suma = 0;long j;
float x;float pi = 3.14;double y;
Dorel Lucanu Algoritmica si programare
int, long ...
constanteINT_MIN … -2 -1 0 1 2 INT_MAX
LONG_MIN … -2 -1 0 1 2 LONG_MAX
<limits.h>
16 biti 32 biti
INT_MAX
INT_MIN
LONG_MAX
LONG_MIN
215-1 231-1
-215 -231
231-1 263-1
-231 -263
Dorel Lucanu Algoritmica si programare
Operatorul sizeof() (ex. I_17.c)
sizeof() intoarce dimensiunea locatiei de memorie ocupate de o variabila apartinand unui tip
parametru un tip:printf("%15s%5u\n","int",sizeof(int));
parametru o variabile simple:double x;printf("%15s%5u\n",“dim x",sizeof(x));
int 4dim x 8
Dorel Lucanu Algoritmica si programare
int, long ...
Atentie la reprezentarea circulara!INT_MAX + 1 == INT_MININT_MIN – 1 == INT_MAXLONG_MAX + 1 == LONG_MINLONG_MIN – 1 == LONG_MAX...
afisarea unui intint a = 10;printf(“a = %d”, a);
citirea unui intprintf(“a: “); scanf(“%d”, &a);
Dorel Lucanu Algoritmica si programare
char
SIX☻2^B
SOH☺1^A
NUL0^@
CodeCharDecCTRL
………… ……
B66
A65
@64
CharDec
C nu are constante de tip char sau unsigned charchar ( = signed char ): -128..127unsigned char : 0..255
cod ASCII:
……
“34
!33
sp32
CharDec
Dorel Lucanu Algoritmica si programare
char
afisarea unui charchar a = ‘a’;printf(“a = %c”, a);
citirea unui charprintf(“a: “); scanf(“%c”, &a);
Dorel Lucanu Algoritmica si programare
float, double
constante314.528 314.528f 314.528l
314.528F 314.528L.528
314..314528e3 314528.e-3 314528e-3.314528E3 314528.E-3 314528E-3 operatori+ - * /
functii matematicesqrt() pow() log() exp() sin() …
Dorel Lucanu Algoritmica si programare
float, double
afisarea unui floatfloat pi = 3.14;printf(“pi = %f”, pi);
citirea unui foatprintf(“x: “); scanf(“%f”, &x);
afisarea unui doubledouble pi = 3.14LF;printf(“pi = %lf”, pi);
citirea unui foatprintf(“x: “); scanf(“%lf”, &x);
Dorel Lucanu Algoritmica si programare
valori booleene
C nu are constante booleene (true, false)0 este interpretat ca false≠ 0 este interpretat ca trueoperatori
!not (¬)
||or (∨)
&&and (∧)
Dorel Lucanu Algoritmica si programare
operatori relationali
mai mare sau egal>=
mai mic sau egal<=
diferit!=
egal==
mai mare>
mai mic<
Dorel Lucanu Algoritmica si programare
Operatorul _?_:_
sintaxa⟨expresie⟩ ? ⟨expresie⟩ : ⟨expresie⟩
Semanticae1?e2:e3este echivalenta cuif e1 then e2 else e3
exemplul: minimum dintre 2 variabile
x = (a < b) ? a : b
Dorel Lucanu Algoritmica si programare
comentarii
/* comentariu */
/* comentariupe mai multelinii
*/
//comentariu pe o linie
int s; // variabila care memoreaza suma
Dorel Lucanu Algoritmica si programare
atribuirea
sintaxa expresiei de atribuire⟨expr_atr⟩ ::= ⟨l_val⟩ = ⟨r_val⟩⟨l_val⟩ :: = ⟨expresie⟩⟨r_val⟩ :: = ⟨expresie⟩restrictiisemantica expresiei de atribuirex = 78 /* realizeaza x ← 78 si intoarce 78 */a + (b = 5) /* realizeaza b ← 5 si intoarce a+5 */
instructiunea de atribuire⟨instr_atr⟩ ::= ⟨expr_atr⟩;semanticax = 78; /* realizeaza x ← 78 */
Dorel Lucanu Algoritmica si programare
atribuirea multipla
⟨expr_atr⟩ ::= ⟨expr_atr⟩ = ⟨r_val⟩exemplea = b = 2;/* echivalent cu */a = (b = 2);
x = y = a + 5;/* echivalent cu */x = y = (a + 5);
Dorel Lucanu Algoritmica si programare
alti operatori de atribuire
x += 5 /* e echivalenta cu */ x = x + 5x *= 5 /* e echivalenta cu */ x = x * 5x /= 5 /* e echivalenta cu */ x = x / 5...
Dorel Lucanu Algoritmica si programare
operatori de (in/de)crementare
++i; /* e echivalenta cu */ i = i+1;--i; /* e echivalenta cu */ i = i-1;i++; /* e echivalenta cu */ i = i+1;i--; /* e echivalenta cu */ i = i-1;
dar++i /* NU e echivalenta cu */ i++--i /* NU e echivalenta cu */ i--
exemplui = 2;a = i++ + ++i;/* a == 6, i == 4 */
Dorel Lucanu Algoritmica si programare
instructiunea bloc
sintaxa⟨instr_comp⟩ ::= {⟨elem_bloc ⟩0..n }⟨elem_bloc⟩ ::= ⟨decl⟩ | ⟨instructiune⟩
exemplu{x = 5;y = x * 7;{ int a = 5;x = x * a;
}}
Dorel Lucanu Algoritmica si programare
if
sintaxa⟨instr_if⟩ ::= if (⟨expresie⟩) ⟨instr⟩⟨instr_if_else⟩ ::= if (⟨expresie⟩) ⟨instr1⟩
else ⟨instr2⟩⟨instr1⟩ ::= ⟨instr⟩⟨instr2⟩ ::= ⟨instr⟩
Dorel Lucanu Algoritmica si programare
if - exemple
min = a;if (b < a)min = b;
min ← aif (b < a)
then min ← b
if (a < b)min = a;
elsemin = b;
if (a < b)then min ← aelse min ← b
Dorel Lucanu Algoritmica si programare
if - exemple
if (nota < 1 || nota > 10){
printf("Eroare!!! Nota invalida");exit(0);
}else if (nota < 5)printf("Nota nesatisfacatoare.");
else if (nota < 7)printf("Nota satisfacatoare.");
else if (nota < 9)printf("Nota buna.");
elseprintf("Nota excelenta.");
Dorel Lucanu Algoritmica si programare
switch
switch (nota){case 1:case 2:case 3:case 4:
printf("Nota nesatisfacatoare.");break;
case 5:case 6:
printf("Nota satisfacatoare.");break;
...default:
printf("Eroare!!! Nota invalida.");break;
}
Dorel Lucanu Algoritmica si programare
while
sintaxawhile (⟨expresie⟩)
⟨instr⟩semanticawhile (e)
instr1. se evalueaza e
2. daca rezultatul este adevarata) se executa instr
b) se reia procesul de la pasul 13. altfel, executia instructiunii while se termina
Dorel Lucanu Algoritmica si programare
while - exemple
cel mai mic k a.i. 7k ≥ n pentru un n datk = 0;sapte_la_k = 1;while (sapte_la_k < n){
++k;sapte_la_k = sapte_la_k * 7;
}
Dorel Lucanu Algoritmica si programare
do-while
sintaxado
⟨instr⟩while ⟨expresie⟩;
semanticado
Swhile (e);
este echivalenta cu
S;while (e)
S
Dorel Lucanu Algoritmica si programare
do - exemple
x = 25;k = 0;do {
x = x/2;++k;
} while (x > 0)
cat e valoarea lui k dupa?
Dorel Lucanu Algoritmica si programare
for
sintaxa⟨instr_for⟩ ::= for (⟨expr1⟩; ⟨expr2⟩; ⟨expr3⟩) ⟨instr⟩⟨expr1⟩ ::= ⟨expr⟩⟨expr2⟩ ::= ⟨expr⟩⟨expr1⟩ ::= ⟨expr⟩semantica
for (e1; e2; e3) Seste echivalenta cu
e1;while (e2)
{S;e3;
}
Dorel Lucanu Algoritmica si programare
for - exemple
s = 0;for (i = n; i > 0; --i)
s += i;
s ← 0for i ← n downto 1 do
s ← s + i
a = 1;for (i = 1; i <= k; ++i)
a *= 2;
a ← 1for i ← 1 to k do
a ← a * 2
s = 0;for (i = 1; i <= n; ++i)
s += i;
s ← 0for i ← 1 to n do
s ← s + i
Dorel Lucanu Algoritmica si programare
operatorul , (virgula)
sintaxa
<expr_virgula> ::= <expresie> , <expresie>| <expr_virgula> , <expresie>
semantica: se evalueaza expresiile de la stangala dreaptaexemplu
for (s = 0, i = 1; i <= n; s += i, ++i)
;
Dorel Lucanu Algoritmica si programare
break
sintaxa<break> ::= breaksemantica: iesire din bucla do, for, switch sauwhile cea mai mica care o include
exemplu
for (i=0; i<n; i++)if (a[i]==x)break;
if (i<n)printf("\nNumarul %d apare in a.",x);
elseprintf("\nNumarul %d nu apare in a.",x);
Dorel Lucanu Algoritmica si programare
continue
sintaxa<continue> ::= continuesemantica: paseaza controlul la urmatoareaiteratie do, for sau while care o include (ceamai mica)
Dorel Lucanu Algoritmica si programare
continue
exemplufor(i=3; i <= n; i++){
if ( (i % 2) == 0)continue;
ii = (int)sqrt(i);for (j = 2; j <= ii; j++)if ((i % j) == 0)
break;if ((i % j) == 0)continue;
printf(" %d", i);}
ce afiseaza programul?
Dorel Lucanu Algoritmica si programare
goto
sintaxa<goto> ::= goto <ethicheta><eticheta> ::= <identificator><instr_etichetata> ::= <eticheta> : <instr>semanticaControlul este dat instructiunii precizate de
eticheta.
Dorel Lucanu Algoritmica si programare
goto
cod_err = 0; if (b == 0){ cod_err = 1; goto eroare; }
elsec = a/b;
if ((b > 0) && (a > INT_MAX - b)){ cod_err = 2; goto eroare; }
else if ((b < 0) && (a < INT_MIN - b)){ cod_err = 3; goto eroare; }
elsed = a+b;
return 0;eroare:
switch (cod_err). . .
return 1;
Dorel Lucanu Algoritmica si programare
instructiunea vida si instructiunea expresie
instructiunea vida<instr_vida> ::= ;
instructiunea expresie<instr_expr> ::= <instr_vida> | <expresie> ;instructiunea de atribuire este caz particular de instructiune expresie
b = 2; a = b += 2; /* instr. vida */ ;a + b - 2; /* echivalent cu * /;