Sunteți pe pagina 1din 19

LABORATOR

1 Generalităţi. Noţiuni
primare C/C++
Sumar

 Introducere în programare
 Tipuri de fişiere în C/C++
 Erori de sintaxă şi erori logice într-un program
 Structura programelor C
 Vocabularul limbajului
 Operaţii de citire şi scriere de la consolă
 Variabile. Tipuri de date. Tipuri standard
 Constante
 Expresii. Operatori
 Aplicaţii rezolvate
 Aplicaţii propuse

1. Introducere în programare
Programele de calculator, cunoscute şi sub numele de componente soft, sunt
constituite dintr-o serie de instrucţiuni pe care le execută calculatorul. Când se creează un
program, trebuie specificate instrucţiunile pe care calculatorul trebuie să le execute pentru a
realiza operaţiile dorite.
Când se creează un program, instrucţiunile se păstrează într-un fişier ASCII la al cărui
nume este ataşată extensia, care implicită este .c, în cazul programelor realizate în limbajul C,
sau .cpp, în cazul programelor realizate în limbajul C++.
Instrucţiunile pe care le execută un calculator sunt de fapt grupuri de 1 şi 0 (cifre
binare) care reprezintă semnale electronice produse în interiorul calculatorului. Pentru a
programa primele calculatoare (în anii ‘40), programatorii trebuiau să înţeleagă modul în care
calculatorul interpreta diferitele combinaţii de 0 şi 1, deoarece programatorii scriau toate
programele folosind cifre binare. Cum programele deveneau din ce în ce mai mari, acest mod
de lucru a devenit foarte incomod pentru programatori. De aceea cercetătorii au creat limbaje
de programare care permit exprimarea instrucţiunilor calculatorului într-o formă mai
accesibilă omului.

1
Astfel că, după ce programatorii scriau instrucţiunile într-un fişier (numit fişier sursă),
un al doilea program (numit compilator), convertea instrucţiunile limbajului de programare
în şirurile de 0 şi 1 (cunoscute sub numele de cod maşină), pe care le putea înţelege
calculatorul. Fişierele rezultate, cu extensia .exe sau .com conţin codul maşină (şiruri de 0 şi
1) pe care calculatorul îl va executa. Figura de mai jos ilustrează procesul de compilare a unui
fişier sursă, în urma căruia se obţine un program executabil.

void main() 100011101101


{ 101110111101
…………… 110111101111
} 011110100100

nume_fisier.c (sau .cpp) compilator nume_fisier.exe

Figura de mai sus evidenţiază faptul că, un compilator converteşte instrucţiunile din cod sursă
în cod maşină.

2. Tipuri de fişiere în C/C++


