Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Limbajul C standard (Nivel I)

c



+ Font mai mare | - Font mai mic



Limbajul C standard (Nivel I)

Introducere

Limbajul de programare C - a aparut in 1972 - ca limbaj cu destinatie universala.



Autorii limbajului Dennis M. Ritchie si Brian W. Kernighan de la Bell Laboratories.

Initial a fost proiectat pentru a asigura implementarea portabila a sistemului de operare UNIX.

Avantajele limbajului C:

portabilitate mare

flexibilitate in programare asigurata de setul de instructiuni

lucrul pe biti si calculul de adrese - facilitati specifice limbajelor de asamblare (de nivel jos)

toate acestea permit scrierea de programe optime din punct de vedere al gestionarii memoriei cit si al timpului de executie.

Structura unui program C

Elemente de limbaj

Variabile

Intrari-Iesiri standard

1.Structura unui program C

Un program contine una sau mai multe functii , dintre care una este functie principala si punctul de intrare in program.

Numele functiei principale este main ,celelalte functii au nume definite de utilizator.

Codul sursa al unui program se poate pastra intr-un fisier sau mai multe (fisierele C standard au extensia .c in C++ au extensia .cpp)

Fisierul scris in limbaj C sau C++ spunem ca contine codul sursa al programului si se numeste fisier sursa.

Prin compilarea unui fisier sursa se obtine un fisier cu extensia .obj (object)

Codul sursa al unui program se poate afla intr-unul sau mai multe fisiere sursa care pot fi compilate impreuna sau separat.

Fisierele obiect(object) rezultate in urma compilarii sint reunite intr-un singur fisier executabil cu extensia .exe prin editia de legaturi(link-editare).

Un program C este o secventa de functii si declaratii de variabile.

Executia unui program incepe cu prima instructiune din functia principala (main).

Exemplu:

#include<stdio.h>

void main(void)

in urma compilarii fisierului sursa in care sa va gasi codul scris anterior se va afisa la iesirea standard (monitor) textul:

"Cel mai simplu program scris in C ".

Analiza codului scris:

Prima linie din fisier cea care incepe cu #include este o directiva de precompilare care indica compilatorului sa include in fisierul sursa fisierul cu numele stdio.h aflat intr-un director predefinit.

Directivele de precompilare care se gasesc de regula la inceputul fisierelor sursa sint precedate intotdeauna de caracterul # (diez).

A doua linie din fisier se defineste functia principala a programului (main).

Cuvintul din fata numelui de functie, "void", are semnificatie speciala, precizeaza ca:

Functia respectiva este o functie fara tip (numim o functie fara tip aceea functie care nu intoarce valori in programul apelant in urma executiei instructiunilor pe care le contine)

"void" este cuvint rezervat cu semnificatie pentru compilator(cuvint cheie).

Prin prezenta lui "void" intre parantezele rotunde care preced numele functiei se precizeaza copilatorului(interpretorului de cod sursa) ca functia respectiva nu are parametrii.

Corpul functiei este delimitat de perechea de acolade .

In interiorul corpului de functie (intre cele doua acolade) se pot gasi apeluri de alte functii ca in cazul de fata sau declaratii de variabile.

Functia "printf()" este cea care tipareste (afiseaza ) la iesirea standard (monitor) sirul de caractere care se gaseste intre ghilimele.

Obs: In limbajul C nu exista instructiuni de intrare-iesire; pentru realizarea acestor operatii se folosesc functiile de biblioteca (functii din biblioteca standard a limbajului sint functii definite si care au un scop bine definit).

Functia printf() este declarata in fisierul stdio.h (standard input output header ).

Intr-un fisier header se gasesc de regula declaratii de functii.

Pentru a putea folosi functia printf() a fost nevoie de directiva de precompilare in care am mentionat includerea acestui fisier la compilare; acest fisier trebuie inclus in orice program in care au loc operatii de intrare-iesire.

Apelul functiei printf() este urmat de " ; " care in C inseamna terminator de instructiune; Orice instructiune se termine cu " ; ".

