Sunteți pe pagina 1din 11

PROGRAMARE C/C++, VOL.

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

Sintaxa specificatorilor de format: Litera_tip:


% [*] [lg] [l|L] litera_tip

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)

OPERATORI DE ATRIBUIRE Clasa = 15 = = + +/-* etc..

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;

VERIFICAREA UNEI PROPRIETATI


Variabila P(x) = 1; devine 0 daca am intalnit proprietatea P.

CAUTAREA SECVENTIALA (multimi dezordonate)


Pur si simplu cautarea unei valori date intr-un vector, prin comparatii.

CAUTAREA BINARA (multimi ordonate)


Ex: cartea de telefoane! Cautam in jumatatea in care se afla X pana cand gasim pe X, sau pana cand nu mai avem unde cauta! VEZI PAG 117 jos ALGORITM-ul

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[].

MATRICE SIRURI DE CARACTERE


Def: O succesiune de caractere terminate cu caracterul NULL ( = 0 in ASCII)
Char s1[]=Mama are mere - nu e neaparat sa specific dimensiunea! Diferenta dintre a si a este aceea ca primul e stocat pe 1 octet si reprezinta doar caracterul a, pe cand al doilea este stocat pe 2 octeti si reprezinta sirul de caractere format din a si NULL. CITIRE: Error: Cin>>s; SAU Cin>>s; (s[50]) => se incearca sa se umple sirul. Daca exista mai mult de 50 de caractere, in s[] vor fi citite ultimele 50 caractere din primul cuvint. => se citeste primul cuvant pana la aparitia unui character alb;

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++);

lista_variabile; (doar in 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;

Return 0; } >>> argv*+ = ,buna, Dan,V.,Ionescu-

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!]

S-ar putea să vă placă și