Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Introducere in limbajul C - notiuni de baza

Introducere in limbajul C - notiuni de baza


Toate elementele individuale ale limbajului C nu sunt de sine statatoare, ci in conjunctie unul cu celalalt. Din acest motiv este important sa fie intelese aspectele fundamentale ale limbajului, inainte ca acestea sa fie detaliate.

Toate aplicatiile realizate prin intermediul limbajului C au anumite trasaturi comune. Programele contin cel putin o functie, fiecare incluzand una sau mai multe instructiuni. O functie poate fi definita ca fiind o subrutina care poate fi apelata de diferite parti ale aplicatiei. O instructiune se refera la o actiune care trebuie sa fie executata de program. Toate instructiunile scrise intr-un program trebuie sa apartina unei functii si se termina obligatoriu cu .



Cea mai simpla forma a unei functii este urmatoarea:

nume_functie()


unde nume_functie reprezinta numele unei functii, iar instructiuni reprezinta secventa de instructiuni (una sau mai multe) care apartine functiei declarate.

In ceea ce priveste numele functiei (si nu numai) trebuie spus ca limbajul C este de tip CASE-SENSITIVE, ceea ce presupune ca programatorul sa aiba in vedere faptul ca, compilatorul C face deosebire intre litere mari si litere mici.

Orice program in limbajul C contine cel putin o functie: functia main(). Executia fiecarui program incepe cu functia main(), ceea ce inseamna ca daca programatorul omite scrierea acestei functii, compilatorul va fi in imposibilitatea compilarii programului editat. Astfel, atunci cand se executa un program, primele instructiuni executate sunt cele care fac parte din functia main. Daca programul contine mai multe functii, numele acestora va fi definit de utilizator.

Toate programele scrise in limbajul C sunt memorate intr-un fisier sau mai multe, acestea avand extensia .c. Un fisier care contine un program scris in C sau care contine numai o parte a acestuia se numeste fisier sursa. Prin compilarea fisierului sursa rezulta un fisier obiect, care are extensia .obj. Fisierele sursa care intra in compunerea unui program pot fi compilate impreuna sau separat. In urma unei compilari rezulta un fisier obiect; fisierele obiect corespunzatoare unei aplicatii pot fi reunite intr-un program executabil prin link-editare. In urma link-editarii rezulta un fisier executabil, cu extensia .exe.

Un nume este o succesiune de litere si eventual cifre, primul caracter fiind litera. Pot fi utilizate litere mici si litere mari precum si caracterul subliniere (_).

Exista un numar de cuvinte imprumutate din limba engleza care au o semnificatie predefinita. Utilizatorul nu poate da o alta utilizare acestora si de aceea se mai numesc cuvinte cheie. Acestea se scriu mereu cu litere mici si reprezinta nume cu destinatii speciale (for, if, while, break, exit, etc.).

Tipuri de date de baza

Multimea tipurilor de date predefinite constituie o caracteristica importanta a oricarui limbaj si un argument in alegerea unui limbaj sau altul pentru rezolvarea unei probleme.

In limbajul C exista o serie de tipuri simple de date predefinite (tabelul 1.1), a caror lungime poate sa difere de la un calculator la altul si de la o implementare la alta.

Pentru fiecare tip predefinit din limbajul C exista cuvinte rezervate, care reprezinta modificatori de tip: unsigned, signed, long si short pentru tipul int; signed si unsigned pentru tipul char; long pentru tipul double. Cuvintele rezervate dintre parantezele patrate sunt optionale si diferitele combinatii definesc acelasi tip de data.

Tipurile de date specifice limbajului C sunt urmatoarele:

Tabelul 1.1 - Principalele tipuri de date in limbajul C

Tip

Nr.octeti

Interval de valori

Semnificatie

Int

4

[-2147483648 - 2147483647]

(-231 - 231-1)

contine numere intregi cu semn, reprezentate binar pe 4 octeti

Short Int

2

[-32768 - 32767]

(-215 - 215-1)

contine numere intregi cu semn, reprezentate binar pe 2octeti

long

8

(-231 - 231-1) / (-215 - 215-1)

contine numere intregi cu semn, reprezentate binar pe 8 octeti

Unsigned Int

4

[0 -2147483647] (0-231 -1)

se foloseste pentru a crea intregi fara semn.  Diferenta dintre intreg cu semn si fara semn consta in modul in care compilatorul interpreteaza bitul de semn. Daca bitul de semn este 0, numarul este pozitiv, si daca bitul de semn este 1, numarul este negativ. De cele mai multe ori, numerele negative se reprezinta in complement fata de doi. Daca un intreg este declarat cu unsigned, cand bitul de semn este 1, numarul devine 231-1

[signed] char

1

[-128 - 127] (-27 - 27-1)

sunt caractere, adica simboluri tipografice elementare: litere, cifre, semne de punctuatie, simboluri matematice, etc

unsigned char

1

[0 - 255] 28-1)

caracter fara semn

float

4

[3,4*10-38 - 3,4*1038]

zecimal in virgula flotanta simpla precizie - contin numere reprezentate in virgula flotanta (pot avea partea fractionara)

double

8

[1,7*10-308 - 1,7*10308]

zecimal in virgula flotanta dubla precizie - contin numere reprezentate in virgula flotanta (pot avea partea fractionara)

long double

12

[3,4*10-4932 - 1,1*104932]

Reprezentare flotanta in dubla precizie


De asemenea, o componenta importanta a unui program C o reprezinta biblioteca functiilor C (a functiilor executate de un program) care pot realiza:

operatii de intrare/iesire,

operatii matematice,

operatii cu siruri, etc.

Printre cele mai des folosite functii din C se numara functia printf[1], care este principala functie de iesire aferenta limbajului C, si este redata sub urmatoarea forma:

printf("sir de caractere");

Pentru exemplul prezentat, pe ecran se va afisa sirul de caractere inclus intre ghilimele.

O alta componenta importanta care caracterizeaza majoritatea programelor C sunt fisierele header. Toate informatiile aferente functiilor din biblioteca standard se afla in fisiere care sunt transmise impreuna cu compilatorul, aceste fisiere recunoscandu-se prin intermediul extensiei: .h . Informatiile din aceste fisiere sunt folosite de compilator pentru lucrul cu functiile din biblioteca. Toate fisierele necesare se adauga prin intermediul directive preprocesor include, care au rolul de a determina compilatorul sa citeasca un alt fisier si sa-l includa in program[2].

Un fisier cu text sursa poate fi inclus cu ajutorul constructiei #include. Aceasta constructie are formatul:

#include "specificator_fisier"

sau

#include<specificator_fisier>

unde specificator_fisier (care depinde de sistemul de operare) defineste un fisier cu text sursa pastrat pe disc. In faza de preprocesare, textul fisierului respectiv se substituie constructiei #include. Astfel, textul fisierului respectiv ia parte la compilare impreuna cu textul in care a fost inclus.

In cazul sistemului de operare DOS, specificatorul de fisier trebuie sa fie un nume de fisier impreuna cu extensia lui (.C pentru compilatorul C, .H pentru fisiere de tip header - fisiere cu prototipuri, etc.). De asemenea, in afara de numele si extensia fisierului, specificatorul de fisier poate contine si o "cale" daca este necesar, pentru localizarea fisierului.

Diferenta dintre cele doua formate consta in modul de cautare al fisierului de inclus:

Formatul cu paranteze unghiulare <.> se foloseste la includerea fisierelor standard, cum sunt cele care contin prototipuri pentru functii din biblioteca.

In cazul in care se foloseste formatul cu ghilimele, fisierul este cautat in directorul curent sau conform "caii" daca aceasta este prezenta.

Un fisier standard care se include frecvent este stdio.h; acesta contine prototipurile pentru o serie de functii ce realizeaza operatii de intrare/iesire.

Constructiile #include se scriu de obicei la inceputul fisierelor sursa, pentru ca textele inserate sa fie valabile in tot fisierul sursa care se compileaza.

Pentru a putea folosi intr-un program functia printf(), este necesara includerea directivei #include<stdio.h>, deoarece, asa cum spuneam anterior, aceasta directiva contine informatii cu privire la aceasta functie de iesire. Directivele incluse in program nu se finalizeaza cu caracterul , deoarece nu reprezinta un cuvant cheie al programului, ci o "instructiune" catre compilatorul C.

Cel mai simplu program scris in limbajul C este urmatorul:

Ex. 1.1.

#include <stdio.h>

main()


care va afisa pe suprafata ecranului mesajul: Primul program in limbajul C !!!.