Functia printf() spre deosebire de functia principala are are un parametru: un sir constant de caractere delimitat de ghilimele , sir care va fi tiparit la consola.

Ultimele doua caractere din sir au semnificatie aparte: reprezinta o asa numita secventa escape newline (linie noua) care va provoca pozitionarea cursorului la inceputul urmatoarei linii de pe ecran.

2.Elemente de limbaj

Nume de functii si variabile (Identificatori)

Identificator=o succesiune de litere si eventual cifre, primul caracter din nume fiind obligatoriu o litera sau caracterul " _ " (underline).Numarul de caractere care intra in compunerea unui nume nu este limitat , dar numai primele 32 de caractere sint semnificative.

Exemple nume: x, Az, _xyz, a2, a_7, acesta_este_nume, AcestaEsteNume, numeVariabila etc.

Obs: Numele trebuie sa fie cit mai sugestiv pentru data sau functia pe care o reprezinta.

Cuvinte cheie

Sint cuvinte imprumutate din limba engleza care au o semnificatie speciala si o utilizare predefinita care nu pot fi schimbate de catre programator.

Se scriu totdeauna cu litere mici main, include, if, break, else, int etc.

Tipuri de date de baza (predefinite)

Tipul datei se specifica prin cuvinte cheie specifice oferite de catre orice limbaj de programare.

Tabel tipuri de date specifice limbajului de programare C

Tip

Dimensiune in biti

Interval de valori

Mod de reprezentare

int

[-32768,-32767] sau

Intreg reprezentat prin complement fata de doi

short

Intreg reprezentat prin complement fata de doi

long

Intreg reprezentat prin complement fata de doi

unsigned

Intreg fara semn

unsigned long

0-~4milioane

Intreg fara semn

char

Cod ASCII al caracterului

float

[0-~4milioane]

Reprezentare flotatnta in simpla precizie (3B mantisa 1B exponent)

double

Reprezentare flotanta in dubla precizie

long double

Reprezentare flotanta in dubla precizie

Obs: Datele de tip char - implicit sint numere fara semn.

Structura unei functii

1 tip nume_functie (lista declaratii parametrii formali)

primul rind reprezinta antetul functiei, este urmat de corpul functiei reprezentat de perechea de acolade si declaratiiile si instructiunile prezente.

Tip defineste tipul valorii returnate de functie.

Din punct de vedere al tipului functiei intilnim doua tipuri de functii in C:

a)functii care in urma apelului returneaza o valoare programului apeland ,caz in care tipul acestei valori returnate se defineste prin tip din antetul functiei.

b)functii care nu returneaza nici o valoare in urma apelului in programul apeland,caz in care spunem ca este o functie void iar tipul din antetul functiei este void .

nume_functie ->poate fi orice nume dat de programator respectind regulile de la numele de variabile si functii amintite anterior.

lista declaratii parametri formali-> o functie poate avea unul, niciunul sau mai multi parametri formali.

In cazul in care functia nu are nici un parametru acest lucru se precizeaza prin cuvintul cheie void care este trecut intre parantezele rotunde.(nu este obligatorie scrierea cuvintului cheie void intre parantezele rotunde; in cazul in care nu trec nimic implicit se considera void).

In situatia in care functia are unul sau mai multi parametri formali acestia se trec intre parantezele rotunde despartiti prin virgula fiind necesar sa se precizeze pentru fiecare in parte tipul si numele.

Exemple definitii functii:

a)     tip nume()

b)     int functie1()

c)      int functie2( int a )

d)     void functie3( void )

e)     double functie4( int a, int b )

Pentru functia main() se pot utiliza antetele:

void main()

functia nu primeste si nu returneaza nimic, acesta este unul dintre cele mai frecvent intilnite antete pentru functia principala

int main()

caz in care functia returneaza o valoare intreaga in urma apelului sistemului de operare care face apelul

int main(int n, char* argc[])

functia returneaza o valoare intreaga la revenirea din ea si primeste parametrii transmisi din linia de comanda

int main(int n,char* argc[],char* argv[])

Comentariile

Sint explicatii pentru programatori pentru a face mai usor de inteles codul scris.

Comentariile sint introduse in doua moduri:

a)     Pentru o explicatie ce se intinde pe mai multe rinduri se foloseste succesiunea de caractere: /* -pentru inceput de comentariu si atunci cind se doreste incheierea explicatiei se trece urmatoarea succesiune de caractere */

b)     Pentru explicatii care nu se intind pe mai mult de un rind se foloseste urmatoarea succesiune de caractere //- aici este un comentariu terminat pe acelasi rind

Textul care este scris intre cele doua sucesiuni de caractere la punctula a) sau cel care este precedat de caracterele de la punctul b) nu este luat in considerare de catre compilator.

Constante

O constanta este descrisa de un tip si o valoare care sint determinate de caracterele care intra in componenta sa.

2.5.1 Constante intregi

pot fi scrise in sistem de numeratie cu baza 8,10 sau 16.

o constanta zecimala intreaga este un sir de cifre zecimale care are prima cifra diferita de zero.

tipul constantei este int si se poate reprezenta pe 16 sau 32 de biti depinde de configuratia sistem.

exemplu: 123 este de tip intreg cu semn, sau 156u (u -unsigned) tipul este intreg fara semn sau 123lu ( lu-long unsigned) sau 112L(L -long)

o constanta octala este reprezentata pritr-o sucesiune de cifre de la 0-7 precedate de un zero nesemnificativ

Exemplu: 04, 0123

o constanta hexazecimala intreaga este o succesiune de cifre hexazecimale precedate de 0x sau 0X

cifre hexazecimale pot fi de la 0 la 9 si a,b,c,d,f.

Exemplu: 0xf3, 0x28dd

2.5.2 Constante flotante

reprezinta un numar rational, compus din parte intreaga (constanta zecimala)

si parte fractionara (compusa din caracterul punct dupa care urmeaza o succesiune de cifre zecimale) si un exponent.

exponentul-incepe cu litera mica ,e' sau mare ,E' (precedat de semn care este optional) si un sir de cifre zecimale.

Exponentul defineste un factor care exprima o putere a lui 10

Exemple:

78e4->78*10000

.1e-3->0,1*(-)1000

123.456e2->12345,6

1234.567e-4->0,1234567

Constantele flotante sint reprezentate in dubla precizie(64 biti) pentru a reprezenta o constanta flotanta in simpla precizie constanta respectiva trebuie sa se termine cu litera f sau F.

Daca se termina cu litera l sau L se va reprezenta pe 80 biti si are tipul long double.

2.5.3 Constante caracter

Caracterele se codifica folosind coduri numerice.

Cele mai utilizate coduri folosite pentru codificarea caracterelor sint:

a)EBCDIC - Extended Binary Coded Decimal Interchange Code

b)ASCII - American Standard Code for Information Interchange ,cod utilizat de calculatoarele compatibile IBM-PC

codurile negrafice au codurile situate in intervalul 0-31 plus 127(DEL) si 32 (spatiu)

codurile caracterelor grafice se afla in intervalul 33-126.

caracterele grafice impreuna cu caracterul spatiu formeaza setul de caractere imprimabile.

O constanta caracter are ca valoare codul ASCII al caracterului pe care il reprezinta iar tipul ei este int.

O constanta caracter corespunzatoare unui caracter imprimabil se reprezinta prin caracterul respectiv inclus intre caracterele apostrof.

Exemplu:

,a'->97

,A'->65

,0'->48

Secvente escape

t - tabulare orizontala

b - backspace

" - reprezinta ghilimelele cind apar in constante sir

- reprezinta caracter cind apare in constante sir

n - trecerea pe rindul urmator si pozitionarea la inceput de rind

O secventa escape se introduce dupa cum se observa in exemplele anterioare cu ajutorul caracterului backslash (,')

Cifrele care urmeaza dupa o secventa escape se considera automat in baza 8.

Caracterele din intervalul 128-255 sint caractere cu utilizare speciala -cod ASCII extins folosite pentru reprezentarea caracterelor diacritice (caractere speciale din diverse alfabete).

3. Variabile

Declararea unei variabile

declararea unei variabile presupune specificarea tipului variabilei si a identificatorului pentru variabila respectiva

exemplu:

int x;

double t;

char c;

int x,y,z; - pentru declararea mai multor variabile de acelasi tip.

Obs1: Orice variabila inainte de a fi utilizata trebuie declarata.

Obs2: Orice variabila poate fi initializata in momentul in care este declarata, cu o constanta.

Exemplu:

int x=7,y=3;

char c='a';

La declararea unei variabile se stabileste o legatura intre numele si tipul variabilei respective si se aloca o zona de memorie a carei dimensiune este data de tipul variabilei respective, zona in care se retine valoarea variabilei respective (constanta cu care este initializata).

Zona respectiva de memorie poate fi accesata prin numele variabilei.

Obs: Zona de memeorie rezervata la declararea unei variabile de un anume tip nu este initializata implicit , initial va contine un "garbage" =gunoi .

In concluzie este necesar ca variabila o data declarata sa fie si initializata cu o constanta ininte de a fi utilizata intr-o expresie.

4. Functii I/O (input/output) standard

Prin intrari-iesiri (input/output) se intelege un set de operatii care permit schimbul de date intre un program si un periferic.

Limbajul C nu dispune de instructiuni specifice pentru operatiile de intrare - iesire, acestea se pot realiza prin intermediul functiilor definite special in acest scop.

Functiile de biblioteca utilizate frecvent pentru operatiile de intrare -iesire:

Intrari (de la tastatura):

getch, getche, gets, scanf

Iesiri (afisare la consola)

putch ,puts ,printf

macrouri pentru intrari - iesiri

getchar -pentru intrare

putchar -pentru iesire

Functiile getch, getche

permit citirea de la tastatura a unui singur caracter, diferenta intre cele doua fiind urmatoarea: functia getch -citeste un caracter fara ecou (caracterul tasta pe care vrem sa-l citim nu este afisat)

functia getche - citeste un caracter cu ecou

permit citirea de la tastatura atit a caracterelor ASCII cit si a celor corespunzatoare unor functii speciale F1, F2, combinatii de taste speciale (in acest caz functia se apeleaza de doua ori - la primul apel se returneaza valoarea zero iar la cel de-al doilea apel valoarea specifica tastei actionate).

functiile nu au parametrii si returneaza codul ASCII al caracterului citit.

pot fi apelate ca operanzi in expresii.

la apelarea lor se opreste executia program si se asteapta tastarea unui caracter, programul continua dupa tastarea acestuia.

se utilizeaza si in cazul in care dorim sa vizualizam fereastra utilizator si sa blocam programul pentru analiza continutului curent al ecranului.

prottipurile acestor functii se gasesc in fisierul conio.h (consol input -output header)

Exemplu:

char c=getch(); - se initializeaza variabila caracter c cu o valoare primita de la tastatura.

Functia putch

afiseaza un caracter la consola .

are un parametru care determina caracterul afisat (valoarea parametru se interpreteaza ca fiind codul ASCII al caracter afisat)

functia returneaza codul ASCII al caracterului afisat

Exemplu:

program care citeste un caracter imprimabil de la tastatura si-l afiseaza apoi pe ecran.

#include<conio.h>

void main()

Exemplu2:

program care citeste un caracter de tastatura, il afiseaza si apoi trece cursorul pe linia urmatoare.

#include<conio.h>

void main()

Exemplu 3:

programul citeste un caracter de la tastatura ,il afiseaza ,trece cursorul pe rindul urmator, afiseaza mesaj "Apasa o tasta pentru a continua" si asteapta apasarea unei taste.

#include<conio.h>

void main()

Macrourile getchar ,putchar

prototipurile lor se gasesc in fisierul stdio.h

- getchar -permite citirea cu ecou de la tastatura numai a caracterelor ASCII.

Caracterele se citestc indirect prin intermediul unei zone de memorie tampon (buffer) ,unde pot fi citite unul sau mai multe caractere ,citirea se intrerupe la apasarea tastei ENTER cind in buffer se introduce caracterul linie noua si se continua executia.

Se revine din getchar prin returnarea codului ASCII al caracterului curent din buffer. La un nou apel al macroului getchar se returneaza codul ASCII al urmatorului caracter din buffer, astfel se continua pina la epuizarea caracterelor din zona tampon cind apelul lui getchar implica tastarea unui nou set de caractere care reincarca zona tampon.

Se apeleaza fara parametrii si este de obicei un operand al unei expresii.

- putchar - afiseaza un caracter ASCII

returneaza codul caracter afisat sau -1 in caz de eroare.

Obs: Citirea caracterelor prin intermediul zonei tampon permite corectarea erorilor la tastare.(se pot corecta inainte de apasarea tastei ENTER)

Exemplu:

#include<stdio.h>

#include<conio.h>

void main()

Functiile gets, puts

sint functii pentru efectuarea operatiilor de intrare -iesire cu siruri de caractere (explicatii la siruri de caractere)

Functiile printf, scanf

functia printf este folosita pentru afisarea date pe ecranul terminal standard permitind controlulul formatului de afisare cu prototipul:

int printf(parametru pentru controlul formatului de afisare,par1,par2,.parn);

primul parametru este un sir de caractere care defineste textul care va fi afisat si formatele datelor.

par1,par2,..parn sint expresii ale caror valori sint afisate conform specificatorilor de format prezenti in parametrul de control al afisarii.

functia returneaza numarul caracterelor afisate sau -1 in caz de eroare.

specificatorii de format sint machete care definesc conversiile datelor din format intern in format extern

in afara de acesti specificatori de format, primul parametru al functiei poate contine si succesiuni de caractere care sint afisate ca atare.

Obs: Nu este obligatorie prezenta atit a specificatorilor cit si a succesiunilor de caractere oricare dintre ele poate lipsi dar nu ambele.

Daca lipsesc specificatorii de format atunci lipsesc si par1, par2.parn.

Exemplu:

printf("n acest sir nu contine specificatori de format si va fi afisat ca ataren");

Un specificator de format incepe cu caracterul '%' si poate fi urmat de:

a)     Un punct si un sir de cifre zecimale

punctul defineste precizia datei care se afiseaza (daca data este flotanta, punctul defineste numarul de zecimale care se scriu, daca este un sir de caractere indica numarul de caractere care se vor afisa)

b)     Una sau doua litere

definesc tipul de conversie aplicat datei care se afiseaza

c)      Un sir de cifre zecimale

defineste dimensiunea minima a cimpului in care se afiseaza caracterele care intra compunerea formatului extern al datei

d)     Caracterul minus

daca apare atunci data este cadrata in stinga cimpului in care se afiseaza

exemple:

fie double a=1.23

printf("numarul a=%20lf",a);

va afisa - a= 1.23 -data este cadrata la dreapta

printf("numarul a=%-20lf",a);

va afisa - a=1.23 - data este cadrata la stinga datorita prezentei caracter minus

printf("numarul a=%020lf",a);

va afisa - a=000000000000000001.23 - zero care urmeaza dupa caracterul '%' specifica ca vor urma atitea zerouri cite se precizeaza in continuare (20) iar data va fi cadrata la dreapta.

Obs:In cazul in care dupa caracterul '%' urmeaza un alt caracter diferit de cele folosite la definirea specificatorilor de format, caracterul ,'%'se ignora si se afiseaza caracterul care urmeaza dupa el.

Pentru afisarea caracter ,'%'se foloseste succesiunea de caractere %%

(primul se ignora iar cel de-al doilea se afiseaza).

Principalele conversii realizate prin specificatorii de format sint definite de literele care urmeaza dupa caracterul '%' dupa cum urmeaza:

a)     litera c

