Capitolul 1.2. Variabile si aritmetica

Vezi subiectul anterior Vezi subiectul urmator In jos

Capitolul 1.2. Variabile si aritmetica

Mesaj  zooky la data de Mier Mar 18, 2009 12:41 am

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.

Exercitiul 1.3. Modificati programul de conversie temperaturi pentru a scrie un antet la inceputul tabelei de conversie.

Exercitiul 1.4. Scrieti un program care sa tipareasca tabela corespunzatoare Celsius - Fahrenheit.
avatar
zooky
Moderator
Moderator

Numarul mesajelor : 147
Data de inscriere : 15/03/2009
Varsta : 24
Localizare : Cernatesti City

Vezi profilul utilizatorului http://e-learning.forumhit.ro

Sus In jos

Vezi subiectul anterior Vezi subiectul urmator Sus


 
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum