Documente Academic
Documente Profesional
Documente Cultură
PROGRAMAREA
CALCULATOARELOR
Note de curs
http://www.ace.tuiasi.ro/~eserban
PROGRAMAREA
CALCULATOARELOR
CURS – AN I
TITULAR DISCIPLINĂ:
ş. l. dr. ing. ELENA ŞERBAN
www.ace.tuiasi.ro/~eserban
Bibliografie
1. Kernigham, B. W. şi Ritchie, D. M., Limbajul C, Editura
TEORA, Bucureşti.
3. Botez, C., Şerban, E., Maftei, L., Gospodaru, M., Şova, I.,
Programarea calculatoarelor în limbajul C/C++. Lucrări
practice, Editura Gh. Asachi, Iaşi, 2002.
• Exemplu de program in C
Ieşirea:
• aria calculată a triunghiului
• lungimea medianei, bisectoarei şi a înălţimii care pleacă
din vârful A
Descompunerea problemei în
subprobleme
Problema
ma =
(
2 ⋅ b2 + c2 − a2)
4
Bisectoarea unghiului A
2 ⋅ p ⋅ b ⋅ c ⋅ ( p − a)
ba =
b+c
Etapa 4 Datele de test
Date de test pentru care ar trebui să se afişeze
mesaj de eroare:
• a = 1, b = 2, c = 3
• a = 0, b = 2, c= 4
• a = -5, b = 5, c= 3
• Se va folosi limbajul C
• Problema se implementează cu ajutorul
unui proiect care include toate modulele
necesare
• Gestionarea modulelor (modul şi timpul
când se face apel la ele) este făcută
prin funcţia main
Etapa 5
• Un modul este format din:
Crearea proiectelor
• Visual C 6.0
– File → New → Project
– Se alege opţiunea Win32 Console
Application → An empty project
Proiectul P1
• Fişierul P1.cpp care conţine funcţia
main
• Modulul triunghi compus din
• triunghi.h – fişierul care conţine prototipurile
funcţiior
• triunghi.c – fişierul care conţine codul sursă
pentru funcţiile care calculează valorile cerute
Fişierul triunghi.h
#ifndef _TRIUNGHI_
#define _TRIUNGHI_
int OK(int a, int b, int c); // Valideaza datele
float Aria(int a, int b, int c); // Calculeaza aria
float semiP(int a, int b, int c); // Calculeaza semiperimetrul
float mediana(int a, int b, int c); // Calculeaza mediana
float inaltime(int a, int b, int c); // Calculeaza inaltimea
float bisectoare(int a, int b, int c); // Calculeaza bisectoarea
#endif
Fişierul triunghi.c
#include <math.h>
#include "triunghi.h"
int OK(int a, int b, int c)
{
int ok;
if(a <= 0 || b<= 0 || c<= 0)
ok = 0;
else
if(a+b <= c || a+c <= b || b+c <=a)
ok = 0;
else
ok = 1;
return ok;
}
return 0;
}
TEMA
•Folosind funcţiile scris (şi nu altele) să se calculeze
lungimile înălţimii, medianei şi bisectoarei care pleacă
din vârfurile B şi C.
Program
• Ce este?
Sistem care prelucrează informaţii.
• Cum?
Prin interacţiunea unor entităţi (mai
simple sau mai complexe) care lucrează
împreună cu scopul de a îndeplini o
sarcină.
25/04/07 PC - Curs nr. 2 6
Entităţi
• Pot fi formate la rândul lor din alte
entităţi, mai simple.
• Se caracterizează prin:
– atribute
– comportament
Entităţi
În programarea structurată şi modulară
– Care conţin informaţii (se mai numesc şi date)
• variabilele
• constantele
– Care prelucrează informaţia:
• subprogramele (funcţiile)
În plus, pentru POO
– Care conţin informaţii şi în acelaşi timp pot
prelucra informaţii (conţin date şi funcţii - metode)
• obiecte
Variabile
• Îşi pot modifica valoarea pe parcursul
execuţiei programului
• Pot fi accesate
– din întregul program (cazul variabilelor
globale)
– numai din funcţia sau blocul în care au fost
declarate şi/sau definite (cazul variabilelor
locale)
25/04/07 PC - Curs nr. 2 10
Constante
• Pot fi:
– de tip numeric, de tip caracter sau de tip şir de
caractere
– simbolice (numele şi valoarea sunt stocate în
tabele create de compilator)
Funcţii
• Sunt entităţi care rezolvă o sarcină clar
delimitată din cadrul unui program
Identificatori
Sunt numele asociate entităţilor cu care lucrează
programul
Atenţie
Primul caracter poate fi numai din 1. sau 2.
Exemple identificatori
Corect
alfa beta _STIVA_ __C
citesteDateDeIntrare
a_1
afiseaza_vector
Tip
Fiecare identificator dintr-un program are
un tip asociat.
Acest tip determină:
– mulţimea valorilor posibile pentru entitatea
respectivă
– ce operaţii pot fi aplicate entităţii asociate
asociate acelui nume
– cum sunt interpretate aceste operaţii
1. întregi:
1. de tip caracter definite prin char
2. de tip întreg definite prin int
2. reale
1. în simplă precizie definite prin float
2. în dublă precizie definite prin double
Tipuri fundamentale
Fiecare din aceste tipuri poate fi folosit
însoţit de un modificator care se
plasează în faţa cuvântului cheie care
descrie tipul.
Tipuri fundamentale
char signed char unsigned char
Tipuri fundamentale
Observaţii:
Forma generală a expresiei de determinare a
dimensiunii (în octeţi) a unui anumit tip
este:
sizeof(den_tip)
unde den_tip este denumirea tipului de entitate.
int main(void)
{
printf("Tipul short int are %d octeti.\n", sizeof(short int));
printf("Tipul int are %d octeti.\n", sizeof(int));
printf("Tipul long int are %d octeti.\n", sizeof(long int));
printf("Tipul char are %d octeti.\n", sizeof(char));
printf("Tipul float are %d octeti.\n", sizeof(float));
printf("Tipul double are %d octeti.\n", sizeof(double));
printf("Tipul long double are %d octeti.\n", sizeof(long double));
return 0;
}
25/04/07 PC - Curs nr. 2 25
Exemple
char x;
unsigned int a, b;
float x;
long double valoare;
long numarDeTelefon;
unsigned char OCTET;
int numarLinii;
double mediaAritmetica;
25/04/07 PC - Curs nr. 2 26
Tipuri definite de programator
1. Tipuri derivate Æ sunt formate prin
utilizarea unei combinaţii de unul sau mai
multe tipuri fundamentale şi/sau definite de
programator:
1. tipuri structurate (agregate) – conţin mai multe
elemente
1. de acelaşi tip - tablourile
2. care pot fi de tipuri diferite - structurile
2. uniuni
3. câmpuri de biţi
4. pointeri
25/04/07 PC - Curs nr. 2 27
tip nume[dim1][dim2]…[dimn];
unde
¾tip Æ tipul elementelor tabloului
¾nume Æ numele tabloului
¾dim1, dim2, …, dimn Æ valorile celor n
dimensiuni ale tabloului
25/04/07 PC - Curs nr. 2 29
long b[10][5][100];
nume[index1][index2]…[indexn]
unde
¾ nume este numele tabloului
¾ index1, index2,…, indexn sunt indicii
elementului accesat
2. double B[10][20];
B[0][1] sau B[5][4] sau B[9][19]
struct nume_prototip_structura {
declaraţii de variabile;
};
Alecu.nume[0]
Alecu.dataNasterii.zi
Crearea de sinonime
Se face prin folosirea declaraţiei de tip
typedef.
NATURAL a, b;
REAL x;
BYTE ok;
25/04/07 PC - Curs nr. 2 37
Crearea de sinonime
Exemple:
typedef int VECTOR[20];
typedef struct _MATRICE {
int n; // Numar linii
int m; // Numar coloane;
double A[30][30]; // Matricea
} MATRICE;
Date de ieşire
Date de intrare Funcţie
Antet, interfaţă
25/04/07 PC - Curs nr. 2 40
Declaraţii şi definiţii
Sunt modalităţi de "a face cunoştinţă"
programului cu entităţile cu care va lucra.
Declaraţii şi definiţii
Pentru o funcţie sau variabilă pot exista mai
multe declaraţii, dar numai o singură definiţie
(ODR – One Definition Rule)
Observaţie:
Poate apare într-un fişier header.
Definţii de funcţii
Definiţia unei funcţii este formată din:
1. antet (interfaţă)
2. corpul funcţiei
tip_f numeF(tip1 nume1, tip2 nume2, ..., tipn numen)
{
definiţii de variabile;
instrucţiuni;
}
25/04/07 PC - Curs nr. 2 44
Definţii de funcţii
Observaţii:
NU pot apare într-un fişier header.
NU pot conţine declaraţiile (prototipurile altor
funcţii).
Exemple
float FCT(int a, float b); // este in header
CONSTANTE
Constante numerice întregi zecimale
Dacă nu se specifică altfel, compilatorul
consideră că o constantă este un număr
zecimal cu semn:
47 3 1101 -235
e x e m p l u \0
int main(void)
{
enum zile astazi = luni;
if((astazi == sambata) || (astazi == duminica))
printf("Week end\n");
else
printf("Du-te la scoala\n");
return 0;
}
Curs nr. 4
25/04/07 1
25/04/07 2
Fluxuri de date (stream)
• stdin
• stdout
• stderr
25/04/07 3
Buffer
Tastatură (Zona Program
tampon)
25/04/07 5
char den[30];
scanf("%s", den);
25/04/07 7
scanf
Observaţie:
În format nu trebuie să apară decât formatele şi
eventualele caractere obligatorii din şirul de intrare).
Exemplu:
Se citeşte un moment din zi sub forma:
12:23:45
scanf("%d:%d:%d", &ora, &min, &sec);
23.09.2004
scanf("%d.%2d.%4d", &zi, &luna, &an);
25/04/07 8
scanf
În formatul de citire pot apare şi şiruri de forma:
%[…] caută doar caracterele specificate
%[^…] caută toate caracterele cu excepţia celor
specificate
Exemplu:
char den[30];
scanf("%[abcd]", den);
scanf("%[^abcd]", den);
scanf("%[0-9]", den); // %[A-Z], %[0-9a-z], %[^A-FT-Z]
scanf("%20[ a-z]", den);
25/04/07 9
scanf
Citirea se opreşte la:
–*
– atingerea lăţimii
– următorul caracter din şir care nu se
potriveşte cu formatul
– următorul caracter din şir care nu există în
mulţimea de căutare
25/04/07 10
Citirea datelor de la tastatură - scanf
Funcţia returnează numărul de câmpuri corect
citite. La întâlnirea sfârşitului de fişier (CTRL/Z)
returnează valoarea –1 (EOF).
scanf - exemplu
#include <stdio.h>
#include <conio.h>
int main(void)
{
int nr;
int a=10, b=20, c=30;
clrscr();
nr = scanf("%d%d",&a,&b);
printf("1 nr = %d\n",nr);
printf("1 a = %d, b = %d\n",a,b);
25/04/07 12
scanf - exemplu
nr = scanf("%c",&c);
printf("2 nr = %d\n", nr);
printf("2 c = %c", c);
getch();
return 0;
}
25/04/07 13
scanf
OBSERVAŢII:
Nu se amestecă formatele %c şi %s cu
formatele %d şi %f sau scanf(…) cu
getchar().
25/04/07 14
Afişarea cu format - printf
Forma generală:
int printf("<format>", <arg1>, <arg2>, …);
unde
<format> este de forma:
%[flags][width][.prec][F|N|h|l|L]tip_char
25/04/07 15
printf
Exemplu:
int zi = 12;
int luna = 2;
int an=2004;
printf("%02d.%02d.%5d", zi, luna, an);
Æ 12.02. 2004
25/04/07 16
printf
int a=1;
printf("%02d", a); //Æ 01
printf("%.3d", a); // Æ 001
float a=2.3;
printf("%.0f", a); // Æ 2
double f = 34.5; // Æ %lf
long double g = 74; // Æ %Lf
long j = 123; // Æ %ld
25/04/07 17
printf
x = ( 24, 31, 29)
25/04/07 18
printf
int err;
char fis[50];
Mesajul:
"Eroare '59' la citirea fisierului a1.txt"
25/04/07 19
Exemplu – P2
Să se scrie un program care calculează
produsul scalar a doi vectori cu
componente numere întregi, precum şi
vectorul sumă.
Primul vector se citeşte de la tastatură
până la întâlnirea combinaţiei de taste
CTRL/Z (CTRL/D în Linux), iar al doilea
vector are exact atâtea elemente cât şi
primul.
25/04/07 20
Analiza problemei
Fie cei doi vectori
X = (xi)i=1,n
şi
Y = (yi)i=1,n
atunci
n
si = xi + yi PS = ∑ xi ⋅ yi
i =1
25/04/07 21
Analiza problemei
1. o funcţie de citire a unui şir de numere pânâ la
intâlnirea caracterului CTRL/Z. Funcţia returnează
numărul elementelor citite.
2. o funcţie de citire a unui vector când se cunoaşte
numărul de elemente care trebuie citite
3. o funcţie de afişare a unui vector
4. funcţia de calcul a vectorului sumă
5. funcţia de calcul a produsului scalar
25/04/07 22
Proiectul
• P2.C – fişier care conţine funcţia main
• modulul VECTOR
– VECTOR.H
– VECTOR.C
25/04/07 23
VECTOR.H
/*
* VECTOR.H
*/
#ifndef _VECTOR_
#define _VECTOR_
// Functia de citire a unui sir de numere pana la CTRL/Z
// (CTRL/D)
int citireVector1(int a[], char den[], int DimMax);
// Functia de citire a unui vector când se cunoaste
// dimensiunea vectorului
void citireVector2(int a[], int n, char den[]);
25/04/07 24
VECTOR.H – continuare
// Functia de afisare vector
void afisareVector(int a[], int n, char den[]);
// Functia de calcul a produsului scalar
long produsScalar(int a[], int b[], int n);
//Functia de calcul a vectorului suma
void sumaVectori(int a[], int b[], int c[], int n);
#endif
25/04/07 25
P2.C
/*
* P2.C
*/
#include <stdio.h>
#include <conio.h>
#include "vector.h"
int main(void)
{
int x[20], y[20], suma[20];
int n;
int ps;
25/04/07 26
P2.C
n = citireVector1(x,"x",20);
if(n > 0) {
citireVector2(x,n,"y");
ps = produsScalar(x, y, n);
sumaVectori(a, b, suma, n);
printf("Pentru vectorii \n");
afisareVector(x, n, "x");
printf("si\n");
afisareVector(y, n, "y");
printf("vectorul suma este\n");
afisareVector(suma, n, "S");
printf("iar produsul scalar este %d.\n",ps);
}
25/04/07 27
P2.C
else
fprintf(stderr,"Vector nul.\n");
if(!getch()) getch();
return 0;
}
25/04/07 28
VECTOR.C
#include <stdio.h>
int citireVector1(int a[], char den[], int DimMax)
{
int n = 0;
printf("%s(%d) = ", den, n);
while((n < DimMax) && (scanf("%d", &a[n]) == 1))
{
n = n+1;
printf("%s(%d) = ", den, n);
}
return n;
}
25/04/07 29
VECTOR.C
void citireVector2(int a[], int n, char den[])
{
int i;
for(i=0; i<n; i=i+1)
{
printf("%s(%d) = ", den, i);
scanf("%d",&a[i]);
}
}
25/04/07 30
VECTOR.C
void afisareVector(int a[], int n, char den[])
{
int i;
printf("%s=(", den);
for(i=0; i<n-1; i=i+1)
{
printf("%d, ", a[i]);
}
printf("%d)\n", a[n-1]);
}
25/04/07 31
VECTOR.C
long produsScalar(int x[], int y[], int n)
{
long ps;
int i;
ps = 0;
for(i=0; i<n; i=i+1)
ps = ps + x[i]*y[i];
return ps;
}
25/04/07 32
VECTOR.C
void sumaVectori(int a[], int b[], int s[], int n)
{
int i;
for(i=0; i<n; i = i+1)
s[i] = a[i] + b[i];
}
25/04/07 33
25/04/07 34
Operaţii de intrare – ieşire pentru
caractere
Prototipuri în stdio.h
int getchar(void);
int putchar(int c);
25/04/07 35
int getch(void);
int getche(void);
int putch(int c);
25/04/07 37
Exemplu:
Se introduce un text de la tastatură
caracter cu caracter până la întâlnirea
CTRL-Z.
Să se afişeze numărul de linii introduse.
25/04/07 38
Exemplu:
#include <stdio.h>
int main(void)
{
int c;
int numarLinii = 0;
25/04/07 39
c = getchar();
while(c != EOF) {
if (c == '\n')
numarLinii = numarLinii + 1;
c = getchar();
}
25/04/07 40
printf("S-au introdus %d linii.\n",
numarLinii);
return 0;
}
25/04/07 41
• fscanf, fprintf
int fscanf(FILE *fisier, format, arg1, arg2, …);
int fprintf(FILE *fisier, format, arg1, arg2, …);
25/04/07 42
Operaţii de intrare - ieşire
char temp[81];
int a;
………………………
while(fgets(temp,80,stdin) != 0)
{
nr = sscanf(temp, ",%d", &a);
if(nr == 1)
printf("%d ",a);
}
………………………….
25/04/07 43
25/04/07 45
PROGRAMAREA
CALCULATOARELOR
25/04/07 1
Expresii şi operatori
25/04/07 2
Expresie
O secvenţă de operatori şi operanzi care
specifică modul de calculare a unei valori.
Expresia:
¾ operanzi care sunt entităţile care participă
¾ operatori care descriu operaţiile care se execută
25/04/07 3
Operatori
Caracteristici:
1. aritate Æ număr de operanzi
25/04/07 5
Operatori
În funcţie de operaţia realizată:
9aritmetici
9incremetare şi decrementare
9relaţionali
9logici
9logici la nivel de bit
9atribuire
9accesul la date şi dimensiune
25/04/07 6
Expresii aritmetice
Operanzi:
constante, variabile, funcţii, elemente de
tablou, subexpresii, membrii unei structuri
Operatori:
1. unari (prefixaţi): +, -
2. binari (infixaţi): *, /, %
+, -
25/04/07 7
Expresii aritmetice
Observaţii:
1. dacă cei doi operanzi sunt de acelaşi tip, atunci tipul
rezultatului coincide cu tipul celor doi operanzi
4/3 Æ ?
4./3. Æ?
25/04/07 8
Expresii aritmetice
Reguli de evaluare
1. Dacă apar funcţii, se consideră ca operanzi
rezultatele furnizate de acele funcţii
2. Priorităţi:
+ - Æ unari
*/%
+ - Æ binari
25/04/07 9
Conversii
1. implicite
char, enum Æ int
se face conversia la tipul prioritar
T + long double Æ long double
T + double Æ double
T + float Æ float
T + unsigned long Æ unsigned long
long + unsigned int Æ unsigned long
T + long Æ long
unsigned int + int Æ int (dacă se poate) sau
unsigned int
Æ int
25/04/07 10
Conversii
2. explicite
Folosirea operatorului de conversie (operatorul cast).
Forma generală:
(tip)operand
Exemplu:
short int a = 31564, b = 5130;
long int c;
c = (long)a + b;
printf("c = %ld",c);
// c = 36694
25/04/07 11
Decrementare
operaţia de micşorare a valorii unei
variabile de tip întreg cu 1.
Operator: --
25/04/07 12
Operatori de incrementare - decrementare
Exemple:
++i //este echivalent cu i = i + 1
n-- //este echivalent cu n = n + 1
x = ++n;
x=6
n=6
x = n++;
x=5
n=6
25/04/07 14
Operatori de incrementare - decrementare
Exemplu:
temp [nc] = c;
nc++;
este echivalent cu
temp [nc++] = c;
25/04/07 15
Exemplu:
1) x = fn1(i++) + fn2(i++)
Corect:
x = fn1(i++);
x = x + fn2(i++);
25/04/07 16
Operatori de incrementare - decrementare
2) a[i++] = b[i++]; /* GREŞIT */
3) int i, a[10];
i = 0;
while(i < 10)
a[i] = i++; /* GREŞIT */
25/04/07 17
Se afişează
21
25/04/07 18
Operatori de incrementare - decrementare
#include <stdio.h> int next (int x)
#include "ex.h" {
return x++;
int main(void) }
{
int a, i = 10; Programul va afişa:
a = next(i); a=
10
printf("a =\n\t%d\n", a);
return 0;
}
25/04/07 19
Expresii de relaţie
Rezultatul expresiei poate fi:
25/04/07 20
Expresii de relaţie
Operatori:
< <= > >=
== !=
Exemple:
i < lim – 1
b == a*a
getchar() != EOF
25/04/07 21
Expresii logice
Se compun din operanzi şi operatori logici.
Operatorii logici:
|| SAU logic
&& ŞI logic
! NU logic
Exemple:
(a==7) || (a==1)
(a>= 0) && (a<= 9)
!(a<0)
25/04/07 22
Expresii logice
Evaluarea expresiei se face de la stânga la
dreapta. Evaluarea se termină când se ajunge
la un punct în care se cunoaşte cu certitudine
rezultatul. Restul expresiei nu se mai
evaluează.
Exemplu:
Dacă a = -2 atunci evaluarea expresiei
(a>0) && (a<20)
se opreşte după evaluarea primei paranteze.
25/04/07 23
Expresii logice
#include <stdio.h>
int main(void)
{
int a=1, b=1;
if((++a > 5) && (++b > 5))
printf("Mesaj 1 si %d %d\n", a, b);
else
printf("Mesaj 2 si %d %d\n", a, b);
return 0;
}
25/04/07 24
Expresii logice
Programul afişează:
Mesaj 2 si 2 1
25/04/07 25
Expresii logice
Prioritatea
&& are prioritate mai mare ca || şi mai mică decât a
operatorilor aritmetici şi relaţionali.
25/04/07 26
Program exemplu P3
Se citeşte un număr întreg reprezentând un an. Se afişează dacă
anul respectiv este bisect sau nu.
25/04/07 27
Program exemplu P3
25/04/07 28
Program exemplu P3
25/04/07 29
Exemple:
x=1
a=b
y = a*x*x + b*x + c
25/04/07 31
Expresia de atribuire
v = expresie
are o valoare care este valoarea atribuită lui v.
Exemple:
(c = getchar()) != EOF
z = sqrt(a = 3*x)
25/04/07 32
Operatori şi expresii de atribuire
Forma generală prin care modificăm o variabilă prin operaţii
asupra propriei valori este:
v = v op exp
unde
v este o variabilă (de oricare tip),
op este un operator binar aritmetic sau de lucru pe biţi
*, +, (, -, % <<, >>, &. |, ^
exp este o valoare sau o expresie al cărui rezultat modifică
valoarea variabilei v
Exemplu:
i = i + 1;
a[i+j+2*k] = a[i+j+2*k] + 4
25/04/07 33
Exemplu:
i=i+1 i += 1
a[i] = a[i] / b a[i] /= b
k = k * (n+1) k *= n+1
a[i+j+2*k] = a[i+j+2*k] + 4 a[i+j+2*k] += 4
25/04/07 34
Operatori şi expresii de atribuire
Observaţie:
variabilele declarate (definite) într-o
funcţie au valori nedefinite dacă nu sunt
iniţializate.
25/04/07 35
1 2 3
int a[2][3] = {1,2,3,4,5,6}; Æ
4 5 6
1 2 3
int a[2][3] = {{1,2,3},{4,5,6}}; Æ
4 5 6
25/04/07 37
Exemplu:
typedef struct _PUNCT {
double x, y;
} PUNCT;
25/04/07 38
Operatori şi expresii de atribuire
Un caz special de folosire a operatorului de atribuire
este în cazul structurilor.
b = a;
25/04/07 40
Operatori logici asupra biţilor
Sunt operatori:
unari (cu prioritatea egală cu a celorlalţi operatori
unari)
~ - complement faţă de 1, negare
binari
<< deplasare stânga la nivel de bit
>> deplasare dreapta la nivel de bit
& ŞI pe biţi
^ SAU EXCLUSIV (XOR) pe biţi
| SAU pe biţi
25/04/07 41
25/04/07 42
Operatori logici asupra biţilor
Operatorul & (ŞI)
& 0 1
0 0 0
1 0 1
25/04/07 43
25/04/07 44
Operatori logici asupra biţilor
Operatorul & (ŞI)
Exemple:
b) c = n & 0177400 8 = n & 11111111 00000000 2
MASCĂ octet superior octet inferior
25/04/07 45
^ 0 1
0 – lasă biţii nemodificaţi
0 0 1 1 – complementează biţii
1 1 0
25/04/07 46
Operatori logici asupra biţilor
Operatorul ^ (SAU EXCLUSIV XOR)
Exemplu:
Trebuie complementat bitul 4 dintr-un octet.
MASCA = 0x10 00010000
Pentru
c = 0x5bu 01011011
rezultatul expresiei
c^MASCA
este 01001011
25/04/07 47
25/04/07 48
Operatori logici asupra biţilor
Operatorul | (SAU)
Exemple:
z = x | MASK
a) x = 6610 MASK = 118
z = 6610 | 118 = 1028 | 118 = 1138 = 7510
MASCĂ
25/04/07 49
25/04/07 50
Operatori logici asupra biţilor
Observaţie
Operatorii & şi | sunt diferiţi de operatorii logici &&
şi ||.
Exemplu:
x = 1, y =2 Æ x & y este 0
Æ x && y este 1
25/04/07 51
Exemplu:
n = 23 Æ 0000000000010111
n << 3 Æ 0000000010111000
n >> 3 Æ 0000000000000010
25/04/07 52
Operatori logici asupra biţilor
Operatorii de deplasare << şi >>
<<
completează poziţiile libere cu zerouri
deplasarea cu o poziţie este echivalentă cu o
înmulţire cu 2
>>
completarea poziţiilor libere se face în funcţie de
implementare (la BorlandC 3.1 se completează cu o
extensie a semnului)
deplasarea cu o poziţie este echivalentă cu o
împărţire la 2
25/04/07 53
x = 4216 şi
x = x & ~077u8 (fără semn)
25/04/07 54
Operatori logici asupra biţilor
Exemplu:
Să se scrie un program care foloseşte operatorii de
lucru pe bit pentru a realiza "împachetarea" unei date
calendaristice.
an luna ziua
15 9 8 5 4 0
1 1 0 1 0 0 1 0 0 1 1 1 0 1 0 1
25/04/07 55
#ifndef _DATA_
#define _DATA_
#endif
25/04/07 56
Operatori logici asupra biţilor
Fişier P4.cpp
#include <stdio.h>
#include "data.h"
int main(void)
{
WORD zi, luna, an;
WORD data;
int nr, valid;
25/04/07 57
25/04/07 58
Operatori logici asupra biţilor
Fişier DATA.CPP
#include <stdio.h>
#include "data.h"
25/04/07 60
Operatori logici asupra biţilor
void afisareBinara1(WORD data)
{
WORD nr = sizeof(WORD) << 3;
WORD MASK = ~((~0u)>>1);
WORD c;
while(nr--)
{
c = (data & MASK) >> nr;
putchar(c + '0');
if(!(nr & 07))
putchar(' ');
MASK >>= (WORD) 1;
}
putchar('\n');
}
25/04/07 61
25/04/07 62
Operatori logici asupra biţilor
else
if(luna == 4 || luna == 6 || luna == 9 || luna == 11)
if(zi > 30)
valid = 0;
else
valid = 1;
}
return valid;
}
25/04/07 63
25/04/07 64
Expresia şi operatorul condiţional
Expresia condiţională este formată cu ajutorul
operatorului condiţional care este un operator ternar.
Forma generală:
expresieL ? expresieDa : expresieNu
Exemplu:
a) Rezultatul expresiei
(a<b) ? a : b
este valoarea minimă dintre a şi b.
25/04/07 65
25/04/07 66
Expresia şi operatorul condiţional
Scriem
f1(a, b+1, c+d, e1? f : 0, (g+h+i)/2);
25/04/07 67
25/04/07 69
25/04/07 70
Operatorul virgulă
Leagă două expresii într-una singură.
Forma generală:
expresie1, expresie2, ..., expresien
25/04/07 71
Operatorul virgulă
Exemplu:
printf("%5d\n", ((c = (a<0) ? –a : a),
((d = (b<0) ? –b : b),
((c > d) ? c : d)));
25/04/07 72
Operatorii de selecţie
1) Operatori de indexare []
Realizează accesul la un element al unui tablou.
Forma generală este:
numeTablou[index1][index2]…[indexn]
Au prioritate maximă.
25/04/07 73
Operatorii de selecţie
2) Operatorul .(punct)
25/04/07 74
Operatorii de selecţie
Exemplu:
struct PUNCT {
double x,y;
};
struct DREPTUNGHI {
struct PUNCT A; // colt stanga sus
struct PUNCT B; // colt dreapta jos
};
p1.x D1.A.y
25/04/07 75
Operatorul sizeof
Furnizează mărimea în octeţi a entităţii specificate.
Forma generală:
sizeof data sau sizeof(data)
sizeof tip sau sizeof(tip)
unde data poate fi un nume de variabilă, de tablou, de
structură, element de tablou sau membru al unei
structuri, iar tip este un cuvânt ce indică un tip de
entitate.
sizeof(short int) Æ 2
float tab[10];
sizeof(tab) este 40, iar sizeof(tab[1]) este 4.
25/04/07 76
Operatorul sizeof
În cazul structurilor, valoarea returnată de sizeof nu
coincide întotdeauna cu suma dimensiunilor membrilor
structurii datorită alinierii sau nealinierii datelor.
Exemplu:
struct TEST {
char c;
float b;
char c1;
int a;
} t;
printf("Marimea structurii de test este de %d octeti. \n",
sizeof(t));
25/04/07 77
Operatorul sizeof
Pentru BorlandC 3.1 (nu ţine cont de alinierea
datelor)
c float c1 a
c float c1 a
25/04/07 78
Ordinea de efectuare a operaţiilor
Se referă la operatorii cu aceeaşi prioritate (precedenţă).
Sensul de evaluare precizează semnificaţia unei expresii
şi nu ordinea cronologicş de evaluare a
subexpresiilor.
Singurele expresii pentru care ordinea (cronologică) este
specificată (în standardul C ANSI) sunt
9 e1 && e2 şi e1 || e2
9 e0 ? e1 : e2
9 e1, e2
25/04/07 79
25.04.2007 1
INSTRUCŢIUNILE LIMBAJULUI C
Maşina virtuală
D.I. MEMORIE D.E.
UNITATE CENTRALĂ
Operaţii de bază:
citirea
scrierea
atribuirea
25.04.2007 3
25.04.2007 4
Structura de control a programului
Modificarea ordinii de execuţie a instrucţiunilor se
face, în programarea structurată, prin utilizarea
structurilor de control.
25.04.2007 5
Blocuri de instrucţiuni
Bloc de instrucţiuni =
o succesiune de declaraţii/definiţii de variabile şi
instrucţiuni încadrată de caracterele
{
Înaintea unui bloc nu se pune ;.
şi
} După un bloc nu se pune ;.
Blocuri de instrucţiuni
Variabilele declarate/definite într-un bloc
(dacă nu sunt statice) sunt create şi
iniţializate la activarea blocului şi distruse în
momentul ieşirii din bloc, având rezervată
memorie în stivă.
25.04.2007 8
Blocuri de instrucţiuni
Exemplu:
STIVA
if(...) {
tip1 x1;
…………… ..............
} x2
x1
else {
..............
tip2 x2;
…………… Intrare în bloc Ieşire din bloc
}
Instrucţiuni
RECOMANDĂRI
25.04.2007 10
Instrucţiuni simple - Instrucţiunea vidă
Se reduce la caracterul ;.
Exemplu:
for(i=0; s[i] != '\0'; i=i+1)
;
25.04.2007 11
Observaţie:
Caracterul ; este caracter terminator de
instrucţiune care se pune numai după
instrucţiunile simple, nu şi după cele compuse
(blocuri de instrucţiuni)
25.04.2007 12
Instrucţiuni simple - Instrucţiunea expresie
Instrucţiunea expresie are sens numai dacă
expresia folosită este:
25.04.2007 13
2. printf("Hello\n");
suma(a,b,n,s);
x = a + f(2,3) Æ expresie
x = a + f(2,3); Æ instrucţiune
25.04.2007 14
Instrucţiuni compuse şi structuri de
control
Structurile de control sunt implementate, în limbajul
C, prin instrucţiuni compuse formate din
instrucţiuni simple şi alte instrucţiuni compuse.
25.04.2007 15
instrucţiuni care se
execută secvenţial (în
ordinea în care sunt Actiune 2
Se execută conform
schemei din figură. Actiune n
25.04.2007 16
Structuri de control - secvenţa
Este formată dintr-un bloc de instrucţiuni, deci
forma generală este:
{
declaratii;
instructiuni;
}
25.04.2007 17
25.04.2007 18
Structuri de control – selecţia (decizia)
Există mai multe tipuri de selecţie:
25.04.2007 19
Reprezentare
prin Adevarat
conditie
Fals
schema
logică: Secventa A Secventa B
25.04.2007 20
Structuri de control – selecţia (decizia)
S1). Selecţia cu două alternative
dacă <condiţie>
atunci <secvenţă_A>;
altfel <secvenţă_B>;
sf. dacă
25.04.2007 21
if(conditie)
Secventa_A;
else
Secventa_B;
25.04.2007 22
Structuri de control – selecţia (decizia)
S1). Selecţia cu două alternative
Exemple:
1) float x, y, z;
if(x > y)
z = x;
else
z = y;
25.04.2007 23
25.04.2007 24
Structuri de control – selecţia (decizia)
S1). Selecţia cu două alternative
Exemple:
3) Funcţie de transformare a unui şir din litere mari în litere mici şi invers
în funcţie de o opţiune
void transf(char sir [], int opt)
{
int i;
if(opt == 1) // se face transformarea in litere mari
{
for(i=0; sir[i] != '\0'; i++)
if(sir[i] >= 'a' && sir[i] <= 'z')
sir [i] = sir[i] – 'a' + 'A';
}
25.04.2007 25
25.04.2007 26
Structuri de control – selecţia (decizia)
S2). Selecţia cu o alternativă (cu o ramură vidă)
Reprezentarea
prin Adevarat
conditie
schema
logică
Secventa
25.04.2007 27
dacă <condiţie>
atunci <secvenţă>;
sf. dacă
25.04.2007 28
Structuri de control – selecţia (decizia)
S2). Selecţia cu o alternativă (cu o ramură vidă)
if(conditie)
secventa;
25.04.2007 29
1) int x, y, z;
if(z != 0)
y = x/z;
2) int x, z;
if(x)
z = 20;
25.04.2007 30
Structuri de control – selecţia (decizia)
S3). Selecţia multiplă - S3.1) Cu instrucţiunea if
Reprezentare prin pseudocod
dacă <conditie1>
atunci <secventa1>;
altfel dacă <conditie2>
atunci <secventa2>;
...........................................
dacă <conditien>
atunci <secventan>
altfel <secventan+1>;
sf. dacă
25.04.2007 31
Adevarat Fals
conditie 1
Adevarat Fals
Secventa 2 conditie 3
Aici schema se
continua cu cate
conditii este nevoie
Seventa 3
Adevarat Fals
conditie n
Secventa
Secventa n
n+1
25.04.2007 32
Structuri de control – selecţia (decizia)
S3). Selecţia multiplă - S3.1) Cu instrucţiunea if
În limbajul C avem
if(conditie1)
secventa1;
else if(conditie2)
secventa2;
else if(conditie3)
secventa3;
………………………………………………………….
else if(conditien)
secventan;
else
secventan+1;
25.04.2007 33
sau if(conditie1)
{
if(conditie2)
secventa1;
else
if(conditie3)
secventa2;
}
else
secventa3;
25.04.2007 34
Structuri de control – selecţia (decizia)
S3). Selecţia multiplă - S3.1) Cu instrucţiunea if
Exemple:
a). int c;
if((c >= 'a') && (c <= 'z'))
puts("litera mica");
else if((c >= 'A') && (c <= 'Z'))
puts("LITERA MARE");
else if(c == ' ' || c == '\t' || c == '\n')
puts("Caracter alb");
else if((c >= '0') && (c <= '9'))
puts("Cifra");
else
puts("Alt caracter");
25.04.2007 35
Exemple:
b). if((c >= 'a') && (c <= 'z')) {
puts("litera mica");
++lit_mica;
}
else if((c >= 'A') && (c <= 'Z')) {
puts("LITERA MARE");
++lit_mare;
}
else {
puts(Alt caracter");
++alte;
25.04.2007 } 36
Structuri de control – selecţia (decizia)
S3). Selecţia multiplă - S3.1) Cu instrucţiunea if
Exemple:
b). int esteEchilateral(int a, int b, int c);
int esteIsoscel(int a, int b, int c);
int esteDreptunghic(int a, int b, int c);
int esteTriunghi(int a, int b, int c);
25.04.2007 37
if(esteTriunghi(a,b,c)) //if1
{
printf("Este triunghi ");
if(esteEchilateral(a,b,c)) //if2
{
printf("echilateral.\n");
}
else if(esteIsoscel(a,b,c)) //else if2 si if3
{
printf("isoscel.\n");
}
25.04.2007 38
Structuri de control – selecţia (decizia)
S3). Selecţia multiplă - S3.1) Cu instrucţiunea if
25.04.2007 39
Expresie ?
Secventa
Secventa 1 Secventa 2 Secventa 3 Secventa n
n+1
25.04.2007 40
Structuri de control – selecţia (decizia)
S3). Selecţia multiplă - S3.2) Cu instrucţiunea switch
if(x == val1)
/* o secvenţă de cod – secventa1*/
else if(x == val2)
/* altă secvenţă de cod – secventa2*/
else if(x == val3)
/* o a treia secvenţă de cod – secventa3*/
else if(x == val4)
/* o a patra secvenţă de cod – secventa4*/
else
/* secvenţa de cod implicită - secventa5 */
25.04.2007 41
switch(x) {
case val1:
secventa1;
break;
case val2:
secventa2;
break;
case val3:
secventa3;
break;
25.04.2007 42
Structuri de control – selecţia (decizia)
S3). Selecţia multiplă - S3.2) Cu instrucţiunea switch
case val4:
secventa4;
break;
default:
secventa5;
}
25.04.2007 43
25.04.2007 44
Structuri de control – selecţia (decizia)
S3). Selecţia multiplă - S3.2) Cu instrucţiunea switch
unde
exp este o expresie de tip întreg
c1, c2, ... sunt constante de tip întreg.
Observaţie:
Instrucţiunea break poate lipsi şi atunci codul se
execută în secvenţă, începând cu cazul constantei ci
care egalează valoarea expresiei exp.
25.04.2007 45
Exemplu:
1) Se citesc două numere întregi de la tastatură şi un
operator. Să se calculeze rezultatul.
.....................................
int a, b;
int op;
int r;
25.04.2007 46
Structuri de control – selecţia (decizia)
S3). Selecţia multiplă
/*
* Cu if
*/
if(op == '+')
r = a+b;
else if(op == '-')
r = a-b;
else if(op == '*')
r = a*b;
else if(op == '/') {
25.04.2007 47
if(b != 0)
r = a/b;
else {
puts("Eroare\n");
r = 0;
}
}
else {
puts("Operator necunoscut\n");
r = 0;
}
25.04.2007 48
Structuri de control – selecţia (decizia)
S3). Selecţia multiplă
/*
* Cu switch
*/
switch(op) {
case '+': r = a+b;
break;
case '-': r = a-b;
break;
case '*': r = a*b;
break;
25.04.2007 49
25.04.2007 50
Structuri de control – selecţia (decizia)
S3). Selecţia multiplă - S3.2) Cu instrucţiunea switch
Exemplu 2.
int ch;
while((ch = getchar()) !=EOF)
switch(ch) {
case '0':
case '2':
case '4':
case '6':
case '8':
++cifre_pare;
25.04.2007 51
25.04.2007 52
Structuri de control repetitive - iteraţia
Este o structură compusă care conţine o
parte iterată care se execută de zero, una
sau mai multe ori în funcţie de rezultatul
unui test logic.
25.04.2007 53
25.04.2007 54
Structuri de control repetitive –
iteraţia cu test iniţial
Schema logică a
acestei structuri
de control este
Fals Adevarat
conditie
Secventa
25.04.2007 55
25.04.2007 56
Structuri de control repetitive –
iteraţia cu test iniţial
Instrucţiunea C
while(conditie)
secvenţă;
Observaţie:
Secvenţa trebuie să modifice una din
variabilele ce apar in expresia conditie
25.04.2007 57
2). int x, y, z;
while(scanf("%d%d%d", &x, &y, &z) != 3)
fflush(stdin);
25.04.2007 58
Structuri de control repetitive –
iteraţia cu test final
Schema logică a
acestei structuri
de control este
Secventa
Fals Adevarat
conditie
25.04.2007 59
repetă
<secvenţă>;
cât timp <condiţie>
25.04.2007 60
Structuri de control repetitive –
iteraţia cu test final
Instrucţiunea C corespunzătoare
do {
secventa;
} while (expresie);
25.04.2007 61
do {
…………………………
printf("Reluati? (d/n) ");
ch = getchar();
} while (tolower(ch) == 'd');
25.04.2007 62
Structuri de control repetitive –
iteraţia cu test final
2) Calculul valorii exponenţialei (recurenţă când nu se
cunoaşte numărul de paşi).
x 2 x3 xn
e =1+ x +
x
+ +K+ +K
2! 3! n!
xk
uk =
k!
x k −1 x x
uk = ⋅ = u k −1 ⋅ u0 = 1
(k − 1)! k k
25.04.2007 63
e x = u0 + u1 + u 2 + K + u n + Rn
S k = u0 + u1 + K + u k −1 + u k
S k = S k −1 + u k S −1 = 0
25.04.2007 64
Structuri de control repetitive –
iteraţia cu test final
2)
double expProprie(double x, double eps)
{
double S = 1, u = 1;
int k = 0;
do {
k = k + 1;
u = x/k * u;
S = S + u;
} while(fabs(u) > eps);
return S;
}
25.04.2007 65
Iteraţia cu contor
Schema logică a acestei
structuri de control este dată va r ← vi
în figură.
Fals Adevarat
var ≤ vf
Secventa
25.04.2007 66
Structuri de control repetitive –
iteraţia cu contor
În pseudocod reprezentarea este
25.04.2007 67
25.04.2007 68
Structuri de control repetitive –
iteraţia cu contor
Observaţii:
1. variabila de buclă poate fi de tip întreg sau real
2. pas poate avea o valoare pozitivă sau negativă
3. expresia var <= vf poate fi înlocuită cu orice
expresie care după un număr finit de paşi
permite ieşirea din buclă
4. Această instrucţiune este echivalentă cu o
instrucţiune repetitivă cu test anterior.
25.04.2007 69
int i, j;
for(i=0; i<n; i=i+1) {
c[i] = 0;
for(j=0; j<m; j=j+3)
c[i] += a[i][j];
}
25.04.2007 70
Iteraţia cu contor
Secventa
Em
25.04.2007 71
unde
ei este expresia de iniţializare a variabilei (variabilelor) de buclă
25.04.2007 72
Structuri de control repetitive –
iteraţia cu contor
Instrucţiunea corespunzătoare în C este
for(ei; et; em)
<secventa>;
ei;
while(et) {
<secventa>;
em;
}
25.04.2007 73
i=0;
for(; s[i] != '\0'; i=i+1)
25.04.2007 74
Structuri de control repetitive –
iteraţia cu contor
Exemplu:
Calculul valorii unui polinom într-un punct.
P(x ) = a0 x n + a1 x n −1 + ... + an −1 x + an
P−1 (x ) = 0
Pn (x ) = Pn −1 (x ) ⋅ x + an
25.04.2007 75
25.04.2007 76
Alte instrucţiuni
break
Permite ieşirea dintr-o buclă înainte de terminarea
normală (dată de condiţia de test). Cu
instrucţiunea break se iese din bucla cea mai
interioară.
25.04.2007 77
Alte instrucţiuni
break - exemple
1)
while((c=getchar()) != '\n') {
if(c == EOF)
break;
++lung;
}
25.04.2007 78
Alte instrucţiuni
break - exemple
2) for(i=0; i<MAX; ++i)
{
lung = 0;
while((c = getchar()) != '\n')
{
if(c == EOF)
break;
++lung;
}
printf("Lungimea liniei %d este %d\n", i, lung);
}
25.04.2007 79
Alte instrucţiuni
continue
Determină terminarea unei iteraţii, prin saltul peste
restul instrucţiunilor din buclă.
25.04.2007 80
Alte instrucţiuni
continue - exemple
1)
for(i=0; i< MAX; i++)
{
r = i%7;
if(0 == r)
continue;
sum += 15780/r;
……………………………………………….
}
25.04.2007 81
Alte instrucţiuni
return
Determină oprirea execuţiei funcţiei în care se
găseşte şi revine la funcţia care a făcut apelul
(funcţia apelantă).
Forma generală:
return expresie;
unde
expresie trebuie să fie de acelaşi tip cu tipul
funcţiei. Valoarea expresiei este valoarea
furnizată de funcţie.
25.04.2007 82
Alte instrucţiuni
goto
Instrucţiune de salt necondiţionat.
Forma generală:
goto eticheta;
unde eticheta este un identificator asociat unei
instrucţiuni executabile din programul C.
Identificatorul trebuie urmat de caracterul ':'
NU SE FOLOSEŞTE ÎN PROGRAMAREA
STRUCTURATĂ.
25.04.2007 83
PROGRAMAREA
CALCULATOARELOR
POINTERI 1
int j, k;
k=2;
j = 7; // Linia 1
k = j; // Linia 2
Pointeri - definiţii
Variabile pointeri
– definiţie
– definire
T *pt; pt
T *pt1, *pt2, pt3;
int *pi;
double *pr;
struct PUNCT *pp;
Pointeri - definiţii
Variabile pointeri –dimensiunea unui pointer
sizeof(pt) Æ ?
T k;
T *pt;
pt = &k;// extrage valoarea stânga pentru k
INTERZIS:
&(k+1) sau &5
T k = 3;
T i;
T *pt = &k;
i = *pt; // Conţine valoarea de la adresa pt
*pt = 5;
j = *pk + 10
d = sqrt((double) *pk)
*pk = 0
*pk += 1
j = *pk + 1
j = *(pk + 1)
double r;
double *pr = &r;
*pr = 3.14159;
Exemplu:
int i;
char c;
void *data;
data = &c;
printf("Data indica un caracter %c\n",
*(char *)data);
int i;
int *pi;
pi = &i;
double *pr = 0;
int i;
pi i
int *pi, *pj;
pj
pi = &i;
pj = pi;
Prototipuri în stdlib.h
Exemplu:
char *p;
p = (char *)malloc(15);
Exemplu:
short int *p1;
p1 = (short int *)malloc(5*sizeof(short int));
p1
T *pt;
pt = (T *)malloc(n * sizeof(T));
if(pt == 0) {
fprintf(stderr, "Eroare la alocare \n");
exit(EXIT_FAILURE);
}
1)
int *p;
p = (int *)xmalloc(20 * sizeof(int));
ps -> an = 2005;
astazi.an = 2005;
ps -> zi = 25;
astazi.zi = 5;
ps->luna = (char *)
xmalloc(15*sizeof(char));
astazi.luna = (char *)
xmalloc(15*sizeof(char));
b) eliberarea memoriei
free((T *)pt);
pt = NULL;
Exemplu:
double *p1;
p1 = (double *)realloc(p0, nE*sizeof(double));
if(p1 == NULL) {
fprintf(stderr, "Eroare la alocare\n");
exit(EXIT_FAILURE);
}
↑ ↑
pi p2
↑ ↑
pf2 pf
↑ ↑ ↑
p3 p1 p2
↑ ↑ ↑
pf3 pf1 pf2
↑ ↑
p q
↑ ↑
p1 p2
Pointeri şi tablouri
Un tablou:
short int v[5];
↑
v
Un pointer:
short int *p;
p = (short int *)xmalloc(5*sizeof(short int));
↑
p
25 aprilie 2007 Programarea Calculatoarelor 38
Pointeri şi tablouri
short int *pv;
pv = &v[0];
↑
v pv
pv = v;
Pointeri şi tablouri
z = v[i];
z = pv[i];
z = *(v+i);
z = *(pv + i);
Pointeri şi tablouri
Putem avea nu numai pointeri la primul element al
tabloului, dar şi pointeri la un element oarecare.
↑ ↑
v p
Pointeri şi tablouri
Diferenţa dintre pointeri şi tablouri
pv = &v[0];
pv++;
pv = v + 3;
v++; // NU
v = pv + 4; // NU
while(*sp != '\0') {
*dp = *sp;
dp++;
sp++;
}
*dp = '\0';
S i r d e t e s t \0
↑ ↑
c c[i]
int a[20];
f1(a,n);
f1(&a[2], n1);
f1((a+2), n1)
Pointeri şi funcţii
void F(int a, int b)
{
int aux;
aux = a;
a = b;
b = aux;
}
……………
a=10; a?
b = 20;
b?
F(a,b);
……………
Pointeri şi funcţii
Pointerii pot fi (ca orice altă variabilă):
Exemplu:
double *pf;
pf = f2(x,y,z);
x, y, z – variabile pointer declarate corespunzător
Modul VECTOR:
VECTOR.H
VECTOR.C
VECTOR.H
#ifndef _VECTOR_
#define _VECTOR_
#endif
VECTOR.C
void afisareVector(int *a, size_t n, char *s)
{
size_t i;
printf("%s(=", s);
for(i=0; i<n-1; i++)
printf("%3d, ", *(a+i));
printf("%3d)\n", *(a+(n-1)));
}
MAIN.C
#include <stdio.h>
#include "vector.h"
int main(void)
{
int *a;
size_t n;
size_t indexMax;
Pointeri constanţi şi
pointeri la o constantă
int main(void)
{
int x, y;
// Pointer la o constanta
const int *pic;
// Pointer constant
int *const cp = &x;
// Pointer constant la o constanta
const int *const cp1 = &y;
pic = &x;
*pic = 5;
/* Nepermis, pointer la o constanta */
cp++;
/* Nepermis, pointer constant */
*cp = 20;
Pointeri constanţi şi
pointeri la o constantă
*cp1 = 30;
cp1++;
/* Nepermis, pointer constant la o constanta */
return 0;
}
POINTERI 2
T tab[100];
typedef T1* T;
T1* tab[100];
Tablou de pointeri
tab
tab[0] 1 2
tab[1]
5 6 7 8
tab[99] 11 21 34
text[0] E x e m p l u \0
text[1]
d e \0
text[2]
t e x t \0
text[49]
#define L 50
#endif
#include <stdio.h>
#include "text.h"
int main(void)
{
char *text[L];
int numarLinii = 0;
return nl;
}
VECTOR v;
VECTOR v1[5];
VECTOR *pv;
Pointer la un tablou
pv = &v1[0];
sau
pv = v1;
sizeof(*pv) ?
T (*pv)[10];
pv = (T (*)[10])xmalloc(1 * sizeof(*pv));
pv = (T (*)[10])xmalloc(N * sizeof(*pv));
T (*pv)[10];
pv
pv = (T (*)[10])xmalloc(1 * sizeof(*pv));
(*pv+j)
1 2 3
pv 15 20 34 25 19
72 20 23 11
*(pv+2) 0 9 8 7 6 5 4 3 2 1
5 15 25 35 45 55 65
Pointeri la un tablou
*pv
Ce semnificaţie
are?
*pv+j Æ ?
*(*pv+j) ⇔
*(pv[0]+j) ⇔
pv[0][j]
*(*(pv+i)+j) ⇔ *(pv[i] + j)
⇔ pv[i][j]
Pointeri la un tablou
T *p3[10];
p3 p3[0]+j
p3[0] 1 2 *(p3[0]+j)
p3[1]
5 6 7 8
p3[9] 11 21 34
#ifndef _TP_
#define _TP_
typedef int T;
void *xmalloc(size_t n);
#endif
int main(void)
{
T *p1;
T (*p2)[10];
T *p3[10];
int i;
size_t n = 20;
p2 = (T (*)[10])xmalloc(2*sizeof(*p2));
/*
* %p – format pentru afişarea valorii unui
* pointer
*/
(*p3)++;
p2++;
p1++;
free(--(*p3)); *p3 = 0;
for(i=1; i<10; i++)
{
free(p3[i]);
p3[i] = 0;
}
return 0;
}
p p[0]+j
p[0] 1 2 *(p[0]+j)
p[1]
5 6 7 8
p[9] 11 21 34
typedef T LINIE[20];
LINIE p1[10];
typedef T (*PT)[20];
int N = 10;
PT p1;
p1 = (T (*)[20])xmalloc(N * sizeof(*p1));
typedef int T;
typedef T LINIE[20];
typedef T (*VP)[20];
#endif
int main(void)
{
int n=2, m = 3;
int i, j;
LINIE mat[10]; /* T mat[10][20]; */
VP mat1;
mat1=(VP)xmalloc(10 * sizeof(*mat1));
puts("Matricea mat");
afisareMatrice(mat, n, m);
free((VP) mat1);
mat1 = 0;
return 0;
}
mat[i][j] Æ ?
*(*(mat+i) + j))
(*pv+j) *(pv+i)+j
1 2 3
pv 15 20 34 25 19
72 20 23 11
pv+i 0 9 8 7 6 5 4 3 2 1
5 15 25 35 45 55 65
typedef T* PLINIE;
PLINIE mat[5];
PLINIE *mat;
T** mat;
Exemplu:
-1 0 1 0 -1 -2
2 3 1 Æ -1 0 1
0 -1 -2 2 3 1
#ifndef _ALOCARE_
#define _ALOCARE_
#endif
#endif
#include "alocare.h"
#include "matrice.h"
int main(void)
{
int **a;
int n, m;
dealoca2d(a,n);
a=0;
return 0;
}
int main(void)
return 0;
}