Documente Academic
Documente Profesional
Documente Cultură
C1
C1
Bibliografie:
Bucuresti, 2003
Cuprins:
Supradefinirea functiilor Operatii de intrare/iesire Tipul referinta Functii in structuri
Introducere Comentarii Pozitia declaratiilor in bloc Operatorul de rezolutie :: Functii inline Argumente de functii cu valori implicite
0. Introducere
*.c
=>
*.cpp
d.p.d.v. al compilatorului
#define _cplusplus
Exista medii de dezvoltare (Borland C) care au un compilator unic pentru programele scrise in C si C++ (care trebuie informate)!
2
1. Comentarii
/* citire data */ getdate(&data); sunet(); printf("\n Azi suntem in: %d.%d.%d\n\n",data.zi,data.luna,data.an); /* deschidere fisier fhandler=fopen("C:\\DATE\\REMEMBER.DAT","a"); fclose(fhandler);*/
in C :
in C++ :
int stare_Panel = 0; // butoane (8): Scenariu, Salvare, Configurare, Declansare, Analiza, // Adnotari, Ajutor, Iesire // stari (4): Initiala, Declansare, Analiza, Simulare int StariButoane[4][8] = {{0,1,1,0,0,0,0,0},{1,1,0,1,0,0,0,0},{0,1,0,1,1,0,0,0},{1,1,1,1,1,1,1,1}}; // int StariButoane[2][3] = {{1,2,3},{4,5,6}}; // = {{0,1,1,0,0,0,0,0},{1,1,0,1,0,0,0,0},{1,1,0,1,0,0,0,0}}; int g_NotepadExeHandle;
3
Daca linia este prea lunga si se trece automat pe linia urmatoare si comentariu nu mai are efect!
in C :
oriunde in program
in C++ :
in C :
main() { char c,x; int notifyCount = 42; /* Wait for at least 50 bytes in queue */ int eventChar = 13; /* Wait for LF */ int eventMask = LWRS_RXFLAG; int comPort = 5; handle = LoadPanel (0, "Reg_Test_62_RS232.uir", BI); DisplayPanel (handle);
SetCtrlAttribute(handle,BI_indic_com_man,ATTR_DIMMED,1); // Deschidere port serial OpenComConfig (5, "COM5", 9600, 0, 8, 1, 512, 512); SetComTime (5, 0.50); // initializare comcallback InstallComCallback (comPort, eventMask, notifyCount, eventChar, MessageReceived, NULL); SetIdleEventRate (50); InstallMainCallback (GetData,(void *)&x , 1); RunUserInterface();
in C++ :
float sum(float v[], int n) { float s; for (int i=0; i<n; i++) s+=v[i]; return s; }
// erore!!!!
6
3. Operatorul de rezolutie :: :
// global // local // global // corect dar nerecomandat
4. functii inline:
Au efect doar asupra codului generat de compilator.
in C++ :
inline int max(int a, int b) { return a>b ? a:b; } // utilizare: int z = max(x, y);
// prototip pt. f
// va afisa 0 5
void printvect(int v[], int n, char*text = ) { printf(%s\n, text); for(int i = 0; i < n; i++) printf(%d ,v[i]); printf(\n); } // utilizare: printvect(x, nx, vectorul x); printvect(y, ny);
Este bine sa avem grija de variabilele sensibile de evitat situatii sensibile de genul impartirii la 0.
10
6. Supradefinirea functiilor:
In C++ pot exista functii (diferite) cu acelasi nume dar numar si tip al parametrilor diferit.
11
// utilizare: printf(%d %f %f %f, arie_drept(2, 4), arie_drept(2.5, 2.2), arie_drept(2.5), arie_drept(2.5, 4.7));
In C++ se pot supradefini chiar si operatorii din C (+, -, ++, --, /, etc.).
12
Exemple:
13
8. Tipul referinta:
Studiu de caz pentru construirea unei functii care interschimba doua variabile:
// functie fara parametri
a)
shimba_1() { int temp; temp = a; a = b; b = temp; } // utilizare; int a,b; a = 3; b = 4; printf(a=%d b=%d\n, a, b); schimba_1(); printf(a=%d b=%d\n, a, b);
// variabile globale
14
functia schimba doar variabilele globale a si b are o viteza mica spatiu de memorie este discutabil (variabila temp dispare dar apare stiva - desen) sunt necesare alte variante
15
b1)
schimba_2(int ca, int cb) { int temp = ca; ca = cb; cb = temp; } // utilizare; int a,b; a = 3; b = 4; printf(a=%d b=%d\n, a, b); schimba_2(a, b); printf(a=%d b=%d\n, a, b); // variabile globale // acelasi rezultat de ce?
16
b2)
int ra = 0; int rb = 0; schimba_2(int ca, int cb) { int temp = ca; ca = cb; cb = temp; ra = ca; rb = cb; } // utilizare; main() { int a ,b; a = 3; b = 4; printf(a=%d b=%d\n, a, b); schimba_2(a, b); a = ra; b = rb; printf(a=%d b=%d\n, a, b); // variabile globale // rezultat de ce?
codul este functional dar este dificil si urat spatiu de memorie suplimentar timp suplimentar
17
c) cu pointeri:
REMEMBER: // np pointer catre o variabila de tipul tip // pi pointer catre o variabila de tip int // & - operatorul de referentiere (adresare) *pi = 3; // * - operatorul de dereferentiere (indirectare) // * si & - operatori inverse
18
schimba_3(int *pa, int *pb) { int temp; temp = *pa; *pa = *pb; *pb = temp; } // utilizare; int a,b; a = 3; b = 4; printf(a=%d b=%d\n, a, b); schimba_3(&a, &b); printf(a=%d b=%d\n, a, b); // variabile globale // rezultat? de ce?
codul este functional este varianta clasica necesita atentie sporita deoarece erori de editare genereaza erori logice greu de detectat.
19
d) cu referinta:
&x referinta catre o variabila x (un nou tip de date)
schimba_4(int &ra, int &rb) { int temp = ra; ra = rb; rb = temp; } // utilizare; if (a > b) schimba_4(a, b);
Alt exemplu:
int int_val = 3; int &ref = int_val; int_val++; // ref++; - compilatorul face indirectarea
20
// cu pointer void majoreaza(int *val) { *val += 5; } // utilizare main() { int x = 0; //. Majoreaza(&x); // } // cu referinta void majoreaza(int &val) { val += 5; } // utilizare main() { int x = 0; //. majoreaza(x); // }
tipul referinta este folosit ca parametru formal in interiorul functiilor; este posibila declararea unor parametri tip referinta si in exteriorul finctiilor dar nu exista motiv pentru aceasta; o functie nu poate returna un pointer la o variabila locala (de ce?) tot asa nu poate returna o referinta la o variabila locala;
Exemplu (incorect):
struct cmplx { float re, im; } cmplx & addx(cmplx &c1, cmplx &c2) { cmplx c3; c3.re = c1.re + c2.re; c3.im = c1.im + c2.im; return c3; } // utilizare cmplx z = addx(a, b);
Se poate corecta daca se elimina operatorul & => o functie ce returneaza ca parametru o structura!!!
22
o referinta nu poate exista singura (int &ref) nu este permisa (se refera la ce sau cine?); spre deosebire un pointer (int *pint) poate exista separate si mai mult poate fi refolosit; o referinta poate fi vazuta ca un alias al unei variabile din acest motiv, nu poate fi folosita pentru o alta variabila; cand operatorul & este utilizat impreuna cu o referinta (a unei variabile, expresia inseamna adresa variabilei indicate de referinta; in mod contrar, un pointer este o variabila de sine statatoare, adresa acestuia fiind diferita de adresa unei variabile catre care acesta indica.
23
denumite si functii membru sau metode; Utilitatea acestor functii se va vedea in cazul programarii obiectuale.
24
Cuvantul este un modificator de tip declara o constanta de un anumit tip specificat (int, float, double etc.); Modificarea ulterioara a valorii acestor este interzisa.
return (0); }
25
26