Toate compilatoarele de C++ sunt şi compilatoare de C, dat fiind faptul că limbajul
C++ este privit ca un supraset al limbajului C. Însă, atunci când se compilează programe în C
trebuie să se reţină un lucru important: fişierele trebuie să aibă extensie .c nu .cpp. Chiar dacă
C este conţinut în C++, există câteva diferenţe minore între cele două limbaje din punctul de
vedere al limbajului C. Din acest motiv, programele în C trebuie compilate ca programe în C,
iar cele în C++, ca programe în C++.
Astfel că, atunci când se scrie un program în C sau C++, se plasează instrucţiunile într-
un fişier sursă care are după caz extensiile .c sau .cpp. Dacă programul se compilează cu
succes, compilatorul va crea un fişier executabil, cu extensia .exe.
Multe din programele realizate utilizează aşa numitele fişiere antet, sau fişiere
bibliotecă (acestea au extensia .h), care conţin instrucşiuni utilizate în mod curent. Acestea
sunt introduse prin intermediul unei directive (#include).
Dacă se va examina conţinutul directorului de lucru după ce s-a realizat şi compilat un
program, se va putea constata ca va exista unul sau mai multe fişiere cu extensia .obj. Aceste
fişiere, denumite fişiere obiect, conţin instrucţiuni sub formă de şiruri de 0 şi 1, pe care le
înţelege calculatorul. Totuşi, nu se pot executa aceste fişiere obiect, deoarece conţinutul lor nu
este chiar complet.

2
Compilatorul de C/C++ pune la dispoziţie rutine (cum ar fi printf), care realizează
operaţiile frecvent utilizate şi reduc numărul de instrucţiuni care trebuie introduse în program.
După ce compilatorul examinează sintaxa programului, el creează un fişier obiect. În cazul
programului nume_fis.c (sau, nume_fis.cpp), compilatorul va crea un fişier obiect denumit
nume_fis.obj. După aceea, un program denumit editor de legături alcătuieşte programul
executabil prin combinarea instrucţiunilor programului din fişierul obiect cu funcţiile pe care
le deţine compilatorul (cum ar fi printf, de exemplu). De cele mai multe ori, atunci când se
apelează compilatorul pentru a examina fişierul sursă, acesta va apela în mod automat editorul
de legături dacă programul s-a compilat cu succes. Figura următoare ilustrează procesul de
compilare şi de realizare a legăturilor unui program.

Scriere
nume_fis.c Rulare
(sau .cpp) nume_fis.exe DA

Compilare Cu DA Editare Cu
nume_fis.c succes? legături succes?
(sau .cpp) nume_fis.obj

NU

Editare NU

3. Erori de sintaxă şi erori logice într-un program


Fiecare limbaj de programare are un set de reguli, denumite reguli sintactice, care
trebuie respectate atunci când sunt introduse instrucţiunile în cadrul programului. Dacă este
încălcată o regulă sintactică, programul nu va fi compilat cu succes. Într-o astfel de situaţie,
compilatorul va afişa pe ecran mesaje de eroare ce precizează linia din program care conţine
eroarea, precum şi o scurtă descriere a acesteia.
Pe măsură ce programele scrise vor deveni mai complexe, pot apărea situaţii în care
programul se compilează cu succes, dar nu execută corect cerea dată de utilizator. Când
programul nu lucrează aşa cum doreşte programatorul, înseamnă că el conţine erori logice,
numite şi bugs. Când programele scrise conţin erori logice trebuie încercată descoperirea şi
corectarea cauzei erorii. Procesul de înlăturare a erorilor logice dintr-un program este numit
depanare.

3
4. Structura programelor C/C++
Limbajul C a apărut la începutul anilor 70 – creaţia lui Dennis Ritchie şi Brian
Kerninghan. Limbajul C este de fapt un subset al limbajului C++. Un program C este alcătuit
din una sau mai multe funcţii. O funcţie este o colecţie de instrucţiuni care execută o anumită
sarcină.
În linii mari, putem spune că:
 Fiecărui algoritm (subalgoritm) în C îi corespunde o funcţie care codifică algoritmul
(subalgoritmul) în instrucţiuni C.
 O funcţie poate întoarce sau nu un rezultat. Dacă aceasta nu întoarce nici un rezultat,

spunem că tipul rezultatului este void. Tot aşa, există funcţii cu rezultat de tip întreg, real,
etc.
 O funcţie poate conţine declaraţii de variabile, care pot fi utilizate doar de ea, nu şi de

celelalte funcţii.
 Programul C este alcătuit din una sau mai multe funcţii, din care una este rădăcină – adică

nu poate lipsi şi execuţia programului începe automat cu ea. Aceasta se numeşte main. De
asemenea, programul poate conţine şi declaraţii de variabile globale – adică variabile cu
care pot lucra toate funcţiile care îl alcătuiesc.

Să vedem cum arată cel mai simplu program C/C++:


void main ()
{
}
Programul de mai sus este corect. Cu toate acestea el nu face nici o operaţie. Dacă îl analizăm,
putem trage primele concluzii:
 Este alcătuit numai din funcţia rădăcină – main.
 Funcţia rădăcină este de tipul void – adică nu întoarce nici un rezultat.
 Cele două paranteze rotunde () se ataşează oricărei funcţii. Între ele se scriu opţional
anumiţi parametri. Un parametru este o informaţie pe care programul o transmite
funcţiei. După caz, prin intermediul parametrilor se poate face transferul şi invers, adică
dinspre funcţie spre exterior, dar, despre asta într-o lecţie ulterioară. În acest caz ei lipsesc.
 Cele două acolade {} constituie corpul funcţiei. Între ele se scriu instrucţiunile care o
alcătuiesc. În cazul de faţă mulţimea lor este vidă.

Observaţie 1: Limbajul face distincţie între literele mari şi cele mici. Programul de mai jos
dă eroare de sintaxă, pentru că tipul Void nu este cunoscut.

4
Void main ()
{
}
Observaţie 2: Nu are importanţă plasarea cuvintelor pe linie, nici spaţiile dintre ele.
Programul mai poate fi scris şi aşa:
void main ( ) { }
Aceasta nu înseamnă că este bine să procedăm astfel. El poate fi rulat, dar este greu de înţeles.

Observaţie 3: Este permis ca tipul funcţiei să lipsească. În acest caz se presupune că funcţia
întoarce un rezultat întreg (de tipul int). De exemplu putem scrie aşa:
main()
{
}
În acest caz, la compilare se primeşte un avertisment. De vreme ce tipul este int, se
aşteaptă ca funcţia să întoarcă un rezultat de acest tip. Dar, ea nu întoarce nimic. Acest
avertisment poate fi ignorat.

5. Vocabularul limbajului
Vocabularul oricărui limbaj este format din:
 setul de caractere;
 identificatori;
 separatori;
 comentarii.
Setul de caractere. Reprezintă ansamblul de caractere cu ajutorul cărora se poate scrie
un program C/C++:
- literele mari şi mici ale alfabetului englez (A – Z, a - z);
- cifrele sistemului de numeraţie în baza 10 (0 - 9);
- caractere speciale: +, –, *, /, =, ^, <, >, (, ), [, ], {, }, ., ,, :, ;, #, $, @, _, şi blank (spatiu)
Identificatori. Prin identificatori înţelegem o succesiune de litere, cifre sau caracterul
special ‘_’ din care prima nu trebuie să fie cifră. Cu ajutorul identificatorilor se asociază nume
constantelor, variabilelor, procedurilor, etc.
Exemple de identificatori: a1, tasta, un_numar, _variabila.
Contraexemple: 1ar, mt@ (primul începe cu o cifră, iar al doilea conţine un caracter
special).
Separatori şi comentarii. Separatorii sunt, după caz unul sau mai multe blancuri,
caracterul CR, sfârşitul de linie sau caraterul ‘;’. Comentariile se introduc între caracterele ‘/*’

5
si ‘*/’ pentru mai multe linii ale textului sursă, respectiv ‘//’ ptr. o sigură linie de comentarii
ale textului sursă.

6. Citiri. Scrieri
Funcţiile printf() şi scanf() efectuează ieşiri, respectiv intrări formatate – ele pot
scrie, respectiv citi date în diverse formate. Ambele funcţii ştiu să lucreze cu orice cu orice tip
de date existent, inclusiv caractere, şiruri şi numere. Prototipurile lor sunt:
printf(<format>[,<parametri>]);
scanf(<format>[,<parametri>]);

Pentru a putea efectua citiri/scrieri trebuie utilizată directiva:


#include<stdio.h>
deoarece, pentru a utiliza funcţiile cerute, compilatorul are nevoie de anumite informaţii
referitoare le ele. Acestea se găsesc într-un fişier header (antet) numit stdio.h. prin directiva
#include se solicită ca fişierul stdio.h să fie inclus înaintea textului care reprezintă
programul C.

Specificatorii de format printf()

Cod Format
%c Caracter
%d Nr. întregi în baza 10 cu semn
%i Nr. întregi în baza 10 cu semn
%e Notaţie ştiinţifică (cu litera e mică)
%E Notaţie ştiinţifică (cu litera E mare)
%f Nr. zecimal în virgulă mobilă
%g Foloseşte %e sau %f (care din ele este mai mic)
%G Foloseşte %E sau %F (care din ele este mai mic)
%o Număr în octal fără semn
%s Şir de caractere
%u Numere întregi zecimale fără semn
%x Nr. hexazecimale fără semn (cu litere mici)
%X Nr. hexazecimale fără semn (cu litere mari)
%p Afişează un pointer
%n Argumentul asociat este un pointer de tip întreg în
care a fost plasat numărul de caractere scrise până
atunci
%% Afişează un semn %

De exemplu, ptr. a afişa un număr întreg reţinut într-o variabilă n se foloseşte următoarea
apelare a funcţiei printf():
printf(“%d”, n);

Specificatorii de format pentru scanf()

Cod Semnificaţie
%c Citeşte un singur caracter

6
%d Citeşte un număr întreg zecimal
%i Citeşte un număr întreg zecimal
%e Citeşte un număr în virgulă mobilă
%f Citeşte un număr în virgulă mobilă
%g Citeşte un număr în virgulă mobilă
%o Citeşte un număr în octal
%s Citeşte un şir
%x Citeşte un număr în hexazecimal
%p Citeşte un pointer
%n Primeşte o valoare egală cu numărul de caractere
citite până atunci
%u Citeşte un număr întreg fără semn
%[ ] Caută un set de caractere

Observaţie: Toate variabilele folosite pentru a primi valori prin scanf() trebuie să fie
transmise prin adresele lor. Aceasta înseamnă că toate argumentele trebuie să fie pointeri la
variabilele care primesc efectiv intrările. De exemplu, pentru a citi un întreg într-o variabilă n
se foloseşte următoarea apelare a funcţiei scanf():
scanf(“%d”, &n);

7. Variabile. Tipuri de date, tipuri standard

O variabilă este un nume pe care compilatorul de C/C++ îl asociază cu una sau mai
multe locaţii de memorie. Atunci când se declară o variabilă într-un program, trebuie să se
specifice tipul şi numele ei. Tipul unei variabile specifică genul de valori pe care variabila le
poate păstra şi setul de operaţii pe care programul le poate executa asupra datelor. Limbajul
C/C++ foloseşte doar tipuri de date numerice, care pot fi întregi sau reale.

Observaţie 1: În C nu există tipul logic de date, astfel încât, orice valoare diferită de 0, a
oricărui tip, este considerată ca fiind TRUE, iar orice valoare 0, a oricărui tip, este considerată
ca fiind FALSE.
Observaţie 2: În C tipul caracter este asimilat tipurilor întregi.

În C există cinci tipuri de bază: char (prin intermediul căruia se pot memora valori
ce reprezintă caractere, din tabloul codurilor ASCII), int (întreg), float (în virgulă
mobilă), double (în virgulă mobilă cu dublă precizie) şi void (fără nici o valoare). Mai jos
este prezentat tabelul cu totalitatea tipurilor definite în C/C++.
Tipurile de date definite pentru standardul C/C++
Tip Dimensiune aproximativă in biţi Domeniu minimal de valori
char 8 de la –128 la 127
unsigned char 8 de la 0 la 255

7
signed char 8 de la –127 la 127
int 16 de la –32767 la 32767
unsigned int 16 de la 0 la 65535
signed int 16 similar cu int
short int 16 similar cu int
unsigned short int 16 de la 0 la 65535
signed short int 16 similar cu short int
long int 32 de la –2.147.483.647 la
2.147.483.647
signed long int 32 similar cu long int
unsigned long int 32 de la 0 la 4.294.967.295
float 32 şase zecimale exacte
double 64 zece zecimale exacte
long double 80 zece zecimale exacte

8. Constante
Există mai multe tipuri de constante:
1. Constante întregi:
 zecimale: 23, 1239, 56.
 octale (în baza 8) – o constantă în baza 8 se declară percedată de un 0 nesemnificativ:
0123 – reţine numărul 123(8)
 hexazecimale (în baza 16) – acestea sunt precedate de 0X sau 0x: 0X1A2 sau 0x1a2 –
reţine numărul 1A2(16)
2. Constante caracter:
Acestea se trec între două caractere apostrof (‘). Exemple ar fi: ‘a’, ‘A’, ‘1’. Memorarea
lor se face utilizând tipul char. Se memorează codul ASCII al caracterului respectiv. De
exemplu, pentru ‘1’ – 49(10), respectiv pentru ‘a’ – 97(10).
3. Constante de tip backslash caracter (sub forma de secvenţă escape):
C admite mai multe coduri backslash speciale a.i. să se poată introduce caracterele respective
ca pe nişte constante.
Coduri backslash
Codul Semnificaţia
\b backspace
\f avans hârtie
\n rând nou
\t spaţiu de tabulare orizontal
\” ghilimele duble
\’ ghilimele simple
\0 nul
\\ backslash (linie înclinata spre stânga)
\v spaţiu de tabulare vertical
\a alertă
\N constantă în octal (unde N este constanta în
octal)

8
\xN constantă în hexazecimal (unde N este o
constantă în hexazecimal)

Exemplu 1: Să se scrie un program care care emite o linie nouă şi un spaţiu de tabulare şi
apoi afişează şirul Acesta este un text.

#include<stdio.h>
void main ()
{
printf("\n\tAcesta este un text");
}

Exemplul 2: Programul de mai jos tipăreşte din mai multe ipostaze caracterul a.

#include<stdio.h>
void main(void)
{
printf("zec=%d, oct=%o, hexa=%x\n",'a','a','a');

printf("%c %c %c %c %c %c\n",'a',97,0141,0x61,'\141','\x61');
}

4. Constante reale:
Exemple: -45.66, 0.3, -2.5E-12(adică, -2.5*10-12)
5. Constante şir de caractere:
Acestea se declară între două caractere ”.
Exemplu: “acesta este un text”.

9. Declaraţii de tip constantă


Pentru a da un nume constantelor se foloseşte const. Forma generală a unei astfel de
declaraţii este:
const [tip] nume=valoare;
unde:
 tip – reprezintă tipul constantei (dacă este absent, tipul este int);
 nume – reprezintă numele constantei;
 valoare – reprezintă valoarea constantei.
Exemple:
 const int numar=10;
 const numar=10; //la fel ca mai sus
 const float pi=3.14;
Să analizăm ultimul exemplu: dacă const ar fi lipsit am fi avut: float pi=3.14; adică,
am fi declarat o variabilă de tip float iniţializată cu valoarea 3.14. Prezenţa modificatorului

9
const determină protecţia la modificare a variabilei pi. Cu alte cuvinte, pi este o variabilă
de tip “citeşte numai” (are spaţiu rezervat, reţine o valoare care nu poate fi modificată).

10. Expresii. Operatori


Definiţie: Se numeşte expresie o succesiune de operatori şi operanzi legaţi între ei, după
reguli specifice limbajului, în scopul efectuării unor operaţii (calcule, atribuiri, apelări de
funcţii etc.). Operanzii pot fi: constante, variabile, funcţii.
Precedenţa operatorilor (în ordine descrescătoare)
() [] . ->
++ -- + - * & ! ~ sizeof
* / %
+ -
>> <<
== !=
&
^
|
&&
||
?:
= += -== *= /=
,

1. Operatori aritmetici:
În C există următorii operatori aritmetici:
-, + (unare si binare), *, /, % (unare si binare)
2. Operatori relaţionali:
<, >, <=, >=.
În C nu există valorile logice TRUE şi FALSE, rezultatul unei operaţii logice fiind 1, în cazul
în care inegalitatea este respectată şi 0 în caz contrar.
3. Operatori de egalitate:
== (pentru egalitate), != (pentru inegalitate).
Ca şi operatorii relaţionali, expresiile de acest tip returnează 0 sau 1 – în funcţie de modul în
care este respectată sau nu egalitatea (inegalitatea). Operanzii pot fi constante, variabile,
funcţii.
4. Operatori de incrementare şi decrementare:
Aceşti operatori sunt unari şi au rolul de incrementa (adună 1) sau decrementa (scad 1).
Operatorii sunt:
 ++ pentru incrementare;
 -- pentru decrementare.
Operatorii pot fi prefixaţi (aplicaţi în faţa oparandului) sau postfixaţi (aplicaţi după

10
operand). Să ne gândim că pot fi expresii care conţin şi alţi operatori în afara celor de
incrementare (decrementare).
 Dacă operatorul este prefixat, variabila este incrementată (decrementată) înainte ca
valoarea reţinută de ea să intre în calcul.
 Dacă operatorul este postfixat, variabila este incrementată (decrementată) după ce
valoarea reţinută de ea intră în calcul.
5. Operatori logici:
! negare logică
&& şi logic
|| sau logic
Aceşti operatori se aplică oricărei variabile şi constante sau expresii din cele mai sus
menţionate.
6. Operatori logici pe biţi:
Limbajul C este dotat cu un set de operatori care permit accesul la bit. Aceştia sunt:
<<, >> operatori de deplasare către stânga/dreapta conţinutul tuturor biţilor din
stânga sa, cu un număr de poziţii egal cu valoarea reţinută de al doilea operand;
& şi pe biţi
| sau pe biţi
^ sau exclusiv pe biţi
~ negare pe biţi (operator unar).

7. Operatori de atribuire:
În C avem mai mulţi operatori de atribuire. Operatorul ‘=’se foloseşte într-o expresie de
forma:
v=expresie ,unde v este o variabilă.
Pot exista şi atribuiri multiple de forma:
v=v1=v2=v3=…..=vn=expresie ,unde v,v1,v2,…vn sunt variabile.
Pentru atribuiri se mai pot utiliza şi operatorii: *=, /=, %=, +=, -=, <<=, >>=, &=,
^=, |=.
Exemplu: Fie declaraţia int a=3; şi expresia a*=2. În urma evaluării a va reţine valoarea 6.

8. Operatorul condiţional:
Se foloseşte în expresii de genul:

11
exp1?exp2:exp3
principiul de execuţie este următorul:
 se evaluează exp1
 dacă aceasta produce o valoare diferită de 0, se evalueză exp2 şi este exp3 ignorată (nu se
evaluează);
 altfel, se evaluează exp3 şi exp2 este ignorată.
În ansamblu, expresia este de tipul lui exp2 sau exp3 şi produce valoarea exp2 sau exp3
(în funţie de cea care se evaluează).

9. Operatorul sizeof
Are rolul de a returna numărul de octeţi pentru memorarea unei valori. Operatorul poate fi
utilizat într-una din cele două forme de mai jos:
sizeof (expresie)
siteof (tip)
Este de reţinut faptul că expresia nu este evaluată (deci nu apar efecte secundare).
Exemple:
 fie declaraţia int a; sizeof(a)=2 (adică, tipul int ocupă 2 octeţi)
 sizeof(float)=4
 sizeof(++x)=4 (dacă x este de tip float, dar x rămâne nemodificat – expresia ++x nu
a fost evaluată).

10. Operatorul de conversie explicită:


De multe ori, se doreşte ca unul sau mai mulţi operanzi să intre în calcul convertiţi într-o
formă dorită, nu implicit. Pentru aceasta, înaintea operandului se trece între paranteze rotunde
tipul său.
Exemple:
 Fie declaraţia float x=-1.9; Atunci (int)x=-1 (se face conversia din tipul float
în int prin trunchiere);
 În aceleaşi condiţii (int)(++x+3)=2 adică, (x=-1.9, ++x=0.9, ++x+3=2.9,
int(2.9)=2;);

 Fie declaraţiile: int a=3, b=6; Atunci (float)a/b=0.5 .

12
11. Aplicaţii rezolvate

Aplicaţia 1: Să se calculeze suma a două numere întregi, prin mai multe variante.

a) Se dau două valori direct în program memorate la două locaţii de memorie


şi se va calcula suma lor.

#include<stdio.h>

void main()
{
int a=1,b=2,c;

c=a+b;
printf("Suma este: %d\n",c);
}

b) Se citesc două numere de la tastatură, şi se afişează suma lor.

#include<stdio.h>

void main()
{
int a,b;
printf("dati a: "); scanf("%d",&a);
printf("dati b: "); scanf("%d",&b);

printf("Suma este: %d\n",a+b);


}

c) Rezultatul este reţinut prin intermediul unei variabile.

#include<stdio.h>

void main()
{
int a,b;
printf("dati a: "); scanf("%d",&a);
printf("dati b: "); scanf("%d",&b);

int c;
c=a+b;

printf("Suma este: %d\n",c);


}

d) Se va scrie o funcţie de sumare a două numere întregi.

#include<stdio.h>

int suma(int x,int y)


{
int s;
s=x+y;

13
return s;
}

void main()
{
int a,b;
printf("dati a: "); scanf("%d",&a);
printf("dati b: "); scanf("%d",&b);

int c;
c=suma(a,b);

printf("Suma este: %d\n",c);


}

e) Acelaşi efect, dar funcţia va în toarce rezultatul prin linia de


parametri.

#include<stdio.h>

void suma(int x,int y,int* s)


{
*s=x+y;
}

void main()
{
int a,b;
printf("dati a: "); scanf("%d",&a);
printf("dati b: "); scanf("%d",&b);

int c=0;
suma(a,b,&c);

printf("Suma este: %d\n",c);


}

f) Se va calcula şi media aritmetică a celor două numere întregi.

#include<stdio.h>

void main()
{
int a,b;
printf("dati a: "); scanf("%d",&a);
printf("dati b: "); scanf("%d",&b);

int s=a+b;
float m=(float)s/2; //ar fi mers si declaratia float m=s/2.;
/* operatia anterioara trebuie facuta datorita faptului ca impartirea a
doua numere intregi va rezulta catul impartirii, adica tot un numar intreg,
de aceea unul dintre membrii trebuie convertit spre un tip real */

printf("Suma este: %d\n",s);


printf("Media este: %.2f\n",m);
}

Aplicaţia 2. Să se scrie din mai multe ipostaze textul ”Salut C!”.

14
a) Să se scrie o rutină afişează textul: "Salut C!".

#include<stdio.h>

void main()
{
printf("Salut C!");
}

b) Să se modifice programul anterior astfel încât mesajul de afişat să fie


transmis prin intermediul unei variabile de un tip corect adaptat.

#include<stdio.h>

void main()
{
char a[]="salut C!";
printf("%s",a);
}

c) Acelaşi efect, un alt tip de memorare.


#include<stdio.h>

void main()
{
char* a="Salut C!";
printf("%s",a);
}

d) Să se modifice programul anterior astfel încât afişarea să se realizeze


prin intermediul unei funcţii definite de utilizator.

#include<stdio.h>

void afiseaza()
{
printf("Salut C!");
}

void main()
{
afiseaza();
}

e) Funcţia va fi una universală, cu posibilitatea transmiterii şirului prin


parametru.

#include<stdio.h>

void afiseaza(char a[])


{
printf("%s",a);
}

void main()
{
afiseaza("Salut C!");
}

15
f) Acelaşi efect, alt tip de scriere.

#include<stdio.h>

void afiseaza(char* a)
{
printf("%s",a);
}

void main()
{
afiseaza("Salut C!");
}

g) Şirul dorit se introduce de la tastatură, după care se afişează pe


ecran.

#include<stdio.h>

void main()
{
char* a;
printf("Introduceti de mana sirul <Salut C!>: ");
scanf("%s",a);
printf(a);
}

h) Varianta de mai sus nu corespunde, aşa că aratăm varianta corectă.

#include<stdio.h>

void main()
{
char* a;
printf("Introduceti de mana sirul <Salut C!>: ");
gets(a);
printf(a);
}

