Documente Academic
Documente Profesional
Documente Cultură
Seminar
Recapitulare
Limbaj C
©A.Sarca SuP S - 1
Sisteme cu microprocesoare Limbajul C
Bibliografie
C – general
• Kernighan B., Ritchie D. – The C Programming Language, Prentice
Hall
C si embedded systems
• Barr M., Programming Embedded Systems in C and C++, O’Reilly,
1999
• Zurell K., C Programming for Embedded Systems, R&D Books,
2000
• Craft B., First Steps with Embedded Systems, 2002
• Labrosse J., Embedded System Building Blocks, R&D Books,
2000
• Ganssle J., The Art of Designing Embedded Systems, Accademic
Press
Altele
• McConnell St., Code Complete, Microsoft, 2004
• Qualline St., Practical C Programming, O’Reilly, 1997
©A.Sarca SuP S - 2
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
1. Numele variabilelor
Exemple:
int alfa, beta;
float x, speed, temperature;
char MyName[20];
long position_count;
©A.Sarca SuP S - 3
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
2. Tipuri de date, dimensiuni
• Tipuri de bază:
– int – întreg, corelat cu procesorul utilizat (uzual, 16 biți) [-32768; 32767]
– float – virgula mobila, simplă precizie (32 biți) [1.2E-38; 3.4E+38]
– double – virgula mobila, dublă precizie (64 biți) [2.3E-308; 1.7E+308]
– char – un caracter (1 octet = 8 biți) [-128; 127]
• Tipuri aditionale:
– short int – întreg scurt, tipic 8 biți dacă int este de 16 biți. Dacă nu este suportat
va fi la fel ca int
– long int – întreg lung, tipic 32 biți dacă int este de 16 biți. Dacă nu este suportat
va fi la fel ca int
– signed int – la fel ca int
– unsigned int – întreg fără semn [0; 65535]
– long double – virgulă mobilă, precizie mai mare decât double
Exemple:
double field[1000];
unsigned int a = 230;
©A.Sarca SuP S - 4
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
3. Constante
• Intreg: 1234
• Long: 334512356L
• Hexazecimal: 0xA123
• Caracter: ’A’ – codul ASCII al literei A , 1 caracter (octet)
• String: “Data Nasterii” – un șir cu caracterele din text, plus
caracterul null ‘\0’ la final
• Escape sequence: ‘\n’ . Caracter de control: linie nouă
• Enumerări: enum boolean { NO, YES } (primul=0, al doilea=1, etc.)
Exemple:
#define PI 3.141528
#define MAXINDEX 100
i[MAXINDEX+3] = 77;
if (a == YES)
x = 100;
©A.Sarca SuP S - 5
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
4. Declarații
int minim, maxim, interval;
char c, nume[100];
echivalent cu
char c;
char nume [100];
int i = 0;
int interval = BAZA + 1;
float two_pi = 2 * PI;
©A.Sarca SuP S - 6
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
5. Operatori aritmetici
+ Adunare
- Scădere
* înmulțire
/ împărțire
% modulo (rest împărțire)
Exemple:
x = a + 3;
y = b/2 * a/3;
zeta = zi % 7;
©A.Sarca SuP S - 7
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
6.a Operatori relaționali
Exemple:
if(i <=7)
a = 12;
while(a != 100)
{ a = a +1;}
if (speed == MAXSPEED)
stop = TRUE; ©A.Sarca SuP S - 8
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
6.b Operatori logici
&& ȘI logic A B A && B A B A || B
|| SAU logic 0 0 0 0 0 0
0 1 0 0 1 1
dacă TRUE, rezultatul e egal cu 1;
1 0 0 1 0 1
dacă FALSE, rezultatul e egal cu 0
1 1 1 1 1 1
Exemple:
if(i <=7 && j!=0)
a = 12;
while(a != 100 || b<32)
{ a = a +1; b=b-2;}
if (speed == MAXSPEED)
stop = TRUE;
Prioritate operatori:
High > >= <= <
== !=
&&
Low ||
Exemplu:
for(i=0; i<lim-1 && (c=getchar()) != ‘x’ && c != ‘y’; i++)
©A.Sarca SuP S - 9
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
7. Conversii de tip
/* atoi: conversie caracter în întreg */
int atoi(char s)
{
int n;
n = s - ’0’;// ‘0’=48 in decimal
return n;
}
©A.Sarca SuP S - 10
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
7. Conversii de tip (continuare)
Regula generală: în expresie cu 2 operanzi de tip diferit, cel de tip ‘inferior’
este convertit automat la tipul ‘superior’:
©A.Sarca SuP S - 11
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
7. Conversii de tip (continuare)
int i, j;
float x, y;
i = x; /* conversie float la întreg, trunchiere */
©A.Sarca SuP S - 12
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
8. Operatori de incrementare și decrementare
++ incrementare(adunare cu 1)
-- decrementare(scădere cu 1)
Utilizați ca prefix (înainte de operand) –întăi
incrementez/decrementez, apoi se utilizează operandul
Exemplu:
i = 3;
a = ++i + 2; /* a va avea valoarea 6, i valoarea 4 */
©A.Sarca SuP S - 13
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
9. Operatori la nivel de biți
& ȘI logic
| SAU logic
^ SAU Exclusiv
<< deplasare la stânga
>> deplasare la dreapta
~ complement (one’s complement)
©A.Sarca SuP S - 14
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
9. Operatori la nivel de biți (continuare)
<< utilizat pentru deplasare la stânga;
Exemplu:
n = n << 2; /* deplasare la stânga cu 2 biți; se pierd biții din
stânga, se introduc doi biți de 0 în dreapta. Echivalent cu înmulțire
cu 2^2 */
În general
expr 1 op= expr 2
e echivalent cu
expr 1 = (expr 1) op (expr 2 )
Exemplu:
x *= y + 1; /* e echivalent cu x = x * (y +1) */
©A.Sarca SuP S - 16
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
11. Expresii condiționale
if( a > b)
z = a;
else
z = b;
alternativ:
expr 1 ? expr 2 : expr 3
evaluează expr1. Dacă e diferită de 0 (TRUE), se atribuie valoarea
expr2. Dacă e 0 (FALSE), se atribuie valoarea expr3
Exemplu:
z = (a>b) ? a:b; /* este echivalent cu z = max(a,b) */
©A.Sarca SuP S - 17
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
12. Precedență și ordinea evaluării expresiilor
©A.Sarca SuP S - 18
Sisteme cu microprocesoare Limbajul C
Tipuri, operatori, expresii
x = f() + g(); /* posibil să se apeleze întâi f(), SAU g() . Dacă f sau g modifică o
variabilă globală utilizată și în cealaltă funcție, efectele pot fi nepredictibile! */
a[i] = i++; /* nu se știe dacă se modifica și indicele din tablou unde se memorează i
– depinde de compilator, etc. */
Concluzie: a NU se scrie cod în care pot apărea situații ambigue în care
ordinea evaluării unor expresii e nesigură!
©A.Sarca SuP S - 19
Sisteme cu microprocesoare Limbajul C
Controlul programului
1.Instrucțiuni
if(a==0) {
x=1;
y=2;
}
else {
x=2;
y=1;
}
©A.Sarca SuP S - 20
Sisteme cu microprocesoare Limbajul C
Controlul programului
2. Decizii
if-else înlănțuite - else asociat
instrucțiunii if precedente
If-Else
if (n > 0)
if (expresie) if (a > b)
instrucțiune z = a;
else else
instrucțiune z = b;
Utilizare ‘{‘ și ‘}’ pentru claritate sau alte
else – opțional, poate fi omis condiții
if (n > 0) {
Testul condiției este echivalent
if (a > b)
cu
z = a;
if (expresie != 0) }
else
z = b;
©A.Sarca SuP S - 21
Sisteme cu microprocesoare Limbajul C
Controlul programului
2.Decizii (continuare)
if (n > 0) if (n > 0) {
for (i=0; i < n; i++) for (i=0; i < n; i++)
if (s[i] > 0) { if (s[i] > 0) {
printf(“…”); printf(“…”);
return i; return i;
}
}
}
else
else
printf (“error! n is negative!”); printf (“error! n is negative!”);
©A.Sarca SuP S - 22
Sisteme cu microprocesoare Limbajul C
Controlul programului
2.Decizii (continuare)
Else if
©A.Sarca SuP S - 23
Sisteme cu microprocesoare Limbajul C
Controlul programului
2.Decizii (continuare)
switch (x) {
Switch case 1: case 2:
a = 10;
switch (expresie) { b = 1;
case expresie-constanta: break;
instrucțiuni case 5:
case expresie-constanta: a = 5; /* lipsește ‘break’,
instrucțiuni continuă! */
default: instrucțiuni case 6:
} b = 2;
break;
default:
a = 0;
b = 0;
}
©A.Sarca SuP S - 24
Sisteme cu microprocesoare Limbajul C
Controlul programului
3.Bucle
while ((c = getchar()) == ‘ ‘)
while și for ; /* elimin caracter
spațiu */
while (expresie)
instrucțiune for (i = 0; i < n; i++)
…
/* Dacă expresie adevarată,
execută instrucțiune */ #include <string.h>
______________________________________ /* reverse: reverse string s in place */
for (expr1; expr2; expr3) void reverse(char s[])
instrucțiune {
int c, i, j;
instrucțiunea for e echivalentă cu for (i = 0, j = strlen(s)-1; i < j; i++, j--)
{
expr1; c = s[i];
while (expr2) { s[i] = s[j];
instrucțiune s[j] = c;
expr3; }
} }
©A.Sarca SuP S - 25
Sisteme cu microprocesoare Limbajul C
Controlul programului
3.Bucle (continuare)
/* găsire primul spațiu într-un string */
int position, i;
Break; Continue
for (i = 0; i < n; i++ )
if (a[i] = ‘ ‘)
break – forțează ieșirea din break;
bucle for, while, do, switch position = i;
- se iese din bucla interioară
©A.Sarca SuP S - 26
Sisteme cu microprocesoare Limbajul C
Controlul programului
3.Bucle (continuare)
©A.Sarca SuP S - 27
Sisteme cu microprocesoare Limbajul C
Structura programului
1.Funcții
©A.Sarca SuP S - 28
Sisteme cu microprocesoare Limbajul C
Structura programului
1.Funcţii (continuare)
Mai multe fișiere
Totul în același fișier Fișier 1:
(întâi definită funcția, apoi, apelată!) /* definierea funcției */
double sum(double a, b)
double sum(double a, b) {
{ double s = a + b;
double s = a + b; return s;
return s; }
} Fișier 2:
… double sum(double a, b); /* prototype
main () funcție definită în altă parte*/
{ main ()
double x, y, suma; {
x = 1.23; double x, y, suma;
y = 2.e-5; x = 1.23;
suma = sum(x , y); y = 2.e-5;
} suma = sum(x , y);
}
©A.Sarca SuP S - 29
Sisteme cu microprocesoare Limbajul C
Structura programului
2.Variabile externe
IMPORTANT! O variabilă globală poate fi DEFINITĂ ÎNTR-UN SINGUR LOC
din program! Ea trebuie DECLARATĂ în orice loc (fișier) în care va fi
folosită, ÎNAINTE de a fi referită în cod (dacă nu este definită acolo).
…
Fisier 1 void main()
/* definire variabile a și b, li se alocă memorie */ {
int a = 10, b = 100; int u, v, w;
Int f4(int x, int y); /* prototype funcție externâ */ u = f1(5); /* u = 50 */
… v = f2(10); /* v = 1100 */
int f1(int x) w = f3(1,2); /* w = 6; a = 3 */
{ u = f1(5); /* u = 15 ! */
return a * x; v = f4(1, 2); /* v = 16; a = 8; */
} }
int f2(int x) Alt fisier:
{ /* declarară tip și nume variabile, NU alocă
return (a + b) * x; memorie */
} extern int a, b;
int f3 (int x, int y) int f3(int m, int n); /* prototype funcție f3 */
{ void f4(int x, int y)
a = x + y; /* atentie, modifica pe a */ {
return 2*a; int uu = f3(2*x, 3*y);
} return uu;
}
©A.Sarca SuP S - 30
Sisteme cu microprocesoare Limbajul C
Structura programului
3.Fișiere header
©A.Sarca SuP S - 31
Sisteme cu microprocesoare Limbajul C
Structura programului
4.Variabile statice
Variabile statice – valabile doar în fișierul în care sunt definite.
Pot folosi același nume de variabilă și în alt fișier.
Fișier 1 Alt fișier:
/* definire variabile statice a și b */ /* definire alte variabile statice a
static int a = 10, b = 100; și b */
int f4(int x, int y); /* prototype f4 */
static int a = 30, b = 50;
int f3 (int x, int y)
{ void f4(int x, int y)
a = x + y; /* atenție, modifică pe {
a */ int uu = f3(a*x, b*y);
return 2*a; return uu;
} }
…
void main()
{
int w = f3(1,2); /* w = 6; a = 3 */
int u = f4(1, 2); /* u = 130; */
}
©A.Sarca SuP S - 32
Sisteme cu microprocesoare Limbajul C
Structura programului
5.Scope = valabilitate
Variabile de tip registru:
register int x; /* sugerează compilatorului să aloce
variabila într-un registru al procesorului */
int x;
int y;
f(double x)
{
double y;
}
©A.Sarca SuP S - 33
Sisteme cu microprocesoare Limbajul C
Structura programului
6.Recursivitate
#include <stdio.h>
/* printd: print n în decimal */
void printd(int n)
{
if (n < 0) {
putchar('-');
n = -n;
}
if (n / 10)
printd(n / 10);
putchar(n % 10 + '0');
}
©A.Sarca SuP S - 34
Sisteme cu microprocesoare Limbajul C
Structura programului
7.Preprocesorul C
Includerea de fișiere
#include “nume_fisier”- caută uzual de unde e sursa programului, +
#include <nume_fisier>- caută după reguli specifice de implementare
Linia de program
x = max(p+q, r+s);
generează codul urmator
x = ((p+q) > (r+s) ? (p+q) : (r+s));
©A.Sarca SuP S - 35
Sisteme cu microprocesoare Limbajul C
Structura programului
7.Preprocesorul C (continuare)
Includerea condiționată
©A.Sarca SuP S - 36
Sisteme cu microprocesoare Limbajul C
Pointeri
Pointer: variabilă ce conține adresa unei variabile
Pointerul p este în sine un tip special de
variabilă, memorată într-o locație de
memorie (de ex., la adresa 100)
100 1200
Valoarea pointerului p (valoarea care se
găsește la adresa unde este pointerul),
reprezintă adresa unei variabile (de ex.,
1200 este adresa la care se găsește
variabila pe care o referă pointerul din 1200 1234
figura alaturată).
Exemplu:
int *ip; /* definire pointer la un întreg */
ip = 1200; /* se setează valoarea pointerului la 1200 */
*ip = 1234; /* se seteaza conținutul memoriei de la adresa 1200 cu valoarea 1234 */
©A.Sarca SuP S - 37
Sisteme cu microprocesoare Limbajul C
Pointeri
Operatorul & dă adresa unui obiect definit:
p = &c;
valoarea pointerului p este setată cu adresa variabilei c
int x = 1, y = 2, z[10];
int *ip; /* ip is a pointer to int */
ip = &x; /* ip now points to x */
y = *ip; /* y is now 1 */
*ip = 0; /* x is now 0 */
ip = &z[0]; /* ip now points to z[0] */
©A.Sarca SuP S - 38
Sisteme cu microprocesoare Limbajul C
Pointeri
©A.Sarca SuP S - 39
Sisteme cu microprocesoare Limbajul C
Pointeri
Pointeri și argumentele funcților
Argumentele câtre funcții sunt transmise prin valoare: la apelare funcție, se
transmit funcției valorile parametrilor. Orice modificare a acestora în funcție NU
modifică valorile acestora în locul de unde se apelează funcția. Exemplu:
void swap(int x, int y) /* WRONG */ void swap(int *px, int *py) /* OK */
{ {
int temp; int temp;
temp = x; temp = *px;
x = y; *px = *py;
y = temp; *py = temp;
} }
… un apel de genul … un apel de genul
©A.Sarca SuP S - 40
Sisteme cu microprocesoare Limbajul C
Pointeri
Pointeri și tablouri (arrays) – legatură directă
int a[10];
Definește un tablou de 10 elemente (consecutive în memorie), a[0], a[1], … a[9]
a[0] a[9]
a:
a[0]
pa:
©A.Sarca SuP S - 41
Sisteme cu microprocesoare Limbajul C
Pointeri
Pointeri și tablouri (arrays) - Exemplu
©A.Sarca SuP S - 42