Programarea calculatoarelor

February 12, 2017 | Author: Ciprian Vara | Category: N/A
Share Embed Donate


Short Description

Download Programarea calculatoarelor...

Description

1. Introducere Versiunea originală a limbajului de programare C a fost creată de Dennis Ritchie, la “AT&T Bell Laboratories”, în 1972. Acest limbaj utilizează şi unele din principiile limbajului ”B”, inventat de Ken Thompson, în 1970, pentru primul sistem de operare UNIX, pentru DEC-PDP7. Limbajul “C” a fost creat ca un instrument de lucru pentru programatori; scopul său principal este de a fi un limbaj folositor programatorilor. Cele mai multe limbaje de programare sunt, bineînţeles, folositoare, dar ele au diferite scopuri. De exemplu, unul dintre scopurile principale ale limbajului PASCAL este de a furniza o bază solidă pentru învăţarea principiilor de programare, fiind, în general, unul dintre primele limbaje care se studiază. BASIC-ul, pe de altă parte, a fost dezvoltat pentru a semăna cu limbajul natural, limba Engleză, astfel încât să poată fi învăţat uşor de cei nefamiliarizaţi cu calculatoarele. Aceste sunt criterii importante, dar nu sunt întotdeauna compatibile cu utilizarea pragmatică. Din acest punct de vedere ”C”-ul este un limbaj pragmatic, orientat către programator. De exemplu să considerăm interfaţa între programe şi hardware. Limbajul PASCAL accentuează principiile de programare generale şi încearcă să izoleze programatorul de consideraţiile hardware. Din acest motiv au fost adăugate multe extensii, nestandard, acestui limbaj, cum ar fi posibilitatea de a specifica adrese hardware. Aceste caracteristici sunt adesea, în paralel, cu cele deja găsite în C. În plus, C-ul oferă multe facilităţi de programare care reduc sarcina de lucru. În special, după 1980, C-ul a devenit unul dintre cele mai importante şi răspândite limbaje de programare. Iniţial creşterea în popularitate a acestui limbaj s-a realizat odată cu creşterea în popularitate a sistemului de operare UNIX, care a fost dezvoltat, de asemenea, la “Bell Laboratories”. De fapt mai mult de 90% din acest sistem de operare a fost scris în limbajul C. Ulterior, după succesul calculatoarelor IBM PC, bazate pe sistemul de operare MS-DOS, sau realizat şi compilatoare C pentru acestea. Aceste versiuni s-au bazat pe versiunea C, descrisă în cartea “The C Programming Language”, de Brian Keringham şi Dennis Ritchie (Prentice Hall, 1978). Din păcate cartea nu furniza o definiţie completă şi fără ambiguităţi a limbajului C, astfel încât mulţi producători au interpretat unele aspecte ale limbajului în moduri diferite. La începutul anilor ’80 a apărut nevoia de a standardiza definirea limbajului C. Organizaţia care se ocupă cu standardizarea este Institutul American de Standarde Naţionale (ANSI - American National Standards Institute); în 1983 un comitet ANSI (denumit X3J11) a realizat standardizarea limbajului C, astfel încât orice compilator de C are încorporate toate caracteristicile limbajului, specificate de acest standard. Exemplele prezentate, în continuare, sunt scrise în ANSI C, astfel încât să poată fi rulate cu succes, după compilare şi editarea legăturilor, de diferite limbaje de programare C, cum ar fi Microsoft C, Turbo C++, Borland C++, etc.

1.1. Caracteristicile limbajului C C-ul este u limbaj universal, care permite scrierea de programe bine structurate (datorită structurilor de control: decizia, selecţia şi ciclul), utilizează un bogat set de operatori şi permite definirea de structuri de date şi lucrul cu pointeri (adrese). El conţine multe caracteristici din teoria şi practica ştiinţei calculatoarelor. Conţine structuri moderne de control, trei forme de cicluri pentru operaţiile repetitive şi trei structuri pentru alegerea căilor alternative de acţiune. De asemenea, poate reprezenta un domeniu larg de informaţie prin diferite tipuri de variabile, tablouri şi alte structuri de date. Limbajul permite descompunerea programului în module, denumite funcţii; permite documentarea programului prin includerea de comentarii explicative. Aceste caracteristici permit utilizarea de tehnici de programare, cum ar fi descompunerea de sus în jos (top-down), programare structurată şi programare modulară. C-ul este un limbaj portabil, ceea ce înseamnă că programele scrise pe un sistem pot fi rulate pe un alt sistem, fără modificări, sau cu mici modificări. Dacă sunt necesare schimbări, ele pot fi 1

făcute, adesea, numai prin modificarea câtorva intrări într-un fişier antet (header), care însoţeşte programul principal. C-ul este un limbaj puternic şi flexibil. De exemplu, cel mai puternic şi flexibil sistem de operare, UNIX, este scris în C. Nu este un limbaj de “nivel foarte înalt”, este unul de nivel mediu, şi nu este specializat pentru un anumit domeniu de aplicaţii. Absenţa restricţiilor şi generalitatea sa îl fac un limbaj mai convenabil şi mai eficient, decât alte limbaje. Nu posedă operaţii care să prelucreze direct: şiruri de caractere, mulţimi, liste sau tablouri, considerate fiecare ca o entitate. Nu are facilităţi de intrare / ieşire (precum Read / Write, în Pascal) şi nici metode de acces direct la fişiere. Aceste mecanisme, de nivel înalt, se realizează prin funcţii explicite. Deci este un limbaj de nivel relativ scăzut (sau înalt), expresiv, elastic, ce permite o gamă largă de programe. Limbajul poate fi utilizat pentru probleme inginereşti, dar şi pentru secvenţe de animaţie. El realizează secvenţe de control delicate, asociate, de obicei, cu limbajul de asamblare, deci permite accesul la hardware. Permite manipularea de biţi individuali din memorie, şi este mai puţin restrictiv decât limbajul Pascal. Această libertate are avantajul că permite mult mai multe operaţii, cum ar fi convertirea datelor care este mult mai simplă în C, dar are şi dezavantajul că permite utilizatorului să facă unele greşeli care în alte limbaje sunt imposibile. Posedă o mare bibliotecă de funcţii utile. Compilatorul de C furnizează programe compacte şi eficiente. În concluzie limbajul C este, în prezent, unul dintre cele mai importante limbaje de programare, şi va continua să fie şi în continuare.

1.2. Noţiuni fundamentale În acest paragraf sunt definiţi câţiva termeni fundamentali, care trebuie înţeleşi, înainte de a învăţa cum se programează în C.

Programare Calculatoarele execută numai ceea ce li se spune (comandă) să execute. Ele realizează anumite operaţii de bază, aritmetice, logice, etc., care alcătuiesc setul de instrucţiuni al calculatorului. Pentru a rezolva o problemă cu ajutorul calculatorului, trebuie exprimată soluţia problemei în termenii instrucţiunilor, pentru calculatorul respectiv. Deci un program de calculator este, de fapt, tocmai o listă de instrucţiuni necesare pentru a rezolva o anumită problemă. Concepţia sau metoda utilizată pentru a rezolva problema este denumită algoritm. De exemplu, dacă vrem să determinăm dacă un număr este par sau nu, putem utiliza următorul algoritm: se divide numărul cu 2; dacă restul împărţirii este 0, atunci numărul este par, altfel numărul este impar. După determinarea algoritmului putem trece la scrierea instrucţiunilor necesare pentru a implementa algoritmul pe un anumit calculator (sau într-un anumit limbaj). Aceste instrucţiuni pot fi exprimate în declaraţiile unui anumit limbaj, cum ar fi : PASCAL, BASIC, sau C.

Limbaje de nivel înalt La începutul evoluţiei lor, calculatoarele puteau fi programate numai în termenii numerelor binare, care corespundeau direct la anumite instrucţiuni şi locaţii din memoria calculatorului. Acest limbaj este denumit limbaj maşină sau cod maşină, iar instrucţiunile respective sunt denumite instrucţiuni maşină. Următorul pas tehnologic, în evoluţia softului (programării), a fost apariţia limbajelor de asamblare, care permiteau programatorului să lucreze cu calculatorul la un nivel uşor ridicat. În locul secvenţelor de numere binare, care realizau anumite task-uri (sarcini), limbajul de asamblare permite programatorului să utilizeze nume simbolice pentru a realiza anumite operaţii şi pentru a 2

face referire la anumite locaţii de memorie. Un program special, denumit asamblor, translatează (traduce) programul scris în limbaj de asamblare, de la formatul său simbolic, la instrucţiunile maşină, specifice calculatorului, de altfel, singurele pe care acesta le poate executa. Datorită corespondenţei de unu la unu, existentă între declaraţiile limbajului de asamblare şi o anumită instrucţiune maşină, limbajele de asamblare sunt denumite, sau privite, ca limbaje de nivel coborât (sau scăzut). Programatorul trebuie să cunoască setul de instrucţiuni ale calculatorului respectiv, pentru a scrie un program în limbaj de asamblare, iar programul obţinut nu este portabil; deci programul nu va putea fi rulat (executat) pe un alt tip de calculator, fără a fi rescris, deoarece fiecare tip de calculator are setul său de instrucţiuni specifice, dependent de maşină. Ulterior, au apărut aşa numitele limbaje de nivel înalt, unul dintre primele fiind FORTRANul. O instrucţiune sau declaraţie într-un limbaj de nivel înalt este translatată în mai multe instrucţiuni maşină, spre deosebire de corespondenţa unu la unu existentă între declaraţiile limbajului de asamblare şi instrucţiunile maşină. Standardizarea limbajelor de nivel înalt înseamnă că un program poate fi scris într-un limbaj, fără a fi dependent de instrucţiunile maşină; deci programul poate fi rulat pe orice maşină ce suportă limbajul respectiv, adică posedă un compilator pentru limbajul respectiv. Pentru a permite execuţia unui program scris într-un limbaj de nivel înalt s-au dezvoltat programe speciale care translatează declaraţiile dezvoltate în limbajul de nivel înalt, într-o formă pe care calculatorul respectiv o poate înţelege, adică în instrucţiuni specifice calculatorului. Un astfel de program este denumit compilator. Acesta are ca intrare programul sursă, adică programul scris într-un limbaj de programare, şi furnizează, ca ieşire, programul obiect sau programul executabil, care poate fi, ulterior executat. Mai există un tip de program care realizează translaţia de la programul sursă la cel executabil, denumit interpretor, dar acesta realizează translaţia pe măsura interpretării liniilor sursă ale programului, deci el nu furnizează un program executabil, ci realizează translaţia şi execuţia fiecărei linii sursă, pe măsura citirii declaraţiilor din programul sursă. Diferenţa dintre cele două programe de translaţie constă, în primul rând, în timpul de execuţie, care este net defavorabil interpretoarelor, care realizează, de fiecare dată, traducerea şi execuţia fiecărei instrucţiuni în cod maşină. Cele două tipuri de translatoare de cod, compilatoare şi interpretoare, precum şi asambloarele, mai sunt denumite, generic, translatoare de cod. Sisteme de operare Un sistem de operare este un program care controlează întreaga operare asupra sistemului de calcul. Toate operaţiile de intrare / ieşire, pe care le realizează un calculator sunt efectuate prin intermediul sistemului de operare. El administrează, de asemenea, resursele calculatorului şi trebuie să manipuleze execuţia programelor. Unul dintre cele mai răspândite sisteme de operare este UNIX, care se poate găsi pe multe tipuri de calculatoare. Iniţial sistemele de operare erau, de obicei, asociate cu un tip de calculator; deoarece UNIX este scris, în primul rând, în C, şi face puţine presupuneri asupra arhitecturii calculatorului, el este portabil, cu succes, pe diferite calculatoare, cu minimum de modificări. Alte sisteme de operare, larg răspândite, cum ar fi MS-DOS, Windows’95 (’98, XP), au fost dezvoltate, în primul rând, pentru calculatoarele IBM PC.

Compilatoare Un compilator analizează un program dezvoltat într-un anumit limbaj de programare şi apoi îl translatează într-o formă adecvată pentru execuţie, pe un anumit calculator. Pentru rezolvarea unei anumite probleme, cu ajutorul calculatorului, trebuie stabilit ce trebuie să realizeze programul respectiv, adică ce informaţii va include programul, ce calcule trebuie să realizeze şi ce informaţii trebuie să furnizeze utilizatorului. La acest nivel de planificare, trebuie gândit în termeni general, nu în termenii unui anumit limbaj de programare. Odată definită diagrama conceptuală a programului, se va decide asupra limbajului de implementare, în funcţie de modul de reprezentare a datelor şi metodelor de prelucrare, a interfeţei 3

