Documente Academic
Documente Profesional
Documente Cultură
Limbajul lucreaza puternic cu functii, insasi programul principal este o functie. Putem
incerca intr - un program un alt program definit ca functie. Datorita acestui mod de realizare
utilizatorul poate construi aplicatii pe care sa le re-utilizeze si sa le dezvolte in cursul timpului,
construind programul pe bucati, care se pot asambla.
Limbajul a fost conceput initial in vederea scrierii sistemului de operare UNIX si tot in el a
fost scris sistemul de comenzi NORTON.
In acest limbaj instructiunile si variabilele se scriu cu litere mici. La sfirsitul unei linii apare
semnul ";" . O linie poate fi scrisa pe mai multe randuri.
Sistemul de meniuri
Pentru lansarea in executie a limbajului de foloseste comanda:
(ALT) + litera
unde litera reprezinta prima litera din cuvintele corespunzatoare meniului superior.
Vom prezenta cele mai uzuale comenzi din sistemul de meniuri.
Meniul FILE
Se activeaza tastand (ALT) + F.
Acest meniu contine urmatoarele comenzi care pot fi selectate cu sistemul de sageti :
LOAD ( sau F3):- Incarcarea unui program si editarea lui prin specificarea numelui acestuia,
sau selectarea lui din lista care apare tastind (CR).
PICK ( sau ALT F3 ):- permite selectarea unui program si incarcarea lui din ultimele opt
programe create (ca data).
NEW :-sterge fisierul din memorie si creaza un fisier fara nume ( noname.c ).
SAVE (sau F2 ) :salveaza programul din memorie in directorul deschis, sub numele sub care
a fost deschis.
WRITE TO... :-salveaza un fisier sub numele pe care il dam in acel moment.
Meniul RUN
Contine urmatoarele comenzi:
RUN (sau ALT + F9) :-lanseaza in executie programul de tip .exe specificat in meniul
COMPILE (vezi mai jos ), sau compileaza programul editat, face program executabil si il
lanseaza in executie.
GO TO CURSOR ( sau F4): - executa programul pina in pozitia cursorului. Dupa activarea
acestei comenzi se poate rula programul pas cu pas, tastand repetat fie cheia F7, fie F8. Diferenta
dintre aceste chei consta in aceea ca cu cheia F7 se ruleaza pas cu pas inclusiv functiile definite
in program, iar cu F8 fara rularea in detaliu a acestor functii.
USER SCREEN ( sau ALT + F5 ): - afiseaza ecranul de iesire pentru date. Revenirea la
mediul integrat se poate face apasand o tasta.
Meniul COMPILE
Contine comenzile:
PRIMARY .C FILE: - Se stabileste care este programul *.c primar pentru care se vor genera
programele de tip .obj si .exe cu acelasi nume.
BUILD ALL (sau F9):-Construieste, plecand de la programul *.c specificat mai sus, fisierele
*.obj si *.exe.
MAKE .EXE FILE ( sau F9) :-produce un program .exe plecand de la unul de tip .c .
Meniul PROJECT
Permite controlul programelor realizate prin includerea in programul principal a unor
programe (functii) construite de utilizator. Are urmatoarele comenzi:
PROJECT NAME: - Permite stabilirea fisierului de tip *.prj in care se afla informatiile
referitoare la modul de legare a diferitelor programe si a ierarhiilor dintre acestea.
Meniul OPTIONS
Contine o serie de optiuni care se stabilesc de obicei la instalarea limbajului pe un
calculator, de mai mica importanta pentru programatorul incepator. Aici trebuie specificat de
exemplu tipul de microprocesor, nivelul de eroare la care se intrerup operatiile, etc, lucruri de
importanta, de obicei la instalarea programului pe un anumit calculator. De aceea vom prezenta
numai elementele strict necesare din acest meniu:
COMPILER: - are un submeniu MODEL care contine cele sase tipuri de memorie:
-LARGE: -precum si
OUTPUT DIRECTORY: - Activand aceasta comanda puten specifica directorul in care vor fi
depuse programele de iesire de tip *.obj , *.map si *.exe precum si fisierele de date generate in
urma rularii programelor.
Daca se doreste sa se obtina informatii asupra unor instructiuni sau functii, pe care suntem
pozitionati cu cursorul, sau informatii generale, cand cursorul nu este pozitionat pe un cuvant
specific se tasteaza CTRL + F1.
CTRL + KB: - Marcheaza inceputul unui bloc din locul in care este pozitionat cursorul.
CTRL + KK: - Marcheaza sfirsitul unui bloc in pozitia in care se afla cursorul. In acest
moment blocul marcat va fi afisat cu o culoare distincta.
CTRL + KC: - Copiaza un bloc marcat incepind din pozitia in care se afla cursorul, blocul
copiat fiind marcat cu o culoare distincta.
CTRL + KV: - Muta un bloc marcat din pozitia sa in pozitia in care se gaseste cursorul.
CTRL + KR: - Copiaza un bloc marcat in alt program in pozitia cursorului. Numele
programului din care se face copierea se va scrie in fereastra care se deschide la activarea acestei
comenzi.
CTRL + KW: - Scrie un bloc marcat intr - un fisier al carui nume se specifica in fereastra
care se deschide.
#include <stdio.h>
..................
#define N 50
.......................
.......................
main()
......................................
f(a,b)
..........................................
..........................................
Recomandam cititorului sa urmareasca cu atentie, in timpul expunerii, care sunt liniile care
se termina cu ";" si care nu. In anumite situatii functia main poate avea parametri.
Limbajul are posibilitatea scrierii structurate in sensul ca o instructiune poate fi scrisa in mai
multe moduri, ca de exemplu cea de tiparire a lui a:
1.:
2.:
3.:
a);}
Tipuri de constante si variabile
In acest limbaj sunt definite o serie de constante si variabile. In C toate variabilele si
constantele trebuiesc declarate ca tip.
Tipul int
Este tipul de date intregi, cu semn, cuprinse intre -32768 si 32767. Declararea sa se face
prin declaratia:
int lista;
De exemplu:
int i,a,j1;
Se pot defini si intregi fara semn, cuprinsi in intervalul 0 - 65585 utilizand declaratia:
ca de exemplu:
float lista;
Se pot defini si numere reale in dubla precizie, cuprinse intre 1.7e-308 si 1.7e308, ocupnd
opt octeti, cu ajutorul declaratiei:
double lista;
elementele declarate astfel vor fi cuprinse intre 3.4e - 4932 si 3.4e4932 si ocupa zece octeti.
De exemplu:
float a1;
double s,p;
Tipul long
Este intreg cu semn cuprins intre -2147483648 si 2147483647, fiecare element ocupand
patru octeti. Se declara:
long lista;
Tipul short
Corespunde unor intregi cuprinsi intre -32768 si 32767 declarati cu :
short lista;
Tipul char
Este tipul de data pentru caractere. Pentru elementele de acest tip se rezerva un octet. In
cadrul acestui tip sunt cuprinsi intregii foarte mici din domeniul: -128 si 127, reprezentand de
fapt codul zecimal al caracterelor. Se declara cu:
char lista;
Variabilele pot fi si intregi fara semn, cuprinse intre 0 si 255. In acest caz este necesara
declaratia:
OBSERVATIE IMPORTANTA Declararea unui tip de date are ca efect doar alocarea de
spatiu in memorie, si nu presupune initializarea cu zero a datelor respective. Pentru initiali -
zarea datelor, acest lucru trebuie facut explicit, ca de exemplu:
int i, j = 3 , x;
i = 0;
Tipuri derivate
Tipul enum
Descrie de fapt o multime discreta de numere intregi, grupate intr - o lista sub un nume
generic. Declararea se face prin:
enum nume_generic{lista};
In urma acestei declaratii primului element din lista i se asociaza valoarea 0, celui de - al
doilea valoarea 1, celui de - al treilea 2, etc. De exemplu:
enum numere{a,b,c};
are ca efect:
a = 0 , b = 1 , c = 2
Daca unui element din lista i se atribuie explicit o valoare, elementele care urmeaza vor avea
valori mai mari cu 1, crescator. De exemplu:
are ca efect:
zero=0 ,trei=3,patru=4,cinci=5
Tipul union
Descrie o multime de elemente grupate sub un nume generic avnd campurile din lista
aliniate. Pentru calculatoarele de tip AT 286 alinierea se face invers fata de elementele din lista.
Alocarea de memorie poate fi diferita la diferite momente. Declararea acestui tip se face cu:
De exemplu:
In urma acestei declaratii vor fi aloacate de la dreapta la stanga cimpuri continand 1,3
respectiv 7 biti ,iar variabila de acest tip va purta numele de ct. Pot fi referite elemente din
aceasta lista prin:
ct.i
Pe o astfel de structura se pot face operatii cu campuri de biti ca de exmplu rotiri etc.
Tipul struct
Acest tip reprezinta o colectie de mai multe variabile grupate sub un nume generic cu care
se pot defini variabile structurate. Se utilizeaza declaratia:
Prin acesta declaratie variabila va avea structura definita de structura "nume - structura".
De exemplu:
Prin aceasta, variabila dr va avea structura de tipul dreapta. Putem extrage diferite elemente
din structura, referindu - le:
struct dreapta{float x1; float y1; float x2; float y2; }dr
dr . x1 = 1.2 etc.
Putem atribui valori elementelor unei structuri si extrage elemente din structura, ca de
exemplu:
ab . x1 = 5; b = dr . x2;
Tipul void
Este tipul de variabila vida careia nu i se atribuie valori, cu ajutorul careia se pot construi
insa, diferite functii, care nu au valoare asociata numelui, insa care poate sa aiba o lista de
argumente. Declaratia se face cu:
I. void nume;
In cazul I se defineste un pointer de tip vid, in cazul II o functie vida, fara lista de argumente,
iar in cazul lII o functie vida, cu lista de argumente.
De exemplu:
void mesaj();
mesaj()
printf("Mesaj tiparit");
Aceasta functie este vida si nu are o lista de parametri, iar prin apelarea ei, prin scrierea in
program:
mesaj();
va avea ca efect tiparirea mesajului dintre ghilimele.
Un alt exemplu:
calcul(a,b)
b = a * a + 2;
functia "calcul" este de tip void, insa are ca lista de parametri a si b, iar la apelarea ei va calcula b
plecand de la a. Apelarea se face cu:
calcul(a,b);
Tipul typedef
Aceasta declaratie de tip permite redefinirea numelor de tip de date, fiind posibil sa se
lucreze si cu numele anterior. Are sintaxa:
De exemplu:
va avea ca efect posibilitatea declararii unor variabile atat cu int cit si cu intreg. De exemplu,
putem defini mai departe:
int a;
intreg g;
Tablouri
Se pot defini si tablouri cu tipurile numerice, precizand in declaratia de tip, numarul de
elemente:
int a[100];
double beta[50];
de precizat ca indicii tablourilor sunt definiti de la 0 la n - 1, adica de exemplu:
De precizat ca pentru declararea unor tablouri se pot utiliza si constante scrise simbolic,
definite la inceputul programului in asa numita "zona antet" folosind macrodefinitia:
#define N 100
#define M 50
int x[N];
char y[N];
Notatia acestor constante se va face cu litera mare. Dorim sa observam aici ca prin aceste
macrodefinitii, se asociaza, partii din dreata, indiferent de natura notatia din stanga. De exemplu
putem inlocui + cu ADUNAT:
#define ADUNAT +
CLASE DE MEMORIE
Clasele de memorie permit definirea unor zone de memorie temporara pentru anumite
variabile dinamice si a unor zone permanente comune.
sau:
tip lista_de_variabile;
declaratia aparand in interiorul functiei main, sau a celorlalte functii definite. Variabilele din
acesta clasa au valori initiale nedefinite, adica nu se face initializarea lor la intalnirea declaratiei
de tip, si au valabilitate doar in interiorul functiei in care sunt definite. Pentru utilizarea lor ele
trebuiesc initializate.
Un exemplu de utilizare a variabilelor din acesta clasa este dat in secventa urmatoare, in care
a si j sunt de clasa auto:
main()
auto float a;
int j;
j=a=2;
................
Clasa static
Variabilele din acesta clasa pastreaza valorile intre diferitele etape ale executiei
programului. Variabilele de aceasta clasa pot fi "static externe" sau "static interne" in functia de
aparitia declaratiei lor in modulul antet sau in corpul functiei. Variabilele din aceasta clasa sunt
initializate automat cu zero la intalnirea declaratiei de tip. Declararea se face cu:
De exemplu:
static int x, y;
Variabilele static externe sunt vizibile similar, in toate functiile din interior, nefiind vizibile
din exterior.
Clasa extern
Variabilele din clasa extern se declara cu:
extern tip lista_de_variabile;
si reprezinta acele variabile vizibile din toate zonele componente ale unui program. Declararea
variabilelor din acesta clasa este avantajoasa la transmiterea facila a acestor variabile intre
diferitele functii. Variabilele din aceasta clasa sunt initializate automat la intalnirea declaratiei de
clasa.
Clasa register
Variabilele din acesta clasa sunt variabile locale, care sunt plasate in registrii rapizi ai
calculatorului asigurandu - se o viteza mare de lucru cu ele. Se pot declara, din acesta clasa
variabilele de tip char si int, putand fi declarate de acesta clasa un numar mic de variabile, numar
dependent de versiunea limbajului si calculator. In cazul TC Vers 2.0 se pot declara trei variabile
int de aceasta clasa.
Daca se pun de casa register, un numar mai mare de variabile decat permite versiunea, numai
primele vor fi tratate de clasa register celelalte fiind trecute automat de clasa auto. Pe acest motiv
se recomanda ca declararea variabilelor de clasa register, se faca in ordinea importantei lor,
declarand intai indicii cei mai mult utilizati.
O secventa de program in care apare utilizata cu prudenta aceasta declaratie se poate urmari
mai jos, in care se face inmultirea a doua matrici:
main()
register int i, k, l;
c[k][l]=0;
{
c[k][l] = c[k][l] + a[k][i] * b[i][l];
Operatori aritmetici
Trebuie sa atragem atentie ca pentru ridicarea la putere este definita o functie in bib- lioteca
matematica.
++ -operator de incrementare cu 1,
-- -operator de decrementare cu 1.
c = c + 1;
c++;
x = y = z = .. = c;
== pentru egal
!= pentr ne-egal
&& pentru SI
|| pentru SAU
! pentru NU
care efectueaza expresia expr1 in cazul in care expresia logica expr-log este adevarata si expr2 in
caz contrar. Cu ajutorul acestui operator de poate utiliza eficient instructiunea return(...) pentru
iesirea din functii:
main()
int a = 2 , b = 6;
c = maxinul ( a , b );
return( (a>b) ? a : b );
Operatori pe biti
Sunt definite operatii pe campuri de biti:
===========================================================
===========================================================
| re cu zero.
===========================================================
op1 & op2 | realizeaza operatia AND. Are ca efect transfor-
============================================================
| n|b=(10101111)
============================================================
===========================================================
===========================================================
Trebuie sa atragem atentia ca in cazul deplasarii la stinga, daca operanzii sunt de tip
unsigned int, deplasarea se face total, iar daca sunt de tip int si sunt cu semn, deplasarea se face
cu exceptia bitului de semn, acesta fiind cel din stanga:
De exemplu:
int x, y = 2;
x = 15;
x = x << y;
are ca efect:
x=(00001111) x=(00111100)
a^ = b; reprezinta a = a ^ b;
De exemplu in hexazecimale :
c = 36; m = 10000010
c = c | m
Operatori la adresa
Operatorul & plasat inaintea unei variabile ne permite sa aflam adresa la care este memorata
variabila respectiva, care poate fi determinata ca marime de tip int, long int, sau hexazecimal (tip
unsigned char). De exemplu:
int a, b[10], c;
unsigner char d;
a=10;
b[ ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };
c = &a;
d = &b[ 3 ];
va furniza lui c, adresa la care e memorat a sub forma unui intreg si lui d, adresa lui b[3] ca
hexazecimal.
Operatorul * asociat in fata unei variabile, reprezinta un pointer. Asociat unei variabile care
reprezinta o adresa, el returneaza continutul memorat la adresa respectiva.
De exemplu:
int a=15,b,c;
b=&a;
c=*b;
OBSERVATII:
- In cazul operatorilor aritmetici de acelasi ordin, care apar succesiv intr - o expresie,
aplicarea lor se va face de la dreapta la stanga, asfel:
c = 6 / 2 * 2; face ca:
c = 6
- zona de functii care contine functia main ( ) si celelalte functii definite de utilizator. Atat
programul principal, functia main( ) , cit si celelalte functii, au delimitate zona de inceput si de
sfirsit prin paranteze .
Limbajul C are o mare putere prin bibliotecile de functii care se includ in program prin
declaratiile:
# include <nume.h>
# include "fisier.c"
unde <,> reprezinta faptul ca fiseirul nume.h se afla in directorul INCLUDE, continand functiile
definite de producatorul de soft, iar "fisier.c" este un fisier de tip C, care seinclude din directorul
de intrare asignat, in care se afla si programul principal. Un exemplu de program este :
# define N 200
int n=N,i;
float x,y;
main( )
/* program exemplu */
i=n*n;
i+=n;
functie ( );
x=x+y;
functie ( )
{
register int k;
k=n+n*n;
x=k;
y=k+2;
De asemenea atragem atentia ca nu vom prezenta decat un mic numar de functii din
bibliotecile de includere , insa suficient pentru rezolvarea problemelor de proiectare.
Instructiunile if si if...else
a) Instructiunea if are forma: I):
if (expr)instructiune 1 ;
instructiune 2 ;
if (expr)
instructiune 1 ;
..........................
instructiune n ;
instr 1 ;
..........................
Unde expr este o expresie de tip logic, simpla, obtinuta cu operatii ( > , ==, etc. ) sau
compusa cu operatii &&, etc.
In prima forma, daca expresia este adevarata, se efectueaza instructiunea 1, dupa care se
efectueaza instructiunea 2, iar daca nu este adevarata, se efectueaza instructiunea 2.
b) Instructiunea if...else.......
are formele:I)
if (expr) instr 1 ;
else instr 2 ;
instr 3;
sau II):
if(expr)
............
<bloc 1>
else
.........
<bloc 2>
instr 3;
Daca expr este adevarata in cazul I, se efectueaza instr 1, dupa care instr 3, iar daca nu este
adevarata, instr 2, dupa care instr 3. Pentru cazul II, daca expresia este adevarata se efectueaza
instructiunile din bloc 1, dupa care se efectueaza instr 3, iar daca nu este adevarata se efectueaza
instructiunile din bloc 2, dupa care instr 3.
if (expr 1) instr 1;
instr 3;
Exemplu:
x=x*x;
y=x/y;
else
x=x+5;
y=x*y;
x=x+y;
Instructiunea for(....)
Forma acestei instructiuni poate fi I):
sau II):
bloc de instructiuni;
unde "expr 1" reprezinta expresiile de initializare a variabilelor din bucla, "expr 2" reprezinta
conditia de sfirsit a buclei, iar "expr 3" furnizeaza conditia de modificare a variabilei. De
exemplu:
main( )
int j,i;
j=i*i;
j=j+j*10;
va insemna ca bucla este indexata dupa i, cu valoarea de start 0 si valoarea finala 100, cu pas
crescator cu 1.
La fel:
for(;;)
i=j;
}
va descrie o bucla infinita in care se repeta instructiunile din bloc.
int i,j,k;
k=i+j;
} /* sfirsit bucla j */
} /* sfirsit bucla i */
Instructiunea while
Este o instructiune de ciclare care are formele:
sau:
while (expr)
bloc de instructiuni;
Daca expresia expr este adevarata, se efectueaza instructiunea (respectiv blocul de instructi-
uni), iar in caz contrar se trece mai departe fara a se executa instructiunea sau blocul.
s = 1 + 12 + 13 + ... + 1k + ...
2 2 2
main( )
int n=16000,i;
s=1;
i=1;
while (i<=n)
s=s+1/(i*i);
i+=1;
Instructiunea do...while
Daca la instructiunea precedenta, testarea conditiei se face la inceputul buclei, in cazul in
care verificarea condictiei se poate face numai la sfirsitul buclei, se poate utiliza instructiunea: I):
do instructiune;
while (expr);
do
....................
bloc de instructiuni;
while (expresie);
.......................
Daca expresia este adevarata, instructiunea (I) sau blocul de instructiuni (II) se reia atata timp
cat conditia este satisfacuta. Instructiunea sau blocul se efectueaza intotdeauna cel putin o data.
int i,n=16000;
main( )
s=1;
i=1;
do
s0=s;
s=s+1./(k*k);
i=i+1;
d=s-s0;
Instructiunea return
Este folosita la iesirea dintr - o functie. Are forma:
a) return;
b) return( );
c) return(var);
Daca functia este de tip void, se poate folosi forma a ( sau b), fara a se returna nimic la
iesirea din functie. Daca se foloseste varianta c), atunci functiei i se asociaza valoarea var. De
exemplu, putem defini functia de tip void, func( x , f ), unde f = x + 1 / x si functia de tip float
g(x), unde g ( x ) = x / ( x + 1 ) si sa calculam aceste functii pentru x = 5 si x = 7.5:
float x, g, f;
float g( float x );
main( )
float x1 = 5, x2 = 7.5;
funct(x1, f )
f1 = f;
funct(x2, f );
f2 = f;
y1 = g( x1 );
y2 = g( x2 );
funct( x, f );
{
f = x + 1 / x;
return( );
g ( x )
{ float a;
g = x / ( x + 1 );
return ( a ) }
Un alt exemplu este functia maxim( x , y ) de tip float care returneaza maximum dintre x si y
de tip float.
else return ( y );
Instrtuctiunea break
Are forma:
break;
si este folosita la iesirea din cicluri, din locul in care este intalnita.
s = 1 + 1 / 2 + ... 1 / k + ...
2 2
main( )
s = s0 = 1;
d=.00001;
s=1./(k*k);
ds=s-s0;
if(ds<d) break;
s0=s;
Instructiunea switch
Are sintaxa:
switch(expr);
............
break;
.............
break;
.........................
default; instruct n;
instuctiune_ext;
...............
Unde "expr" este o expresie sau variabila care poate avea valori de orice tip.
Daca expresia are valoarea val - 1, se efectueaza secventa de la instruct 1 pana la primul
break trecand apoi la instruct - ext. Similar pentru val - 2 se efectueaza instruct 2, pana la
urmatoarea instructiune break, apoi sare la instruct-ext, .........., respectiv sare la instuct - ext la
intalnirea instructiunii break;, ... , iar daca valoarea expresiei nu coincide cu sirul de valori val-
1... se efectueaza secventa de la instruct n, corespunzatoare cazului default.
f = x + 1 / x;
f = x * x /(1+x);
f = x;
switch(k)
case 1; f = x + 1 / x;
break;
case 2; f = x * x / ( 1 + x );
break;
default; f = x;
...................
In cazul in care apar valori tip sir de caractere, valorile se vor plasa intre ghilimele.
De exemplu, pentru cazul anterior daca k este de tipul char cu valori "a", "b", atunci putem
scrie:
switch (k)
case "a"; f = x + 1. / x;
break;
case "b"; f = x * x / ( 1 + x );
break;
default ; f = x;
\end{ verbatim }
\section{Instructiunea continue}
$ $
Are sintaxa:
\begin{verbatim}
continue;
Instructiunea goto
Are forma:
goto etic;
...............
etic: instructiune;
..............
si are ca efect saltul neconditionat la eticheta etic care poate fi numerica sau nenumerica.
Atragem atentia ca pe linia pe care este plasata eticheta trebuie sa existe o instructiune sau in caz
contrar, se poate plasa instructiunea vidi (;), adica este corect.
goto etic;
...........
etic: ;
............
Biblioteca matematica
La dispozitia utilizatorului se afla un important numar de functii matematice in fisierul:
INCLUDE\math.h
#include <math.h>
Prezentam pe scurt functiile definite in acesta biblioteca:
[0,pi).
-calculeaza arcsin(x),
[ - pi / 2 , pi / 2 ].
-calculeaza arctg( x ),
( - pi / 2 , pi / 2 ).
-calculeaza arctg( y / x ),
[ - pi , pi ],
-daca x = y = 0 ,calulatorul semnaleaza eroare.
egal cu x.
egal cu x.
x = y . i + f
double,
x si y adica sqrt( x * x + y * y ).
pow( x , y ) =x^y
de 264.
Exista si functii utile pentru calculul matematic in afara celor cuprinse in fisierul math.h. De
exemplu in:
INCLUDE\stdlib.h
se gasesc;
double,
#include <complex.h>
complex z1;
double x,y;
main(void)
x = 1.3; y = .97;
z1 = complex( x , y );
defini astfel:
double re,im;
double a;
a=cabs(z);
complex,
-calculeaza conjugatul complex a lui z.
Trebuie sa atragem atentia asupra faptului ca sunt active si majoritatea functiilor matematice
din math.h cu argument complex: sin, cos, tan, exp, log, log10, sinh, cosh,, sqrt, pow, asin, acos,
asinh- returnand un complex. Functiile: real, imag, arg - au argument complex returnand un
numa de tip double.
Prototipul acestor functii se gaseste in INCLUDE\ stdio.h , de aceea pentru utilizarea lor, in
modulul antet trebuie sa apara:
# include <stdio.h>
Functia printf(...)
Are sintaxa generala :
unde var 1, var 2,...este o lista de variabile de diferite tipuri, iar lista formate este o lista de
formate asociate tipurilor respective si mesaje tip text, precum si de caractere de control. Efectul
ei este de tiparire pe ecran a variabilelor formate si a mesajelor asociate. Se pot utiliza
urmatoarele formate:
%s sir de caractere
\n linie noua
\b spatiu inapoi
\t tabulare pe orizontala
De exemplu:
#include <stdio.h>
main()
print f("\n%d",a)
120
Terminat de scris!
Se pot utiliza si formate fixe pentru tiparirea datelor. De exemplu:
%n1d.n2d
unde n1 si n2 sunt doua numere intregi. In acest caz se aloca n1 digiti inainte de virgula si n2
dupa virgula. Daca descriptorul de format, dupa % apare semnul - atunci vor fi aliniate la stanga.
Daca dupa % apare + numerele pozitive se vor afisa cu semnul + iar cele negative cu -.
Functia scanf(....)
Se utilizeaza pentru citirea datelor de la tastatura. Instructiunea are sintaxa:
scanf("lista_de_formate",lista__de_adrese)
unde lista-de-formate reprezinta lista formatelor citite, formate prezentate la functia printf().
Lista de adrese reprezinta lista adreselor la care vor fi memorate numerele citite. Se stie ca
adresele variabilelor citite se scriu:
&variabila
Prin urmare, citirea lui a- de tip float, b - de tip int si c-de tip char se face cu:
Ca exemplu vom prezenta un program care citeste doua marimi tip float, un mesaj cu
lungime maxima 20 de caractere, un caracter afiseaza mesajul, calculeaza suma si afiseaza
rezultatul si se afiseaza caracterul.
Rezultatele se afiseaza fiecare pe linie separata, iar datele de intrare se introduc pe linia pe
care apar mesajele.
Pentru a intelege mai bine aceste instructiuni puteti introduce in acest program, intre
ghilimele, spatii, etc.
/*===================================================*/
/* */
/* Program exemplu */
/*===================================================*/
#include <stdio.h>
main()
char c[20],d;
float a,b,x;
scanf("%f",&a);
scanf("%f",&b);
scanf("%s",%c);
scanf("%c",&d);
x=a+b;
printf("\n %s",c);
getch();
este de tip char si are ca efect citirea unui caracter de la tastatura cu afisarea caracterului pe
ecran.
Functia getche se gaseste in "conio.h" si are sintaxa:
getche();
este de tip char si are ca efect citirea de la tastatura a unui caracter, cu afisarea pe ecran a
caracterului.
gets();
este de tip sir si are ca efect citirea unui sir de la tastatura cu afisarea mesajului.
Vom ilustra expunerea noastra cu un program in care sa se citeasca caracterul a si sirul [20]
cu afisarea mesajului si un caracter fara afisarea mesajului si fara atribuirea acestuia unei
variabile:
#include <stdio.h>
char a,b[20];
main()
a = getch();
b = gets();
getche();
INCLUDE\conio.h
Cu ajutorul acestor functii, se pot afisa in mod elegant texe pe ecran si se pot construi
meniuri de conversatie, programele realizate capatand un aspect profesional.In versiunile mai noi
ale limbajului, incepand de la TURBO - C 3.0 exista meniuri prefabricate si chiar iconuri pentru
lucru cu mouse - ul, insa aceste versiuni functioneaza pe calculatoare cu resurse puternice
(memorie RAM peste 2 MOct si spatiu pe disc peste 50 MOct). De aceea ne vom margini sa
prezentam doar functiile din versiunea 2.0.
In mod text, pe ecran se pot reprezenta fie 80 caractere pe linie pe 25 de linii (80 * 25 =
2000), fie 40 * 25 = 1000.
Pozitia unui caracter se poate exprima prin coordonata (x,y), unde x si y sunt intregi, x
reprezentand pozitia in linie a caracterului iar y numarul liniei pe care se afla caracterul. Coltul
din stanga sus al ecranului are coordonata (0 , 0) iar cel din dreapta jos (79 , 24) (pentru o
reprezentare pe 80 * 25).
textmode( mod_text );
unde mod-text reprezinta o variabila de tip intreg, care poate avea valorile:
valoare
notatie
semnificatie
-1 LASTMODE revenirea la modul
precedent
0 BW40 alb - negru, 40 de
coloane
1 C40 color, 40 de coloane
2 BW80 alb - negru, 80 de
coloane
3 C80 color, 80 de coloane
4 MONO monocrom 80 coloane
textmode(1);
textmode(C40);
Pentru reprezentarea color pe ecran avem la dispozitie urmatoarele culori pentru fond si
caractere, pentru culoarea de fond fiind active numai primele opt coduri:
Valoare Constanta Culoare
0 BLACK negru
1 BLUE albastru
2 GREEN verde
3 CYAN turcoaz
4 RED rosu
5 MAGENTA purpuriu
6 BROWN maro
7 LIGHTGRAY gri - deschis
8 DARKGRAY gri - inchis
9 LIGHTBLUE albastru deschis
10 LIGHTGREEN verde deschis
11 LIGHTCYAN turcoaz deschis
12 LIGHTRED rosu deschis
13 LIGHTMAGENTA purpuriu deschis
14 YELLOW galben
15 WHITE alb
128
BLINK
caracter
clipitor
Pentru modul alb - negru, programatorul are la dispozitie urmatoarele functii de tip void
pentru a stabili intensitatea de iluminare a ecranului:
In cazul lucrului in mod color trebuie stabilita atat culoarea fondului, cat si culoarea de
reprezentare a caracterelor. Pentru culoarea fondului se foloseste:
textbackground(culoare);
unde variabila "culoare" este o variabila de tip intreg conform tabelului precedent, cuprinsa
intre 0 si 7.
textcolor(culoare);
Ambele culori, precum si conditia de clipire se pot impune cu o singura functie, anume:
textattrib(const);
unde "const" este o constanta de tip intreg, a carei valoare se stabileste conform relatiei:
unde culoare-de-fond, culoare-caractere si clipire se pot exprima fie valoric, fie utilizand
codurile cu majuscule din tabelul anterior. De exemplu, pentru tiparirea pe fond albastru, cu
caractere galbene, clipitoare , 80 de caractere pe linie, se poate folosi fie secventa:
#include <conio.h>
#include <stdio.h>
main()
int a,b,c,x;
x=16*a+b+c;
.......................
textmode(C20);
textattrib(x);
.......................
fie:
\begin{verbatim}
.........................
Pentru definirea unor ferestre dreptunghiulare pentru afisarea textelor, se pot folosi instruc-
tiunea:
unde ( x1 , y1 ) reprezinta coltul din stinga sus al ferestrei iar ( x2 , y2 ) coltul din dreapta
jos:
clrscr();
Pentru plasarea cursorului pe una din pozitiile ferestrei active, definita anterior se poate folosi
instructiunea:
gotoxy( x , y );
unde (x , y) reprezinta coordonatele cursorului relative la fereastra, coltul din stanga sus
avand coordonata (0 , 0).
x = wherex();
y = wherey();
struct textinfo{
Pentru citirea de la tastatura a unui caracter se recomanda utilzarea instructiunii de citire fara
ecou, descrisa anterior:
c = getche();
unde c este de tip intreg, iar pentru scrierea acestuia in fereastra deschisa , in pozitia curenta
stabilita se foloseste:
putchar(c);
Pentru scrierea cu format a unor mesaje necolorate in fereastra deschisa se foloseste instruc-
tiunea descrisa anterior:
printf(.......);
cprintf(........);
Pentru a copia un text dintr - o zona cu limitele ( x1 , y1 ) - ( x2 , y2) , intr - o zona care are
coltul din dreapta sus de coordonate ( x3 , y3 ) se foloseste instructiunea:
insline();
iar pentru stergerea unei linii in care este pozitionat cursorul intr - o fereastra se foloseste:
delline();
int left,
int top,
int right,
int bottom,
int borderstyle,
int bordercolor,
int backgrdcolor);
in care:
-left, top - reprezinta coordonatele x si y ale coltului din stanga sus a ferestrei definite pentru
meniu.
int row,
char *message,
int skip,
int (*action) () ) ;
unde:
-"action" este un pointer la o functie care va fi executata atunci cand cu sagetile se selecteaza
linia respectiva si se tasteaza ENTER.
unde "nume" reprezinta numele meniului definit anterior prin definepopup(), iar "first"
reprezinta numarul liniei in care se va pozitiona la inceput bara de selectie. Similar celorlalte
functii, functia returneaza 0 sau 1 in caz de nereusita/reusita.
int dezactivatepopup();
unde "nume" este numele meniului deja definit, iar pentru a sterge totul de pe ecran si din
memorie se utilizeaza :
int releasall();
showcursor();
hidecursor();
Instructiuni grafice
Se gasesc in INCLUDE\ graphics.h si prin urmare se incarca cu directiva de includere:
#include <graphics.h>
Trebuie sa atragem atentia ca operatiile grafice se fac intr- un domeniu fizic, dependent de
placa grafica de care dispune fiecare calculator. Pentru placa CGA aceste coordonate vor fi:
Prin urmare, in vederea unor reprezentari grafice de alte dimensiuni, trebuie sa transformam
figura la dimensiunile fizice ale ecranului.
Sunt definite urmatoarele instructiuni:
initgraph(&graphdriver,&graphmode,"\\tc");
closegraph();
Instructiunea line
Are sintaxa:
line(x1,y1,x2,y2);
unde x , y si x , y sunt intregi, reprezentand coordonatele punctului initial si final intre care
1 1 2 2
se traseaza o linie.
Instructiunea lineto
Are sintaxa:
lineto(x,y);
unde x , y sunt intregi. Are ca efect trasarea unei linii din pozitia in care se afla cursorul in
pozitia de coordonate (x , y).
Instructiunea circle
Are sintaxa:
circle(x,y,r);
unde x, y, r sunt intregi. Are ca efect trasarea unui cerc cu centrul in (x,y) si cu raza r.
Instructiunea rectangle
Are sintaxa:
rectangle(x1,y1,x2,y2);
unde x1, y1, x2, y2 sunt intregi. Are ca efect desenarea unui dreptunghi avand coltul din
stanga sus definit de (x1 , y1), iar cel din dreapta jos de (x2,y2).
setbkcolor(culoare);
setcolor( culoare );
Instructiunea outtext
Are sintaxa:
outtext(x,y,"...text...");
unde x, y sunt intregi, reprezentand coordonata punctului din care incepe reprezentarea
textului dintre ghilimele.
Instructiunea settextstyle
Are sintaxta:
settextstyle(a,b,c);
HORIZONTAL_DIR
VERTICAL_DIR
iar c este un intreg reprezentand dimensiunea de reprezentare. Daca c = 1 , caracterele se
reprezinta pe 8 * 8 pixeli, daca c = 2, se reprezinta pe 16 * 16 pixeli, etc.
a=getmaxx();
b=getmaxt();
unde a si b sunt doi intregi. Instructiunile furnizeaza limitele maxime ale ecranului
( coordonatele x si y ). Aceasta instructiune poate fi folosita pentru construirea de programe care
sa functioneze independent de placa grafica a calculatorului.
Instructiunea moveto
Are sintaxa:
moveto(x,y);
unde x si y sunt intregi. Are ca efect fixarea punctului de unde incepe sa se faca o
reprezentare grafica. Aici x si y reprezinta cordonatele acestui punct in spatiul ecranului. Se pate
folosi cu lineto() in locul instructiunii line() pentru reprezentari grafice.
Vom ilustra instructiunile grafice cu un exemplu in care vom reprezenta un sistem de axe
avand pe x valori de la 0 la 7, iar pe y de la -2 la 2 in care vom reprezenta un sinus si vom scrie
sus mesajul "Grafic":
#include <math.h>
#include <conio.h>
#include <graphics.h>
int a, b, c, d, i;
main()
{
initgraph(&graphdriver, &graphmode, "\\tc" );
setbkcolor(LIGHTBLUE);
setcolor(YELLOW);
settextstyle(GOTHIC_FONT, HORIZONTAL_DIR, 1 );
line(0, 0, 0, ay);
x[i] = 2 * pi * i / 500;
y[i] = sin( x[ i ] );
a = ax * x[i] / x[500];
b = ax * x[i-1] / x[500];
c = ay / 2- (ay / 2) * y[i] / 2;
d = ay / 2 -(ay / 2) * y[i-1] / 2;
line( b, d, a, c);
getch();
closegraph();
}
Fisiere in C
Vom prezenta un mod simplu de scriere in fisiere care nu necesita cunostiinte aprofundate
asupra operatiilor cu fisiere.
FILE *nume1;
nume1=fopen(nume2,"tip");
unde nume2 reprezinta o variabila de tip sir care va contine numele sub care se memoreaza
fisierul pe disc iar tip reprezinta modul in care se deschide fisierul avand urmatoarele posibilitati:
Este posibil sa utilizam si combinatii "w+r" pentru cazul in care se scrie in fisier apoi se
citeste din el.
fclose(nume1);
fprintf(nume1,"formate",lista_de_variabile);
unde formate reprezinta lista de formate a marimilor care se citesc, utilizandu - se aceleasi ca
la instructiunea printf. Lista - de - variabile va reprezenta lista variabilelor care se scriu in fisier.
unde nume1 si formate au fost prezentate anterior, iar lista - de - adrese este cea a adreselor
la care urmeaza sa fie depuse datele citite din fisier.
Vom ilustra aceste instructiuni cu un program care citeste de N = 1000 de ori intregii cu si a
in fisieryl asignat cu *f si scrie un intreg reprezentand numarul valorii scrise si x[i] de tip float
pentru 1000 de valori.
Fisierul de iesire este asignat *co. Numele sub care sunt scrise pe disc se citeste la tastatura.
#include <stdio.h>
#define N 1000
char nume[20];
int cu, a, b, i, j;
float x[1001];
FILE *f;
FILE *co;
main()
scanf("%s",nume);
et:f=fopen(nume, "r" );
if ( f == 0)
exit();
goto et;
}
for(i=0; i <= N; i++ )
x[i] = cu + a;
if ( co == 0)
goto et;
BIBLIOGRAFIE
1. Vlad Caprariu - Ghid de utilizare - Turbo C.0, Micro - Informatica, Cluj Napoca, 1991.
APLICAŢII – LIMBAJUL C
APLICAŢIA 1:
Să se scrie un program care citeşte un şir de
numere întregi şi scrie suma lor.
# include <stdio.h>
void main( )
{
int s,i;
s=0;
while ( scanf ( "%d" , &i) = =1)
s=s+i;
printf("suma=%d \ n",s);
}
APLICAŢIA 2:
Să se scrie un program care citeşte un număr întreg n şi calculează şi afişează n!
(factorialul lui n).
# include<stdio.h>
main( )
int n,i;
double f;
f =1.0;
i =2;
while (i<=n)
f =f*i;
i++;
}
APLICAŢIA 3:
Se dă funcţia:
Să se scrie un program care citeşte valoarea lui x (dat de la tastatură), calculează valoarea
lui y şi apoi o scrie pe ecran.
# include <stdio.h>
main( )
{float x,y;
scanf ("%f",&x);
if (x>0)
y=3*x*x+2*x-10;
else
y=5*x+10;
APLICAŢIA 4:
Să se scrie un program care citeşte două numere întregi şi afişează maximul lor.
# include <stdio.h>
void main()
{
int a,b,c;
if (a>b)
c=a;
else
c=b;
a,b,c);
APLICAŢIA 5:
Să se scrie un program care citeşte valoarea lui x şi scrie valoarea funcţiei următoare:
# include <stdio.h>
void main( )
float x, y, a;
scanf("%f", &x);
a = x*x;
if (x<0)
y = 4*x*a+5*a-2*x+1;
else
if (x= =0)
y=100;
else
y = 2*a+8*x-1;
printf("y=%f \ n",y);
APLICAŢIA 6:
Să se afişeze un scurt mesaj pe ecran.
# include <stdio.h>
APLICAŢIA 7:
Să se scrie un program care citeşte un şir de întregi şi scrie maximul lor.
# include <stdio.h>
void main( )
{
int max, i;
scanf("%d",&max);
if (i>max)
max=i;
printf("max=%d\n",max);
APLICAŢIA 8:
Să se scrie un program care copiază la ieşire intrarea sa.
# include <stdio.h>
void main()
int c;
putchar(c);
APLICAŢIA 9:
Să se scrie un program care scrie numărul caracterelor citite din fişierul de intrare,
utilizându-se instrucţiunea "while".
# include <stdio.h>
void main( )
long n;
n=0;
n++;
APLICAŢIA 10:
Să se scrie un program care numără liniile de la intrare utilizându-se instrucţiunea
"while".
# include <stdio.h>
void main( )
int c, n;
n=0;
if (c = =’\n’)
n++;
APLICAŢIA 11:
Să se scrie un program care scrie numărul caracterelor citite din fişierul de intrare,
utilizându-se instrucţiunea "for".
# include <stdio.h>
void main( )
long n;
APLICAŢIA 12:
# include <stdio.h>
void main( )
int c, n;
if (c = =’\n’)
n++;
printf("numarul liniilor citite: %d \ n",n);
APLICAŢIA 13:
Sa se rezolve ecuatia de gradul doi.
float a, b, c;
clrscr( );
printf("Introduceti a: ");
scanf("%f",&a);
printf("Introduceti b: ");
scanf("%f",&b);
printf("Introduceti c: ");
scanf("%f",&c);
delta=b*b-4*a*c;
if (delta>=0)
{ rex1=(-b+sqrt(delta))/(2*a);
rex2=(-b-sqrt(delta))/(2*a);
imx1=imx2=0;
else
imx1 = sqrt(-delta)/(2*a);
imx2 = - imx1;
getch( );