Sunteți pe pagina 1din 10

Etapele realizării şi testării unui program scris în limbajul C.

18

CAPITOLUL 2
Etapele realizării şi testării unui program scris în limbajul C

Tehnologia informaţiei se sprijină pe microcalculator. Din punct de vedere structural acesta


cuprinde 2 părţi esenţiale: suport tehnic pentru prelucrarea informaţiei, acceptat pentru
denumirea de hardware şi totalitatea programelor care asigură utilizarea resurselor tehnice
denumite software.
Pentru a avea acces la resursele calculatorului trebuie scrise programe în limbaje
recunoscute de microcalculator. Orice limbaj este tradus în codrul intern, denumit limbajul
intern al microprocesorului, de catre compilatoare, translatoare sau asambloare.
Limbajul C este un limbaj structurat, flexibil, portabil şi destul de prietenos. Instrucţiunile
sunt mai apropiate de operaţiile raţionamentului uman. Pentru traducerea lor în cod maşină,
un program numit compilator traduce fiecare instrucţiune într-un grup de instrucţiuni maşină.
Programarea este activitatea de codificare a algoritmilor în calculator. Procesul de
programare are 4 paşi:
●specificarea task-urilor;
●descoperirea unui algoritm pentru soluţia sa;
●codificarea algoritmului în limbajul C;
●testarea codului.
Dacă ne referim la structura interna a unui microcalculator din punct de vedere al
programatorului, atunci aceasta se poate reduce la 4 blocuri funcţionale:
●memoria;
●microprocesorul;
●dispozitivele de intrare-ieşire;
●magistrala (asigură conectarea componentelor).

Memoria Microprocesor I – Dispozitive I/O


ROM 80X86 tastatură,display,
RAM imprimantă,porturi

Fig.1 Schema bloc a unui microcalculator.

Procesorul lucrează cu instrucţiuni care sunt înregistrate în memorie. Pe lângă aceste


instrucţiuni, în memorie sunt păstrate şi date.
Un cod C se numeste cod sursă, iar un fişier ce conţine un cod sursă se numeşte fişier
sursă. Dupa ce a fost creat un fişier sursă se invocă un compilator C. Dacă nu sunt erori, în
urma acestei operaţii, se produce fişierul executabil asociat.
editare → compilare → execuţie.
Toate programele C au anumite componente şi trasături comune, programele în C au
urmatoarea structură:
●Directive preprocesare
●Declaraţii globale
●Funcţii
19 Etapele realizării şi testării unui program scris în limbajul C.

Preprocesorul este apelat automat atunci când se începe compilarea. Prin intermediul lui
se pot realiza: includeri de text, definiţii şi apeluri de macrouri simple, compilare condiţionată.
Declaraţiile globale permit utilizarea unor tipuri de date şi variabile definite de utilizator
în orice punct din interiorul programului.
Deşi un program C poate conţine mai multe funcţii, singura funcţie care trebuie neaparat
să existe este funcţia main. Cu această funcţie începe execuţia programului. Atunci când
programul este lansat, el execută instrucţiunile din funcţia main începând cu prima
instrucţiune ce urmează după paranteza acoladă deschisă. Toate instrucţiunile se termina cu ; .
Limbajul C nu recunoaşte sfârşitul de linie ca terminator. Execuţia programului se termină
când este întâlnită paranteza acoladă închisă.
Unul din cele mai simple programe ce pot fi scrise în limbajul C este următorul:

Aplicaţie:
Să se realizeze programul care afişează următorul mesaj "Acesta este primul meu
program C".
Programul corespunzător este:
# include <stdio.h>
# include <conio.h>
void main()
{
clrscr();
printf(“ Acesta este primul meu program C“ );
getch();
}
Analiza problemei:
După ce este compilat şi rulat va apare pe ecran mesajul "Acesta este primul meu
program C".
Directiva # include determină procesorul să includă o copie a fişierului header stdio.h
şi a fişierului conio.h în acest punct al codului. Fişierul stdio.h este introdus pentru funcţia
standard printf, iar fişierul conio.h este introdus pentru funcţiile standard clrscr şi getch.
Forma generală a directivei #include este:
#include"nume_fisier"
#include <nume_fisier>
În primul caz, fişierul specificat este căutat în directorul curent şi apoi în directoarele
standard, în al doilea caz se caută numai în directoarele standard.
Acţiune: textul fişierului specificat este inclus în program.
Fiecare program are o functie numita main de unde începe execuţia programului.
Parantezele acolade arată că aceasta este o funcţie.
Limbajul C conţine o bibliotecă standard de funcţii care poate fi utilizată în
programare, printf fiind o astfel de funcţie care afişează pe ecran. Funcţia standard clrscr
este o funcţie care şterge ecranul, iar funcţia getch citeşte o tastă.
Mesajul "Acesta este primul meu program C" este argumentul funcţiei printf.