Aplicaţia 3: Să se calculeze puterea a n-a a lui 2, unde n este un întreg citit de la tastatură.
/*Acest exemplu il putem folosind unul dintre operatorii speciali pe care ii are C-ul si anume, operatorul de
deplasare pe biti spre stanga <<. Fie x un numar intreg. Prin x<<1 intelegem deplasarea spre stanga a bitilor
din reprezentarea pe biti (in baza 2) a lui x, completandu-se cu 0 in dreapta. Astfel, de exemplu, daca x=5,
adica 101,atunci deplasarea pe spre stanga va duce la obtinerea numarului x=10, adica 1010. De fapt, o
deplasare spre stanga cu o unitate reprezinta o inmultire a lui x cu 2. O deplasare spre stanga cu p pozitii a
lui x reprezinta o inmultire a lui x cu 2 de p ori. Folosind aceste artificiu se poate calcula puterea lui 2 a unui
numar dat.*/
#include<stdio.h>
void main()
{
int n,m=1;//aici se declara atat variabila n, cat si m care se initializeaza cu 1
printf("Dati n:");
scanf("%d",&n);
printf("2^%d=%d\n",n,m=(m<<n));
}

16
/*Al doilea apel al functiei printf are un element de afisare a valorii expresiei m=(m<<n). Valoarea unei
expresii de forma m=e, care este si instructiune de atribuire, este tocmai valoarea expresiei e. Astfel, cand
scriem m=(m<<n), inseamna ca m este shiftat spre stanga cu n pozitii, deci m, initial 1, devine egal cu puterea
n a lui 2. Aceasta este si valoarea expresiei m=(m<<n), care va fi afisata.*/

Aplicaţia 4: Se citeste un număr zecimal si unul in hexa de cel mult 4 cifre fiecare şi se cere
să se afişeze valorile respective în sistemele de numerotaţie cu baza 10, 8, şi 16.
#include<stdio.h>
void main ()
{
unsigned int i,h;
printf("Dati nr. intreg zecimal: ");
scanf("%d",&i);
printf("Dati nr. intreg hexazecimal: ");
scanf("%x",&h);
printf("\nnr. zec:\tBaza 10: %u\tBaza 8: %o\tBaza 16: %x",i,i,i);
printf("\nnr. hex:\tBaza 10: %u\tBaza 8: %#o\tBaza 16: %#X",h,h,h);
//# este folosit ptr. afisarea unui prefix (0 sau 0x) inaintea valorilor octale, respectiv hexazecimale
}

Aplicaţia 5: Să se realizeze un program care să determine numărul de caractere afişate de


”printf” folosind cunoştinţele acumulate.
#include<stdio.h>
void main (void)
{
int nr1,nr2;
printf("Acesta%n este un text.%n\n", &nr1,&nr2);/*specificatorul de format %n se
foloseste atunci cand apar situatii in care se doreste a se cunoaste numarul de caractere pe care le-a afisat
functia printf. La folosirea lui %n printf va tribui unei variabile (in urma unui transfer
printr-un pointer) suma totala a caracterelor pe care le-a fisat*/
printf("%10d %d",nr1,nr2);//primul nr. se scrie cu o spatiere de 10
}

