CATEGORII DOCUMENTE |
Introducere in limbajul C
Obiectivele lucrarii:
1. Introducere in limbajul C
Limbajul de progamare C a fost creat in anii '70 de catre Dennis Ritchie in cadrul firmei Bell Telephone Laboratories (Bell Labs), avand ca obiectiv principal dezvoltarea unui limbaj care sa fie utilizat pentru implementarea sistemului de operare UNIX. La vremea respectiva, existau limbaje de programare de nivel scazut (apropiate de nivelul limbajului masina al procesorului), precum si limbaje specializate de nivel inalt (FORTRAN, COBOL). Cele de nivel scazut erau adecvate pentru dezvoltarea de sisteme de operare deoarece permiteau acces direct la resursele procesorului dar aveau dezavantajul unei productivitati extrem de scazute a programatorului. Cele de nivel inalt permiteau dezvoltarea mai usoara de aplicatii specializate, dar ridicau numeroase probleme din punct de vedere al performantelor de executie a programelor. Acesta este motivul pentru care s-a cautat o cale de mijloc: dezvoltarea unui limbaj de programare de uz general, cu caracteristici de nivel inalt pentru imbunatatirea productivitatii programatorilor, dar care, la nevoie, sa permita acces direct la resursele hardware ale sistemului de calcul, pentru a permite optimizarea foarte riguroasa din punct de vedere al vitezei de executie a aplicatiilor unde acest criteriu este dominant. Astfel a luat nastere limbajul C, un limbaj de nivel mediu, care pastreaza caracteristicile limbajelor de nivel inalt din care a fost derivat (B si BCPL), dar care reflecta foarte bine realitatile hardware: acces direct la adrese de memorie, operatii la nivel de bit, accesul resurselor procesorului (registri), apel direct al functiilor puse la dispozitie de sistemul de operare.
Facand referire la clasificarile limbajelor de programare prezentate in laboratorul 1, limbajul C este un limbaj de nivel mediu, structurat, tipizat si compilat.
Fiind un limbaj structurat, limbajul C permite crearea de secvente de instructiuni reunite sub un anumit nume, care efectueaza o anumita operatie clar definita si returneaza un rezultat. Aceste secvente de instructiuni se numesc functii. Odata creata o functie, ea poate fi referita (apelata) de oricate ori este necesar, pe baza numelui acesteia. Spre deosebire de alte limbaje de programare insa, in C toate instructiunile trebuie sa apara numai in cadrul unor functii. Pe langa posibilitatea de a returna un rezultat, o functie are si posibilitatea de a primi anumiti parametri asupra carora sa efectueze prelucrarile.
Orice program in limbajul C trebuie sa contina obligatoriu o functie cu un rol special, functia cu numele main. Aceasta este functia de la care incepe executia programului in momentul lansarii acestuia de catre sistemul de operare.
In contiunare este prezentat un exemplu de program care nu efectueaza nici o operatie, dar care respecta structura de baza pentru orice program C:
void main (void)
Prima linie din program declara o functie cu numele main, care nu returneaza nici un rezultat (cuvantul void dinainte de numele functiei) si nu primeste nici un parametru (cuvantul void de dupa numele functiei). Simbolul '' marcheaza finalul functiei. Instructiunile care formeaza corpul functiei trebuie scrise intre ''.
Urmatorul exemplu de program afiseaza un mesaj ('Hello World') pe ecran:
#include <stdio.h>
void main (void)
Se observa ca si acest program contine o functie main, dar in corpul functiei este apelata functia printf () pentru afisarea unui mesaj. In C, orice instructiune executabila (cum e cazul apelului la printf) trebuie urmata de ';'. Functia printf este o functie din biblioteca standard pentru intrari si iesiri a limbajului C, de aceea prima linie de program contine acum o directiva preprocesor, #include <stdio.h>, necesara pentru a putea apela functii din acea biblioteca.
Alta observatie legata de acest program ar fi prezenta unui comentariu in interiorul functiei main:
/* apelam functia printf pentru afisare pe ecran */
In limbajul C, comentariile sunt texte precedate de secventa ' /* ' si care se incheie cu ' */ '. Comentariile sunt ignorate in totalitate de catre compilator.
2. Prezentarea mediului de programare Borland C++ 3.1
Un mediu de programare consta dintr-un pachet de programe menite sa ajute munca programatorilor intr-un anumit limbaj de programare. In majoritatea cazurilor, un mediu de programare ofera urmatoarele facilitati:
- un compilator pentru acel limbaj de programare
- o biblioteca de functii reutilizabile utile programatorilor
- posibilitatea de a lucra cu proiecte complexe alcatuite din mai multe fisiere sursa, eventual la care lucreaza mai multi programatori
- un editor de texte specializat pentru programatori cu evidentierea sintaxei limbajului de programare
- instrumente pentru a facilita depanarea programelor
- documentatie on-line (help) despre mediul de programare, despre sintaxa si functiile din bibliotecile standard ale limbajului respectiv
Borland C++ 3.1 este un mediu de programare care indeplineste toate conditiile de mai sus si care permite dezvoltarea de proiecte complexe in limbajele C si C++.
Interfata acestuia cu utilizatorul este prezentata in imaginea urmatoare:
Principalele comenzi si combinatiile de taste pentru efectuarea acestora sunt urmatoarele:
- deschiderea unui fisier existent: File -> Open (F3)
- salvarea fisierului curent: File -> Save (F2)
- compilarea fisierului curent: Compile -> Compile (Alt + F9)
- rularea programului curent: Run -> Run (Ctrl + F9)
- accesarea documentatiei on-line despre mediul de programare: F1
- accesarea cuprinsului documentatiei on-line: Shift + F1
- accesarea documentatiei despre cuvantul sub care se afla cursorul intr-o fereastra de editare: Ctrl + F1
- revenirea la ultima pagina de documentatie deschisa: Alt + F1
- comutarea intre ecranul cu mesajele afisate de program si ecranul mediului de programare: Alt + F5
Mediul de programare permite lucrul cu mai multe fisiere sursa simultan, fiecare deschis intr-o fereastra proprie:
- comutarea intre ferestre se realizeaza cu tasta F6 sau cu Alt + [numarul ferestrei], afisat in partea dreapta sus a fiecarei ferestre
- inchiderea ferestrei active se face cu combinatia Alt + F3
- lista cu toate ferestrele deschise se obtine cu combinatia Alt + 0
Exercitiu: scrieti si rulati cele doua exemple de mai sus in mediul de programare Borland C++ 3.1.
3. Notiuni de programare in limbajul C
Orice program, indiferent de limbajul de programare in care este scris, preia un set de date de intrare, efectueaza anumite prelucrari asupra acestora, si genereaza niste rezultate (date de iesire). In general, aceste prelucrari necesita insa memorarea temporara a unor rezultate intermediare. Pentru memorarea datelor de intrare, a rezultatelor intermediare si a datelor de iesire, limbajul de programare trebuie sa permita declararea si utilizarea unor variabile. O variabila reprezinta o zona de memorie rezervata care se acceseaza printr-un nume asociat, si care poate contine informatii de un anumit tip indicat in momentul declararii variabilei (operatiune care are ca efect si rezervarea memoriei). In general, continutul unei variabile se poate citi si scrie. O variabila poate servi ca sursa de informatii pentru diverse operatii sau ca destinatie a rezultatului altor operatii efectuate de program asupra datelor. In limbajul C, o variabila se declara in felul urmator:
tip_date nume_variabila;
tip_date reprezinta tipul de informatii care se vor memora in acea variabila si este folosit de compilator in doua scopuri principale:
- determinarea dimensiunii in octeti a zonei de memorie care trebuie rezervata pentru acea variabila
- verificarea corectitudinii operatiilor care implica acea variabila (spre exemplu, daca declaram o variabila care sa contina numere intregi, compilatorul ne va semnala eroare daca incercam sa depozitam in acea variabila un sir de caractere).
In limbajul C, exista urmatoarele tipuri de date predefinite:
Tip |
Dimensiune |
Domeniu de valori |
unsigned char |
8 biti |
0 255 |
char |
8 biti |
-128 127 |
enum |
16 biti |
-32,768 32,767 |
unsigned int |
16 biti |
0 65,535 |
short int |
16 biti |
-32,768 32,767 |
int |
16 biti |
-32,768 32,767 |
unsigned long |
32 biti |
0 4,294,967,295 |
long |
32 biti |
-2,147,483,648 2,147,483,647 |
float |
32 biti |
3.4 * (10^-38) 3.4 * (10^38) |
double |
64 biti |
1.7 * (10^-308) 1.7 * (10^308) |
long double |
80 biti |
3.4 * (10^-4932) 1.1 * (10^4932) |
nume_variabila reprezinta numele simbolic prin care va fi accesata acea zona de memorare. Numele unei variabile sau al unei functii in C trebuie sa fie un identificator valid:
- poate sa inceapa numai cu o litera sau cu caracterul _ (underscore)
- dupa primul caracter, poate sa contina numai litere, cifre sau _ (underscore)
- nu poate sa fie unul dintre cuvintele cheie rezervate ale limbajului:
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef typeid union unsigned using void volatile while
In C, variabilele se pot declara in doua locuri:
- in interiorul unei functii, caz in care ele devin variabile locale si sunt accesibile doar din acea functie; la incheierea executiei functiei variabilele se distrug automat
- in afara oricarei functii, caz in care ele devin variabile globale si sunt accesibile din orice functie
Limbajul C este case-sensitive, adica face distinctie intre literele mici si literele mari. Urmatorii identificatori sunt considerati diferiti:
Var1
var1
VAR1
O variabila poate fi initializata cu o anumita valoare in momentul declararii, cu sintaxa:
tip_date nume_var = valoare_initiala;
int a = 10;
char c = 'A';
In limbajul C, constantele numerice intregi se pot scrie in urmatoarele moduri:
- direct in forma zecimala (baza 10), daca nu sunt precedate de cifra 0: 1, 123
- in baza 16 (hexazecimala), precedate de 0x: 0x1A, 0xFFFF
- in baza 8 (octal), precedate de cifra 0: 017, 077
Constantele reale se introduc in forma zecimala sau notatia exponentiala: 123.1, 127.5E-4
Constantele de tip caracter sunt incluse intre doua simboluri apostrof: 'A', ':'.
Constantele de tip sir de caractere sunt incluse intre doua ghilimele: 'sirul'.
In cadrul constantelor de tip caracter sau sir de caractere, se pot introduce si caractere speciale de control, daca sunt precedate de caracterul backslash:
n - are ca efect salt la linie noua cand este afisat
t - caracterul tab, 8 spatii
r - revenire la inceputul liniei curente
- genereaza caracterul (backslash)
xNN - genereaza caracterul ASCII cu codul NN (specificat in baza 16)
' - genereaza caracterul ', folosit in cadrul constantelor de tip sir
Dupa cum s-a vazut in al doilea exemplu, functia printf se utilizeaza pentru afisarea unor mesaje pe ecran. Functia permite si afisarea continutului unor variabile, dupa cum rezulta din exemplul urmator:
#include <stdio.h>
void main (void)
Acest program declara o variabila v de tip intreg, initializata cu valoarea 10 si afiseaza continutul acestei variabile. In urma executiei, programul afiseaza urmatorul mesaj:
Valoarea variabilei este 10
Functia printf se poate apela cu un numar variabil de parametri, dar primul parametru nu poate fi omis si trebuie sa fie un sir de caractere, numit sir de formatare. Urmatorii parametri pot fi variabile de orice tip predefinit. In cadrul sirului de formatare se poate solicita afisarea continutului unei variabile utilizand caracterul % urmat de un alt caracter, numit caracter de tip, care indica modul de afisare al continutului variabilei. Variabilele sunt considerate in ordinea in care apar in lista de parametri, de la stanga la dreapta. Continutul variabilei este introdus in sirul care se afiseaza pe pozitia pe care apare caracterul % in sirul de formatare.
Valorile cele mai frecvent utilizate pentru caracterele de formatare sunt urmatoarele:
Secventa de formatare |
Efect |
%d |
afisarea in baza 10 a unei variabile intregi (cu semn) |
%u |
afisarea in baza 10 a unei variabile intregi (fara semn) |
%x |
afisarea in baza 16 a unei variabile intregi (fara semn, litere mici) |
%X |
afisarea in baza 16 a unei variabile intregi (fara semn, litere mari) |
%o |
afisarea in baza 8 a unei variabile intregi (fara semn) |
%f |
afisarea in baza 10 a unui numar real, notatia zecimala |
%e |
afisarea in baza 10 a unui numar real, notatia exponentiala |
%c |
afisarea unui caracter ASCII |
%s |
afisarea unui sir de caractere ASCII |
%% |
afisarea caracterului '%' |
Exercitiu: Rulati urmatorul program C si analizati mesajele afisate in urma executiei.
#include <stdio.h>
void main (void)
Se constata ca aceeasi variabila, cu aceeasi valoare, se poate afisa in diverse moduri, in functie de necesitati, utilizand caracterul corespunzator dupa %.
Urmatorul exemplu ilustreaza posibilitatea de a afisa mai multe variabile cu functia printf:
#include <stdio.h>
/* Programul schimba continutul a doua variabile intregi */
void main (void)
Acest exemplu ilustreaza si operatorul de atribuire '=', cu sintaxa generala
dest = sursa;
si care are ca efect copierea
valorii din sursa in destinatie. Destinatia trebuie sa fie o variabila. Sursa
poate fi o variabila, o
In cadrul expresiilor care implica valori numerice, se pot folosi urmatorii operatori:
+ pentru adunare
- pentru scadere
* pentru inmultire
/ pentru impartire
% (modulo) pentru restul imartirii a doua numere intregi
4. Facilitatile de depanare ale mediului Borland C++ 3.1
Dupa cum am mentionat, mediul de programare dispune de anumite facilitati care usureaza depanarea programelor in faza de dezvoltare a acestora, care vor fi ilustrate in continuare.
Exercitiu: scrieti si rulati urmatorul program C:
#include <stdio.h>
void main (void)
Prima facilitate de depanare permite setarea unui break-point pe o anumita linie de program si se activeaza / dezactiveaza cu combinatia de taste Ctrl + F8. In timpul rularii, in momentul in care executia ajunge la linia de cod sursa pe care este setat break-point, programul este intrerupt si se revine automat in mediul de programare. Un break-point temporar se poate introduce si cu tasta F4, care lanseaza programul si il intrerupe in momentul in care executia acestuia ajunge la linia de cod sursa pe care era cursorul in momentul actionarii tastei F4.
A doua facilitate permite rularea programului pas cu pas, odata ce executia acestuia a fost intrerupta (prin atingerea unui break-point). Rularea pas cu pas se face cu tasta F7 (Trace Into) sau F8 (Step Over). Diferenta dintre cele doua moduri de rulare apare in momentul in care programul contine mai multe functii si se ajunge la o instructiune care contine un apel la una dintre functiile definite de programator. Utilizand Trace Into (F7), se intra pas cu pas si in functia respectiva. Utilizand Step Over (F8), functia se executa fara a fi intrerupta si se revine la mediul de programare cand functia s-a incheiat.
A treia facilitate importanta permite urmarirea evolutiei continutului variabilelor pe parcursul executiei programului. Pentru aceasta, se activeaza fereastra Watches cu combinatia de taste Ctrl + F7. In aceasta fereastra se pot adauga (tasta Insert), modifica (tasta Enter) sau sterge (tasta Delete) variabile sau expresii al caror rezultat este afisat in timpul rularii pas cu pas a programului.
5. Probleme propuse
1) Sa se scrie un program C care afiseaza suma a doua variabile intregi, initializate, atat in baza 10 cat si in baza 16.
2) Sa se scrie un program C care converteste un unghi din grade in radiani
3) Sa se scrie un program C care face conversia din grade Celsius in grade Fahrenheit, C = (F - 32) * 5/9
4) Sa se scrie un program care afiseaza codurile ASCII ale urmatoarelor caractere:
A a 0 ' [ '
5) Sa se scrie un program C care afiseaza cifra unitatilor unei variabile de tip intreg
6) Sa se scrie un program C care afiseaza valorile celor doi octeti ai unei variabile de tip intreg fara semn (16 biti)
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1483
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved