introducereîn c - seap.usv.rovaleriul/lupu/cap2.pdf · introducereîn c despre c În anul 1978 s-a...

53
Introducere în C B. Kernighan, D. Richie-Limbajul C 1. Despre C. Primul program 2. Variabile şi expresii aritmetice 3. Instrucţiunea for 4. Constante simbolice 5. Citirea şi scrierea caracterelor 6. Tablouri 7. Funcţii 8. Tablouri de caractere 9. Variabile automatice şi domenii de vizibilitate

Upload: lydung

Post on 13-Mar-2018

217 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

B. Kernighan, D. Richie-Limbajul C

1. Despre C. Primul program

2. Variabile şi expresii aritmetice

3. Instrucţiunea for

4. Constante simbolice

5. Citirea şi scrierea caracterelor

6. Tablouri

7. Funcţii

8. Tablouri de caractere

9. Variabile automatice şi domenii de vizibilitate

Page 2: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Despre C

� C este un limbaj de programare cu destinaţie universală. Este implementat pe majoritatea platformelor de calcul existente azi.� Este cel mai popular limbaj de programare pentru scrierea de software de sistem. Este folosit la fel de bine şi la scrierea altor programe de importanţă deosebită în domenii numeroase şi diverse.� Este apreciat pentru eficienţa codului obiect pe care îl poate genera şi pentru portabilitatea sa.� A fost dezvoltat la începutul anilor 1970 de Ken Thompsonşi Dennis Ritchie, care aveau nevoie de un limbaj simplu şi portabil pentru scrierea nucleului sistemului de operare UNIX.

Page 3: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Despre C

� În anul 1978 s-a publicat prima ediţie a cărţii “Limbajul de programare C”, avându-i ca autori pe Brian W.Kernighanşi Dennis M. Richie.� În 1983, Institutul Naţional pentru Standarde din America (the American National Standards Institute – ANSI) a înfiinţat o comisie care să creeze “o definiţie lipsită de ambiguităţi şi independentă de maşină a limbajului C”, menţinându-i în acelaşi timp stilul. Rezultatul este standardul ANSI pentru C.� Ediţia a 2-a a cărţii “Limbajul de programare C”(1988) descrie limbajul C aşa cum este definit de standardul ANSI.� Aşa cum s-a scris şi în prefaţa primei ediţii, limbajul C “devine tot mai folositor pe măsura ce experienţa în lucrul cu acesta creşte”.

Page 4: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

De ce C ?

Argumente în favoarea programării în C� Limbaj de programare structurat: permite o bună organizare a programelor

� Complexitatealimbajului este de nivel mediu

� Permite programareala un nivel mai scăzutdecât alte limbaje, mai apropiat de hardware: operaţii pe biţi, acces direct la memorie

� Potrivit pentru programarea de sistem

� Produce un cod obiect eficient: redus ca dimensiune şi rapid în execuţie

Page 5: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

De ce C ?

Principalul dezavantaj�Limbajul nu este foarte strict în ceea ce priveşte tipurile de date (conversii implicite între tipuri) => puţine verificări şi multe erori nesemnalate.

Concluzii�C este destinat specialiştilor din toate domeniile de activitate, interesaţi nu doar de algoritmi dar şi de accesul la sistemul de operare şi interfaţa hardware.

�Programarea în C presupune că programatorii ştiu ce fac, ceea ce este, desigur, valabil după o anumită experienţă.

Page 6: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Primul program

� Un program C, indiferent de mărime, este format din funcţii şi variabile. � O funcţie grupează instrucţiuni care precizează ce calcule să se efectueze atunci când se apelează funcţia. � Variabilele stochează valorile folosite în timpul efectuării calculelor. Ele sunt nume simbolice ale unor locaţii de memorie.� Fiecare program trebuie să conţină o funcţie principală numită main. Executarea programului C constă, de fapt, în execuţia instrucţiunilor acestei funcţii.� main va apela de obicei alte funcţii, unele scrise de programator, altele din bibliotecile care sunt la dispoziţie.

Page 7: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Primul program

sfârşitul corpului funcţiei}

se apelează funcţia printf din biblioteca standard pentru a tipări(afişa) şirul de caractere

printf(“salut, lume\n”);

începutul corpului funcţiei{

defineşte funcţia main, fără argumente

main()

se include o bibliotecă standard #include <stdio.h>

Page 8: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Primul program

� Programul s-ar putea scrie şi astfel:

#include <stdio.h>main() {

printf(“salut, ”);printf(“lume”);

printf(“\n”);}

� \n este notaţia C pentru caracterul rând nou. \n reprezintă unsingur caracter; o astfel de notaţie se numeştesecvenţă escape.

� Alte secvenţe escape sunt: \t pentru tab, \b pentru backspace, \” pentru ghilimeleşi \\ pentru backslash.

Page 9: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Variabile şi expresii aritmetice

� Programcare afişează un tabel de temperaturi exprimate în grade Fahrenheit (0-300) şi grade Celsius, folosind formula:

0C=(5/9)(0F-32).#include<stdio.h>/*afiseaza tab. Fahrenheit-Celsius pt. fahr=0,20,…,300*/

main() {int fahr, celsius;int prim, ultim, pas;

prim=0; /* limita inferioara a temperaturii */ultim=300; /* limita superioara */pas=20; /* marimea pasului */

Page 10: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Variabile şi expresii aritmetice

fahr = prim;while (fahr <= ultim) {

celsius = 5 * (fahr-32) / 9;printf(“%d\t%d\n’’, fahr, celsius);fahr = fahr + pas;

}}� /* ….. */ constituie un comentariu. Toate caractereleaflate între /* şi */ sunt ignorate de compilator.� Comentariile pot fi plasate în program oriunde poate fi plasat un spaţiu, un tabulatorsau un caracter rând nou.

Page 11: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Variabile şi expresii aritmetice

� În C toate variabilele trebuie să fie declarateînainte de a fi folosite; declararea se face de obicei la începutul funcţiei, înaintea oricăror instrucţiuni executabile.� O declaraţie enunţă proprietăţile variabilelor. Declaraţia constă dintr-un nume de tip şi o listă de variabile.

int fahr, celsius;int prim, ultim, pas;

� Tipul int arată că variabilele enumerate sunt de tip întreg reprezentate în binar.� Tipul float desemnează numere raţionale în reprezentarea numită virgulă mobilă, adică numere ce pot avea şi o parte fracţionară.

Page 12: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Variabile şi expresii aritmetice� Limbajul C furnizează şi alte câteva tipuri de date, printre care:

char caracter – un singur octet

short întreg scurt

long întreg lung

double număr raţional în reprezentare virgulă mobilă în dublă precizie.

� Există structuri de date: tablouri, structuri şi uniuni formate cu componente de aceste tipuri de bază, pointeri către acestea şi funcţii care returnează valori de aceste tipuri.

� În program există câteva instrucţiuni de atribuirecare atribuie variabilelor valori iniţiale: ex. prim=0; sau rezultate din calcul.

� Instrucţiunile individuale se termină prin ;

Page 13: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Variabile şi expresii aritmetice

� Ciclul while produce câte o linie a tabelului la fiecare repetiţie. Când rezultatul testului devine fals, ciclul ia sfârşit.� Corpul unei instrucţiuni while poate consta dintr-una sau mai multe instrucţiuni cuprinse între acolade sau dintr-o singură instrucţiune fără acolade.� Se recomandă să se indentezeinstrucţiunile din corpul ciclului. Indentareaşi spaţierea corespunzătoare au o importanţă majoră în a face programele lizibile - uşor de citit. � Se recomandă de asemenea, scrierea unei singure instrucţiuni pe o linie.

Page 14: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Variabile şi expresii aritmetice

� În instrucţiunea de atribuirecelsius = 5 * (fahr-32) / 9;

dacă s-ar fi înmulţit cu 5/9, toate temperaturile calculate ar fi fost 0 pentru că, în C, ca şi în multe alte limbaje, împărţirea întreagă trunchiază rezultatul(orice parte fracţionară este înlăturată).� printf este o funcţie pentru formatarea datelor de ieşire, cu două sau mai multe argumente:

printf(“%d\t%d\n’’, fahr, celsius);Fiecare construcţie cu % din primul argument numită specificator de format, are corespondent, în ordine, în celelalte argumente. Aceştia trebuie să concorde ca număr şi tip, altfel se obţin rezultate eronate.

Page 15: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Variabile şi expresii aritmetice

� Pentru a obţine o aliniere la dreaptaa celor două temperaturi, adăugăm fiecărui %d o anumită dimensiune:printf(“%3d %6d\n’’, fahr, celsius);� Pentru a obţínerezultate mai precise ar trebui să folosim aritmetica numerelor raţionale în reprezentare virgulă mobilă în locul celei a întregilor.#include<stdio.h>/*afiseaza tabelul Fahrenheit-Celsius

pt. fahr=0,20, …, 300; versiunea in virgula mobila*/main() {

float fahr, celsius;float prim, ultim, pas;

Page 16: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Variabile şi expresii aritmetice

prim=0.0; /* limita inferioara a temperaturii */ultim=300.0; /* limita superioara */pas=20.0; /* marimea pasului */fahr = prim;while (fahr <= ultim) {

celsius = (5.0/9.0) * (fahr-32.0);printf(“%3.0f %6.2f\n’’, fahr, celsius);fahr = fahr + pas;

}}

Page 17: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Variabile şi expresii aritmetice

� Dacă un operator aritmetic are operanzi întregi, se execută o operaţie cu întregi.

� Dacă un operator aritmetic are un operand în reprezentare virgulă mobilă şi un operand întreg, înainte ca operaţia să fie executată, întregul va fi convertit în număr în reprezentare virgulă mobilă.

� Specificatorii din printf au următoarea semnificaţie:

%3.0f - se tipăreşte un număr în reprezentare virgulă mobilă într-un câmp de cel puţin 3 caractere, fără cifre zecimale.

%6.2f - se tipăreşte un număr în reprezentare virgulă mobilă într-un câmp de cel puţin 6 caractere dintre care 2 caractere după punctul zecimal.

Page 18: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Instrucţiunea for

#include<stdio.h>/*afiseaza tabelul Fahrenheit-Celsius

pentru fahr=0,20, …, 300 */main() {

int fahr;for (fahr = 0; fahr <= 300; fahr = fahr + 20)printf(“%3d %6.2f\n”, fahr, (5.0/9.0) * (fahr-32));

}

Page 19: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Instrucţiunea for

� Au fost eliminate majoritatea variabilelor. A rămas doarfahr.� Limitele inferioară şi superioară precum şi dimensiunea pasului apar ca şi constante în instrucţiunea for. � Expresia care calculează valoarea temperaturii în grade Celsius apare ca al treilea argument al lui printf: în orice context în care este permisă folosirea valorii unei variabile de un anumit tip, se poate folosi o expresie oricât decomplicată,de acel tip.� Instrucţiunea for, ca şi instrucţiunea while anterioară, este,de asemenea, un ciclu. Între paranteze există trei părţi separate prin punct şi virgulă: iniţializarea, condiţia de continuare şi incrementarea (reiniţializarea). Ciclul se încheie în cazul în care condiţia a devenit falsă. Iniţializarea, condiţia şi incrementarea pot fi orice expresii.

Page 20: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Constante simbolice

� Inserarea numerelor 0, 20şi 300 în program nu constituie o metodă bună. Sunt greu de modificat într-o manieră sistematică. O soluţie este să se dea nume, acestor numere.Definim astfel constante simbolicesau nume simbolice: #define nume text de înlocuire

Din acest moment, orice apariţie a lui numeva fi înlocuită cu text-ul de înlocuire corespunzător. Numele constantelor simbolice se scriu în mod convenţional cu majuscule.

#include<stdio.h>#define PRIM 0

#define ULTIM 300#define PAS 20

Page 21: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Constante simbolice

/*tipareste tabelul Fahrenheit-Celsius */main() {int fahr;for (fahr = PRIM; fahr <=ULTIM; fahr=fahr+PAS)

printf(“%3d %6.2f\n”, fahr, (5.0/9.0)* (fahr-32));}

� Obs.La sfârşitul unei linii define nu apare ;

Page 22: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Citirea şi scrierea caracterelor

� Datele de intrare sau de ieşire sub formă de text , indiferent de originea sau destinaţia lor sunt tratate ca fluxuri de caractere.� Un flux de texteste o secvenţă de caractere împărţită în linii; fiecare linie este formată din zero sau mai multe caractere urmate de un caracter rând nou.� Biblioteca standard pune la dispoziţie funcţii pentru citirea sau scrierea caracterelor unul câte unul. Cele mai simple sunt: getchar şi putchar.� Funcţia getchar citeşte următorul caracter dintr-un flux de text aflat la intrare( de ex. la tastatură) şi îl returnează ca valoare a sa.

c = getchar();variabila c conţine următorul caracter al datelor de intrare.

Page 23: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Citirea şi scrierea caracterelor - copiere

� Funcţia putchar tipăreşte (afişează) un caracter de fiecare dată când este apelată:

putchar(c);Tipăreşte conţinutul variabile întregi c sub forma unui caracter, de obicei pe ecran.� Program care copiază intrarea la ieşire, caracter cu caracter.� Rezolvarea în pseudocod:

citeste un caracterwhile (caracterul nu este indicatorul de sfarsit de fisier)

scrie caracterul care tocmai a fost cititciteste un caracter

Page 24: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Citirea şi scrierea caracterelor - copiere

#include<stdio.h>/* copiaza intrarea la iesire; prima versiune */main() {

int c;

c = getchar();while (c != EOF) {

putchar(c);c = getchar();

}}� Operatorul relaţional != înseamnă “diferit de”.

Page 25: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Citirea şi scrierea caracterelor - copiere

� Problema este să distingem sfârşitul fişierului de intrare. Atunci când nu mai există date de intrare, getchar returnează o valoare specială care nu poate fi confundată cu nici un caracter autentic. Valoarea se numeşte EOF (End Of File). � Trebuie să-l declarăm pe c ca aparţinând unui tip suficient de mare pentru a stoca orice valoare pe care o returneazăgetchar, inclusiv EOF. De aceea am folosit int.� EOF este un întreg definit ca şi o constantă simbolică în<stdio.h>. � În C, orice atribuire, precum c = getchar() este o expresie şi are o valoare, care este chiar valoarea, de după atribuire, a membrului stâng al expresiei. În concluzie, programul poate fi simplificat astfel:

Page 26: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Citirea şi scrierea caracterelor - copiere

#include<stdio.h>/* copiaza intrarea la iesire; a doua versiune */main(){

int c;while ( (c = getchar() ) != EOF)

putchar(c);}� Programul rezultat este mai compact. În C Se va întâlni frecvent acest stil.� Prezenţa parantezelor este necesară deoarece precedenţa operatorului != este mai mare decât a operatorului=.

Page 27: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Citirea şi scrierea caracterelor – numărare caractere

#include<stdio.h>/* numara caracterele din fisierul de intrare; prima

versiune */main(){

long nc;nc=0;while (getchar() != EOF)

++nc;printf(“%ld\n”, nc);

}� Operatorul++ înseamnă incrementare cu unu. Operatorii ++şi --(decrementare cu unu) pot fi folosiţi prefixaţi (++nc) sau postfixaţi (nc++).

Page 28: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Citirea şi scrierea caracterelor – numărare caractere

� Se poate lucra cu numere şi mai mari, folosind o variabilă de tip double (float în dublă precizie). De asemenea, se va folosi o instrucţiune for în loc de while:#include<stdio.h>/* numara caracterele din fisierul de intrare; a doua

versiune */main() {

double nc;for (nc=0.0; getchar() != EOF; ++nc)

;printf(“%.0f\n”, nc);

}

Page 29: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Citirea şi scrierea caracterelor – numărare caractere

� ; de după for desemnează o instrucţiune vidă.

� Dacă fişierul de intrare nu conţine nici un caracter, condiţia de continuare a lui while sau for devine falsă chiar la primul apel al lui getchar.

� Atât while cât şi for evaluează condiţia de continuare la începutul ciclului, înainte de a trece la execuţia corpului. În consecinţă, programele vor acţiona corect şi când datele de intrare au lungimea zero, caz în care astfel de cicluri nu se parcurg niciodată.

Page 30: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Citirea şi scrierea caracterelor-numărare linii

� Programul numără liniile din fişierul de intrare.#include<stdio.h>/* numara liniile din fisierul de intrare */main(){

int c, nl;

nl = 0;while ( (c = getchar() ) != EOF)

if (c == ‘\n’)++nl;

printf(“%d\n”, nl);}

Page 31: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Citirea şi scrierea caracterelor-numărare linii

� Instrucţiuneaif evaluează condiţia închisă între paranteze şi, dacă acea condiţie este adevărată, execută instrucţiunea următ.� Semnul dublu egal == este notaţia C pentru “este egal cu”. Atenţie: începătorii în C scriu uneori = când se referă la ==.� Un caracter scris între două semne apostrof reprezintă o valoare întreagă egală cu valoarea numerică a caracterului respectiv, în setul de caractere al maşinii. Acesta se numeşte constantă caracter, deşi reprezintă doar o altă modalitate de a scrie, în C, un întreg mic ( ex. ‘A’ este o constantă caracter; în setul de caractere ASCII valoarea sa este 65).� Secvenţele escapefolosite în constantele şir de caractere sunt acceptate şi în constantele caracter (‘\n’ este valoarea caracterului rând nou, care în ASCII are valoarea 10).

Page 32: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Citirea şi scrierea caracterelor-numărare cuvinte

� Programul numără linii, cuvinte şi caractere. Se consideră cuvânt orice secvenţă de caractere care nu conţine un spaţiu, un tabulator sau un caracter rând nou.#include <stdio.h>#define INTERIOR 1 /* in interiorul unui cuvant */#define EXTERIOR 0 /* in afara unui cuvant *//* numara liniile, cuvintele si caracterele din fisierul de intrare */main(){

int c, nl, ncuv, nc, stare;stare = EXTERIOR;

Page 33: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Citirea şi scrierea caracterelor-numărare cuvinte

nl = ncuv = nc = 0;while ((c = getchar()) != EOF) {

++nc;if (c == ‘\n’)

++nl;if(c == ‘ ‘ || c == ‘\n’ || c == ‘\t’)

stare = EXTERIOR;else if (stare == EXTERIOR) {

stare = INTERIOR;++ncuv;

}}

Page 34: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Citirea şi scrierea caracterelor-numărare cuvinte

printf(“%d %d %d\n”, nl, ncuv, nc);}

� S-au folosit constantele simbolice INTERIOR şi EXTERIOR în locul valorilor exacte 1 şi 0 deoarece fac programul mai lizibil.� Linia nl = ncuv = nc = 0; setează toate cele trei variabile la zero, o consecinţă a faptului că atribuirea este o expresie care are o valoare. Atribuirile realizează asocierea de la dreapta la stânga.� Operatorul|| înseamnă SAU logic. Expresiile conectate prin && (SI logic) sau prin || se evaluează de la stânga la dreapta şi evaluarea se opreşte imediat ce este stabilit adevărul sau falsitatea expresiei.

Page 35: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Tablouri

� Program care parcurge un text şi contorizează numărul de apariţii ale fiecărei cifre (într-un tablou), ale caracterelor tip spaţiu alb (spaţiu, tabulator, rând nou) şi ale tuturor celorlalte caractere.#include <stdio.h>/* numara cifre, spatii albe, altele */main(){

int c, i, nalbe, naltele;int ncifre[10];nalbe = naltele = 0;

Page 36: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Tablouri

for (i = 0; i < 10; ++i)

ncifre[i] = 0;while ((c = getchar()) != EOF)

if (c >= ‘0’ && c <= ‘9’)++ncifre[c - ’0’];

else if (c == ‘ ‘ || c == ‘\n’ || c == ‘\t’)++nalbe;

else++naltele;

Page 37: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Tablouri

printf(“cifre=“);

for (i = 0; i < 10; ++i)printf(“%d”, ncifre[i]);

printf(“, spatii albe = %d, altele = %d\n”, nalbe, naltele);}

� Declaraţia int ncifre[10]; declară variabila ncifre ca fiind un tablou de 10 întregi. În C, indicii tablourilor încep întotdeauna de la 0, deci elementele sunt ncifre[0], ncifre[1], ..., ncifre[9]. � Un indice poate fi orice expresie cu valoare întreagă.

Page 38: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Tablouri

� Şablonulif (conditie1)

instructiune1

else if (conditie2)instructiune2

........

elseinstructiunen

apare frecvent în programe ca o modalitate de a exprima decizia multiplă.

Page 39: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Funcţii

� O funcţie furnizează o modalitate convenabilă de a încapsula anumite calcule care pot fi utilizate(apelate) ulterior fără a ne preocupa, în momentul apelului, de modul lorde implementare.

� Limbajul C face folosirea funcţiilor uşoară, convenabilă şi eficientă.

� Definiţia unei funcţii are următoarea formă:

tipul-rezultatului numele-functiei (declaratiileparametrilor)

{declaratii

instructiuni}

Page 40: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Funcţii

#include <stdio.h>

int putere(int m, int n);/* utilizarea functiei putere */

int main(){

int i;for (i = 0; i < 10; ++i)

printf(“%d %d %d\n”, i, putere(2,i), putere(-3, i));return 0;

}

Page 41: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Funcţii

/* putere: ridica baza la puterea n; n>=0 */

int putere(int baza, int n){

int i, p;

p = 1;for (i = 1; i<= n; ++i)

p = p * baza;return p;

}

Page 42: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Funcţii

� Prima linie a funcţiei

int putere(int baza, int n)declară tipurile şi numele parametrilorşi tipul rezultatuluireturnat de funcţie.

� În general, vom folosi denumirea de parametru pentru o variabilă enumerată în lista închisă între paranteze din definiţia unei funcţii şi cea de argument pentru valoarea folosită într-un apel de funcţie.

� Valoarea calculată în funcţia putere este returnată către mainde instrucţiunea return. După return poate urma orice expresie. Nu este necesar ca o funcţie să returneze o valoare.

Page 43: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Funcţii

� Declaraţia int putere(int m, int n);

aflată înaintea lui main se numeşte prototip de funcţie şi trebuie să concorde cu definiţia şi apelurile funcţiei putere. � Nu este necesar ca numele parametrilor să corespundă. Un prototip poate fi scris :

int putere(int, int);� Numele folosite în definiţia efectivă a funcţiei putere pentru parametrii săi sunt locale funcţiei putere şi nu sunt vizibile pentru nici o altă funcţie. Acest lucru este valabil şi pentru variabilele locale i şi p. Aceste variabile se numesc, în C, variabile automatice.

Page 44: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Transmiterea argumentelor prin valoare

� În C, toate argumentele funcţiilor sunt transmise “prin valoare”. Acest lucru înseamnă că funcţia apelată primeşte valorile argumentelor sale prin stocare în variabile temporare create în stivă special în acest scop. În acest fel, funcţia nu are acces la locaţiile de memorie ale variabilelor originale.� În C, funcţia apelată nu poate modifica direct variabila corespunzătoare argumentului transmis din funcţia apelantă; ea nu poate modifica decât copia temporară.� Apelul prin valoare conduce la programe mai compacte, cu mai puţine variabile neesenţiale, deoarece parametrii pot fi trataţi în rutina apelată ca variabile locale, convenabil iniţializate ca urmare a apelului.

Page 45: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Simularea transmiterii prin adresă

� Când este necesar, se poate face ca o funcţie să modifice o variabilă din funcţia apelantă. Funcţia apelantă trebuie să furnizeze adresa variabilei ce va fi accesată (un pointer către acea variabilă), iar funcţia apelată trebuie să declare parametrul ca fiind pointerşi să acceseze variabila indirect, prin intermediul acestuia(vezi capitolul despre pointeri).

� O altă excepţie este în cazul tablourilor: când numele unui tablou este folosit ca argument,valoarea transmisă funcţiei este adresa locaţiei primului element al tabloului. Folosind această valoare ca pe o variabilă cu indici, funcţia poate accesa şi poate modificadirect orice element al tabloului.

Page 46: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Tablouri de caractere

� Este tipul de tablou cel mai des folosit în C.� Program care citeşte un set de linii de text şi o tipăreşte pe cea mai lungă.� Pseudocod:

while (exista o alta linie)if (este mai lunga decat precedenta)

(salveaz-o)(salveaza-i lungimea)

tipareste cea mai lunga linie� Programul se împarte în mod natural în mai multe fragmente care vor fi organizate ca funcţii: preluarea liniei, testarea liniei, salvarea liniei.

Page 47: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Tablouri de caractere

#include <stdio.h>

#define MAXLINIE 1000 /* dimensiunea maxima a linieide intrare*/

int preialinie(char linie[ ], int maxlinie);void copiaza(char in[ ], char din[ ]);/* tipareste cea mai lunga linie de intrare */

int main(){

int lung; /* lungimea liniei curente */int max; /* lungimea maxima intalnita pana acum */

Page 48: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Tablouri de caractere

char linie[MAXLINIE]; /* linia de intrare curenta */

char cea_mai_lunga[MAXLINIE]; /* pentru salvarealiniei celei mai lungi */

max = 0;while ((lung = preialinie(linie, MAXLINIE)) > 0)

if (lung > max) {

max = lung;copiaza(cea_mai_lunga, linie);

}

Page 49: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Tablouri de caractere

if (max > 0) /* s-a gasit o linie */

printf(“%s”, cea_mai_lunga);return 0;

}

/* preialinie: citeste o linie, o stocheaza in “s” sireturneaza lungimea ei */

int preialinie(char s[ ], int lim)

{int c, i;

Page 50: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Tablouri de caractere

for (i= 0;i < lim-1 && (c=getchar())!=EOF && c!=‘\n’;++i)

s[ i ] = c;if (c == ‘\n’) {

s[ i ] = c;++i;

}s[ i ] = ‘\0’;

return i;}

Page 51: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Tablouri de caractere

/* copiaza: copiaza “din” in “in”; presupunem ca “in”este suficient de mare */

void copiaza(char in[ ], char din[ ])

{int i;

i=0;while (( in[ i ] = din[ i ] ) != ‘\0’)

++i;}

Page 52: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Tablouri de caractere

� Lungimea tablouluis[ ] nu este necesară în funcţia preialinie, din moment ce dimensiunea sa este setată în funcţia main:

char linie[MAXLINIE].� Tipul int este tipul returnat implicit. Acesta poate fi omis.

� Unele funcţii returnează o valoare utilă; altele, precum copiaza, sunt folosite numai pentru efectul lor.

� Funcţia preialinie aşează caracterul ‘\0’ (caracterul nul, a cărui valoare este zero) la sfârşitul tabloului pe care îl crează, pentru a marca sfârşitul şirului de caractere.

� Specificatorul de format %s din printf aşteaptă ca argumentul corespunzător să fie un şir de caractere terminat cu ‘\0’ .

Page 53: Introducereîn C - seap.usv.rovaleriul/lupu/Cap2.pdf · Introducereîn C Despre C În anul 1978 s-a publicat prima ediţie a c ărţii “Limbajul de programare C”, avându-i ca

Introducere în C

Variabile automatice şi domenii de vizibilitate

� Variabilele din funcţia main: linie, cea_mai_lunga, sunt private sau locale funcţiei main. Nici o altă funcţie nu poate avea acces direct la acestea. Acest lucru este valabil şi pentru variabilele din alte funcţii (de ex. variabila i din funcţia preialinie nu are legătură cu variabila i din funcţia copiază).

� Fiecare variabilă locală dintr-o funcţie îşi începe existenţa doar când este apelată funcţia respectivă şi dispare când se iese din funcţie. Astfel de variabile se numescautomatice.

� Se pot defini şi variabileexternetuturor funcţiilor, adică variabile accesibile din orice funcţie. Fiind global accesibile, pot fi folosite în locul argumentelor pentru a transmite date între funcţii. Totuşi, utilizarea excesivă a acestui mod de comunicare între funcţii este considerat dăunător şi contrar unui bun stil de programare.