39
Dorel Lucanu Algoritmica si programare Curs 7 - Agenda Limbajul C tipuri elementare expresii instructiuni functii

Curs 7 - Agendadlucanu/cursuri/ap/resurse/... · 2005-11-21 · Dorel Lucanu Algoritmica si programare Curs 7 - Agenda Limbajul C tipuri elementare expresii instructiuni functii

  • Upload
    others

  • View
    12

  • Download
    0

Embed Size (px)

Citation preview

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

Demo

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

Dorel Lucanu Algoritmica si programare

functii

int suma(int n){int s = 0;int i;for(i=1; i<=n; ++i)s += i;

return s;}

function suma(n)s ← 0for i ← 1 to n do

s ← s + ireturn s

end