Capitolul 4.1. Notiuni de baza

Vezi subiectul anterior Vezi subiectul urmator In jos

Capitolul 4.1. Notiuni de baza

Mesaj  zooky la data de Mier Mar 18, 2009 12:17 pm

Pentru a incepe, haideti sa scriem un program care imprima fiecare linie care ii este introdusa si care contine un "model" sau un sir de caractere. (Acesta este un caz special al programului utiliar UNIX "grep".) De exemplu, sa cautam modelul "the" in urmatoarele linii:

Now is the time
for all good
men to come to the aid
of their party.

care va produce urmatoarea iesire:

Now is the time
men to come to the aid
if their party.

Structura de baza a programului se imparte in exact trei parti:

while (mai exista o linie)
if (linia contine modelul)
tipareste-o

Cu toate ca se poate pune codul pentru toate acestea in rutina principala,o modalitate mai buna este aceea de a folosi structura naturala si de a face din fiecare parte o functie separata. Este mai usor sa ne ocupam de trei bucati mai mici decit de o bucata mare, deoarece detaliile nerelevante pot fi inmormintate in functii si sansa de a da interactiuni nedorite este minimalizata. Si bucatile pot fi utile chiar luate apoi separat.
"While (mai exista o linie) " este getline, o functie pe care am scris-o in Capitolul 1 iar "tipareste-o" este printf cu care deja am lucrat suficient. Aceasta inseamna ca nu trebuie sa scriem decit o rutina care decide daca linia contine vreo aparitie a modelului. Putem rezolva problema furind o proiectare din PL/1: functia index(s,t) returneaza pozitia sau indexul din sirul s in care incepe sirul t, sau -1, daca s nu-l contine pe t. Vom folosi 0 in loc de 1 ca pozitie de inceput pentru s, deoarece tablourile in C incep din pozitia 0. Cind, mai tirziu vom avea nevoie de o cautare de model mai sofisticata, nu avem decit sa inlocuim "index"; restul codului ramine acelasi.
Data aceasta schita, restul programului este fara ascunzisuri. Iata acum programul intreg, asa ca puteti vedea cum se potrivesc bucatile impreuna. Doar ca acum, modelul care trebuie cautat este literal sir din argumentele lui index, care nu este cel mai general dintre mecanisme. Ne vom intoarce pe scurt pentru a discuta cum sa initializam tablourile de caractere si in Capitolul 5 vom arata cum se face modelul un parametru care este setat atunci cind programul este lansat in executie. Dam de asemenea, o noua versiune getline; gasim ca este nstructiv sa o comparati cu cea din Capitolul 1.

#define MAXLINE 1000
main() /* gasiti toate liniile ce contin un model dat */
{
char line[MAXLINE];
while (getline(line, MAXLINE) > 0)
if (index(line, "the") >= 0)
printf("%s", line);
}
getline(s, lim) /* citeste linia in s, returneaza lungimea ei */
char s[];
int lim;
{
int c, i;
i = 0;
while (--lim > 0 && (c = getchar()) != EOF && c!= '\n')
s[i++] = c;
if (c == '\n')
s[i++] = c;
s[i] = '\0';
return(i);
}
index(s, t) /* returneaza indexul lui t in s, -1 in lipsa */
char s[], t[];
{
int i, j, k;
for (i = 0; s[i] != '0'; i++) {
for (j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++)
;
if (t[k] == '\0')
return(i);
}
return(-1);
}

Fiecare functie are forma

nume (lista de argumente, daca exista)
declaratii de argumente, daca exista
{
declaratii si instructiuni, daca exista
}

Asa cum am sugerat, anumite parti pot sa lipseasca; functia minima este:
dummy() {}

care nu face nimic. (O functie care nu face nimic este utila uneori ca loc pastrat pentru dezvoltari ulterioare in program). Numele functiei poate fi deasemenea precedat de un tip daca functia returneaza altceva decit o valoare intreaga; acesta este subiectul urmatorului capitol.
Un program este tocmai un set de definitii de functii individuale. Comunicarea intre functii este (in acest caz) facuta prin argumente si valori returnate de functii; ea poate fi facuta deasemenea, prin variabile externe. Functiile pot apare in orice ordine in fisierul sursa, si programul sursa poate fi spart in mai multe fisiere, pe cind o functie nu este sparta.
Instructiunea return este mecanismul de returnare a unei valori din functia apelata in apelant. Orice expresie poate urma dupa instructiunea return:

return (expresie)

Functia apelanta este libera sa ignore valoarea returnata daca doreste. Mai mult, nu e necesar sa existe nici o expresie dupa return; in acest caz, nici o valoare nu este returnata apelantului. Controlul este deasemenea returnat apelantului fara nici o valoare atunci cind executia "se continua dupa sfirsitul" functiei, atingind cea mai din dreapta paranteza. Nu este ilegal ci probabil un semn de necaz (deranj), daca o functie returneaza o valoar dintr-un loc si nici o valoare din altul. In orice caz "valoarea" unei functii care nu returneaza nici una, este sigur un gunoi. Verificatorul "lint" cauta si dupa astfel de erori.

Mecanismul prin care se compileaza si se incarca un program care rezida in mai multe fisiere sursa variaza de la un sistem la altul . Pe sistemul UNIX, de exemplu, comanda CC, mentionata in Capitolul 1, face lucrul acesta. Sa presupunem ca cele trei functii se gasesc in trei fisiere numite main.c, getline.c si index.c. Atunci comanda:

CC main,c,getline,c,index,c

compileaza cele trei fisiere, plaseaza codul obiect relocabil rezultat in fisierele main.o, getline.o si index.o si le incarca pe toate intr-un fisier executabil numit a.out.
Daca exista vreo eroare, sa spunem in main.c, fisierul poate fi recompilat singur si rezultatul incarcat cu fisierele obiect anterioare, cu comanda:

CC main.c getline.o index.o

Comanda CC foloseste conventia de notare ".c" spre deosebire de ".o" pentru a distinge fisierele sursa de fisierul obiect.
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