Documente Academic
Documente Profesional
Documente Cultură
I
CONSTANTE:
Octala: 0(-)123; Hexazecimala: 0x/0X(-)FFFF
TIPURI:
Int - 2 octeti Unsigned/ long int 4 octeti Char (/ unsigned char)- 1 octet Float 4 octeti Double 8 octeti Long Double 10 octeti
SECVENTA ESCAPE:
\65 in baza 8 \b backspace \t tab
VARIABILE
Putem declara o variabila avand o valoare in fuctie de o alta variabila anterior specificata: int a=3; int b=a*4; DIFERENTE C vs C++: in C++ o variabila poate fi declarata ORIUNDE, in C o variabila trebuie declarata la inceputul corpului functiei, inaintea oricarei instructiuni
PRE-PROCESOR
<math.h> - functii matematice <iostream.h> - limbajul C++ cu functii de intrare/iesire <stdio.h> - limbajul C cu functii de intrare/iesire nume_antet.h antet creat de mine Values.h contine MAXINT, MAXLONG valorile maxime Conio.h - culori definite BLACK, BLUE, GREEN, RED - cu valorile 1,2,3,4
FUNCTII
Double sqrt(double x); Colorarea fundalului: in <conio.h> => textbackground(GREEN) ; clrscr(); In stdio.h => CITIREA IN C
CITIREA IN C
Scanf() : int scanf(format, adr_var1, adr_var2, ); scanf() o in cazul unei erori, functia se opreste in locul unde s-a produs eroarea o pentru a apela ADRESA variabilei, trebuie folosit operatorul & - altfel, la iesirea din functie nu se va citi nimic in variabila
d = citeste NR INTREG in BAZA 10, intr-o var INT o = citeste NR INTREG in BAZA 8, intr-o var INT x = citeste NR INTREG in BAZA 16, intr-o var INT u = citeste NR INTREG in BAZA 10, intr-o var UNSIGNED INT f, e sau g = citeste NR REAL in BAZA 10, intr-o var FLOAT c = citeste UN CARACTER (+ CELE ALBE), intr-o var CHAR s = citeste un sir de caractere, pana la ultimul caracter ALB sau pana la terminarea lg-ului *** *** *** *** lg - marimea maxima a citirii literele d, o, x - precedate de l - fac int-ul sa devina long int literele f,e,g - precedate de l - fac float-ul sa devina double literele f,e,g - precedate de L - fac float-ul sa devina long double
WATCH OUT! : 3=2+1 => scanf(&d=%d+%d, &a, &b, &c); => a=3, b=1, c=2 3=1+2 => scanf(&d=%*d+%d, &a, &b, &c); => a=3, c=2; b- nu a fost citit *** in conio.h - int getch(void); - EFECT: returneaza codul ASCII al caracterului
AFISARE
int printf (format, expresie1, exresie2, ..., expresien); Specificator: % [ind] [lg] [.prec] [1|L] litera_tip Litera_tip: SAME + o x, X - afiseaza valorile in baza 16; X - 10,11,.. vor fi majuscule, respectiv ... o f- parte_intreaga.parte_zecimala; e - stiintific; g = e sau f - care mai mica *** lg = marimea minima a afisarii WATCH OUT: pentru int a=-1; printf(a=%d sau a=%u\n, a, a); => a=-1 sau a=65535 float y=0.00008; printf(y=%f sau \n y=%e sau \n y=%g\n, y, y, y) => y=0.000080 sau y=8.000000e-05 sau y=8e-05 printf(x=%.2f\n, x); pentru x=-123.147 => 123.15
EXPRESII
OPERATORI / PRIORITATI 16 clase de prioritati Operatorii unari (necesita un singur operand) dac parte din clasa a 2-a
Observatii OPERANZI: *, /, % clasa a 4-a +, - clasa a 5-a (daca sunt binari !!) % poate fi aplicat doar operanzilor INTREGI / aplicat pentru 2 numere INTREGI => un nr INTREG; o aplicat unor numere dintre care cel putin unul este REAL => returneaza un CAT REAL.
ALTE OBSERVATII: ++a vs. a++ : in primul caz, MAI INTAI SE INCREMENTEAZA, apoi se utilizeaza, in al 2-lea caz, MAI INTAI SE UTILIZEAZA, apoi se incrementeaza! CLASA DE PRIORITATE a operatorilor RELATIONALI = 7 (> , < , <=, >= etc.) CLASA DE PRIORITATE a operatorilor RELATIONALI DE EGALITATE= 8 (!=, ==) CLASA DE PRIORITATE a operatorilor LOGICI GLOBALI: o ! = 2 (unar) o && = 12 o || = 13
OPERATORI pe BITI: ~ = complementarierea/ negatia pe BITI (clasa =2, UNAR) <<, >> = deplasarea la ST, DR (clasa=6) & = conjunctie logic ape biti (clasa=9) ^ = disjunctie exclusive pe biti (clasa=10) | = disjunctie logic ape biti (clasa =11)
Observatie: Primul BIT = Bitul SEMN! (0=poz, 1=neg) cand deplasam spre dreapta, biti se completeaza cu 1
OPERATORI CONDITIONALI Clasa 14 OPERATORI DE REFERENTIERE, CONVERSIE, DETERMINARE A DIMENSIUNII Clasa 2 OPERATORUL , CLASA 16
OBERVATIE Se tine cont de prioritatea operatorilor, in lipsa sau in conditii de egalitate a parantezelor Daca apar operatori de prioritati egale o Se asociaza de la ST la DR, cu exceptia: o Operatorilor UNARI, CONDITIONALI, de ATRIBUIRE (de la DR la ST) Daca apar mai multe tipuri de operanzi intr-o expresie, se realizeaza conversia implicita: operandul cu un domeniu de definitie mai restrans este convertit la cel cu domeniul mai amplu
INSTRUCTIUNI
Instructiunea SWITCH Un fel de if cu mai multe variante de raspuns switch(c) { case '*' x*=y break; case '/' x/=y break; default cout<<'Eroare'; } Instructiunea FOR For(expresie-initializare; expresie-continuare; expresie-reinitializare) Instructiune; ECHIVALENTUL IN WHILE Expresie-initializare; While(expresie continuare) { Instructiune; expresie-reinitializare;} OBSERVATII Oricare dintre cele 3 expresii din instructiunea FOR poate fi vida: for ( ; ; )
APLICATII
Ecuatia de gradul II: ax2+bx+c=0; Rezolvati in R Gasirea unei metode de a plati orice suma S (>7) cu bancnote de 3lei/ 5lei. X,y,z Reale; pot fi laturile unui triunghi? Daca da, aflati aria triunghiului;
OBSERVATII
Folosirea instructiunii return cu alte valori = un fel de break pentru int main()
FISIERE
Fstream.h include tipurile ifstream (intrare), ofstream (iesire) si fstream (intrare/iesire) Ifstream f1(); : ifstream: este tipul, f1 este variabila
Dar, f1 = obiect; => ifstream este o clasa. Obs: O clasa aprox. = un struct. Spre deosebire de struct, o clasa contine atat date cat si functii. Datele si functiile din clasa se numesc membri si sunt apelati prin oberatorul de selectie directa . : nume_obiect.nume_membru Deschiderea fisierului: ifstream f1, \n f1.open(date.in); Deschiderea s-a realizat cu ajutorul functiei .open . Obs: ofstream f2; \n f2.open(c:\\ema\\exemple\\date.out); Ifstream si ofstream au inclus by default modul ios::in respective ios::out ( fisier.in, ios::in ) pentru a utiliza clasa fstream, trebuie sa specificam modulul folosit ios:: in/out OBS: Dupa deschiderea unui fisier, este creat un pointer care se deplaseaza la fiecare operatie de citire/scriere OBS: Pentru a verifica daca pointerul de fisier a ajuns la sfarsit, putem apela functia membra eof()
EOF() = 0 daca NU am ajuns la sfarsitul fisierului != 0 daca am ajuns la sfarsitul fisierului CARACTERELE ALBE Modul de citire >> ignora caracterele albe (space, tab, enter). Pentru a le citi, trebuie sa apelam functia membru get() => ifstream f1(intrare.in); char c; f1.get(c); TEST SCRIERE / CITIRE Good() = 0 if NOT GOOD; bad() = 0 if GOOD; fail() = 0 if NO ERROR SO FAR;
ANTICIPAREA URMATORULUI CARACTER, FARA SA-L CITIM: FUNCTIA MEMBRU peek(); INCHIDERE: f1.close(); LIMBAJUL C [tipul] FILE * [nume variabila] fisier ; EX: FILE * f1, *f2, *f3;
f1 = fopen(date.in, r); (fisier de intrare; r=read) f2 = fopen(date.out, w); (fisier de iesire; w=write) f3 = fopen(date.txt, a); (fisier pentru adaugare de informatii; a=append) INCHIDERE FISIER
Tablouri
Exista a[10][10][10]; - Copierea unui vector: Nu se face prin b=a (genereaza o eroare) ci prin atribuirea fiecarui element in parte. OBS: Afisarea cu 2 zecimale - cout<<setprecision(2)<<nr;
SORTARE:
Prin SELECTIE (pag 118 jos) => MAX n*(n-1)/2 operatii: o Elemental MINIM o Elementul MAXIM
BUBBLESORT (pag 119) => MAX n*n operatii: o Compar vecinii intre ei si ii interschimb. Cat timp am fost nevoit sa fac o interschimbare la trecerea prin vector, inseamna ca mai am treaba! VEZI EX 2, PAG 119 jos INSERTIE (pag 120) => MAX n*(n-1)/2 operatii: o De la 1, 2, 3 pana la n, ma asigur ca parcurg vectorul si las in urma elementele sortate. Iau ca reper elementul a*i+ si il asez corect intre elementele ordonate din spatele sau.
INTERCLASARE
Compare pe rand elementele lui a[] cu elementele lui b[] si aleg pe care sa-l pun in c[]. La urma, copii elementele ramase in a[] sau b[].
Better: Get() / getline() ; o Get() : get( ) poate fi apelata fara niciun parametru o Getline(): getline(char *s, int lg , char c=\n); - caracterul delimitator este citit! ECHIVALENTUL getline() in limbajul C: scanf(%9s, s); citeste maximum 9 caractere in vectorul s*100+;
POINTER
Tip * variabila_ponter ; POINTER = o data care are ca valori ADRESE DE MEMORIE OPERATII CU POINTER 1. Referentiere: &variabila => obtinem un pointer ce contine adresa zonei de memorie unde este stocata variabila 2. Dereferentiere: *variabila_pointer => obtinem ca valoare continutul
EX: int i=10, *p ; p=&i ; cout<< *p; cout<<i; 3. Incrementare / Decrementare: a scadea / creste dimensiunea unui vector; Long int *p; p++; creste dimensiunea zonei de memorie adresata de p cu sizeof(tip) = 4;
Respectiv pentru p--; 4. AFISARE, COMPARATIE, SCADERE POINTERI VEZI PAG 129;
LEGATURA DINTRE POINTERI SI TABLOURI: V = &V [ 0]; adresa V+i = &V[i] ; adresa * V = v[0] ; continutul *(V+i) = V[i]; continutul LEGATURA DINTRE POINTERI SI MATRICE V = &V[0][0]; adr V+i = &V[i][0]; adr (V+i)+j= V[i][j]; adr *(*(V+i)+j) = V[i][j]; Content;
Siruri de caractere
FUNCTII: STRING.H
Int Strlen(char); Char * Strchr (dest,sursa); copie element cu element sirul sursa in destinatie de la *0+ la NULL; se returneaza adresa de inceput a sirului dest !!!dest must be long enough !!! Char * strncpy(dest, sursa, n); - copie primele n caractere din sursa in destinatie (prefix de n caractere) Char * strcat(dest, sursa); Char * strncat(dest, sursa, n); Int strcmp(char * s1, char * s2); compara lexicographic 2 siruri de caractere o <0 - s1<s2 o =0 - s1=s2 o >0 - s1>s2 Int stricmp ( ); case INSENSITIVE Char * strchr (s,c); returneaza adresa primei aparitii a lui c in s; Char * strstr (s1,s2); prima aparitie a lui s2 in s1; Char * strlwr() / char * strupr(); Char * strtok(char * s, const char * separatori) ; Extragerea succesiva a unitatilor lexicale dintr-un sir de caractere : o Inca de la primul apel, se returneaza adresa de inceput a urmatoarei unitati lexicale, sau caracterul NULL (sir vid sau plin de separatori) o Dupa primul apel, separatorul de dupa prima unitate lexical este inlocuit de NULL => o A doua forma de apel va fi strtok (NULL, separatori), care va inlocui cu NULL separatorii de dupa unitatea lexicala si vor returna adresa de inceput a unitatii lexicale; Char * p = strtok(s, separatori) o separatori se pot schimba Char * itoa / ltoa / ultoa (int / long int / unsigned long int nr, char * sir, int baza); Conversia lui nr in baza baza si memoreaza totul in sir.
Struct
Struct [nume_tip] {lista_declaratii_campuri} [lista_variabile]; Obs: declaratia poate fi facuta si separat: struct nume_tip Nume_tip lista_variabile; (in C/C++);
Declararea + initializarea unei variabile de tip struct data struct data azi=,31,Decembrie, 2012-; REDENUMIRE TIPURI: Typedef Typedef struct {int ; char ;} Polinom; Typedef float REAL;
STIVA SI COADA
STIVA Implementare: #define DMAX 100 Typedef int Stiva[DMAX]; Stiva S; Int vf; Stiva VIDA: Vf=-1; Inserare element 1. Verificam sa nu fie stiva plina 2. Else: S[++vf]=x;
COADA
Implementare #define DMAX Typedef int Coada[DMAX]; Coada C; Int Inc, Sf;
FUNCTII
Modul in care subproblemele unei probleme / functiile trebuie sa comunica intre ele = INTERFATA. Transmiterea parametrilor prin referinta: 1. POINTERI 2. REFERINTE (just in C++) !!! Variabilele ce primesc adresa unei alte variabile prin referinta, nu sunt variabile, ci simple adrese Operatorul de rezolutie: :: folosit pentru a putea accesa atat variabila locala cat si variabila globala omonima VARIABILE LOCALE STATICE: Pentru a mentine variabila locala Pentru a nu aloca memorie pe stiva la fiecare apel Pentru a pastra valoarea variabilei intre apelurile de functie: Void f () { static int x=2; // initializarea si atribuirea aceasta au loc doar la primul apel al functiei x++; cout<<x<<endl; } OBS: register un mod de a aloca o anumita variabila in memoria microprocesorului si nu a memoriei RAM; (pentru a grabi accesul la ea) OBS: Functia main() poate avea parametric: main(int argc, char * argv[], char * env[]); EX: VEZI EXERCITIU DE LA PAGINA 235 JOS!!! Program: #include <iostream.h> Int main(argc, char * argv[]) { If(argc==1) {Cout<< Nu a primit numele utilizatorului; return 1; } Cout<< Salut, ; For(int i=1; i<argc; i++) Cout<<! \n;
OBS: Functiile inline: *cresc vitea de executie, nu aloca memorie ca pentru o functie obisnuita+ Inline max (int a, int b) {return a>b?a:b;} OBS: Functiile cu parametric impliciti: Void f (int a, int b=1; int c=2) ,cout<<a<<b<<c; - => apelurile sunt cu: F(9) 912; F(9,8) 982; F(9,8,7) 987;
VEZI PAG 240 6.10 PROIECTE [ CUM SA CREEZI ANTETE SI FISIERE EXECUTABILE!]