Documente Academic
Documente Profesional
Documente Cultură
Programare C - Cap - 1
Programare C - Cap - 1
Roger Bacon
Limbajul C a fost creat la nceputul anilor '70 de ctre Brian W
Kernigham i Dennis M Ritchie de la Bell Laboratories New Jersey, fiind
iniial destinat scrierii unei pri din sistemul de operare Unix. Lucrarea
The C Programming Language a celor doi autori, aprut n mai multe
versiuni, a rmas cartea de referin n domeniu, impunnd un standard
minimal pentru orice implementare.
Caracteristicile distinctive ale limbajului au fost clar definite de la
nceput, ele pstrndu-se n toate dezvoltrile ulterioare:
portabilitate maxim;
structurare;
posibilitatea efecturii operaiilor la nivelul mainii cu pstrarea
caracteristicilor unui limbaj evoluat.
Acest manual este structurat pe 12 capitole astfel nct elementele
limbajului C s fie prezentate ntr-o manier unitar. Primul capitol face o
scurt introducere i prezint patru programe C. Urmtoarele nou capitole
descriu elementele limbajului C. Capitolele unsprezece i doisprezece trec n
revist funciile cele mai des utilizate definite n biblioteca standard,
mpreun cu cteva programe demonstrative. Au fost selectate doar funciile
definite de mai multe standarde (n primul rnd ANSI C), pentru a garanta o
portabilitate ct mai mare.
Acest manual a fost conceput pentru a servi ca document care s poat
fi consultat de programatori n elaborarea proiectelor, i nu pentru a fi
memorat. Manualul nu este o introducere n limbajul C; se presupune c
cititorul este familiarizat cu:
concepte de baz referitoare la programare: variabile, instruciuni de
atribuire, de control al execuiei, apeluri de funcii;
reprezentarea informaiei n calculator a valorilor ntregi, n virgul
mobil, a codurilor ASCII;
operaii de intrare / ieire.
Deoarece avem convingerea c cea mai bun explicaie este un program
funcional, majoritatea exemplelor din acest manual se regsesc n fiiere
surs C care pot fi rulate pe orice mediu de programare C i sub orice sistem
de operare.
Ca o ultim observaie amintim recomandarea fcut de nii creatorii
limbajului: cea mai bun metod de nvare este practica.
__________________________________________________________________________
__________________________________________________________________________
s = 0;
do {
scanf("%d",&n);
s += n;
} while (n!=0);
printf("%d\n",s);
return 0;
}
n cadrul funciei main se declar dou variabile s i n care vor
memora valori ntregi. Variabila s (care va pstra suma numerelor
introduse) este iniializat cu valoarea 0.
n continuare se repet o secven de dou instruciuni, prima
fiind o operaie de intrare i a doua o adunare.
Primul argument al funciei scanf - formatul de introducere
"%d" - indic faptul c se ateapt introducerea unei valori ntregi n
format zecimal de la terminal (consol). Al doilea argument indic
unde se va depune n memorie valoarea citit; de aceea este necesar
s se precizeze adresa variabilei n (cu ajutorul operatorului &).
n a doua instruciune la valoarea variabilei s se adun valoarea
variabilei n. Operatorul += are semnificaia adun la.
Aceast secven se repet (do) ct timp (while) valoarea
introdus (n) este nenul. Operatorul != are semnificaia diferit de.
n final funcia printf afieaz pe terminal valoarea variabilei
s n format zecimal.
Al treilea program ateapt de la terminal introducerea unei
valori naturale n, dup care mai ateapt introducerea a n valori reale
(dubl precizie): a0, a1, ..., an1. n continuare se parcurge aceast
list i se determin produsul valorilor strict pozitive. n final
programul afieaz produsul calculat.
#include <stdio.h>
main() {
int n,i;
double a[100], p;
__________________________________________________________________________
scanf("%d",&n);
for (i=0; i<n; i++)
scanf("%lf",&a[i]);
p = 1;
for (i=0; i<n; i++)
if (a[i]>0)
p *= a[i];
printf("%lf\n",p);
return 0;
}
n cadrul funciei main se declar dou variabile n i i care vor
memora valori ntregi. Variabila n pstreaz numrul de valori reale
din lista a. Se declar de asemenea un tablou unidimensional a care
va memora 100 de valori de tip real (dubl precizie), i o variabil p
care va memora produsul cerut.
Se citete de la terminal o valoare n. n continuare se introduc
valorile reale ai (i 0, 1, ..., n1). Formatul de introducere "%lf"
indic faptul c se ateapt introducerea unei valori reale de la
terminal, care va fi depus la locaia de memorie asociat variabilei
ai. n locul construciei &a[i] se poate folosi forma echivalent
a+i.
Pentru a introduce toate valorile ai se efectueaz un ciclu for,
n cadrul cruia variabila i (care controleaz ciclul) ia toate valorile
ntre 0 (inclusiv) i n (exclusiv) cu pasul 1. Trecerea la urmtoarea
valoare a variabilei i se face cu ajutorul operatorului ++.
n continuare variabila p, care va memora produsul valorilor
cerute, se iniializeaz cu 1. Fiecare valoare ai este verificat
(instruciunea if) dac este strict pozitiv i n caz afirmativ este
nmulit cu valoarea p. Operatorul *= are semnificaia nmulete
cu.
Al patrulea program este o ilustrare a unor probleme legate de
capacitatea reprezentrilor valorilor de tip ntreg i virgul mobil.
#include <stdio.h>
__________________________________________________________________________
int main() {
short k,i;
float a,b,c,u,v,w;
i=240; k=i*i;
printf("%hd\n",k);
a=12345679; b=12345678;
c=a*a-b*b;
u=a*a; v=b*b; w=u-v;
printf("%f %f\n",c,w);
if (c==w) return 0;
else return 1;
}
Variabila k, care ar trebui s memoreze valoarea 57600, are tipul
ntreg scurt (short), pentru care domeniul de valori este restrns la
32768 32767. Astfel c valoarea 1110000100000000(2) (n zecimal
57600), n reprezentare ntreag cu semn este de fapt 7936.
Al doilea set de operaii necesit o analiz mai atent; explicaiile
snt valabile pentru programe care ruleaz pe arhitecturi Intel.
Variabila c, care ar trebui s memoreze valoarea 2461357 (rezultatul
corect), va avea valoarea 2461356, deoarece tipul float are
rezervate pentru mantis doar 24 de cifre binare. Rezultatul este
foarte apropiat de cel corect deoarece rezultatele intermediare se
pstreaz n regitrii coprocesorului matematic cu precizie maxim.
Abia la memorare se efectueaz trunchierea, de unde rezult valoarea
afiat.
Cu totul altfel stau lucrurile n cazul celui de al treilea set de
operaii. Aici rezultatele intermediare snt memorate de fiecare dat
cu trunchiere n variabile de tip float. n final se calculeaz i
diferena dintre cele dou valori trunchiate, de unde rezult valoarea
16777216.
nainte de terminare se verific dac valorile c i w snt egale. n
caz afirmativ se comunic sistemului de operare un cod 0 (terminare
normal). n caz contrar se comunic un cod 1 (terminare anormal).
Rulai acest program pe diferite sisteme de calcul i observai
care este rezultatul.
__________________________________________________________________________
__________________________________________________________________________