Documente Academic
Documente Profesional
Documente Cultură
Cap2 PDF
Cap2 PDF
B. Kernighan, D. Richie-Limbajul C
1. Despre C. Primul program
2. Variabile i expresii aritmetice
3. Instruciunea for
4. Constante simbolice
5. Citirea i scrierea caracterelor
6. Tablouri
7. Funcii
8. Tablouri de caractere
9. Variabile automatice i domenii de vizibilitate
Introducere n C
Despre C
C este un limbaj de programare cu destinaie universal. Este
implementat pe majoritatea platformelor de calcul existente
azi.
Este cel mai popular limbaj de programare pentru scrierea de
software de sistem. Este folosit la fel de bine i la scrierea
altor programe de importan deosebit n domenii numeroase
i 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 Thompson
i Dennis Ritchie, care aveau nevoie de un limbaj simplu i
portabil pentru scrierea nucleului sistemului de operare UNIX.
Introducere n C
Despre C
n anul 1978 s-a publicat prima ediie a crii Limbajul
de 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 de
ambiguiti i independent de main a limbajului C,
meninndu-i n acelai timp stilul. Rezultatul este
standardul 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 C
devine tot mai folositor pe msura ce experiena n lucrul
cu acesta crete.
Introducere n C
De ce C ?
Argumente n favoarea programrii n C
Limbaj de programare structurat: permite o bun
organizare a programelor
Complexitatea limbajului este de nivel mediu
Permite programarea la un nivel mai sczut dect alte
limbaje, mai apropiat de hardware: operaii pe bii, acces
direct la memorie
Potrivit pentru programarea de sistem
Produce un cod obiect eficient: redus ca dimensiune i
rapid n execuie
Introducere n C
De ce C ?
Principalul dezavantaj
Limbajul nu este foarte strict n ceea ce privete tipurile de
date (conversii implicite ntre tipuri) => puine verificri i
multe erori nesemnalate.
Concluzii
C este destinat specialitilor din toate domeniile de
activitate, 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.
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 s
se efectueze atunci cnd se apeleaz funcia.
Variabilele stocheaz valorile folosite n timpul efecturii
calculelor. Ele sunt nume simbolice ale unor locaii de
memorie.
Fiecare program trebuie s conin o funcie principal
numit main. Executarea programului C const, de fapt, n
execuia instruciunilor acestei funcii.
main va apela de obicei alte funcii, unele scrise de
programator, altele din bibliotecile care sunt la dispoziie.
Introducere n C
Primul program
#include<stdio.h>
/*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 */
Introducere n C
Variabile i expresii aritmetice
fahr = prim;
while (fahr <= ultim) {
celsius = 5 * (fahr-32) / 9;
printf(%d\t%d\n, fahr, celsius);
fahr = fahr + pas;
}
}
/* .. */ constituie un comentariu. Toate caracterele
aflate ntre /* i */ sunt ignorate de compilator.
Comentariile pot fi plasate n program oriunde poate fi
plasat un spaiu, un tabulator sau un caracter rnd nou.
Introducere n C
Variabile i expresii aritmetice
n C toate variabilele trebuie s fie declarate nainte de a fi
folosite; declararea se face de obicei la nceputul funciei,
naintea oricror instruciuni executabile.
O declaraie enun proprietile variabilelor. Declaraia
const 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 ntreg
reprezentate n binar.
Tipul float desemneaz numere raionale n reprezentarea
numit virgul mobil, adic numere ce pot avea i o parte
fracionar.
Introducere n C
Variabile i expresii aritmetice
Limbajul C furnizeaz i alte cteva tipuri de date, printre care:
char caracter un singur octet
short ntreg scurt
long ntreg lung
double numr raional n reprezentare virgul mobil n
dubl precizie.
Exist structuri de date: tablouri, structuri i uniuni formate
cu componente de aceste tipuri de baz, pointeri ctre acestea i
funcii 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 ;
Introducere n C
Variabile i expresii aritmetice
Ciclul while produce cte o linie a tabelului la fiecare
repetiie. Cnd rezultatul testului devine fals, ciclul ia
sfrit.
Corpul unei instruciuni while poate consta dintr-una sau
mai multe instruciuni cuprinse ntre acolade sau dintr-o
singur instruciune fr acolade.
Se recomand s se indenteze instruciunile din corpul
ciclului. Indentarea i spaierea corespunztoare au o
importan major n a face programele lizibile - uor de
citit.
Se recomand de asemenea, scrierea unei singure
instruciuni pe o linie.
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 fi
fost 0 pentru c, n C, ca i n multe alte limbaje, mprirea
ntreag trunchiaz rezultatul (orice parte fracionar este
nlturat).
printf este o funcie pentru formatarea datelor de ieire, cu
dou sau mai multe argumente:
printf(%d\t%d\n, fahr, celsius);
Fiecare construcie cu % din primul argument numit
specificator de format, are corespondent, n ordine, n celelalte
argumente. Acetia trebuie s concorde ca numr i tip, altfel
se obin rezultate eronate.
Introducere n C
Variabile i expresii aritmetice
Pentru a obine o aliniere la dreapta a celor dou
temperaturi, adugm fiecrui %d o anumit dimensiune:
printf(%3d %6d\n, fahr, celsius);
Pentru a obne rezultate mai precise ar trebui s folosim
aritmetica numerelor raionale n reprezentare virgul
mobil n locul celei a ntregilor.
#include<stdio.h>
/*afiseaza tabelul Fahrenheit-Celsius
pt. fahr=0,20, , 300; versiunea in virgula mobila*/
main() {
float fahr, celsius;
float prim, ultim, pas;
Introducere n C
Variabile i expresii aritmetice
prim=0.0; /* limita inferioara a temperaturii */
ultim=300.0; /* limita superioara */
pas=20.0; /* marimea pasului */
fahr = prim;
while (fahr <= ultim) {
celsius = (5.0/9.0) * (fahr-32.0);
printf(%3.0f %6.2f\n, fahr, celsius);
fahr = fahr + pas;
}
}
Introducere n C
Variabile i expresii aritmetice
Dac un operator aritmetic are operanzi ntregi, se execut o
operaie cu ntregi.
Dac un operator aritmetic are un operand n reprezentare
virgul mobil i un operand ntreg, nainte ca operaia s fie
executat, ntregul va fi convertit n numr n reprezentare
virgul mobil.
Specificatorii din printf au urmtoarea semnificaie:
#include<stdio.h>
/*afiseaza tabelul Fahrenheit-Celsius
pentru fahr=0,20, , 300 */
main()
{
int fahr;
for (fahr = 0; fahr <= 300; fahr = fahr + 20)
printf(%3d %6.2f\n, fahr, (5.0/9.0) * (fahr-32));
}
Introducere n C
Instruciunea for
Au fost eliminate majoritatea variabilelor. A rmas doar
fahr.
Limitele inferioar i superioar precum i dimensiunea
pasului apar ca i constante n instruciunea for.
Expresia care calculeaz valoarea temperaturii n grade
Celsius apare ca al treilea argument al lui printf: n orice
context n care este permis folosirea valorii unei variabile de
un 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 separate
prin punct i virgul: iniializarea, condiia de continuare i
incrementarea (reiniializarea). Ciclul se ncheie n cazul n
care condiia a devenit fals. Iniializarea, condiia i
incrementarea pot fi orice expresii.
Introducere n C
Constante simbolice
Inserarea numerelor 0, 20 i 300 n program nu constituie o
metod 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 cu
text-ul de nlocuire corespunztor. Numele constantelor
simbolice se scriu n mod convenional cu majuscule.
#include<stdio.h>
#define PRIM 0
#define ULTIM 300
#define PAS 20
Introducere n C
Constante simbolice
/*tipareste tabelul Fahrenheit-Celsius */
main()
{
int fahr;
for (fahr = PRIM; fahr <=ULTIM; fahr=fahr+PAS)
printf(%3d %6.2f\n, fahr, (5.0/9.0)* (fahr-32));
}
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
Introducere n C
Citirea i scrierea caracterelor - copiere
#include<stdio.h>
/* copiaza intrarea la iesire; prima versiune */
main() {
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}
Operatorul relaional != nseamn diferit de.
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 un
caracter autentic. Valoarea se numete EOF (End Of File).
Trebuie s-l declarm pe c ca aparinnd unui tip suficient de
mare pentru a stoca orice valoare pe care o returneaz
getchar, inclusiv EOF. De aceea am folosit int.
EOF este un ntreg definit ca i o constant simbolic n
<stdio.h>.
n C, orice atribuire, precum c = getchar() este o expresie
i are o valoare, care este chiar valoarea, de dup atribuire, a
membrului stng al expresiei. n concluzie, programul poate fi
simplificat astfel:
Introducere n C
Citirea i scrierea caracterelor - copiere
#include<stdio.h>
/* 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 ntlni
frecvent acest stil.
Prezena parantezelor este necesar deoarece precedena
operatorului != este mai mare dect a operatorului =.
Introducere n C
Citirea i scrierea caracterelor numrare caractere
#include<stdio.h>
/* numara caracterele din fisierul de intrare; prima
versiune */
main(){
long nc;
nc=0;
while (getchar() != EOF)
++nc;
printf(%ld\n, nc);
}
Operatorul ++ nseamn incrementare cu unu. Operatorii ++
i --(decrementare cu unu) pot fi folosii prefixai (++nc)
sau postfixai (nc++).
Introducere n C
Citirea i scrierea caracterelor numrare caractere
Se poate lucra cu numere i mai mari, folosind o variabil de
tip double (float n dubl precizie). De asemenea, se va folosi
o instruciune for n loc de while:
#include<stdio.h>
/* numara caracterele din fisierul de intrare; a doua
versiune */
main() {
double nc;
for (nc=0.0; getchar() != EOF; ++nc)
;
printf(%.0f\n, nc);
}
Introducere n C
Citirea i scrierea caracterelor numrare caractere
; de dup for desemneaz o instruciune vid.
nl = 0;
while ( (c = getchar() ) != EOF)
if (c == \n)
++nl;
printf(%d\n, nl);
}
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 caracterului
respectiv, n setul de caractere al mainii. Acesta se numete
constant caracter, dei reprezint doar o alt modalitate de a
scrie, n C, un ntreg mic ( ex. A este o constant caracter; n
setul de caractere ASCII valoarea sa este 65).
Secvenele escape folosite n constantele ir de caractere
sunt acceptate i n constantele caracter (\n este valoarea
caracterului rnd nou, care n ASCII are valoarea 10).
Introducere n C
Citirea i scrierea caracterelor-numrare cuvinte
Programul numr linii, cuvinte i caractere. Se consider
cuvnt orice secven de caractere care nu conine un spaiu,
un tabulator sau un caracter rnd nou.
#include <stdio.h>
#define INTERIOR 1 /* in interiorul unui cuvant */
#define EXTERIOR 0 /* in afara unui cuvant */
/* numara liniile, cuvintele si caracterele din fisierul de
intrare */
main()
{
int c, nl, ncuv, nc, stare;
stare = EXTERIOR;
Introducere n C
Citirea i scrierea caracterelor-numrare cuvinte
nl = 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;
}
}
Introducere n C
Citirea i scrierea caracterelor-numrare cuvinte
printf(%d %d %d\n, nl, ncuv, nc);
}
p = 1;
for (i = 1; i<= n; ++i)
p = p * baza;
return p;
}
Introducere n C
Funcii
Prima linie a funciei
int putere(int baza, int n)
declar tipurile i numele parametrilor i tipul rezultatului
returnat de funcie.
n general, vom folosi denumirea de parametru pentru o
variabil enumerat n lista nchis ntre paranteze din definiia
unei funcii i cea de argument pentru valoarea folosit ntr-un
apel de funcie.
Valoarea calculat n funcia putere este returnat ctre main
de instruciunea return. Dup return poate urma orice
expresie. Nu este necesar ca o funcie s returneze o valoare.
Introducere n C
Funcii
Declaraia
int putere(int m, int n);
aflat naintea lui main se numete prototip de funcie i
trebuie s concorde cu definiia i apelurile funciei putere.
Nu este necesar ca numele parametrilor s corespund. Un
prototip poate fi scris :
int putere(int, int);
Numele folosite n definiia efectiv a funciei putere
pentru parametrii si sunt locale funciei putere i nu sunt
vizibile pentru nici o alt funcie. Acest lucru este valabil i
pentru variabilele locale i i p. Aceste variabile se numesc, n
C, variabile automatice.
Introducere n C
Transmiterea argumentelor prin valoare
n C, toate argumentele funciilor sunt transmise prin
valoare. Acest lucru nseamn c funcia apelat primete
valorile argumentelor sale prin stocare n variabile temporare
create n stiv special n acest scop. n acest fel, funcia nu
are acces la locaiile de memorie ale variabilelor originale.
n C, funcia apelat nu poate modifica direct variabila
corespunztoare argumentului transmis din funcia apelant;
ea nu poate modifica dect copia temporar.
Apelul prin valoare conduce la programe mai compacte, cu
mai puine variabile neeseniale, deoarece parametrii pot fi
tratai n rutina apelat ca variabile locale, convenabil
iniializate ca urmare a apelului.
Introducere n C
Simularea transmiterii prin adres
Cnd este necesar, se poate face ca o funcie s modifice o
variabil din funcia apelant. Funcia apelant trebuie s
furnizeze adresa variabilei ce va fi accesat (un pointer
ctre acea variabil), iar funcia apelat trebuie s declare
parametrul ca fiind pointer i s acceseze variabila indirect,
prin intermediul acestuia(vezi capitolul despre pointeri).
O alt excepie este n cazul tablourilor: cnd numele unui
tablou este folosit ca argument,valoarea transmis funciei
este adresa locaiei primului element al tabloului. Folosind
aceast valoare ca pe o variabil cu indici, funcia poate
accesa i poate modifica direct orice element al tabloului.
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:
i=0;
while (( in[ i ] = din[ i ] ) != \0)
++i;
}
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.