Tipuri fundamentale de date în limbajul C

Variabilele şi constantentele sunt obiecte cu care se lucrează într-un program. În


limbajul C, toate variabilele trebuie declarate înainte de a fi folosite.
O variabilă este o locaţie de memorie căreia i s-a atribuit un nume şi care poate conţine
diferite valori. Numai cele mai banale programe nu conţin variabile. Acestea
Etapele realizării şi testării unui program scris în limbajul C. 20

- spun compilatorului cât spaţiu de memorie trebuie rezervat pentru memorarea acestor
variabile;
- permit compilatorului să instruiască maşina pentru a face operaţiile specifice corect;
În limbajul C avem urmatoarele tipuri fundamentale de date:

Tip Semnificaţie Cuvânt cheie


caracter dată caracter char
întreg număr întreg cu semn int
virgula flotanta număr cu zecimale float
număr cu zecimale
dubla precizie reprezentat în dublă double
precizie
void fără valoare void

Aceste tipuri de date, cu exceptia tipului void, pot fi modificate folosind modificarii de
tip:
signed
unsigned
long
short.
Modificările de tip preced şirul de dată ca în exemplul de mai jos, unde se declară un
întreg long.
long int i;
În tabelul următor sunt prezentate combinaţii între tipurile de date şi modificari,
lungimea de reprezentare în biti şi domeniul de valori pe care le pot conţine:

Tip Lungime în biţi Domeniu de valori


char 8 -128 la 127
unsigned char 8 0 la 255
signed char 8 -125 la 127
int 16 -32768 la 32767
unsigned int 16 0 la 65535
short int 16 -32768 la 32767
unsigned short int 16 0 la 65535
long int 32 -2142483648 la
2147483647
unsigned long int 32 0 la 4294967295
float 32 3.4 E -38 la 3.4 E + 38
double 64 1.7 E – 308 la 1.7 E + 308
long double 80 3.4 E – 4932 la
1.1E + 4932

Tipul de date char

Este unul din tipurile fundamentale din limbajul C, constantele si variabilele de acest
tip fiind folosite pentru reprezentarea caracterelor.
Limbajul C foloseşte şirul de caractere al codului ASCII care se codifică prin numere
întregi în intervalul [0 , 127], adică 128 de coduri.
Mulţimea caracterelor se împarte în trei grupe:
21 Etapele realizării şi testării unui program scris în limbajul C.

-caractere negrafice (coduri cuprinse între 00 = NULL şi 31 precum şi 127 – DELL);


-spaţiu (codul 32);
-caractere speciale (coduri cuprinse între 33 si 126).
Caracterele grafice se împart la randul lor în:
-litere mari (coduri între 65 si 90);
-litere mici (coduri între 97 si 122);
-cifre ( coduri între 48 si 59);
-caractere speciale (celelalte coduri);

Aplicaţie:
Să se realizeze programul care citeşte o literă şi afişează codul său ASCII.
Specificarea problemei:
Date de intrare: c - un caracter citit de la tastatură;
Date de ieşire: afişarea codului ASCII;
Date de test: Introduceţi un caracter: A
Codul său ASCII este: 65
Programul corespunzător este:
#include <conio.h>
#include <stdio.h>
void main ( )
{
char c;
clrscr( );
printf ("Introduceti un caracter: ");
c = getchar ( );
printf (" Codul sau ASCII este: %d" , c);
}
Analiza problemei:
În corpul funcţiei principale se declară variabila cu următoarea semnificaţie:
c – reprezintă variabila în care se depune codul ASCII al caracterului;
Cu ajutorul funcţiei printf se va afişa la consolă "Introduceţi un caracter:". Funcţia
getchar este folosită pentru a citi caracterul şi prin asocierea c = getchar() se va depune în
variabila c codul ASCII al caracterului. Când funcţia getchar este apelată, ea aşteaptă până
când se apasă o tastă, apoi afişează pe ecran caracterul citit şi trimite acest caracter către
apelant. Această funcţie necesită includerea fişierului stdio.h.
La sfârşit, folosind funcţia standard printf se va afişa această variabilă.

Tipul de date int

Acest tip de date este cel mai folosit in limbajul C, acesta permiţând o formă
prescurtată de declarare a întregilor modificaţi cu signed, unsigned, short sau long, în sensul că
tipul int poate să lipsească, fiind implicit.
Următoarele declaraţii sunt echivalente:
unsigned count;
unsigned int count;
Etapele realizării şi testării unui program scris în limbajul C. 22

Aplicaţie:
Să se realizeze programul care cere utilizatorului să introducă o valoare de tip unsigned,
o valoare de tip long şi o valoare de tip short, iar apoi să afişeze aceste valori.
Specificarea problemei:
Date de intrare: u, l, s - valori de tip unsigned long şi short;
Date de ieşire: afişarea valorilor;
Date de test: Introduceti o valoare unsigned: 3
Introduceti o valoare long: 2233333
Introduceti o valoare short: 23
3 2233333 23
Programul corespunzător este:
#include <stdio.h>
#include <conio.h>
void main ( )
{
unsigned u;
long l ;
short s;
clrscr( );
printf("Introduceti o valoare unsigned: ");
scanf("%d",&u);
printf("Introduceti o valoare long: ");
scanf("%ld",&l);
printf(" Intoduceti o valoare short: ");
scanf("%hd",&s);
printf("%d %ld %hd\n",u,l,s);
getch( );
}
Analiza problemei:
În corpul funcţiei principale se declară variabile cu următoarea semnificaţie:
u – reprezintă variabila în care se depune valoare de tip unsigned;
l - reprezintă variabila în care se depune valoare de tip long;
s – reprezintă variabila în care se depune valoare de tip short;
Cu ajutorul funcţiei printf se vor afişa la consolă mesajele prin care se cere
utilizatorului să introducă valorile. Apoi, cu ajutorul funcţiei scanf se vor citi aceste valori.
Când afişăm întregi modificaţi prin short sau long folosind printf, nu se poate folosi doar
specificatorul %d, deoarece trebuie să ştie ce fel de date va primi. Atunci când se utilizează
funcţia printf pentru a afişa un short, trebuie folosit specificatorul de format %hd, pentru a
afisa un long se va folosi formatul %ld iar pentru o valoare unsigned se va utiliza formatul
%d.
Funcţia standard printf ()

Forma generală a funcţiei standard printf este următoarea:


printf(“control“,par1,par2,…parn);
control - poate fi text sau/şi specificatori de format;
par1, par2,…parn - pot fi expresii ale căror valori se scriu conform specificatorilor de
format.
Specificatorii de format ai functiei printf sunt prezentaţi în tabelul următor:
23 Etapele realizării şi testării unui program scris în limbajul C.

Cod Semnificaţie
%c Afişează un caracter
%d Afişează un întreg cu semn
%i Afişează un întreg cu semn
%e Notaţie ştiinţifică, format cu exponent
%f Afişează un număr float
%g Foloseşte pe cel mai scurt ditre %e şi %f
%o Afişează un întreg în format octal fără semn
%s Afişează un şir de caractere
%x Afişează un hexazecimal fără semn
%p Afişează un pointer
%n Argumentul asociat va fi un pointer întreg în care este plasat numărul de caractere
scrise anterior
%u Afişează un întreg fără semn
%% Afişează semnul %

Codurile Backslash ale limbajului C sunt prezentate în tabelul următor:

Cod Semnificatie
\b Backspace
\f Form feed
\n New line
\r Carriage return
\t Horizontal tab
\" Double quote
\’ Single quote
\0 Null
\\ Backslash
\v Vertical tab
\a Bell
\N Octal constant (unde N este o
constantă octală)
\xN Hexazecimal constant(unde
N este o constantă hexa)

Cel mai utilizat cod backslash este \n. Când compilatorul C întâlneşte acest cod, el îl
translatează într-o operaţie de trecere la linie nouă.
Prototipul funcţiei printf se află în stdio.h.

Aplicaţia 1:
Să se realizeze programul care folosind specificatorii de format să afişeze la consolă :
două 3 7.43 L.
Date de test: Multitudinea de argumente: doua 3 7.43 L
Programul corespunzător este:
#include<stdio.h>
#include <conio.h>
void main()
{
clrscr( );
Etapele realizării şi testării unui program scris în limbajul C. 24

printf(“ Multitudinea de argumente: %s %d %1.2f %c \n “, “ doua “ , 3,7.43, ‘L’);


getch( );
}
Analiza problemei:
Argumentele funcţiei printf sunt separate de virgulă, deci avem 5 argumente.
% s →“ doua“
%d→3
% f → 7,43
% c → ‘L’
Formatul % mf specifică lungimea câmpului, formatul %.nf specifică precizia.

Aplicaţia 2:
Să se realizeze programul care, folosind specificatorii de format, să afişeze la consolă:
numere: 4.0 5.00 6.000 7.0000.
Date de test: numere: 4.0 5.00 6.000 7.0000
Programul corespunzător este:
#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
printf(" numere:%7.1f%7.2f%7.3f%7.4f", 4.0,5.0,6.0,7.0);
getch();
}
Analiza problemei:
Argumentele funcţiei standard printf sunt separate de virgulă, deci avem 4
argumente. Formatul % mf specifică lungimea câmpului, formatul %.nf specifică precizia,
astfel s-a putut realiza afişajul cu lungimea şi precizia dorită.

Aplicaţia 3:
Să se realizeze programul care, folosind specificatorii de format, să afişeze la consolă:
Imi place limbajul C foarte, foarte mult
Date de test: Imi place limbajul C foarte, foarte mult!
Programul corespunzător este:
#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
printf("Imi place limbajul %c %s",'C',"foarte, foarte mult!");
getch();
}
Analiza problemei:
Argumentele funcţiei standard printf sunt separate de virgulă, deci avem 2
argumente. S-a folosit specificatorul de format %c pentru a afişa caracterul C şi specificatorul
de format %s pentru a afişa un şir de caractere “foarte, foarte mult!”. Funcţia clrscr a fost
folosită pentru ştergerea ecranului.
25 Etapele realizării şi testării unui program scris în limbajul C.

Funcţia standard scanf

Funcţia standard scanf este asemănătoare cu funcţia standard printf fiind folosită pentru
intrari în loc de ieşiri.
Forma generală a funcţiei standard scanf este următoarea:
scanf (“control“,par1,par2,…parn);
control - identic cu cel de la funcţia printf;
par1, par2, ….parn - zone receptoare ale datelor.
Specificatorii de format ai funcţiei scanf sunt prezentaţi în tabelul următor:

Cod Semnificaţie
%c Citeşte un caracter
%d Citeşte un întreg zecimal
%i Citeşte un întreg zecimal
%e Citeşte un numar float
%f Citeşte un numar float
%g Citeşte un numar float
%o Citeste un număr octal fără semn
%s Citeste un şir de caractere
%x Citeşte un număr hexazecimal fără semn
%p Citeşte un pointer
%n Argumentul asociat primeşte o valoare întreagă egală cu numărul. de caractere
deja citite
%u Citeşte un întreg fără semn
%[ ] Scanare pentru un set de caractere

Aplicaţia 1:
Să se realizeze programul care cere utilizatorului să introducă o valoare de tip întreg şi
o valoare de tip float, citeşte aceste valori şi apoi le afişează.
Specificarea problemei:
Date de intrare: num, fl - valorile de tip întreg şi de tip float;
Date de ieşire: afişarea valorilor citite;
Date de test: Introduceti un număr intreg: 2
Introduceti un număr float: 3.45678
2 3.456780
Programul corespunzător este:
#include <stdio.h>
#include <conio.h>
void main ( )
{int num;
float fl;
clrscr();
printf("Introduceti un numar intreg: ");
scanf("%d",& num);
printf("Introduceti un numar float:");
scanf("%f",& fl);
printf("%d %f",num,fl);
getch(); }
Etapele realizării şi testării unui program scris în limbajul C. 26
Analiza problemei:
În corpul funcţiei principale se declară variabile cu următoarea semnificaţie:
num - reprezintă variabila de tip întreg;
fl - reprezintă variabila de tip float;
Cu ajutorul funcţiei standard printf se va afisa la consolă mesajul "Introduceţi un
număr întreg " iar cu ajutorul functiei standard scanf se va citi valoarea acestui întreg. Acelaşi
lucru se realizează pentru numărul de tip float. Apoi se afişează cele doua numere num şi fl.

Aplicaţia 2:
Să se realizeze programul care cere utilizatorului să introducă raza unui cerc iar apoi
calculează aria acestuia.
Specificarea problemei:
Date de intrare: raza - raza cercului;
Date de ieşire: aria - aria cercului;
Date de test: Introduceţi raza cercului: 2
Aria=Pi*raza*raza=12.566371
Programul corespunzător este:
#include <stdio.h>
#include <conio.h>
#define pi 3.141592653589793
void main()
{ double raza;
clrscr() ;
printf("Introduceti raza cercului: ");
scanf("%lf",&raza);
printf("Aria=Pi*raza*raza=%lf",pi*raza*raza);
getch(); }
Analiza problemei:
În corpul funcţiei principale se declară variabila cu următoarea semnificaţie:
raza – reprezintă variabila în care se citeşte valoarea razei;
Cu ajutorul funcţiei standard printf se va afisa la consolă "Introduceţi raza cercului"
iar apoi, cu ajutorul funcţiei scanf se va citi valoarea razei. La sfârşit se va afişa valoarea ariei.
Directivele de preprocesare încep cu # şi se recomandă folosirea acestui caracter
începând cu prima coloană. Pe lângă directiva include care a fost expluicată mai sus, apare şi
directiva define.
Linia #define pi 3.141592653589793 va schimba toate apariţiile identificatorului pi
cu 3.141592653589793. Această directivă poate să apară oriunde în program, dar atunci vor fi
afectate doar liniile care urmează.

Aplicaţia 3:
Să se realizeze programul care cere utilizatorului să introducă trei caractere iar apoi
afişează aceste caractere.
Specificarea problemei:
Date de intrare: a, b, c – trei caractere citite de la tastatură;
Date de ieşire: afişarea celor trei caractere;
Date de test: Introduceţi trei caractere: xyz
Caracterele sunt: x y z
Programul corespunzător este:
#include <stdio.h>
#include <conio.h>
void main()
27 Etapele realizării şi testării unui program scris în limbajul C.

{ char a,b,c;
clrscr();
printf("Introduceti trei caractere: ");
scanf("%c%c%c",&a,&b,&c);
printf("Caracterele sunt: %c %c %c",a,b,c);
getch();
}
Analiza problemei:
În corpul funcţiei principale se declară variabila cu următoarea semnificaţie:
a, b, c – reprezintă variabilele în care se citesc cele trei caractere;
Cu ajutorul funcţiei standard printf se va afişa la consolă mesajul "Introduceţi 3
caractere:" iar apoi, cu ajutorul funcţiei scanf se vor citi cele trei caractere.
La sfârşit se va afişa cele trei caractere folosind tot funcţia standard printf.

Comentariile

Comentariile sunt "notiţe" care se pun în codul sursă, sunt şiruri de caractere cuprinse
intre /* şi */ atunci când avem comentarii pe mai multe linii sau şiruri de caractere scrise
după // atunci când avem comentarii pe o singură linie. Acestea nu fac parte din codul
executabil.

Aplicaţie:
Să se realizeze programul care cere utilizatorului să introducă numărul de zile pământene
şi apoi le transformă în ani pe Jupiter. Se ştie că un an pe Jupiter este echivalent cu 12 ani pe
Terra.
Specificarea problemei:
Date de intrare: zip - numărul ce se citeşte, numărul de zile pământene;
Date de ieşire: numărul de ani pe Jupiter;
Date de test: Introduceti numărul de zile pamantene: 4380
Echivalent ani pe Jupiter: 1.000000
Programul corespunzător este:
#include <stdio.h>
#include <conio.h>
void main()
{ clrscr();
//declararea variabilelor
float zip;
printf("Introduceti numarul de zile pamantene: ");
/************************************************
*******Citirea numarului de zile pamantene*******
************************************************/
scanf("%f",&zip);
/*transformarea si afisarea rezultatului*/
printf("Echivalent ani pe jupiter: %f",zip/(365.0*12.0) );
getch();}
Analiza problemei:
În corpul funcţiei principale se declară variabila cu următoarea semnificaţie:
zip – reprezintă numărul de zile pământene;
Se poate observa folosirea comentariilor pe o linie utilizând // şi comentariile pe mai
multe linii /* …. */.