Aplicatia 6: Să se realizeze o rutină care foloseşte incrementarea (decrementarea) post şi


prefixată.
#include<stdio.h>
void main()
{
int val=1;
printf("Utilizare postfix %d\n",val++); //1
printf("Valoarea dupa incrementare %d\n",val); //2

val=1;
printf("Utilizare prefix %d\n",++val); //2
printf("Valoarea dupa incrementare %d\n",val); //2

val=1;
printf("Utilizare postfix %d\n",val--); //1
printf("Valoarea dupa decrementare %d\n",val); //0

val=1;
printf("Utilizare prefix %d\n",--val); //0

17
printf("Valoarea dupa decrementare %d\n",val); //0
}

Aplicatia 7: Să se realizeze o rutină care execută lucrul pe biţi.


#include<stdio.h>
void main()
{
unsigned int a=5;
const int b=7;
printf("%d <sau pe biti> %d este %d\n",a,b,a|b);
printf("%d <si pe biti> %d este %d\n",a,b,a&b);
printf("%d <sau exclusiv pe biti> %d este %d\n",a,b,a^b);
printf("5 <complementat pe biti> este %u variabila fiind pe %u
octeti\n",~a,sizeof(a));
}

Aplicatia 8: Să se scrie un program care citeşte valoarea lui x, pozitiv, afişează valorile lui
x, [x], {x}, calculează şi afişează valoarea următoarei expresii: 5*x*[x]-3*{x}+15.
#include<stdio.h>
void main()
{
double x;
int y; //pentru partea intreaga
double z; //pentru partea zecimala

scanf("%lf",&x);

printf("x= %g\t",x);
printf("[x]= %d\t",y=x);
printf("{x}= %f\n",z=x-y);

printf("e= %g\n",5*x*y-3*z+15);
}

Aplicatia 9: Să se determine maximul şi minimul a două numere întregi, folosind


cunoştinţele din acest laborator.
#define max(x,y) x>y?x:y
#define min(x,y) x<y?x:y
#include<stdio.h>
void main()
{
int x,y;
printf("Dati x si y : ");
scanf("%d %d",&x,&y);
printf("\n\tMaximul este: %d",max(x,y));
printf("\n\tMinimul este: %d",min(x,y));
}
/* În programul de mai sus am definit două macrouri ptr. minim şi maxim. Aceste macroinstrucţiuni oferă
posibilitatea de a defini constantele pe care procesorul le substituie în tot programul înainte să înceapă
compilarea. În plus, macroinstrucţiunile permit crearea unor operaţii asemănătoare funcţiilor, care lucrează
cu parametri. Parametrii sunt valori care trebuie transmise macroinstrucţiunii.*/

18
Aplicatia 10: Se dau trei numere reale a,b,c. Pot reprezenta ele lungimile laturilor unui
triunghi?
#define si &&
#define adevarat ?
#define altfel :
#define afiseaza printf
#define citeste scanf
#define reale float
#include<stdio.h>
void main()
{
reale a,b,c;
afiseaza("Dati lungimile laturilor:\n");
citeste("%f %f %f",&a,&b,&c);
(a>=0) si (b>=0) si (c>=0) si (a<b+c) si (b<a+c) si (c<a+b)
adevarat afiseaza("\t%4.2f, %4.2f si %4.2f formeaza triunghi.",a,b,c)
altfel afiseaza("\tNu formeaza triunghi.")
}

12. Aplicaţii propuse

1. Să se scrie un program care citeşte pe n de tip întreg şi afişează valoarea expresiei


n/(n+1) cu 15 zecimale.
2. Să se determine maximul şi minimul a două numere întregi, folosind macrouri şi
cunoştinţele din acest laborator.
3. Să se scrie un program care să calculeze numărul de picioare dintr-o curte, în care se
află g găini, p pisici şi un om.
4. Folosind operatorul condiţional să se verifice dacă un număr real x se află în intervalul
[a,b), unde a şi b sunt date de la tastatură.
5. Să se scrie un program care citeşte valoarea variabilei x şi afişează valoarea funcţiei
f(x) definită ca mai jos:
| 3x*x+7x-10 pentru x<0
f(x) = | 2 pentru x=0
| 4x*x pentru x>0
6. Să se îmbunătăţească exemplul 7 astfel încât să se poată introduce şi numere negative.
Se vor folosi doar cunoştinţele acestui laborator.

19

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