cu utilizatorul, a modului de organizare a programului. Evident, noi vom alege pentru implementare limbajul C, care reprezintă scopul acestui curs. În figura următoare sunt prezentate etapele necesare pentru introducerea, compilarea şi execuţia unui program dezvoltat în limbajul C. Programul ce va fi compilat este, mai întâi, editat într-un fişier, denumit, în general, printr-un nume sugestiv, urmat de extensia c sau cpp, pentru C++, (deci: nume_fişier.c, sau nume_fişier.cpp), care specifică, că acel fişier conţine un program C. Pentru editarea lui se poate utiliza orice editor: - editorul inclus în mediul de integrat de dezvoltare de programe C, Turbo C, Borland C++, sau pentru UNIX unul dintre editoarele: vi, edit, sau emacs. În cazul utilizării unui astfel de editor, extensia fişierului, dacă nu este specificată de utilizator, va fi, în mod automat, pusă de către editor. - indiferent de editorul utilizat, trebuie creat un fişier simplu, care să nu conţină decât text (de exemplu în WS se utilizează modul ”NonDocument”, iar în WP “Text In/Out”, pentru a salva fişierul în format DOS). Acest program, salvat în fişierul specificat, este denumit program sursă, deoarece reprezintă forma originală a programului, exprimată în limbajul C. După editarea programului urmează compilarea sa, care se realizează prin apelarea compilatorului printr-o comandă specifică; sub UNIX această comandă este: cc nume_fişier.c În primul pas al procesului de compilare, acesta verifică fiecare declaraţie, dacă este conformă cu sintaxa şi semantica limbajului. Dacă sunt descoperite erori, în această fază, ele sunt raportate utilizatorului şi compilarea ia sfârşit în această fază. Erorile sunt, apoi, corectate în programul sursă şi se reia procesul de compilare. După eliminarea tuturor erorilor de sintaxă şi semantică, compilatorul va lua fiecare declaraţie a programului şi o translatează în declaraţii echivalente în limbaj de asamblare, care realizează un task identic. Următorul pas, după translatarea în limbaj de asamblare, în procesul de compilare, este translatarea declaraţiilor din limbaj de asamblare în limbaj (instrucţiuni) maşină. De cele mai multe ori asamblorul este executat în mod automat, ca parte a procesului de compilare. Asamblorul ia fiecare declaraţie, din programul în limbaj de asamblare, şi o converteşte într-un format binar, denumit “cod maşină” sau “cod obiect”, care este depus într-un alt fişier, care va avea acelaşi nume cu fişierul sursă, dar cu extensia “obj” (sau “o”, pentru UNIX). În final se realizează “editarea de legături” (link). De obicei acest pas este realizat automat (sub UNIX, când se utilizează comanda cc). Alte sisteme de operare pot cere emiterea unei comenzi specifice, pentru a realiza acest task. Scopul acestei etape este de “editare de legături” este de a furniza programul în forma finală, executabilă pe calculator. Dacă programul curent utilizează alte programe, care au fost procesate anterior de compilator, atunci în cadrul acestei etape programele sunt ”legate” împreună. De asemenea sunt căutate şi legate împreună (adică editate legăturile) cu programul obiect, şi programele din biblioteca de programe a sistemului. Fişierul obiect, cel cu extensia .o, sub UNIX, este şters de editorul de legături, după furnizarea programului executabil, dacă nu se fac referiri la alte fişiere (programe). Totuşi, dacă programul original utilizează mai multe fişiere sursă, programe multifişiere, fişierele ce conţin cod obiect sunt salvate. Spre deosebire de compilatorul de C de sub UNIX, cel de sub DOS (Windows) nu şterge fişierul obiect, când se obţine fişierul executabil. Fişierul final, rezultat după această etapă, este în format obiect executabil, şi el este memorat într-un alt fişier, gata de a fi executat (rulat). Sub DOS, el va fi denumit cu acelaşi nume, dar cu extensia .exe (nume_fişier.exe). Sub UNIX, el este denumit, în mod implicit a.out.

4

Etapele realizării unui program Pentru execuţie, comanda constă în tastarea numelui fişierului executabil, care are ca efect “încărcarea” programului cu numele respectiv, în memoria calculatorului şi începerea execuţiei sale. Pentru a vizualiza, sub UNIX, aceste fişiere, se poate utiliza comanda ls, care afişează fişierele din directorul curent. Dacă dorim să păstrăm fişierul executabil, a.out, trebuie să-l renumim (cu un nume nou), altfel acest fişier va fi înlocuit printr-un nou fişier a.out, la următoarea compilare a unui alt program Când se execută programul, fiecare declaraţie a sa este executată secvenţial. Dacă programul solicită date de la utilizator, denumite intrări (input), programul este temporar suspendat pentru introducerea datelor. Rezultatele afişate de program, denumite ieşiri (output), vor fi afişate la terminalul de la care a fost executat programul. Dacă programul nu furnizează rezultatele dorite, va fi necesară reanalizarea logicii programului; această etapă este denumită “etapa de depanare”, în care se elimină toate erorile logice. De obicei, acestea sunt eliminate prin modificări făcute în programul sursă, după care se reia întregul proces de compilare, editare de legături şi execuţie, până se obţin rezultatele dorite (corecte).

2. Structura unui program /* Exemplificare pentru structura unui program C */

5

#include main()

/* declaraţii preprocesor C */ /* nume funcţii (argumente) */

{ int numar; numar=1; printf("%d este primul numar \n",numar); }

/* declară variabila */ /* atribuire valoare */ /* apel funcţie */

După execuţia acestui program se va afişa: 1 este primul numar Să considerăm un alt exemplu, la fel de simplu, pentru a evidenţia câteva caracteristici de bază: /* exemplul 1b */ #include main() /* un program simplu */ { int num; /* se defineşte variabila num */ num = 1; /* se iniţializează variabila num cu valoarea 1 */ printf(”Este un simplu”); /* utilizarea funcţiei printf() */ printf(“exemplu.\n”); printf(“Numarul favorit este %d, deoarece”); printf(“este primul.\n”, num); } După execuţia acestui program se va afişa următorul mesaj: Este un simplu exemplu. Numarul favorit este 1, deoarece este primul.

2.1. Unităţile lexicale ale limbajului C Ca în orice limbaj există următoarele tipuri de unităţi lexicale: - identificatori (inclusiv cuvintele cheie); - constante (numerice, caracter, simbolice, enumerare); - şiruri de caractere; - operatori, şi - separatori (sau delimitatori). Înainte de a descrie aceste unităţi lexicale, care alcătuiesc liniile unui program C, sursă, trebuie precizat alfabetul limbajului , adică mulţimea semnelor (simbolurilor) pe baza cărora se construiesc aceste entităţi; acesta conţine : - cele 26 de litere mari şi mici; - cele 10 cifre (caractere numerice); - caracterul subliniere _, spaţiul ; - alte caractere speciale: +, -, *, /, :, :, etc., care se află pe tastatura calculatorului. Identificatori Un identificator este o succesiune de litere, cifre şi caracterul subliniere, şi care trebuie să înceapă cu o literă sau cu caracterul subliniere. Trebuie menţionat că C-ul face deosebire între literele mari şi cele mici, adică, de exemplu Numar şi numar, reprezintă identificatori diferiţi. Aceşti identificatori pot fi împărţiţi în două categorii: 6

- identificatori predefiniţi, sau cuvinte cheie, rezervaţi limbajului; - identificatori definiţi de utilizator. Identificatorii definiţi de utilizator pot reprezenta nume de variabile, constante, tipuri, funcţii, câmp al unei structuri, sau o macrodefiniţie. Aceşti identificatori trebuie să fie diferiţi de următoarele cuvinte cheie (rezervate) ale limbajului: char register break short const case int volatile continue long auto default signed extern do unsigned static for float struct goto double union if return while else main enum switch void sizeof typedef Aceste cuvinte au o semnificaţie bine determinată, predefinită, şi nu pot fi utilizate decât astfel cum permite sintaxa limbajului. Cuvintele cheie se scriu, obligatoriu, cu litere mici.

Constante Constantele pot fi numerice, caracter, simbolice, sau enumerare. Constantele numerice pot fi întregi sau reale.

Constante întregi O constantă întreagă este o secvenţă de cifre, care poate fi precedată, sau nu, de semnul + sau - (operatorii binari + sau -, cei care precizează semnul unei expresii). Dacă constanta începe cu cifra 0, ea este considerată o constantă octală (deci, exprimată în baza 8), în care caz toate cifrele care urmează trebuie să fie între 0 şi 7. Dacă constanta este precedată de secvenţa 0x sau 0X, ea este o constantă hexazecimală, şi cifrele care urmează pot fi în domeniul 0-9, sau a-f (sau A-F); aceste litere (mici, a-f, sau mari, A-F) sunt utilizate pentru a codifica valorile de la 10 la 15 (10=a,…,15=f), care trebuie exprimate, în hexazecimal, şi care trebuie să ocupe, ca în orice sistem de numeraţie poziţional, o singură poziţie.

Constante reale Constantele reale pot fi reprezentate în două moduri: - în forma normală, adică prin partea întreagă, ce poate fi precedată de semnul plus sau minus, un punct zecimal şi partea fracţionară. De exemplu: -12.456 - în forma cu exponent, adică forma precedentă, urmată de litera e sau E, şi, opţional, de un exponent, care este un întreg, cu semn. De exemplu: -1245.6e-2 (sau -1245.6E-2) şi care reprezintă, de fapt, valoarea: -1245.6 * 102 , adică -12.456. În ambele reprezentări partea întreagă şi cea fracţionară sunt constituite dintr-o succesiune de cifre. La o constantă reală, partea întreagă sau cea fracţionară pot lipsi, dar nu amândouă simultan; de asemenea, poate lipsi punctul zecimal, sau litera e (E) şi exponentul. Constantele reale sunt tratate ca valori cu precizie dublă, adică de tip double. Dacă dorim ca o valoare de tip real să fie considerată de tipul float, atunci ea trebuie urmată de litera f sau F. Dacă sunt urmate de litera l sau L, vor fi considerate de tip long double. 7

Constante caracter O constantă de tip caracter este reprezentată de un caracter inclus între apostrofuri, cum ar fi de exemplu: ’x’. Valoarea unei constante de tip caracter este valoarea numerică a codului caracterului, din codificarea ASCII. De exemplu, iată câteva valori asociate unor caractere: ‘0’ = 48 (30H) ; ‘A’ = 65 (41H); ‘a’ = 97 (61H) .... ‘B’ = 66 (42H); ‘b’ = 98 (62H) ‘9’ = 57 (39H); .... .... Deoarece codurile asociate sunt succesive, şi valorile ce vor fi asociate sunt succesive (pentru cifre, litere mari şi litere mici, respectiv). Constantele caracter pot participa la operaţiile aritmetice, ca şi oricare alte numere. Secvenţe de evitare (escape) Anumite caractere negrafice şi caracterele apostrof (‘) şi backslash (\) pot fi reprezentate ca şi constante caracter, cu ajutorul, aşa-numitelor, secvenţe de evitare (escape). Aceste secvenţe, de evitare, permit şi reprezentarea caracterelor mai greu de reprezentat (introdus), precum şi a oricăror configuraţii de biţi. Aceste secvenţe sunt următoarele: \a - semnal sonor (beep); \b - spaţiu înapoi (backspace); \f - linie nouă, dar pe coloana următoare celei curente (form feed); \n - linie nouă, dar pe prima coloană (new line); \r - revenire la începutul liniei curente (carriage return); \t - tabulare orizontală (horizontal tab); \v - tabulare verticală (vertical tab); \\ - backslash; \” - ghilimele; \’ - apostrof; \0 - null; \nnn - valoare caracter, în octal; \xnn - valoare caracter, în hexazecimal;

Constante simbolice O constantă simbolică este un identificator cu valoare de constantă; valoarea constantei poate fi orice şir de caractere, introdus prin construcţia (declaraţia) #define, ca de exemplu: #defineMAX 100 Compilatorul va înlocui toate apariţiile constantei simbolice MAX, cu valoarea 100. Numele constantelor simbolice se scriu, de obicei, cu litere mari, fără însă a fi obligatoriu, spre a le deosebi de alţi identificatori. Constante enumerare Un identificator care a fost declarat ca o valoare pentru un tip enumerare este considerat o constantă de un tip particular şi este, de altfel, tratat ca fiind de tipul int, de către compilator. Şiruri de caractere Un şir de caractere este o succesiune de caractere scrise între ghilimele; de exemplu: “ABCD” Ghilimelele delimitează şirul. Dacă dorim să includem şi caracterul ghilimele în şirul de caractere, pentru acesta se va utiliza secvenţa de evitare: \”. Pentru a continua un şir de caractere pe mai multe linii se poate folosi caracterul \, la sfârşitul liniei respective, caz în care acest caracter \ va fi ignorat. Sfârşitul unui şir de caractere este marcat, automat, de către compilator, prin plasarea, la sfârşitul şirului, a caracterului NULL (‘\0’), care este un caracter netipăribil. Această reprezentare înseamnă că, teoretic, nu există o limită a lungimii unui şir; programele trebuie să parcurgă şirul, analizându-l pentru a-i determina lungimea. 8

Iată un exemplu de program simplu, ce utilizează şiruri de caractere: /* exemplu de utilizare a unui sir de caractere*/ #include #define SIR “daca asta ti-e numele” main ( ) { char nume[50]; printf(“Cum te cheama ?\n”); scanf(“%s”, nume); /* descriptorul %s citeste o data de tip sir de caractere*/ printf(“Salut, %s ; %s !\n”, nume, SIR); } Observaţii: 1) Funcţia scanf citeşte caracterele până întâlneşte unul dintre caracterele: spaţiu liber, tab, sau linie nouă (newline). Pentru a citi mai multe cuvinte (propoziţii) ca un şir, se poate folosi o altă funcţie de citire gets(), pentru a manipula şiruri, în general. 2) Şirul “x” nu este acelaşi cu caracterul ‘x’. O primă diferenţă este că ‘x’ este un tip de bază (char), iar “x” este un tip derivat, un tablou de char. O a doua diferenţă este că ‘x’ este un singur caracter, un singur octet, în care se află codul ASCII al literei x, în timp ce “x” este un şir de caractere, mai exact doi octeţi: primul este ‘x’, iar cel de-al doilea este caracterul NULL (‘\0’). Pentru a determina numărul efectiv de caractere dintr-un şir se poate utiliza funcţia strlen(). În exemplul următor, vom utiliza această funcţie, dar şi operatorul sizeof, pentru a vedea care este diferenţa dintre aceştia: /* alt exemplu de utilizare a unui sir de caractere, si a unor functii*/ #include #include #define SIR “Am retinut numai numele” main ( ) { char nume[50]; printf(“Cum te cheama ?\n”); scanf(“%s”, nume); printf(“Salut, %s . %s \n”, nume, SIR); printf(“Numele are %d litere, si ocupa %d octeti \n”, strlen(nume), sizeof nume); printf(“Propozitia pentru SIR are %d litere, si ocupa %d octeti\n” , strlen(SIR), sizeof SIR); } Funcţia strlen(), returnează lungimea şirului de caractere s, fără caracterul de sfârşit: int strlen (char s[]) { int i; i = 0; while (s[i] != ‘\0’) ++i; return (i); } Operatori 9

Limbajul C prezintă un mare număr de operatori (sau semne de punctuaţie), care pot fi clasificaţi după diverse criterii: - după numărul de operanzi: unari (un operand), binari (doi operanzi), ternari (trei); - după tipul operaţiei: aritmetici, logici, la nivel de bit, de adresare, etc. În capitolele următoare vom prezenta clasele de operatori, care corespund la anumite nivele de prioritate. Separatori Un separator este un caracter sau un şir de caractere, care separă unităţile lexicale, dintr-un program C. Cel mai frecvent separator este aşa-numitul “spaţiu alb”, care poate fi: - unul sau mai multe blancuri (spaţii libere); - tab-uri orizontale sau verticale; - linie nouă (new-line), sau comentariile. Aceste construcţii sunt eliminate de către preprocesor, care furnizează această “unitate de compilare”, compilatorului. Compilatorul verifică sintaxa şi generează cod, adică furnizează modulul obiect. Acest modul este completat cu celelalte module obiect ale programului şi cu cele de bibliotecă, folosind un editor de legături; după această fază, de editare de legături, se obţine programul executabil. Separatorii admişi de limbajul C, sunt următorii: - separatorii limbajului: + - / = < > = == . ; , etc.; - ( ) utilizate în expresii, sau încadrează lista de argumente a unei funcţii; - { } acoladele încadrează instrucţiunile compuse, sau blocurile, care constituie corpul unor instrucţiuni, sau corpul unor funcţii; - [ ] delimitează dimensiunile de tablou, sau indicii acestuia; - “ “ delimitează un şir de caractere; - ‘ ‘ delimitează un caracter sau o secvenţă de evitare; - ; termină o instrucţiune; - /* */ sau // delimitează, sau precede un comentariu;

10

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF