IPCCap. 2

download IPCCap. 2

of 53

Transcript of IPCCap. 2

  • 7/28/2019 IPCCap. 2

    1/53

    Introducere n C

    B. Kernighan, D. Richie-Limbajul C

    1. Despre C. Primul program

    2. Variabile i expresii aritmetice3. Instruciunea for

    4. Constante simbolice5. Citirea i scrierea caracterelor

    6. Tablouri

    7. Funcii

    8. Tablouri de caractere

    9. Variabile automatice i domenii de vizibilitate

  • 7/28/2019 IPCCap. 2

    2/53

    Introducere n C

    Despre C C este un limbaj de programare cu destinaie universal. Esteimplementat pe majoritatea platformelor de calcul existenteazi. Este cel mai popular limbaj de programare pentru scrierea desoftware de sistem. Este folosit la fel de bine i la scrierea

    altor programe de importan deosebit n domenii numeroasei diverse. Este apreciat pentru eficiena codului obiect pe care l poate

    genera i pentru portabilitatea sa. A fost dezvoltat la nceputul anilor 1970 de Ken Thompsoni Dennis Ritchie, care aveau nevoie de un limbaj simplu i

    portabil pentru scrierea nucleului sistemului de operare UNIX.

  • 7/28/2019 IPCCap. 2

    3/53

    Introducere n C

    Despre C

    n anul 1978 s-a publicat prima ediie a crii Limbajulde programare C, avndu-i ca autori pe Brian W.Kernighan i Dennis M. Richie. n 1983, Institutul Naional pentru Standarde din America(the American National Standards Institute ANSI) a

    nfiinat o comisie care s creeze o definiie lipsit deambiguiti i independent de main a limbajului C,meninndu-i n acelai timp stilul. Rezultatul estestandardul ANSI pentru C. Ediia a 2-a a crii Limbajul de programare C(1988)descrie limbajul C aa cum este definit de standardul ANSI. Aa cum s-a scris i n prefaa primei ediii, limbajul Cdevine tot mai folositor pe msura ce experiena n lucrulcu acesta crete.

  • 7/28/2019 IPCCap. 2

    4/53

    Introducere n C

    De ce C ?

    Argumente n favoarea programrii n C

    Limbaj de programare structurat: permite o bunorganizare a programelor

    Complexitatea limbajului este de nivel mediu

    Permiteprogramarea la un nivel mai sczutdect altelimbaje, mai apropiat de hardware: operaii pe bii, accesdirect la memorie

    Potrivit pentru programarea de sistem

    Produce un cod obiect eficient: redus ca dimensiune i

    rapid n execuie

  • 7/28/2019 IPCCap. 2

    5/53

    Introducere n C

    De ce C ?

    Principalul dezavantaj

    Limbajul nu este foarte strict n ceea ce privete tipurile dedate (conversii implicite ntre tipuri) => puine verificri imulte erori nesemnalate.

    ConcluziiC este destinat specialitilor din toate domeniile deactivitate, interesai nu doar de algoritmi dar i de accesul la

    sistemul de operare i interfaa hardware.Programarea n C presupune c programatorii tiu ce fac,ceea ce este, desigur, valabil dup o anumit experien.

  • 7/28/2019 IPCCap. 2

    6/53

    Introducere n C

    Primul program

    Un program C, indiferent de mrime, este format din

    funcii i variabile. O funcie grupeaz instruciuni care precizeaz ce calcule sse efectueze atunci cnd se apeleaz funcia.

    Variabilele stocheaz valorile folosite n timpul efecturiicalculelor. Ele sunt nume simbolice ale unor locaii dememorie. Fiecare program trebuie s conin o funcie principalnumitmain. Executarea programului C const, de fapt, nexecuia instruciunilor acestei funcii. main va apela de obicei alte funcii, unele scrise de

    programator, altele din bibliotecile care sunt la dispoziie.

  • 7/28/2019 IPCCap. 2

    7/53

    Introducere n C

    Primul program

    sfritul corpului funciei}

    se apeleaz funcia printf dinbiblioteca standard pentru atipri(afia) irul de caractere

    printf(salut, lume\n);nceputul corpului funciei{

    definete funcia main, frargumente

    main()

    se include o bibliotec standard#include

  • 7/28/2019 IPCCap. 2

    8/53

    Introducere n C

    Primul program Programul s-ar putea scrie i astfel:

    #include main() {

    printf(salut, );

    printf(lume);printf(\n);

    }

    \n este notaia C pentru caracterul rnd nou. \nreprezint unsingur caracter; o astfel de notaie se numete secven escape.

    Alte secvene escape sunt:\t pentru tab,\b pentru backspace,\ pentru ghilimele i\\pentru backslash.

  • 7/28/2019 IPCCap. 2

    9/53

    Introducere n C

    Variabile i expresii aritmetice Program care afieaz un tabel de temperaturi exprimate ngrade Fahrenheit (0-300) i grade Celsius, folosind formula:

    0C=(5/9)(0F-32).#include

    /*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 */

  • 7/28/2019 IPCCap. 2

    10/53

    Introducere n C

    Variabile i expresii aritmeticefahr = prim;

    while (fahr

  • 7/28/2019 IPCCap. 2

    11/53

    Introducere n C

    Variabile i expresii aritmetice n C toate variabilele trebuie s fie declaratenainte de a fifolosite; declararea se face de obicei la nceputul funciei,naintea oricror instruciuni executabile. O declaraie enun proprietile variabilelor. Declaraiaconst 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 ntregreprezentate n binar. Tipul float desemneaz numere raionale n reprezentareanumit virgul mobil, adic numere ce pot avea i o parte

    fracionar.

  • 7/28/2019 IPCCap. 2

    12/53

    Introducere n C

    Variabile i expresii aritmetice Limbajul C furnizeazi alte cteva tipuri de date, printre care:

    char caracter un singur octet

    short ntreg scurt

    long ntreg lung

    double numr raional n reprezentare virgul mobilndubl precizie. Exist structuri de date:tablouri,structuri i uniuni formate

    cu componente de aceste tipuri de baz,pointeri ctre acestea ifuncii care returneaz valori de aceste tipuri.

    n program exist cteva instruciuni de atribuire care atribuie

    variabilelor valori iniiale: ex. prim=0; sau rezultate din calcul. Instruciunile individuale se termin prin ;

  • 7/28/2019 IPCCap. 2

    13/53

    Introducere n C

    Variabile i expresii aritmetice Ciclul while produce cte o linie a tabelului la fiecarerepetiie. Cnd rezultatul testului devinefals, ciclul iasfrit. Corpul unei instruciuni while poate consta dintr-una saumai multe instruciuni cuprinse ntre acolade sau dintr-o

    singur instruciune fr acolade. Se recomand s se indenteze instruciunile din corpulciclului. Indentarea i spaierea corespunztoare au o

    importan major n a face programele lizibile - uor decitit. Se recomand de asemenea, scrierea unei singure

    instruciuni pe o linie.

  • 7/28/2019 IPCCap. 2

    14/53

    Introducere n C

    Variabile i expresii aritmetice n instruciunea de atribuire

    celsius = 5 * (fahr-32) / 9;

    dac s-ar fi nmulit cu 5/9, toate temperaturile calculate ar fifost 0 pentru c, n C, ca i n multe alte limbaje, mprireantreag trunchiaz rezultatul (orice parte fracionar este

    nlturat). printf este o funcie pentru formatarea datelor de ieire, cudou sau mai multe argumente:

    printf(%d\t%d\n, fahr, celsius);Fiecare construcie cu % din primul argument numitspecificator de format, are corespondent, n ordine, n celelalteargumente. Acetia trebuie s concorde ca numr i tip, altfelse obin rezultate eronate.

  • 7/28/2019 IPCCap. 2

    15/53

    Introducere n C

    Variabile i expresii aritmetice Pentru a obine o aliniere la dreapta a celor doutemperaturi, adugm fiecrui %d o anumit dimensiune:printf(%3d %6d\n, fahr, celsius);

    Pentru a obne rezultate mai precise ar trebui s folosimaritmetica numerelor raionale n reprezentare virgulmobiln locul celei a ntregilor.#include

    /*afiseaza tabelul Fahrenheit-Celsius

    pt. fahr=0,20, , 300; versiunea in virgula mobila*/

    main() {

    float fahr, celsius;

    float prim, ultim, pas;

  • 7/28/2019 IPCCap. 2

    16/53

    Introducere n C

    Variabile i expresii aritmeticeprim=0.0; /* limita inferioara a temperaturii */

    ultim=300.0; /* limita superioara */pas=20.0; /* marimea pasului */

    fahr = prim;

    while (fahr

  • 7/28/2019 IPCCap. 2

    17/53

    Introducere n C

    Variabile i expresii aritmetice Dac un operator aritmetic are operanzi ntregi, se execut ooperaie cu ntregi.

    Dac un operator aritmetic are un operand n reprezentarevirgul mobili un operand ntreg, nainte ca operaia s fieexecutat, ntregul va fi convertit n numr n reprezentarevirgul mobil.

    Specificatorii din printf au urmtoarea semnificaie:

    %3.0f - se tiprete un numr n reprezentare virgul mobilntr-un cmp de cel puin 3 caractere, fr cifre zecimale.

    %6.2f - se tiprete un numr n reprezentare virgul mobil

    ntr-un cmp de cel puin 6 caractere dintre care 2caractere du unctul zecimal.

  • 7/28/2019 IPCCap. 2

    18/53

    Introducere n C

    Instruciunea for

    #include

    /*afiseaza tabelul Fahrenheit-Celsiuspentru fahr=0,20, , 300 */

    main(){

    int fahr;

    for (fahr = 0; fahr

  • 7/28/2019 IPCCap. 2

    19/53

    Introducere n C

    Instruciunea for Au fost eliminate majoritatea variabilelor. A rmas doarfahr. Limitele inferioari superioar precum i dimensiuneapasului apar ca i constante n instruciunea for. Expresia care calculeaz valoarea temperaturii n gradeCelsius apare ca al treilea argument al lui printf: n oricecontext n care este permis folosirea valorii unei variabile deun anumit tip, se poate folosi o expresie orict de complicat,de acel tip.

    Instruciunea for, ca i instruciunea while anterioar, este,de asemenea, un ciclu. ntre paranteze exist trei pri separateprin punct i virgul: iniializarea, condiia de continuare iincrementarea (reiniializarea). Ciclul se ncheie n cazul n

    care condiia a devenit fals. Iniializarea, condiia iincrementarea pot fi orice expresii.

  • 7/28/2019 IPCCap. 2

    20/53

    Introducere n C

    Constante simbolice Inserarea numerelor 0, 20 i 300 n program nu constituie ometod bun. Sunt greu de modificat ntr-o manier

    sistematic. O soluie este s se dea nume, acestor numere.Definim astfel constante simbolice sau nume simbolice:#define nume text de nlocuire

    Din acest moment, orice apariie a lui nume va fi nlocuit cutext-ul de nlocuire corespunztor. Numele constantelorsimbolice se scriu n mod convenional cu majuscule.

    #include

    #define PRIM 0

    #define ULTIM 300#define PAS 20

  • 7/28/2019 IPCCap. 2

    21/53

    Introducere n C

    Constante simbolice/*tipareste tabelul Fahrenheit-Celsius */

    main(){

    int fahr;

    for (fahr = PRIM; fahr

  • 7/28/2019 IPCCap. 2

    22/53

    Introducere n C

    Citirea i scrierea caracterelor Datele de intrare sau de ieire sub form de text , indiferentde originea sau destinaia lor sunt tratate cafluxuri de

    caractere. Unflux de texteste o secven de caractere mprit n linii;fiecare linie este format din zero sau mai multe caractereurmate de un caracter rnd nou. Biblioteca standard pune la dispoziie funcii pentru citireasau scrierea caracterelor unul cte unul. Cele mai simple sunt:getchar i putchar.

    Funcia getchar citete urmtorul caracterdintr-un flux detext aflat la intrare( de ex. la tastatur) i l returneaz cavaloare a sa.

    c = getchar();

    variabila c conine urmtorul caracter al datelor de intrare.

  • 7/28/2019 IPCCap. 2

    23/53

    Introducere n C

    Citirea i scrierea caracterelor - copiere Funcia putchar tiprete (afieaz) un caracter de fiecaredat cnd este apelat:

    putchar(c);Tiprete coninutul variabile ntregi c sub forma unuicaracter, de obicei pe ecran. Program care copiaz intrarea la ieire, caracter cu caracter. Rezolvarea n pseudocod:

    citeste un caracter

    while (caracterul nu este indicatorul de sfarsit de fisier)

    scrie caracterul care tocmai a fost citit

    citeste un caracter

  • 7/28/2019 IPCCap. 2

    24/53

    Introducere n C

    Citirea i scrierea caracterelor - copiere#include

    /* copiaza intrarea la iesire; prima versiune */

    main() {

    int c;

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

    putchar(c);

    c = getchar();

    }

    }

    Operatorul relaional !=nseamn diferit de.

  • 7/28/2019 IPCCap. 2

    25/53

    Introducere n C

    Citirea i scrierea caracterelor - copiere Problema este s distingem sfritul fiierului de intrare.Atunci cnd nu mai exist date de intrare, getchar returneaz

    o valoare special care nu poate fi confundat cu nici uncaracter autentic. Valoarea se numete EOF (EndOfFile). Trebuie s-l declarm pe c ca aparinnd unui tip suficient de

    mare pentru a stoca orice valoare pe care o returneazgetchar, inclusiv EOF. De aceea am folosit int. EOF este un ntreg definit ca i o constant simbolic n

    . n C, orice atribuire, precum c = getchar() este o expresiei are o valoare, care este chiar valoarea, de dup atribuire, amembrului stng al expresiei. n concluzie, programul poate fisimplificat astfel:

  • 7/28/2019 IPCCap. 2

    26/53

    Introducere n C

    Citirea i scrierea caracterelor - copiere#include

    /* 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 ntlnifrecvent acest stil. Prezena parantezelor este necesar deoarece precedena

    operatorului != este mai mare dect a operatorului =.

  • 7/28/2019 IPCCap. 2

    27/53

    Introducere n C

    Citirea i scrierea caracterelor numrare caractere#include

    /* numara caracterele din fisierul de intrare; prima

    versiune */main(){

    long nc;

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

    ++nc;

    printf(%ld\n, nc);}

    Operatorul ++nseamnincrementare cu unu. Operatorii ++i --(decrementare cu unu) pot fi folosii prefixai (++nc)sau postfixai (nc++).

  • 7/28/2019 IPCCap. 2

    28/53

    Introducere n C

    Citirea i scrierea caracterelor numrare caractere Se poate lucra cu numere i mai mari, folosind o variabil detip double (floatn dubl precizie). De asemenea, se va folosi

    o instruciune forn loc de while:#include

    /* numara caracterele din fisierul de intrare; a doua

    versiune */main() {

    double nc;

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

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

    }

  • 7/28/2019 IPCCap. 2

    29/53

    Introducere n C

    Citirea i scrierea caracterelor numrare caractere ; de dupfor desemneaz o instruciune vid.

    Dac fiierul de intrare nu conine nici un caracter,condiia de continuare a lui while sau for devinefals chiar

    la primul apel al lui getchar.

    Att while ct i for evalueaz condiia de continuare la

    nceputul ciclului, nainte de a trece la execuia corpului. nconsecin, programele vor aciona corect i cnd datele deintrare au lungimea zero, caz n care astfel de cicluri nu se

    parcurg niciodat.

  • 7/28/2019 IPCCap. 2

    30/53

    Introducere n C

    Citirea i scrierea caracterelor-numrare linii Programul numr liniile din fiierul de intrare.#include

    /* numara liniile din fisierul de intrare */main(){

    int c, nl;

    nl = 0;

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

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

    printf(%d\n, nl);

    }

  • 7/28/2019 IPCCap. 2

    31/53

    Introducere n C

    Citirea i scrierea caracterelor-numrare linii Instruciunea if evalueaz condiia nchis ntre paranteze i,dac acea condiie este adevrat, execut instruciunea urmt. Semnul dublu egal == este notaia C pentru este egal cu.Atenie: nceptorii n C scriu uneori =cnd se refer la ==. Un caracter scris ntre dou semne apostrof reprezint o

    valoare ntreag egal cu valoarea numeric a caracteruluirespectiv, n setul de caractere al mainii. Acesta se numeteconstant caracter, dei reprezint doar o alt modalitate de a

    scrie, n C, un ntreg mic ( ex. A este o constant caracter; nsetul de caractere ASCII valoarea sa este 65). Secvenele escape folosite n constantele ir de caracteresunt acceptate i n constantele caracter (\n este valoareacaracterului rnd nou, care n ASCII are valoarea 10).

  • 7/28/2019 IPCCap. 2

    32/53

    Introducere n C

    Citirea i scrierea caracterelor-numrare cuvinte Programul numr linii, cuvinte i caractere. Se considercuvnt orice secven de caractere care nu conine un spaiu,

    un tabulator sau un caracter rnd nou.#include

    #define INTERIOR 1 /* in interiorul unui cuvant */

    #define EXTERIOR 0 /* in afara unui cuvant */

    /* numara liniile, cuvintele si caracterele din fisierul deintrare */

    main()

    {

    int c, nl, ncuv, nc, stare;

    stare = EXTERIOR;

    d

  • 7/28/2019 IPCCap. 2

    33/53

    Introducere n C

    Citirea i scrierea caracterelor-numrare cuvintenl = 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;

    }

  • 7/28/2019 IPCCap. 2

    34/53

    Introducere n C

    Citirea i scrierea caracterelor-numrare cuvinteprintf(%d %d %d\n, nl, ncuv, nc);

    }

    S-au folosit constantele simbolice INTERIOR iEXTERIORn locul valorilor exacte 1 i 0 deoarece fac

    programul mai lizibil. Linia nl = ncuv = nc = 0; seteaz toate cele trei variabile lazero, o consecin a faptului c atribuirea este o expresie careare o valoare. Atribuirile realizeaz asocierea de la dreapta la

    stnga. Operatorul ||nseamn SAU logic. Expresiile conectate prin&& (SI logic) sau prin || se evalueaz de la stnga la dreapta ievaluarea se oprete imediat ce este stabilit adevrul saufalsitatea expresiei.

  • 7/28/2019 IPCCap. 2

    35/53

    Introducere n C

    Tablouri Program care parcurge un text i contorizeaz numrul deapariii alefiecrei cifre (ntr-un tablou), ale caracterelor tip

    spaiu alb (spaiu, tabulator, rnd nou) i ale tuturor celorlaltecaractere.#include

    /* numara cifre, spatii albe, altele */main()

    {

    int c, i, nalbe, naltele;

    int ncifre[10];

    nalbe = naltele = 0;

  • 7/28/2019 IPCCap. 2

    36/53

    Introducere n C

    Tablouri

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

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

    if (c >= 0 && c

  • 7/28/2019 IPCCap. 2

    37/53

    Introducere n C

    Tablouriprintf(cifre=);

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

    printf(, spatii albe = %d, altele = %d\n, nalbe,

    naltele);}

    Declaraia int ncifre[10]; declar variabila ncifre ca fiind

    un tablou de 10 ntregi. n C, indicii tablourilor ncepntotdeauna de la 0, deci elementele sunt ncifre[0], ncifre[1],..., ncifre[9].

    Un indice poate fi orice expresie cu valoare ntreag.

    I d C

  • 7/28/2019 IPCCap. 2

    38/53

    Introducere n C

    Tablouri ablonulif (conditie1)

    instructiune1

    else if (conditie2)

    instructiune2

    ....

    ....

    elseinstructiunen

    apare frecvent n programe ca o modalitate de a exprimadecizia multipl.

    I t d C

  • 7/28/2019 IPCCap. 2

    39/53

    Introducere n C

    Funcii O funcie furnizeaz o modalitate convenabil de a ncapsulaanumite calcule care pot fi utilizate(apelate) ulterior fr a nepreocupa, n momentul apelului, de modul lor de implementare. Limbajul C face folosirea funciilor uoar, convenabilieficient.

    Definiia unei funcii are urmtoarea form:

    tipul-rezultatului numele-functiei (declaratiileparametrilor)

    {declaratii

    instructiuni

    }

    I t d C

  • 7/28/2019 IPCCap. 2

    40/53

    Introducere n C

    Funcii#include

    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;

    }

    I t d C

  • 7/28/2019 IPCCap. 2

    41/53

    Introducere n C

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

    int putere(int baza, int n)

    {

    int i, p;

    p = 1;

    for (i = 1; i

  • 7/28/2019 IPCCap. 2

    42/53

    Introducere n C

    Funcii Prima linie a funciei

    int putere(int baza, int n)

    declar tipurile i numele parametrilori tipul rezultatuluireturnat de funcie.

    n general, vom folosi denumirea deparametru pentru ovariabil enumerat n lista nchis ntre paranteze din definiiaunei funcii i cea de argumentpentru valoarea folosit ntr-un

    apel de funcie. Valoarea calculat n funcia putere este returnat ctre mainde instruciunea return. Dupreturn poate urma orice

    expresie. Nu este necesar ca o funcie s returneze o valoare.

    Introducere n C

  • 7/28/2019 IPCCap. 2

    43/53

    Introducere n C

    Funcii Declaraia

    int putere(int m, int n);

    aflat naintea lui main se numeteprototip de funcie itrebuie s concorde cu definiia i apelurile funciei putere. Nu este necesar ca numele parametrilor s corespund. Unprototip poate fi scris :

    int putere(int, int);

    Numele folosite n definiia efectiv a funciei puterepentru parametrii si sunt locale funciei putere i nu suntvizibile pentru nici o alt funcie. Acest lucru este valabil ipentru variabilele locale i i p. Aceste variabile se numesc, n

    C, variabile automatice.

    Introducere n C

  • 7/28/2019 IPCCap. 2

    44/53

    Introducere n C

    Transmiterea argumentelor prin valoare n C, toate argumentele funciilor sunt transmise prinvaloare. Acest lucru nseamn c funcia apelat primete

    valorile argumentelor sale prin stocare n variabile temporarecreate n stiv special n acest scop. n acest fel,funcia nuare acces la locaiile de memorie ale variabilelor originale.

    n C,funcia apelat nu poate modifica direct variabilacorespunztoare argumentului transmis din funcia apelant;ea nu poate modifica dect copia temporar.

    Apelul prin valoare conduce la programe mai compacte, cumai puine variabile neeseniale, deoarece parametrii pot fitratai n rutina apelat ca variabile locale, convenabiliniializate ca urmare a apelului.

    Introducere n C

  • 7/28/2019 IPCCap. 2

    45/53

    Introducere n C

    Simularea transmiterii prin adres Cnd este necesar, se poate face ca o funcie s modifice ovariabil din funcia apelant. Funcia apelant trebuie s

    furnizeze adresa variabilei ce va fi accesat (unpointerctre acea variabil), iar funcia apelat trebuie s declare

    parametrul ca fiind pointeri s acceseze variabila indirect,

    prin intermediul acestuia(vezi capitolul despre pointeri). O alt excepie este n cazul tablourilor: cnd numele unuitablou este folosit ca argument,valoarea transmis funciei

    este adresa locaiei primului element al tabloului. Folosindaceast valoare ca pe o variabil cu indici, funcia poateaccesa i poate modificadirect orice element al tabloului.

    Introducere n C

  • 7/28/2019 IPCCap. 2

    46/53

    Introducere n C

    Tablouri de caractere Este tipul de tablou cel mai des folosit n C. Program care citete un set de linii de text i o tiprete 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 fragmentecare vor fi organizate ca funcii: preluarea liniei, testarea liniei,salvarea liniei.

    Introducere n C

  • 7/28/2019 IPCCap. 2

    47/53

    Introducere n C

    Tablouri de caractere#include

    #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 */

    Introducere n C

  • 7/28/2019 IPCCap. 2

    48/53

    Introducere n C

    Tablouri de caracterechar 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);

    }

    Introducere n C

  • 7/28/2019 IPCCap. 2

    49/53

    Introducere n C

    Tablouri de caractereif (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;

    Introducere n C

  • 7/28/2019 IPCCap. 2

    50/53

    Introducere n C

    Tablouri de caracterefor (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;

    }

    Introducere n C

  • 7/28/2019 IPCCap. 2

    51/53

    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;

    }

    Introducere n C

  • 7/28/2019 IPCCap. 2

    52/53

    Introducere n C

    Tablouri de caractere Lungimea tabloului s[ ] nu este necesar n funcia preialinie,din moment ce dimensiunea sa este setat n funcia main:

    char linie[MAXLINIE].

    Tipul int este tipul returnat implicit. Acesta poate fi omis.

    Unele funcii returneaz o valoare util; altele, precumcopiaza, sunt folosite numai pentru efectul lor.

    Funcia preialinie aeaz caracterul \0 (caracterul nul, a

    crui valoare este zero) la sfritul tabloului pe care l creaz,pentru a marca sfritul irului de caractere.

    Specificatorul de format %s din printf ateapt ca argumentul

    corespunztor s fie un ir de caractere terminat cu \0 .

    Introducere n C

  • 7/28/2019 IPCCap. 2

    53/53

    Introducere n C

    Variabile automatice i domenii de vizibilitate Variabilele din funcia main: linie, cea_mai_lunga, sunt privatesau locale funciei main. Nici o alt funcie nu poate avea acces

    direct la acestea. Acest lucru este valabil i pentru variabilele din altfuncii (de ex. variabila idin funcia preialinie nu are legtur cuvariabila idin funcia copiaz).

    Fiecare variabil local dintr-o funcie i ncepe existena doarcnd este apelat funcia respectivi dispare cnd se iese dinfuncie. Astfel de variabile se numesc automatice.

    Se pot defini i variabile externe tuturor funciilor, adic variabileaccesibile din orice funcie. Fiind global accesibile, pot fi folosite nlocul argumentelor pentru a transmite date ntre funcii. Totui,utilizarea excesiv a acestui mod de comunicare ntre funcii esteconsiderat duntor i contrar unui bun stil de programare.