Thanks Thanks:  0
Likes Likes:  0
Dislikes Dislikes:  0
Results 1 to 2 of 2

Thread: Programare in C(step by step)

  1. #1
    Standard RSP member gessle's Avatar
    Join Date
    31 Jan 2007
    Location
    tg ocna;jud. BACAU
    Posts
    719
    Mentioned
    0 Post(s)
    Rep Power
    67

    Thumbs up Programare in C(step by step)

    Sa incepem cu o introducere rapida in C. Scopul nostru este sa preezentam elementele esentiale ale limbajului in programe reale, fara insa a ne impotmoli in detalii, reguli formale si exceptii. In acest punct al expunerii nu incercam sa fim completi si nici macar foarte precisi (mentionam totusi ca exemplele vor sa fie corecte). Dorim sa va aducem cit mai repede posibil in punctul in care veti fi capabili sa scrieti programe utile si, pentru aceasta, ne-am concentrat asupra fundamentelor: variabile si constante, aritmetica, controlul fluxului, functii si rudimente de operatii de I/O. Am lasat deoparte intentionat din acest capitol acele caracteristici ale limbajului C care sint de importanta vitala in scrierea programelor mai mari. Acestea includ pointerii, structurile, majoritatea din bogatul set de operatori ai lui C, anumite instructiuni de control al fluxului si o multime de detalii.
    Acest mod de abordare are neajunsurile lui, desigur. Cel mai notabil este acela ca povestea completa a caracteristicilor oricarui limbaj de programare nu este gasita intr-un singur loc, iar o initiere in el, fiind scurta, poate induce in eroare. Deoarece exemplele nu pot folosi intreaga putere a lui C, ele nu sint atit de concise si de elegante pe cit ar putea fi. Am incercat sa minimalizam aceste efecte, dar fiti atenti!
    Un alt neajuns este acela ca in capitolele urmatoare vom repeta in mod necesar cite ceva din acest capitol. Speram ca aceasta repetitie va va ajuta mai mult decit va va plictisi. In orice caz, programatorii experimentati vor fi capabili sa extrapoleze din materialul din acest capitol propriile lor nevoi de programare.

    1.1 Sa incepem

    Singurul mod de a invata un nou limbaj de programare este de a scrie programe in el. Primul program pe care-l vom scrie este acelasi pentru toate limbajele:
    Tipariti cuvintele
    hello, world
    Acesta este primul obstacol; pentru a sari peste el, trebuie sa fiti in stare sa creati undeva textul program, sa-l compilati cu succes, sa-l incarcati, sa-l executati si sa aflati textul tiparit acolo unde este iesirea calculatorului dumneavoastra. In C, programul pentru a tipari "hello, world" este:
    main ()
    {
    printf("hello, world\n");
    }
    Cum ruleaza acest program, depinde de sistemul pe care-l folositi, Drept exemplu specific, pe sistemul de perare RSX, trebuie sa creati acest program sursa intr-un fisier al carui nume se termina in ".C", de exemplu "hello.C" apoi sa-l compilati cu comenzile:
    >cc hello
    >as hello
    Daca n-ati gresit nimic, de exemplu sa fi uitat un caracter sau sa fi inversat doua caractere, compilarea se va desfasura silentios si va produce un fisier obiect numit "hello.obj". Lansindu-l in executie dupa linkeditare cu comenzile
    >tkb hello=hello,lb:[1,1]clib/lb
    >run hello
    va produce
    hello, world
    ca iesire a sa. Pe alte sisteme, regulile vor fi diferite; verificati-le cu expertul local.

    Si acum citeva explicatii despre programul insusi. Un program C, oricare i-ar fi marimea, consta din una sau mai multe "functii" care specifica operatiile efective de calculat care trebuiesc facute. Functiile din C sint similare cu functiile si subrutinele dintr-un program Fortran sau cu procedurile din PL/1, Pascal,etc.
    In exemplul nostru, "main" este o astfel de functie. In mod normal aveti libertatea de a da functiilor ce nume doriti, dar "main" este un nume special - programul dumneavoastra se va executa de la inceputul lui "main". Aceasta inseamna ca fiecare program trebuie sa aibe un "main" undeva, ca "main" va invoca in mod obisnuit alte functii pentru a-si realiza scopul, unele venind din acelasi program iar altele din biblioteci ce contin functii
    scrise anterior.
    O metoda de a comunica date intre functii este prin argumentele functiilor. Parantezele care urmeaza dupa numele functiei includ lista de argumente. In cazul nostru, "main" este o functie fara argumente ceea ce se indica prin "()". Acoladele "{ }" includ instructiunile care alcatuiesc functia. Ele sint analoage lui "DO-END" din PL/1 sau lui "begin-end" din ALGOL, PASCAL, etc. O functie este apelata prin nume, urmate de o lista de argumente in paranteze.
    Nu exista instructiunea CALL ca in FORTRAN sau PL/1. Parantezele trebuie sa fie prezente chiar daca nu exista argumente.
    Linia care spune:
    printf("hello, world\n");
    este un apel de functie, care cheama o functie numita "printf" cu argumentul ("hello, world\n"). "printf" este o functie din biblioteca care tipareste pe terminal (daca nu este specificata o alta destinatie). In acest caz, ea tipareste sirul de caractere care alcatuiesc argumentul.
    O secventa alcatuita din orice numar de caractere cuprinse intre doua ghilimele "..." se numeste sir de caractere sau constanta sir. Pentru moment, singura folosire a sirurilor de caractere va fi ca argumentele pentru "printf" si alte functii.
    Secventa "\n" din sir este notatia din C pentru caracterul "linie noua", care, cind este tiparit, avanseaza cursorul terminalului la marginea din stinga a urmatoarei linii. Daca uitati "\n" (un experiment care merita facut), veti observa ca iesirea dumneavoastra nu se termina cu o linie noua. Singurul mod de a avea caracterul "linie noua" in "printf" este "\n" ca argument. Daca incercati ceva de tipul
    printf("hello, world");
    compilatorul C va va tipari un diagnostic neprietenos despre ghilimele absente.
    "printf" nu furnizeaza o linie noua in mod automat, asa ca apelurile multiple pot fi folosite pentru a tipari o linie pe etape. Primul nostru program poate fi scris la fel de bine si astfel:
    main()
    {
    printf("hello, ");
    printf("world");
    printf("\n");
    }
    pentru a produce o iesire identica.
    Sa notam ca "\n" reprezinta un singur caracter. O "secventa escape" ca de exemplu "\n" este in general un mecanism extensibil pentru reprezentarea caracterelor greu de obtinut sau invizibile. Printre alte secvente escape, limbajul C poseda: \t pentru tab, \b pentru backspace, \" pentru apostrof dublu si \\ pentru backspace.


    1.2. Variabile si aritmetica


    Urmatorul program tipareste tabela de temperaturi Fahrenheit si echivalentele lor in centigrade sau grade Celsius, folosind formula: C = (5 / 9) * (F - 32).
    0 -17.8
    20 -6.7
    40 4.4
    60 15.6
    ...
    260 126.7
    280 137.8
    300 148.9
    Iata acum si programul:
    /* Print Fahrenheit-Celsius table
    for f = 0, 20, ..., 300 */
    main()
    {
    int lower, upper, step;
    float fahr, celsius;
    lower = 0; /* lower limit of temperature table */
    upper = 300; /* upper limit */
    step = 20; /* step size */
    fahr = lower;
    while (fahr <= upper) {
    celsius = (5.0 / 9.0) * (fahr - 32.0);
    printf("%4.0f %6.1f\n", fahr, celsius);
    fahr = fahr + step;
    }
    }
    Primele doua linii :
    /* Print Fahrenheit-Celsius table
    for f = 0, 20, ..., 300 */
    sint un comentariu, care in acest caz explica pe scurt ce face programul. Orice caractere cuprinse intre "/*" si "*/" sint ignorate de compilator; ele pot fi folosite liber pentru a face programul mai usor de inteles. Comentariile pot apare oriunde poate aparea un spatiu sau o linie noua.
    In limbajul C, toate variabilele trebuie declarate inainte de a fi folosite, deobicei la inceputul liniei, inaintea oricarei instructiuni executabile. Daca veti uita o declaratie, veti primi un diagnostic de la compilator. O declaratie consta dintr-un "tip" si o lista de variabile care au acel tip, ca in:
    int lower, upper, step;
    float fahr, celsius;
    Tipul "int" implica faptul ca variabilele listate sint intregi;"float" denota virgula mobila, adica numere care pot avea parte fractionara. Precizia atit pentru "int" cit si pentru "float" depinde de calculatorul pe care-l folositi. Pentru PDP-11, de exemplu, un "int" este un numar cu semn de 16 biti, adica un numar cuprins intre -32768 si +32767 . Un numar "float" este o cantitate ce se reprezinta pe 32 de biti ceea ce revine la aproximativ sapte cifre semnificative, cu magnitudinea cuprinsa aproximativ intre 10 ^ -38 si 10 ^ +38. Capitolul 2 da olista a acestor marimi pentru alte calculatoare.
    Pe linga tipurile "int" si "float", limbajul C poseda si alte tipuri de date fundamentale :
    "char" caracter - un singur octet
    "short" intreg scurt
    "long" intreg lung
    "double" numar flotant dubla precizie
    Marimea acestor obiecte este deasemenea dependenta de calculator; detalii se dau in Capitolul 2. Exista deasemenea "tablouri", "structuri" si "uniuni" de asemenea tipuri de baza, "pointeri" la ele si "functii" care le returneaza si cu toate ne vom intilni in aceasta carte.
    Calculul efectiv in programul de conversie temperatura incepe cu asignarile:
    lower = 0;
    upper = 300;
    step = 20;
    fahr = lower;
    care seteaza variabilele pe valorile lor de start. Instructiunile individuale se termina cu punct si virgula.
    Fiecare linie a tabelei este calculata in acelasi fel, asa ca vom folosi o bucla care se repeta odata pe linie; acesta este scopul instructiunii "while":
    while (fahr <= upper) {
    ...
    }
    Este testata conditia din paranteza. Daca ea este adevarata (fahr este mai mic sau egal cu upper), este executat corpul buclei (toate instructiunile incluse intre parantezele { si }). Apoi conditia este retestata si, daca este adevarata, corpul este executat din nou . Cind testul devine fals (fahr este mai mare decit upper), bucla se termina si executia continua cu instructiunea care urmeaza buclei. Deoarece in acest program nu mai exista alte instructiuni care sa succeada bucla, executia lui se termina.
    Corpul unei bucle while poate fi alcatuit din mai multe instructiuni incluse intre acolade, ca in programul de mai sus sau dintr-o singura instructiune, fara paranteze, ca in exemplul de mai jos:
    while(i<j)
    i = 2 * i;
    In ambele cazuri, instructiunile controlate de "while" sint decalate cu un tab, asa ca se observa de la prima privire ce instructiuni se gasesc in interiorul buclei. Decalarea scoate in evidenta structura logica a programului. Cu toate ca limbajul C este destul de liberal in ceea ce priveste pozitionarea instructiunilor, o tabulare potrivita si folosirea spatiilor albe sint critice in scrierea programelor usor citibile si de catre altii decit autorul lor.
    Recomandam scrierea unei singure instructiuni pe un rind si lasarea de spatii (uzual) in jurul operatorilor. Pozitia acoladelor este mai putin importanta; noi am ales unul dintre stilurile cele mai populare. Alegeti-va un stil care va convine, apoi folositi-l consecvent.
    Temperatura celsius este calculata si asignata lui "celsius" prin instructiunea:
    celsius = (5.0 / 9.0) * (fahr - 32.0);
    Ratiunea pentru folosirea lui (5.0/9.0) in locul mai simplei 5/9 este aceea ca in C, ca si in multe alte limbaje, impartirea intreaga trunchiaza rezultatul, asa ca orice parte fractionara este eliminata. Astfel 5/9 este zero si tot asa ar fi fost toate temperaturile. Un punct zecimal intr-o constanta indica faptul ca aceasta este flotanta si deci 5.0/9.0 este 0.5555... ceea ce am si dorit. Am scris deasemenea 32.0 in loc de 32, chiar daca deoarece "fahr" este "float", 32 ar fi convertit automat in "float" inainte de scadere. Ca o problema de stil, este bine sa scriem constantele flotante cu punct zecimal explicit chiar cind au valori intregi; aceasta accentueaza natura lor flotanta pentru cititorii umani si ne asigura ca si compilatorul va gindi in acelasi mod ca si noi.
    Regulile detaliate pentru conversiile de intregi in flotante sint date in Capitolul 2. Acum sa notam doar ca asignarea
    fahr = lower;
    si testul
    while (fahr <= upper)
    vor lucra amindoua asa cum ne asteptam "int" este convertit in "float" inainte de executia operatiei.
    Acest exemplu arata deasemenea putin mai multe despre modul de lucru al lui "printf". Ea este o functie de conversie de format cu scop general, care va fi descrisa complet in Capitolul 7. Primul sau argument este un sir de caractere ce se vor tipari, fiecare caracter % indicind argumentele (al doilea, al treilea) ce se va substitui si forma in care se vor tipari. De exemplu, in instructiunea
    printf("%4.0f %6.1f\n", fahr, celsius);
    specificatia de conversie "%4.0f" spune ca un numar flotant va fi tiparit intr-un spatiu de cel putin patru caractere, cu zero cifre dupa punctul zecimal. "%6.1f" descrie un alt numar care va ocupa cel putin sase spatii, cu o cifra dupa punctul zecimal, analog cu F6.1 din FORTRAN sau F(6,1) din PL/1. Parti din specificator pot fi omise: "%6f" arata ca numarul are o lungime de cel putin 6 caractere; "%.2f" cere doua pozitii dupa punctul zecimal, dar lungimea lui nu este supusa restrictiilor; "%f" spune doar sa se tipareasca numarul ca flotant.
    "printf" recunoaste deasemenea: "%d" pentru intregi zecimali, "%o" pentru numere octale,"%x" pentru hexazecimale, "%c" pentru un caracter, "%s" pentru sir de caractere si "%%" pentru insusi semnul "%".
    Fiecare constructie cu % in primul argument al lui "printf" face pereche cu al doilea, al treilea,... argument. Aceste perechi trebuie sa corespunda ca numar si tip, altfel veti avea surpriza unor rezultate lipsite de inteles.
    Fiindca veni vorba, "printf" NU face parte din limbajul C. Nu exista definite in C intrari si iesiri. Nu e nimic magic in
    legatura cu "printf" ea este pur si simplu o functie utila care face parte din biblioteca standard de rutine care sint in mod normal accesibile programelor C. Cu scopul de a ne concentra asupra limbajului C, nu vom spune prea multe despre operatiile de I/O pina in Capitolul 7. In particular, vom amina descrierea intrarilor cu format pina atunci. Daca aveti de introdus numere, cititi descrierea functiei "scanf" din Capitolul 7, sectiunea 7.4; "scanf" este foarte asemanatoare cu "printf" atit doar ca ea citeste intrari in loc sa scrie iesiri.


    1.3. Instructiunea For

    Asa cum probabil va asteptati, exista o multime de moduri pentru a scrie un program; haideti sa incercam o alta varianta a programului de conversie de temperatura :
    main() /* Fahrenheit-Celsius table */
    {
    int fahr;
    for (fahr = 0; fahr <= 300; fahr = fahr + 20)
    printf("%4d %6.1f\n", fahr, (5.0 / 9.0) * (fahr - 32));
    }
    Aceasta va produce aceleasi rezultate dar, cu siguranta, arata altfel decit prima. O modificare esentiala este eliminarea majoritatii variabilelor; a ramas numai "fahr", declarata ca "int" (observati specificatorul "%d" in printf). Limitele inferioara si superioara si marimea pasului apar doar ca si constante in instructiunea "for", ea insasi o constructie noua, iar expresia care calculeaza temperatura Celsius apare acum ca al treilea argument din "printf" in loc de a fi o instructiune de asignare separata.
    Aceasta ultima schimbare este un exemplu pentru o regula generala in C - in orice context in care este permisa folosirea valorii unei variabile de un anumit tip, se poate folosi o expresie de acel tip. Deoarece al treilea argument al lui "printf" trebuie sa fie o valoare flotanta pentru a se potrivi cu "%6.1f", orice expresie flotanta poate apare pe locul ei.
    Instructiunea "for" este o bucla, o generalizare a lui "while". Daca o comparati cu "while", aceasta afirmatie va va fi clara. Ea contine trei parti separate prin punct si virgula. Prima parte
    fahr = 0
    se face o data, inainte ca bucla propriu-zisa sa inceapa. A doua parte este testul sau conditia care controleaza bucla:
    fahr <= 300
    Este evaluata aceasta conditie; daca ea este adevarata, este executat corpul buclei (la noi, o singura "printf"). Urmeaza apoi pasul de reinitializare
    fahr = fahr + 20
    care este executat si apoi conditia este reevaluata. Bucla se termina atunci cind conditia devine falsa. La fel ca si la instructiunea "while", corpul buclei poate fi alcatuit dintr-o singura instructiune sau dintr-un grup de instructiuni inclus intre acolade. Partile de initializare si reinitializare pot fi o
    singura expresie.
    Alegerea intre "while" si "for" este arbitrara, bazata pe ceea ce ne pare noua a fi mai clar. Instructiunea "for" este potrivita in mod uzual pentru buclele in care initializarea si reinitializarea sint instructiuni unice si logic inrudite deoarece este mai compacta decit "while" si pastreaza instructiunile de control al buclei intr-un singur loc si impreuna.


    ===va urma===
    FOCUS SAT-UPC;RCS-digital cablu;ADSL;BAYERN MUNCHEN&AC MILAN;
    .de

  2. #2
    Standard RSP member gessle's Avatar
    Join Date
    31 Jan 2007
    Location
    tg ocna;jud. BACAU
    Posts
    719
    Mentioned
    0 Post(s)
    Rep Power
    67

    Default Re: Programare in C(step by step)

    1.4. Constante simbolice

    Vom face o observatie finala inainte de a parasi pentru todeauna programul de conversie de temperatura. E o practica proasta aceea de a inmorminta "numere magice" ca 300 sau 20, intr-un program; ele transmit putina informatie cuiva care va citi programul mai tirziu si este greu sa le modificam intr-o maniera sistematica. Din fericire, C poseda o modalitate de a evita astfel de numere magice. Cu ajutorul constructiei "#define", se pot defini la inceputul programului nume sau constante simbolice, care sint un sir particular de caractere. Dupa aceea, compilatorul va inlocui toate aparitiile nepuse intre ghilimele ale numelui, prin sirul corespunzator. Inlocuirea efectiva a numelui poate fi orice text; ea nu se limiteaza la numere.
    #define LOWER 0 /* lower limit of the table */
    #define UPPER 300 /* upper limit */
    #define STEP 20 /* step size */
    main() /* Fahrenheit-Celsius table */
    {
    int fahr;
    for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP)
    printf("%4d %6.1f\n", fahr, (5.0 / 9.0) * (fahr - 32));
    }
    Cantitatile LOWER, UPPER si STEP sint constante, asa incit ele nu apar in declaratii. Numele simbolice se scriu in mod normal cu litere mari, asa ca ele pot fi usor distinse de numele de variabile care se scriu cu litere mici. Sa notam ca la sfirsitul unei definitii NU se pune punct si virgula. Deoarece intreaga linie de dupa numele definit este substituita, in instructiunea "for" ar exista prea multe punct si virgule.
    FOCUS SAT-UPC;RCS-digital cablu;ADSL;BAYERN MUNCHEN&AC MILAN;
    .de

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •