Professional Documents
Culture Documents
Cum Se Scrie Un Program (In C)
Cum Se Scrie Un Program (In C)
Programele sunt scrise pentru a instrui masinile sa lucreze cu taskuri specifice sau sa rezolve
probleme specifice. O procedura (descrisa pas cu pas) asociata unui task se
numeste algoritm. Programarea este activitatea de comunicare (codificare) a algoritmilor in
calculatoare. Procesul de programare are (in general) patru pasi:
1. Specificarea task-ului;
2. Descoperirea unui algoritm pentru solutia sa;
3. Codificarea algoritmului in C;
4. Testarea codului.
1. tastatura;
2. discheta;
3. banda;
4. CD-ROM.
1. ecranul terminalului;
2. imprimanta;
3. discheta;
4. banda;
5. CD-ROM.
Sistemul de operare consta intr-o colectie de programe speciale si are doua scopuri
principale:
Un cod C se numeste cod sursa, iar un fisier ce contine un cod sursa se numeste fisier sursa.
Dupa ce a fost creat un fisier sursa, atunci se invoca un compilator de C. De exemplu, pentru
sistemele MS-DOS se poate da comanda:
bc ex1.c sau tcc ex1.c
cc ex1.c
Daca nu sunt erori in ex1.c, atunci aceasta comanda produce fisierul executabil asociat
(ex1.exe). Acum acesta poate fi rulat (executat) cu numele sau (ex1 sau ex1.exe).
In continuare, vom preciza trei dintre trasaturile procesului de compilare (mentionam ca
asupra acestor notiuni, vom reveni cu detalii interesante intr-un capitol viitor):
1. invocarea preprocesorului;
2. invocarea compilatorului;
3. invocarea incarcatorului.
Preprocesorul modifica o copie a codului sursa prin includerea altor fisiere si facand alte
schimbari. Compilatorul traduce aceasta in cod obiect folosit de incarcator pentru producerea
fisierului executabil final. Fisierul care contine codul obiect se numeste fisier obiect. Fisierele
obiect, spre deosebire de fisierele sursa, nu se pot intelege asa usor. Cand spunem deci
compilare, de fapt invocam preprocesorul, compilatorul si apoi incarcatorul.
Dupa ce scriem un program, acesta trebuie compilat si testat. Daca sunt necesare modificari,
atunci codul sursa trebuie editat din nou. Asadar, partea proceselor de programare consta din
ciclul:
#include
main()
{
printf("azi am inceput laboratoarele de C\n");
}
Folosind un editor de texte, presupunem ca am scris si salvat acest fisier numit "ex1.c". Cand
programul este compilat si rulat atunci va apare pe ecran sirul:
Explicatii:
1. #include
2. main()
Fiecare program are o functie numita "main", care se executa intai. Parantezele ce urmeaza
dupa "main" indica compilatorului ca aceasta este o functie.
3. {
Acolada stanga incepe corpul fiecarei functii. O acolada dreapta corespunzatoare trebuie sa
fie la sfarsitul functiei.
4. printf()
Un sir constant in C consta dintr-un numar de caractere incadrate intre ghilimele. Acest sir
este un argument al functiei "printf()". Caracterele \n de la sfarsitul sirului (se citesc
"backslash n"), reprezinta, de fapt, un singur caracter numit "newline".
#include
main()
{
printf("azi am inceput ");
printf("laboratoarele de C\n");
}
Observatii:
In urmatorul exemplu vom ilustra folosirea variabilelor pentru manipularea valorilor intregi.
Variabilele sunt folosite sa memoreze valori. Din moment ce diferite tipuri de variabile sunt
folosite sa memoreze diferite tipuri de date, tipul fiecarei variabile trebuie specificat.
Pentru a ilustra aceasta idee vom calcula cate ore si minute contin un anumit numar de zile.
Algoritmul ar fi:
1. asigneaza un numar de zile unei variabile;
2. calculeaza numarul de ore si memoreaza-l intr-o variabila;
3. calculeaza numarul de minute si memoreaza-l intr-o variabila;
4. afiseaza numarul de zile, ore si minute pe ecran.
#include
main()
{
int zile, ore, minute;
zile=7;
ore=24*zile;
minute=60*ore;
printf("O saptamana are %d ore, %d minute.\n",ore, minute);
}
Explicatii:
Reprezinta o declaratie de variabile. Variabilele zile, ore, minute sunt declarate de tip "int",
unul dintre cele mai importante tipuri din C. O variabila de tip "int" poate lua o valoare
intreaga intre -32678 si 32677. Toate variabilele dintrr-un program trebuie declarate inainte
de a fi utilizate. Declaratiile, la fel ca si instructiunile, au la sfarsit ";".
2. Linia: zile=7:
Reprezinta o instructiune de atribuire (sau asignare). Semnul "=" este operatorul de asignare
de baza in C. Valoarea expresiei din partea dreapta a simbolului "=" este atribuita variabilei
din partea stanga.
Este similara celei prezentate in exemplul precedent, dar are trei argumente. Primul
argument, intotdeauna un sir de caractere, se numeste sir de control. Aici, intalnim
specificarea de conversie (care se mai numeste format) "%d". Formatele "%d" determina
tiparirea valorilor expresiilor corespunzatoare (al doilea si al treilea argument) in formatul
intregilor zecimali. Asadar, primul format "%d" corespunde cu valoarea variabilei "ore", iar
cel de-al doilea format "%d" cu valoarea variabilei "minute".
Directive de precompilare:
main()
{
declaratii
instructiuni
}
Operatorii binari: + - * / %
Exemple: 5 % 2 = 1 si 7 % 4 = 3.
Evident, in expresia a % b, b nu trebuie sa fie zero, din moment ce nu se poate face impartirea
cu zero.
#include
main()
{
float x, y;
x = 1.0;
y = 2.0;
printf("Suma dintre x si y este %f.\n", x+y);
}
Pe ecran se va afisa:
Observatii:
1. Linia: float x, y;
Semnifica declararea variabilelor x si y de tip "float" (deci de tip real). In realitate sunt
numere rationale din intervalul
[-10^{308},-10^{-308}] U [10^{-308},10^{308}].
Initializarea variabilelor se poate face si cand se declara acestea. De exemplu, putem scrie:
char c='A';
int i=1;
Observatii:
1. De obicei, pentru initializarea unei variabile se folosesc constante sau expresii constante.
Se pot insa folosi si variabile care au deja valoarea precizata. De exemplu, urmatoarea
secventa de program este corecta:
int zile=7, ore=zile * 24, minute=ore * 60;
Observatii:
Deoarece identificatorul PI se va inlocui peste tot (cu exceptia sirurilor constante) in 3.14159,
atunci acesta se va numi constanta simbolica.
2. Directiva #define poate aparea oriunde in program, dar ea afecteaza numai liniile care
urmeaza acesteia.
1. Lizibilitate marita. Se refera la citirea si intelegerea rapida a fisierului sursa (PI stim ce
inseamna si ne amintim ca este 3.ceva, deci nu trebuie sa scriem de fiecare data valoarea sa);
2. Schimbarile ulterioare ale unor valori constante se face foarte usor. De exemplu, vrem sa
modificam valoarea lui LIMIT la 10000.
In locul liniei:
Reamintim ca formatul %d este folosit pentru scrierea valorii unei expresii ca un intreg
zecimal. In mod similar:
Argumentele lui "printf()" sunt separate de virgula, deci avem sase argumente. Primul
argument este sirul de control. Obtinem corespondenta:
%s <---> "one"
%d <---> 2
%f <---> 2.33
%c <---> 'G'
%c <---> 'O'
Observatii:
1. Daca instructiunea "printf()" contine prea multe caractere, atunci se poate scrie aceasta pe
mai multe linii, separate prin virgula. De exemplu, putem scrie:
printf("%s%s\n",
c - ca un caracter
d - ca un intreg zecimal
e - ca un numar in virgula flotanta in notatia stiintifica
f - ca un numar in virgula flotanta
g - in format e sau f (alegand cel mai scurt dintre ele)
s - ca un sir
Cand un argument este tiparit, locul unde este tiparit se numeste campul sau, iar numarul de
caractere ale acestui camp se numeste lungimea campului. Aceasta lungime poate fi
specificata intr-un format ca un intreg plasat intre caracterul % si caracterul de conversie. De
exemplu, instructiunea:
printf("%c%3c%7c\n", 'A', 'B', 'C');
va tipari:
ABC
Pentru numerele in virgula flotanta, putem controla precizia (numarul de cifre zecimale), la
fel ca lungimea campului. Forma generala a formatului este:
%m.nf
si semnifica ca m este lungimea campului, iar n precizia. Formatul %mf specifica doar
lungimea campului, iar formatul %.nf numai precizia. De exemplu, instructiunile:
printf("Numere1: %.1f %.2f %.3f\n", 1.0, 2.0, 3.0);
printf("Numere2: %7.1f %7.2f %7.3f\n", 4.0, 5.0, 6.0);
vor avea ca efect afisarea:
Numere1: 1.0 2.00 3.000
Numere2: 4.0 5.00 6.000
Functia "scanf()" este asemanatoare cu "printf()", dar este folosita pentru intrari in loc de
iesiri. Primul sau argument este un sir de control care are formatele corespunzatoare cu
variatele moduri de interpretare a sirurilor de intrare. Dupa sirul de control urmeaza adresele
variabilelor. Adresa unei variabile este locul din memorie unde este memorata variabila (vom
reveni in capitolele viitoare). Simbolul "&" reprezinta operatorul de adresa. De exemplu,
scanf("%d", &x);
c - la un caracter
d - la un intreg zecimal
f - la un numar in virgula flotanta (float)
lf - la un numar in virgula flotanta (double)
Lf - la un numar in virgula flotanta (long double)
s - la un sir
#include
#define PI 3.141592653589793
main()
{
double raza;
printf("\n%s\n\n%s",
"Acest program calculeaza aria cercului",
"Dati raza:");
scanf("%lf", &raza);
printf("\n%s\n%s%.2f%s%.2f%s%.2f\n%s%.5f\n\n",
"Aria = PI * raza * raza",
" = ", PI, " * ", raza, " * ", raza,
" = ", PI * raza * raza);
}
Presupunem ca la executia programului introducem raza egala cu 2.333. Atunci vor apare pe
ecran:
Acest program calculeaza aria cercului
Daca am calcula separat (pe hartie), am obtine Aria = 3.14 * 2.33 * 2.33 = 17.046746, numar
care nu coincide cu cel furnizat de calculator. Justificarea este aceea ca PI si raza sunt tiparite
doar cu doua zecimale, pe cand valorile lor sunt pastrate in memorie cu precizie mai mare.
1.7 Instructiunea "while"
Instructiunea while face parte din categoria actiunilor repetitive. Pentru a intelege aceasta
instructiune, vom face un exemplu de adunare a numerelor de la 1 la 10.
Exemplu:
#include
main()
{
int i=1, suma=0;
while (i<=10)
{
suma = suma + i;
i = i + 1;
}
printf("Suma primelor 10 numere este %d\n",suma);
}
Explicatii:
2. Constructia:
while (i<=10)
{
suma = suma + i;
i = i + 1;
}
Reprezinta o instructiune while (sau iteratie while). Mai intai, se evalueaza expresia i<=10.
Cum valoarea initiala a lui i este egala cu 1, rezulta ca se vor executa instructiunile dintre
acolade. Astfel, variabila suma va fi asignata cu vechea valoare a lui suma la care se adauga
valoarea lui i. Deci, suma se evalueaza la 1. Apoi, variabila I se evalueaza la suma dintre
vechea valoare a lui i (i=1) si 1, deci este egala cu 2. In acest moment, executia revine la
inceput adica evaluam expresia i<=10. Cum valoarea lui i este 2, rezulta ca se va executa iar
corpul lui while. La sfarsitul acestei iteratii, suma este evaluata la 1+2, iar i la 3. Se observa
usor ca i<=10 este tot adevarata, deci se va executa din nou corpul lui while. La sfarsitul celei
de-a treia iteratii, sum este evaluata la 1+2+3, iar i la 4. Procesul continua pana cand valoarea
lui i este 11, care implica falsitatea expresiei i<=10. Astfel se iese din bucla while.
3. Instructiunea:
printf("Suma primelor 10 numere este %d\n", suma);
va afisa mesajul Suma primelor 10 numere este 55.
Dorim sa citim mai multe numere (fara a sti aprioric numarul lor si care sunt acestea) si
dorim sa afisam suma lor.
Instructiunea while este una din cele trei constructii existente in C menite sa descrie actiuni
repetitive. In solutia noastra, utilizam valoarea returnata de functia "scanf()" pentru a controla
instructiunea while. Consideram urmatorul cod C:
#include
main()
{
int contor = 0;
Explicatii:
1. scanf("%f", &x)==1
Simbolul == reprezinta operatorul de egalitate. Expresia a==b intoarce true daca valoarea lui
a este egala cu valoarea lui b. De exemplu, 1==1 intoarce true, 2==3 intoarce false. Functia
"scanf()" are rolul de a citi caractere scrise de utilizator, sa le converteasca la float, si sa
plaseze aceasta valoare la adresa lui x. Daca totul se desfasoara cu succes, atunci scanf()
intoarce valoarea 1, adica true. Daca din anumite motive, procesul de conversie esueaza,
atunci se intoarce valoarea 0 (deci false). Daca nu mai introducem nici o data (Control^z in
MD-DOS, CR urmat de Control^d in UNIX), atunci scanf() va intoarce valoarea -1 (deci tot
false).
2. while (scanf("%f", &x)==1)
{
contor = contor +1;
suma = suma +x;
}
Dupa cum am vazut mai sus, bucla while se executa atata timp cat scanf("%f", &x)==1 se
evalueaza la true. Iteratia se incheie cand tastam Control^z sau ceva ce nu se poate converti la
float, de exemplu 'a' sau CR. La fiecare executie a buclei se incrementeza variabila contor, iar
valoarea variabilei suma creste cu valoarea lui x (citita de la tastatura).
3. printf("\n%s%5d\n%s%12f\n\n",
"Numarul de numere: ", contor,
"Suma lor: ", suma);
Presupunem ca executam acest program pentru numerele
1.1 2.02 3.003 4.0004 5.00005
Pe ecran va apare rezultatul:
Numarul de numere: 5
Suma lor: 15.123449
Observatii:
1. Daca numaram spatiile, observam ca valoarea lui contor a fost tiparita pe un camp de 5
caractere, iar suma pe 12 caractere. Aceasta este cauzata de formatele "%5d" si "%12f".
Retineti ca tiparirea zecimalelor pentru suma este gresita de la a treia zecimala.
Un stil bun de scriere a codului este esential pentru arta programarii. Aceasta faciliteaza
citirea, scrierea si intretinerea programelor. Un stil bun foloseste:
1. spatii goale si comentarii, astfel incat codul este usor de citit si de inteles;
2. utilizarea indentarii este cruciala, care indica cu precizie structurile de control. De
exemplu,
in constructia
while (expresie)
instructiune
indentarea instructiunii indica ca executia acesteia este sub controlul iteratiei while;
3. alegerea de nume sugestive pentru variabile;
4. corespondenta dintre acolade. De exemplu, urmatorul program este scris in stilul "Bell
Labs
industrial programming style" (#,{,},m pe prima coloana).
#include
#include
#define GO "Start"
main()
{
}
Observatii:
1. Programatorii incepatori uneori cred ca vor "sparge" piata cu stilul lor propriu de redactare
a programelor. Atentie ! Utilizati strategia care este deja in uz.
Mai ales la inceputul invatarii programarii pe calculator, se fac multe erori simple, cum ar fi:
Exemplu:
#include
main()
{
char ch;
a_{n+2}=a_{n+1}+a_n, n>=1
Negreanvictor@gmail.com
www.littlemicrosoft.tk