Practic, in acest program banal sunt incluse toate aspectele comune si obligatorii aferente unui program scris in C. Prima linie permite includerea in program a fisierului stdio.h. pentru a fi citit de compilator. Inceputul functiei principale este desemnat de a doua linie, main(). Corpul tuturor functiilor in C (deci, si a functiei main) este inclus intre doua paranteze acolada; tot ce este scris in interiorul acestor paranteze acolade constituie corpul functiei. In cazul programului prezentat anterior, corpul functiei main() este format dintr-o singura instructiune, care apeleaza functia printf() din biblioteca standard pentru a permite afisarea pe ecran a sirului dorit. Atunci cand corpul unei functii este format din mai multe instructiuni, parcurgerea acestora se va face secvential.


Folosirea functiilor

Programul prezentat anterior a inclus o singura functie, si anume functia main(). Insa majoritatea programelor includ mai mult de o functie. Forma generala a unui program cu mai multe functii este:

main()


functia_1()


functia_n()



Cand se finalizeaza executia tuturor instructiunilor din corpul unei functii, se va intoarce in functia apelanta, pe linia imediat urmatoare celei care a inclus apelul functiei. Daca argumentul functiei este vid (intre cele doua paranteze nu este nimic), atunci functia nu transmite nici un parametru.

Ex. 1.2.

#include <stdio.h>

main()


functia_2()



Rezultatul este urmatorul:

Afisare din functia principala

Afisare din functia functia_2

Ne-am intors in functia principala


Daca o functie contine o instructiune return, atunci acea functie returneaza o valoare. Valoarea intoarsa de functia respectiva poate fi folosita in programul apelant.

Ex. 1.3.

#include <stdio.h>

main()


functia_1()


Rezultatul in acest caz este urmatorul:

Afisare din functia principala

Flosesc valoarea intoarsa de functia_1:4

De aceasta data, al doilea argument al functiei printf este chiar apelul functiei.

Exista de asemenea posibilitatea ca la apelul unei functii sa se transmita ca parametri niste valori (functii cu argumente). Deci, argumentul unei functii este o valoare care este transmisa functiei atunci cand aceasta este apelata. Numarul argumentelor unei functii poate diferi - pot exista 0 argumente, unul sau mai multe. Cand se apeleaza o functie care are cel putin un argument, atunci trebuie sa existe o functie declarata si care sa aiba exact acelasi numar de parametri; pentru a avea argumente, trebuie declarate niste variabile, care urmeaza sa primeasca valorile argumentelor, variabile care se numesc parametri formali. Acesti paramatri formali se declara in interiorul parantezelor care succed numele functiei. Spre exemplu, suma(int x, int y) are doi parametri formali de tip int.

Ex. 1.4.

#include <stdio.h>

main()


suma(int x, int y)



In cadrul functiei printf aferenta functiei main(), al doilea argument este apelul functiei suma, care trimite ca argument doua numere. Cand se ajunge in functia suma cei doi parametri formali x si y iau valorile transmise ca parametri, adica 10 si 5, functia returnand suma celor doua numere.

Plecand de la cele mentionate anterior, se pot specifica urmatoarele concepte importante:

argument - valoarea transferata unei functii;

parametru formal - variabila care primeste valoarea argumentului folosit la apelarea functiei;

functie parametrizata - o functie cu argumente.


Tema 1.1 Sa se scrie un program care sa contina o functie care returneaza un sir de caractere prin intermediul instructiunii return si sa se afiseze din functia principala respectivul sir de caractere;

Tema 1.2 Sa se scrie un program care contine o functie care returneaza cu ajutorul lui return o valoarea intreaga care este adunata cu o alta valoare in functia principala.

Tema 1.3: Sa se scrie un program care foloseste o functie care are ca parametri formali doua variabile de tip char, iar functia afiseaza pe ecran argumentul transmis la apel.

Tema 1.4: Sa se scrie un program care foloseste o functie care are ca parametri formali doua variabile de tip intreg. Functia returneaza in functia principala suma celor doi parametri care este adunata cu un alt intreg si apoi afisata la consola.

BIBLIOGRAFIE

&            Costea Damian, Initiere in C, Editura Teora, Bucuresti, 1995;

&            Kernighan Brian, Ritchie Dennis, Limbajul de programare C, Programming in C:  A Tutorial, Bell Laboratories, Murray Hill, N. J.;

&            Negrescu Liviu, Limbajele C si C++ pentru incepatori, volumul I, Editura Albastra, Cluj-Napoca, 1996;




[1] Functia printf() va fi detaliata intr-un alt capitol

[2] In capitolul 11 se va face o detaliere a preprocesarii C si a altor directive