Sunteți pe pagina 1din 7

Theory without practice is useless; practice without theory is blind

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.
__________________________________________________________________________

1. Generaliti asupra limbajului C


1.1. Introducere
Limbajul C este un limbaj de programare universal, caracterizat
printr-o exprimare concis, un control modern al fluxului execuiei,
structuri de date, i un bogat set de operatori.
Limbajul C nu este un limbaj de nivel foarte nalt i nu este
specializat pentru un anumit domeniu de aplicaii. Absena
restriciilor i generalitatea sa l fac un limbaj mai convenabil i mai
eficient dect multe alte limbaje mai puternice.
Limbajul C permite scrierea de programe bine structurate,
datorit construciilor sale de control al fluxului: grupri de
instruciuni, luri de decizii (if), cicluri cu testul de terminare
naintea ciclului (while, for) sau dup ciclu (do) i selecia unui
caz dintr-o mulime de cazuri (switch).
Limbajul C permite lucrul cu pointeri i are o aritmetic de
adrese puternic.
Limbajul C nu are operaii care prelucreaz direct obiectele
compuse cum snt irurile de caractere, mulimile, listele sau
masivele, considerate fiecare ca o entitate. Limbajul C nu prezint
faciliti de alocare a memoriei altele dect definiia static sau
disciplina de stiv relativ la variabilele locale ale funciilor. n
sfrit, limbajul C nu are faciliti de intrare-ieire i nici metode
directe de acces la fiiere. Toate aceste mecanisme de nivel nalt snt
realizate prin funcii explicite.
Dei limbajul C este, aadar, un limbaj de nivel relativ sczut, el
este un limbaj agreabil, expresiv i elastic, care se preteaz la o gam
larg de programe. C este un limbaj restrns i se nva relativ uor,
iar subtilitile se rein pe msur ce experiena n programare crete.

__________________________________________________________________________

1.2. Primele programe


n aceast seciune snt prezentate i explicate patru programe cu
scopul de a asigura un suport de baz pentru prezentrile din
capitolele urmtoare.
Prin tradiie primul program C este un mic exemplu din lucrarea
devenit clasic The C programming language, de Brian W
Kernigham i Dennis M Ritchie.
#include <stdio.h>
main() {
printf("Hello, world\n");
return 0;
}
Acest program afieaz un mesaj de salut.
Prima linie indic faptul c se folosesc funcii de intrare / ieire,
i descrierea modului de utilizare (numele, tipul argumentelor, tipul
valorii returnate etc) a acestora se afl n fiierul cu numele
stdio.h .
A doua linie declar funcia main care va conine instruciunile
programului. n acest caz singura instruciune este un apel al funciei
printf care afieaz un mesaj la terminal. Mesajul este dat ntre
ghilimele i se termin cu un caracter special new-line ('\n').
Instruciunea return pred controlul sistemului de operare la
terminarea programului i comunic acestuia codul 0 pentru
terminare. Prin convenie aceast valoare semnific terminarea
normal a programului - adic nu au aprut erori n prelucrarea
datelor.
Corpul funciei main apare ntre acolade.
Al doilea program ateapt de la terminal introducerea unor
numere ntregi nenule i determin suma lor. n momentul n care se
introduce o valoare zero, programul afieaz suma calculat.
#include <stdio.h>
main() {
int s,n;
__________________________________________________________________________

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.
__________________________________________________________________________

1.3. Meta-limbajul i setul de caractere


Meta-limbajul care servete la descrierea formal a sintaxei
limbajului C este simplu.
Categoriile sintactice sau noiunile care trebuie definite snt
urmate de simbolul ':'.
Definiiile alternative de categorii snt listate pe linii separate.
Dac o linie nu este suficient, se trece la linia urmtoare, aliniat la
un tab fa de linia precedent.
Un simbol opional, terminal sau neterminal este indicat prin
adugarea imediat dup el a configuraiei de caractere opt.
Setul de caractere al limbajului C este un subset al setului de
caractere ASCII, format din:
26 litere mici
abcdefghijklmnopqrstuvwxyz
26 litere mari
ABCDEFGHIJKLMNOPQRSTUVWXYZ
10 cifre
0123456789
30 simboluri speciale
Blanc ! " # % & ' ( ) * , . / : ; ? [ \ ] ^ _ ~ { | }
6 simboluri negrafice
\n, \t, \b, \r, \f, \a

__________________________________________________________________________

S-ar putea să vă placă și