permite afisarea unui caracter.Valoarea parametrului corespunzator specoficatorului de format va fi interpretata ca fiind codul ASCII al unui caracter si caracterul respectiv se afiseaza in cimpul definit de specificator.

b)     litera s

afisarea unui sir de caractere.Parametrul are ca valoare adresa de inceput a zonei de memorie care contine sirul de caractere, se vor afisa toate caracterele sirului pina la intilnirea caracter sfirsit de sir '0' sau NULL.

Exemplu:

printf("abc");

se afiseaza: "abc"

printf("%s","abc") ;

se afiseaza: "abc"

printf("*%15.10*","limbajul C standard");

se afiseaza: "* limbajul C*"   

lungimea cimpului este de 15 caracter in care se afiseaza doar 10 caractere.

c)      litera d

afisarea in zecimal a unei date de tip intreg (valorile negative se afiseaza precedate de semnul minus).

d)     litera o

datele de tip int sau unsigned pot fi convertite si afisate in octal

printf("*%10o*",123);

se afiseaza: "* 173*"

e)     literele x, X

datele de tip int si unsigned pot fi convertite si afisate in hexazecimal

printf("*%10x*",123);

se afiseaza: "*    7b*"

f)       litera u

la fel ca si litera d dar pentru date de tip unsigned

g)     litera l

poate precede una din literele d,o,x,u,f ;afiseaza date de tip long (long int,long unsigned ,long float )

h)     litera f

folosita pentru converia datelor de tip double sau float ,pentru afisarea numerelor reale

i)        litera e

folosita pentru afisarea datelor floatante (reale) cu exponent printf("%e",123.678 )

va afisa: "1.236780e+02"

j)        litera g

afiseaza un tip de data ca in cazul literei f sau e.Formatul de afisare se alege automat in asa fel incit afisarea sa ocupe un numar minim de caractere

(de exemplu in cazul tipului float se vor afisa toate cele 6 zecimale numai daca sint semnificative)

Obs: datele de tip float au o precizie de 6 zecimale ,cele de tip double au precizie de pina la 15 zecimale.

Tema laborator:

1. Sa se scrie un program care sa afiseze constanta 123435 in octal zecimal si hexazecimal.

2. Sa se se scrie un program care sa afiseze textul :"Astazi testam specificatorii C",folosind specificatorii de format:

%s, %15s, %-15s, %10s, %15.10, %-15.10s

Functia scanf folosita pentru preluarea datelor de la tastatura are prototipul:

int scanf(parametru control al formatului,par1,par2,.parn);

parametrul de control al formatului este un sir de caractere care defineste formatele datelor preluate de la tastatura.

Obs:In cadrul sirului de control al formatului la scanf nu se folosesc sucesiuni de caractere ,aici se trec de regula doar specificatorii de format.

par1,par2..parn sint adresele zonelor de memorie in care se vor pastra datele citite dupa ce au fost convertite de la formatul extern la formatul intern.

functia returneaza numarul cimpurilor citite corect.

Obs:Eroare frecventa care apare este datorita neconcordantei dintre data citita si specificatorul de format sub controlul caruia se face citirea.

functia citeste datele din zona tampon atasata tastaturii (la fel ca si getchar) datele sint citite dupa apasarea tastei ENTER.

par1,par2,.parn -adresele zonelor de memorie se exprima folosind operatorul unar &

exemplu:

daca int i;

este o variabila de tip intreg atunci adresa zonei de memorie care a fost rezervata pentru aceasta se exprima astfel:

&i ->adresa zonei de memorie rezervate variabilei i.

Exemplu: scanf("%d",&i);

Exercitii: (utilizarea functiilor printf si scanf)

1. Sa se scrie un program care citeste un caracter de la tastatura si afiseaza codul ASCII al caracterului respectiv folosind functiile scanf printf.

#include<stdio.h>

void main()

2. Sa se scrie un program care citeste un intreg zecimal de cel mult 4 cifre si-l afiseaza in zecimal octal si hexazecimal.

#include<stdio.h>

void main()



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1329
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved