Sunteți pe pagina 1din 70

NOTIUNI LMBAJUL C – APLICAŢII

Prof. dr. Gheorghe DRĂGĂNESCU

Asist. dr.ing. Rodica BĂDĂRĂU

Elemente introductive de programare in TURBO - C

Limbajul C reprezinta un limbaj extrem de evoluat care ofera o serie de avantaje ca de


exemplu: viteza de calcul comparabila cu limbajul de asamblare, o extrem de bogata biblioteca
de functii care permit utilizatorului acces la toate nivelele si functiile calculatorului, lucrul cu
pointeri, posibilitatea comunicarii cu alte limbaje ca de exemplu cu PASCAL, posibilitatea de a
defini functii noi in biblioteca de functii etc. Utilizatorul are posibilitatea lucrului comod datorita
existentei unui mediu de programare cu un bogat sistem de meniuri si a unui "help" complex.

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.

Trebuie sa atragem atentia ca exista diferente intre bibliotecile de functii elaborate de


diferitele case de soft. In cursul lucrarii ne vom referi la limbajul Turbo-C elaborat de firma
BORLAND CORP., datorita performantelor sale.

Sistemul de meniuri
Pentru lansarea in executie a limbajului de foloseste comanda:

Tc (CR) sau: tc.exe (CR)

Va apare un sistem de meniuri care poate fi activat prin tastarea simultana a:

(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.

DIRECTORY :-afiseaza programele din directorul caruia ii precizam numele.

CHANGE DIR: - schimba directorul curent.

OS SHELL: - abandoneaza temporar TC revenind sub sistemul de operare (DOS). Reve-


nirea in TC se face tastind ESC.

QUIT (sau (ALT)+X ): - paraseste TC revenind in DOS.

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.

PROGRAM RESET: -reseteaza programul chiar daca a fost intrerupt.

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.

COMPILE (sau ALT+F9):-compileaza programul *.c primar producand un fisier *.obj cu


acelasi nume.

MAKE .EXE FILE ( sau F9) :-produce un program .exe plecand de la unul de tip .c .

LINK: - produce un program .exe plecand de la unul de tip .obj.

GET INFO: - Da informatii asupra programului compilat.

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.

BREAK MAKE ON: - Contine conditiile de intrerupere a procesului de formare a unui


program *.exe plecand de la un proiect cu mai multe surse. Are la randul sau urmatorii
parametri:

WARNINGS: - intreruperi pentru avertismente.

ERRORS: - intreruperi pentru erori.

FATAL ERRORS: - Intreruperi pentru erori fatale.

LINK: - intreruperi inaintea editarii de legaturi.

AUTO DEPENDENCIES: - Se verifica interdependentele din programul de tip *.prj


specificat.

CLEAR PROJECT: - se anuleaza procesul de formare a unui program de tip proiect.

REMOVE MESSAGES: - Sterge fereastra de mesaje.

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:

-TINY:-64 K pentru cod, date si tabele.

-SMALL:-64 k pentru date si 64 k pentru cod, in segmente diferite. Se foloseste in aplicatii


obisnuite.

-MEDIUM: - pentru cod pana la 1 Moct iar pentru date pana la 64 k.

-COMPACT:-pentru cod pana la 64 k iar cod pana la 1 Moct.

-LARGE: -precum si

-HUGE: - se folosesc pentru programe foarte mari cu foarte multe date.

DIRECTORIES : - In acest meniu se specifica directoarele in care se gasesc fisierele


necesare pentru functiile din biblioteca de tip heder ( *.h ).

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.

SAVE OPTIONS: - Serveste la salvarea noilor optiuni.

De asemenea avem la dispozitie un HELP continand informatii asupra comenzilor


disponibile care poate fi activat tastand F1.

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.

Comenzi pentru blocuri


Exista posibilitatea de a face diferite operatii asupra unor secvente de program (blocuri ). In
acest sens avem la dispozitie urmatoarele comenzi:

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 + KT: - Marcheaza cuvantul pe care este pozitionat cursorul.

CTRL + KY: - Sterge blocul marcat.

CTRL + KH: - Dezactiveaza sau reactiveaza un bloc marcat.

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.

Structura unui program C


La inceputul unui program C se afla un asa zis "modul antet" in care pot apare diverse
macrodefinitii, directive de includere a unor biblioteci si declaratii de tipuri dupa care incepe
progranul propriu - zis reprezeentat de functia "main()" si alte functii. Aceste functii sunt
delimitate de paranteze { , }. Conentariile pot apare oriunde si sunt delimitate de sirul de
semne /* si */. De exemplu:

#include <stdio.h>

..................

#define N 50

.......................

int x[N]; <---modul antet

.......................

main()

......................................

/* ---- program principal------- */


.......................................

f(a,b)

..........................................

/*------- corpul functiei 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.:

{ printf("\n valoarea lui a=",a); }

2.:

printf("\n valoarea lui a=",a);

3.:

printf("\n valoarea lui a=",

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:

unsigned int lista;

ca de exemplu:

unsigned int x,y,t;

Fiecare element definit de tip int ocupa doi octeti.

Tipul float si double


Tipul float reprezinta tipul de numere reale cuprinse intre 3.4e38 si 3.4e-38, ocupand patru
octeti pe fiecare element declarat. Se declara cu:

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;

Daca se utilizeaza declaratia :

long 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;

long double q,w;

Tipul long
Este intreg cu semn cuprins intre -2147483648 si 2147483647, fiecare element ocupand
patru octeti. Se declara:

long lista;

Tipul acesta se poate declara si fara semn prin declaratia:

unsigned long lista;

in acest caz fiind cuprinse intre 0 si 4294967295.

Tipul short
Corespunde unor intregi cuprinsi intre -32768 si 32767 declarati cu :

short lista;

Pot fi delarati si fara semn, in intervalul 0 si 65535 cu declaratia:

unsigned 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:

unsigned char lista;

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;

operatii prin care a fost initializat i si j, iar x a ramas neinitializat.

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:

enum valori{ zero , trei = 3, patru, cinci};

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:

union nume_generic{tip1 nume1; tip2 nume2; ...; }variabila;

De exemplu:

union cimp{float a; int b; int c;};

Se pot concatena astfel campuri de biti, ca de exemplu:


union biti{ int i:1; int j:3; int k:7; }ct;

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

ct.j respectiv ct.k

Pe o astfel de structura se pot face operatii cu campuri de biti ca de exmplu rotiri etc.

In memorie se rezerva spatiu pentru cel mai mare element al reuniunii.

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:

struct nume_structura{tip1 var1;tip2 var2;...}variabila;

Prin acesta declaratie variabila va avea structura definita de structura "nume - structura".

De exemplu:

struct dreapta{float x1;float y1;float x2;float y2;}dr;

Prin aceasta, variabila dr va avea structura de tipul dreapta. Putem extrage diferite elemente
din structura, referindu - le:

dr.x1 dr.x2 dr.y1 dr.y2

Putem defini de asemenea alte variabile de acest tip prin declararea:

struct dreapta ab;

ab devenind o variabila cu structura de tip dreapta. Initializarea variabilelor cu acesta structura


se poate face cu:

struct dreapta{float x1; float y1; float x2; float y2; }dr

={ 1.2 , 2.2 , 3.1 , 4.2 };

deci vom avea:

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;

Exista cateva tipuri de structuri predefinite in cazul limbajului, ca de exemplu:

struct complex{float real,imag;};

struct time{int ti_hour, ti_min, ti_sec, ti_hound; };

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;

II. void nume();

III. void nume(lista de tipuri);

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:

void calcul(int a,b);

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:

typedef nume_tip_vechi nume_tip_nou;

De exemplu:

typedef int intreg;

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:

a[0], a[1], ..., a[99]

Se pot defini si tablouri cu mai multe dimensiuni ca de exemplu:

float co[4] [5] [4];

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.

Clasa auto (automatic)


Se refera la variabilele locale, care se afla in corpul diferitelor functii si care nu au mai fost
definite anterior de alta clasa. Declararea variabilelor din acesta clasa se poate face cu declaratia:

auto tip lista_de_variabile;

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:

static tip lista_de_variabile;

De exemplu:

static int x, y;

Trebuie avut in vedere faptul ca la declararea variabilelor static interne, in interiorul


functiilor, valorile acestora sunt vizibile numai in interiorul functiilor in care au fost declarate si
isi pastreaza valorile intre diferitele apeluri ale functiilor respective.

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.

Se recomanda sa se puna indicii tablourilor de acesta clasa asigurnd o viteza de calcul


ridicata.

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()

float a[4][4], b[4][4], c[4][4];

register int i, k, l;

for(l=0; l<=3; l++)

for(k=0; k<=3; k++)

c[k][l]=0;

for(i=0; i<=3; i++)

{
c[k][l] = c[k][l] + a[k][i] * b[i][l];

Operatori aritmetici

Sunt definiti urmatorii operatori aritmetici:

+, -, *, /, % - pentru operatia modulo (exemplu a % b)

Trebuie sa atragem atentie ca pentru ridicarea la putere este definita o functie in bib- lioteca
matematica.

Sint definiti de asemenea urmatorii operatori:

++ -operator de incrementare cu 1,

-- -operator de decrementare cu 1.

De exemplu operatia de incrementare a lui c:

c = c + 1;

poate fi scrisa si sub forma:

c++;

De asemenea anumite operatii se pot scrie condensat, ca in tabelul de mai jos:


   
Operatie
  Semnificatie
 
a+ = b; a = a + b;, unde b poate fi si
expresie
a+ = 1; a = a + 1;
a- = b; a = a - b;
a* = b; a = a * b;
a/ = b; a = a / b;
a = z + y++; a = y + z; y = y + 1;
a = z + y–-; a = z + y; y = y - 1;
a = z + ++y; y = y + 1; a = z + y;
a = z + –y; y = y - 1; a = z + y;
a = b++; a = b; b = b + 1;
a = b–; a = b; b = b - 1;
a = ++b; b = b + 1; a = b;
a  = –b; b  = b - 1; a = b;

In cazul in care sunt necesare asfel de expresii, se recomanda sa se utilizeze forma


condensata din stinga tabelului, datorita faptului ca in aceasta scriere calculatorul lucreaza mai
repede.

Pentru operatiile de atribuire se poate utiliza si atribuirea multipla:

x = y = z = .. = c;

in urma careia toate variabilele vor primi valoarea c.

Operatori logici relationali


Sunt definiti urmatorii operatori relationali:

> >= < <=

== pentru egal

!= pentr ne-egal

De asemenea se pot defini expresii logice compuse cu operatorii:

&& pentru SI

|| pentru SAU

! pentru NU

De exemplu se poate construi expresia logica compusa:

(a==0) && (b>=c)

Un alt operator logic este definit:

expr_log ? expr1 : expr2

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 );

int maximul( int a , b )

return( (a>b) ? a : b );

Programul de mai sus va calcula maximul dintre a si b si il va atribui lui c.

Operatori pe biti
Sunt definite operatii pe campuri de biti:

===========================================================

op1<<op2 | produce deplasarea la stinga a bitilor din

| operandul op1, cu un numar de biti specificat

| de op2 cu valori intregi, umplind cu zero loca-

| tiile ramase libere.

===========================================================

op1>>op2 | produce similar deplasarea la dreapta a cimpu-

| lui op1 cu un numar op2,inlocuind spatiile libe-

| re cu zero.

===========================================================
op1 & op2 | realizeaza operatia AND. Are ca efect transfor-

| marea in zero a cimpurilor din op1 care coincid

| cu cimpuri zero in op2 si pastrarea neschimbata a

| cimpurilor carora le corespund cimpuri umplute

| cu 1 in op2. De exemplu daca n=(00001111),

| atunci n &b=(00001100). Trebuie sa atragem aten-

| tia ca operanzii trebuie sa fie de tipul unsigned

| char numere octale.

============================================================

op1|op2 | realizeaza operatia AND. Are ca efect trans-

| formarea cimpurilor de biti in op1, acolo

| unde exista in op2 cimpuri 1. De exemplu:

| n|b=(10101111)

============================================================

op1^op2 | realizeaza operatia de XOR (sau exclusiv)

===========================================================

~ op1 | realizeaza negarea (NOT). Are ca efect com-

| plementarea cimpurilor de biti (0 1, 1 0)

===========================================================

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:

10000111 <–bit de semn

De exemplu:
int x, y = 2;

x = 15;

x = x << y;

are ca efect:

x=(00001111) x=(00111100)

Trebuie sa atragem atentia ca si operatiile pe campuri de biti se pot scrie prescurtat. De


exemplu:

a& = b; reprezinta a = a & b;

a^ = b; reprezinta a = a ^ b;

De asemenea dorim sa atragem atentia ca operanzii pot fi si siruri de numere octale si nu


variabile intregi declarate ca mai sus, sau hexazecimale.

De exemplu in hexazecimale :

char c, m; efect : c = 00100100

c = 36; m = 10000010

m = 0x82; c|m = 10100110

c = c | m

Operatiile pe campurile de biti permit o prelucrare mai rapida a informatiilor provenite de la


porturi ,a unor valori interne, a unor vectori de stare etc.

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;

va avea ca efect b = adresa lui - a, c = continutul de la adresa lui a ( adica c = 15 ).

Utilizarea pointerilor permite accesarea directa si rapida a diferitelor zone de memorie,


posibilitate care confera putere acestui limbaj. Vom reveni in alt paragraf la aceste notiuni.

OBSERVATII:

- Pentru scrierea comentariilor in C se folosesc delimitatorii /* pentru inceput si */ pentru


sfirsitul comentariului, dupa care nu se pune ";".

Exemplu: /* program test */

- Un comentariu poate ocupa mai multe linii.

- 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

Structura unui program C - sursa


Un program C contine doua zone:
- zona antet, care contine declaratiile de tip pentru variabilele locale, macrodefinitiile,
directivele de includere si definitiile de functii.

- 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 :

# include < stdio.h>

# 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;

Se observa ca s - a inclus biblioteca stdio.h (care contine functiile de intrare - iesire. De


asemenea se observa ca functia functie( ) este de tip void fara argumente (variabile). Variabilele
x, y, n se transmit de la ea la programul principal ( main), datorita faptului ca au declarate
variabile globale in fisierul antet.

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 ;

sau forma: II):

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.

In varianta a - II - a, daca expresia este adevarata, se efectueaza blocul de instructiuni


(terminate cu ;) cuprinse intre acolade, dupa care se efectueaza instr 1 ;. Daca expresia nu este
adevarata se efectueaza instr 1.

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.

Se pot de asemenea inlanlui astfel de instructiuni:

if (expr 1) instr 1;

else if (expr 2) instr 2;

instr 3;

Exemplu:

if(x>=0 && y!=0)

x=x*x;

y=x/y;

else

x=x+5;

y=x*y;

x=x+y;

Instructiunea for(....)
Forma acestei instructiuni poate fi I):

for(expr 1; expr 2; expr 3) instructiune;

sau II):

for(expr 1; expr 2; expr 3)


{

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;

for(i=0; i<=100; 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=100; i>=0; i--) j=i*i;

descrie o bucla cu pas descrescator cu 1 de la 100 la 0 . Daca expresiile lipsesc, bucla va fi o


bucla infinita cu pas crescator. De exemplu:

for(;;)

i=j;

}
va descrie o bucla infinita in care se repeta instructiunile din bloc.

Se pot construi bucle suprapuse, de forma:

int i,j,k;

for(i=0; i<=100; i+t)

for(j=0; j<=100; j+t)

k=i+j;

} /* sfirsit bucla j */

} /* sfirsit bucla i */

Instructiunea while
Este o instructiune de ciclare care are formele:

while (expr) instructiune;

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.

De exemplu putem calcula suma unei serii cu conditia ca numarul de termeni sa nu


depaseasca n = 16000. Pentru seria:

s = 1 + 12 + 13 + ... + 1k + ...
2 2 2

Pentru calculul seriei, putem scrie urmatorul program:


float s;

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);

sau in forma II):

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.

De exemplu, putem relua programul anterior impunand conditia suplimentara de a opri


calculul atunci cnd diferenta intre doua sume partiale s(k+1)-s(k) este mai mica decat ds =
0.000001 sau k > n.

double float s, s0, ds=0.000001, d ;

int i,n=16000;

main( )

s=1;

i=1;

do

s0=s;

s=s+1./(k*k);

i=i+1;

d=s-s0;

while (d<=ds || i<n);

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;

void funct(float x, float f);

float g( float x );

main( )

float x1 = 5, x2 = 7.5;

float f1, f2, y1, y2;

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.

float maxim (float x, float y)

if( x > y ) return( x );

else return ( y );

Instrtuctiunea break
Are forma:

break;

si este folosita la iesirea din cicluri, din locul in care este intalnita.

Putem ilustra utilizarea ei cu exemplul de calcul al seriei:

s = 1 + 1 / 2 + ... 1 / k + ...
2 2

si oprirea calculului daca s ( k + 1 ) - s ( k ) < d:

double s0, s, d, ds;


int k , n=16000;

main( )

s = s0 = 1;

d=.00001;

for(k=2; k<=n, k++)

s=1./(k*k);

ds=s-s0;

if(ds<d) break;

s0=s;

Instructiunea switch
Are sintaxa:

switch(expr);

case val_1: instruct 1;

............

break;

case val_2: instruct 2;

.............
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.

De exemplu putem realiza o functie, care pentru k = 1 sa utilizeze expresia analitica:

f = x + 1 / x;

pentru k = 2 expresia analitica:

f = x * x /(1+x);

iar pentru altel valori ale lui k:

f = x;

Acest lucru se realizeaza cu secventa:

void func (int k, float x, float f)

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:

void funct(char k, float x, f )

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;

iar la intalnirea ei intr - un ciclu, calculatorul se intoarce la inceputul ciclului, abandonand


instructiunile care urmeaza dupa 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: ;

............

De asemenea trebuie sa atragem atentia asupra faptului ca nu este preferabil sa se utilizeze


salturi de acest tip, ele fiind posibile numai peste un numar limitat de octeti de program,
utilizandu - se numai pentru secvente scurte. Este preferabil sa se utilizeze in locul acestei
instructiuni, instructiunile prezentate anterior, ca de exemplu switch( ).

Biblioteca matematica
La dispozitia utilizatorului se afla un important numar de functii matematice in fisierul:

INCLUDE\math.h

Utilizarea acestora este posibila prin incarcarea acestuia cu directiva de includere:

#include <math.h>
Prezentam pe scurt functiile definite in acesta biblioteca:

acos(x) -functia este de tipul double,

-valoarea este in radiani,

-argumentul x este de tipul double,

-are ca efect calculul lui arccos( x )

-domeniul de valori este cuprins in intervalul

[0,pi).

asin(x) -functia este de tipul double.

-valoarea este in radiani,

-argumentul functiei este de tipul double,

-calculeaza arcsin(x),

-are domeniul de valori cuprins in intervalul

[ - pi / 2 , pi / 2 ].

atan(x) -functia este de tipul double,

-are argumentul de tip double,

-calculeaza arctg( x ),

-domeniul de valori este cuprins in intervalul

( - pi / 2 , pi / 2 ).

atan2(y,x) -functia este de tipul double.

-argumentele x , y sint de tipul double,

-calculeaza arctg( y / x ),

-domeniul de valori este cuprins in intervalul

[ - pi , pi ],
-daca x = y = 0 ,calulatorul semnaleaza eroare.

ceil(x) -argumentul functiei este de tip double,

-valoarea functiei este de tip double,

-returneaza cel mai mic intreg mai mare sau

egal cu x.

cos(x) -valoarea functiei este de tip double,

-argumentul functiei este de tip double,

-argumentul este in radiani,

cosh(x) -valoarea functei este de tip double,

-argumentul este de tip double

sin(x) -valoare tip double cu argument tip double

-argumentul este in radiani

sinh(x) -valoare tip double cu argument de tip double

exp(x) -are domeniul de valori de tip double,

-argumentul este de tip double

fabs(x) -functie de tip double,

-argumentul de tip double,

-calculeaza modulul lui x,

floor(x) -functie de tip double cu argument de tip double,

-returneaza cel mai mare intreg mai mic sau

egal cu x.

fmod(x,y) -functie double,

-argumentele de tip double,


-calculeaza restul , in virgula mobila a imparti-

rii lui x la y. Este definit de expresia:

x = y . i + f

-unde i este intreg. Daca y = 0 functia returneaza 0

hypot(x,y) -este functie tip double cu argumente de tip

double,

-calculeaza ipotenuza triunghiului de catete

x si y adica sqrt( x * x + y * y ).

ldexp(x,y) -este functie de tip double,

-argumentul x este de tip double iar y de tip int

-functia calculeaza ldexp( x , y ) = x * 2 y.

log(x) -functie tip double cu argument tip double,

-calculeaza logaritmul natural ln(x).

log10(x) -functie tip double cu argument double,

-calculeaza logaritmul zecimal log( x ).

pow(x,y) -functia este de tip double,

-argumentele x si y sint de tip double,

-functia calculeaza x la puterea y:

pow( x , y ) =x^y

-functia nu recunoaste valori intregi mai mari

de 264.

sqrt(x) -functie de tip double,

-argument de tip double,


-calculeaza radacina patrata din x

tan(x) -functie de tip double cu argument tip double,

-argumentul este in radiani,

-calculeaza tangenta din x

tanh(x) -functie de tip double

-argumentul de tip double,

-calculeaza tangenta hiperbolica.

Exista si functii utile pentru calculul matematic in afara celor cuprinse in fisierul math.h. De
exemplu in:

INCLUDE\stdlib.h

se gasesc;

random(n) -argumentul reprezinta un intreg pozitiv,

-functie cu valoare intreaga cuprinsa intre 0

si n-1 reprezentind un numar aleator cu

distributie constanta in acest domeniu.

min(x,y) -functie cu valoare tip double,

-x si y sint valori de tip double,

-functia returneaza ninimul dintre x si y;

max(x,y) -functia de tip double cu argumente de tip

double,

-returneaza maximul dintre x si y

In fisierul INCLUDE\complex.h in limbajul C++, se gasesc functii complexe. Toate


instructiunile din C, raman valabile, insa programul trebuie rulat cu extensia .cpp. Tipul complex
se poate defini cu:

complex <lista de variabile si tablouri>;


Sunt definiti operatorii + , - , * , / , aplicabili atat intre numere complexe cat si reale si
complexe. Sunt definite functiile:

complex( z_re, z_im ) - unde z_re,z_im sunt de tipul double,

reprezentind partea reala si imaginara.

Functia reurneaza un complex. Exemplu:

#include <complex.h>

complex z1;

double x,y;

main(void)

x = 1.3; y = .97;

z1 = complex( x , y );

cabs(z) -functia returneaza o valoare de tip double,

-are argument de tip complex care se poate

defini astfel:

double re,im;

struct complex {re;im} z;

double a;

rezulta aplicind functia:

a=cabs(z);

conj(z) -functie tip struct complex cu argument struct

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.

Instructiuni de intrare - iesire


Operatiile de intrare - iesire sunt realizate cu ajutorul unor functii.

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 :

print f("lista formate",var 1, var 2,...);

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:

%d intreg cu semn (zecimal)

%i intreg cu semn (zecimal)

%o octal intreg cu semn

%u intreg zecimal fara semn

%x intreg hexazecimal fara semn

%X hexazecimal intreg fara semn cu A,B,...E,F

%f real cu semn in reprezentare zecimala

%e real cu semn in reprezentare exponentiala


%c caracter

%s sir de caractere

%ld intreg lung

%df real lung

De asemenea sunt definite urmatoarele linii de control :

\n linie noua

\a secund sonor (BELL)

\b spatiu inapoi

\t tabulare pe orizontala

\ddd configuratie de biti

De exemplu:

#include <stdio.h>

main()

int a=120, float x=25.42;

print f("\n%d",a)

print f("\n valoarea lui b=%f",b);

print f("\nTerminat de scris!");

Acest program va tipari:

120

Valoarea lui b = 25.42

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:

scanf("%f %d %c", &a , &b , &c );

Prin modul de concepere al instructiunii: scriere la adresele variabilelor , se asigura o mare


viteza de lucru a calculatorului.

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;

printf("\n Introduceti numarul a :");

scanf("%f",&a);

printf("\n Introduceti numarul b :");

scanf("%f",&b);

printf("\n Introduceti un mesaj de maxim 20 de caractere:");

scanf("%s",%c);

printf("\n Introduceti un caracter ! :");

scanf("%c",&d);

x=a+b;

printf("\n Suma numerelor a si b este=%f",x);

printf("\n Mesajul introdus se afiseaza pe linie noua !\n");

printf("\n %s",c);

printf("\n Caracterul introdus este :",d);

Functiile getch, getche, gets


Functia getch se gaseste in "conio.h" si are sintaxa:

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.

In stdio.h se mai gaseste functia gets:

gets();

este de tip sir si are ca efect citirea unui sir de la tastatura cu afisarea mesajului.

Marimile citite pot fi atribuite sau nu diferitelor variabile de aceste tipuri.

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();

Instructiuni grafice in mod text


Pentru gestiunea ecranului in mod text, programatorul are la disopozitie un pachet de
functii, care se gaseste in fisierul heder:

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).

Setarea ecranului in mod text se poate face cu instructiunea:

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

Declararea modului se poate face fie cu ajutorul vlaorii numerice, ca de exemplu:

textmode(1);

fie utilizand constantele simbolice:

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

Atributul de caracter clipitor poate fi asociat cu toate culorile anterioare.

Pentru modul alb - negru, programatorul are la dispozitie urmatoarele functii de tip void
pentru a stabili intensitatea de iluminare a ecranului:

highvideo(); --> pentru intens

lowvideo(); --> slab

normvideo(); --> normal

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.

Pentru stabilirea culorii caracterelor se foloseste functia:

textcolor(culoare);

unde "culoare" este o variabila de tip intreg conform tabelului precedent.

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:

const = 16 * (culoarea_de_fond) + culoare_caractere + clipire

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;

a=1; /*---- pentru fond ------*/

b=14; /*---- pentru text ------*/

c=128; /*---- pentru clipire text -------*/

x=16*a+b+c;

.......................

textmode(C20);

textattrib(x);

.......................

fie:

\begin{verbatim}

.........................

textattrib( 16 * BLUE + YELLOW + BLINK );


.........................

Pentru definirea unor ferestre dreptunghiulare pentru afisarea textelor, se pot folosi instruc-
tiunea:

window( x1, y1, x2, y2 );

unde ( x1 , y1 ) reprezinta coltul din stinga sus al ferestrei iar ( x2 , y2 ) coltul din dreapta
jos:

Pentru stergerea unei ferestre definite anterior se poate folosi instructiunea:

clrscr();

sau intreg ecranul, daca initial nu a fost declarata nici o fereastra.

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).

Coordonatele cursorului in fereastra activa pot fi determinate cu ajutorul instructiunilor:

x = wherex();

y = wherey();

unde x si y au fost declarate intregi.

Pentru obtinerea de informatii asupra parametrilor ecranului, utilizatorul are la dispozitie


urmatoarea instructiune:

gettextinfo( struct textinfo *p);

unde "textinfo" este o variabila structurata predefinita cu urmatoarea structura:

struct textinfo{

char winleft; ->margine stinga

char wintop; ->margine sus

char winright; ->margine dreapta


char winbottom; ->margine jos

char attribute; ->atibut

char normattr; ->atribut nornal

char currattr; ->atribut curent

char screenheight; ->inaltime ecran

char screenwidth; ->latime ecran

char curx; ->pozitie x cursor

char cury; ->pozitie y cursor

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(.......);

avand aceleasi argumente ca in prezentarea anterioara a instructiunii, iar pentru scrierea de


caractere color se foloseste:

cprintf(........);

avind aceleasi argumente ca instructiunea printf().

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:

int movetext( x1, y1, x2, y2, x3, y3 );

care returneaza o valoare intreaga egala cu:


1 --> daca copierea s-a facut corect,

0 --> daca copierea s-a facut cu erori.

Semnificatiile parametrilor sunt:

Pentru inscrierea unei linii de spatii intr - o fereastra se foloseste:

insline();

iar pentru stergerea unei linii in care este pozitionat cursorul intr - o fereastra se foloseste:

delline();

Instructiuni pentru realizarea meniurilor


Dorim sa atragem atentia ca aceste instructiuni sunt active numai in versiunile de TURBO -
C incepand cu versiunea 3.0.

Pentru definirea unui meniu vertical se foloseste instructiunea:

int definepopup( char *nume,

int left,

int top,

int right,

int bottom,

int borderstyle,

int bordercolor,

int backgrdcolor);

in care:

-nume - reprezinta numele meniului, nume care nu apare afisat pe ecran.

-left, top - reprezinta coordonatele x si y ale coltului din stanga sus a ferestrei definite pentru
meniu.

-right, bottom - similar, pentru coltul din dreapta jos.


-borderstyle - reprezinta constanta care descrie tipul chenarului si poate avea urmatoarele
valori:

0 sau NONE pentru contur cu blank

1 sau PANEL pentru contur cu o linie "-"

2 sau DOUBLE pentru contur cu doua linii "="

-bordercolor - reprezinta culoarea de trasare a conturului

-backgrdcolor - reprezinta culoarea de trasare a interiorului meniului.

Functia returmeaza un intreg avand valoare 1 in caz de reusita si 0 in cazul in care


operatiunea se face cu eroare,

Pentru definirea unei linii in cadrul meniului se foloseste comanda:

int defineline( char *nume,

int row,

char *message,

int skip,

int (*action) () ) ;

unde:

-"nume" -reprezinta numele atribuit meniului in definepopup(),

-"row" - reprezinta numarul randului pe care va fi afisata comanda,

-"message" reprezinta mesajul care va fi afisat in fereastra,

-"skip" are valoare:

1 - daca linia respectiva poate fi selectata (comanda este activa)

0 - daca comanda respectiva este blocata (linie inactiva),

-"action" este un pointer la o functie care va fi executata atunci cand cu sagetile se selecteaza
linia respectiva si se tasteaza ENTER.

Pentru activarea unui meniu se poate folosi comanda:


int activatepopup(char *nume, int first);

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.

Pentru dezactivarea unui meniu activ se foloseste:

int dezactivatepopup();

acesta putand fi reactivat. Functia returneaza 0 sau 1.

Pentru stergerea unui meniu de pe ecran se foloseste inmstructiunea:

int releasepopup( char *nume);

unde "nume" este numele meniului deja definit, iar pentru a sterge totul de pe ecran si din
memorie se utilizeaza :

int releasall();

functiile returnand 0 sau 1.

Pentru afisarea respectiv stergerea cursorului de pe ecran se foloseste:

showcursor();

hidecursor();

Instructiuni grafice
Se gasesc in INCLUDE\ graphics.h si prin urmare se incarca cu directiva de includere:

#include <graphics.h>

de asemenea trebuiesc definite variabilele:

int graphdriver = DETECT, graphmode;

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:

Instructiunile initgraph si closegraph


Au sintaxa:

initgraph(&graphdriver,&graphmode,"\\tc");

closegraph();

si folosesc pentru initializarea, respectiv intreruperea memoriei grafice.

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).

Instructiunile setbkcolor si setcolor


Au sintaxa:

setbkcolor(culoare);

si da posibilitatea de selectare a culorii de reprezentare a fondului, respectiv:

setcolor( culoare );

si da posibilitatea de selectare a culorii de reprezentare.

-"culoare" reprezinta una din culorile:

BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY,


LIGHTBLUE, LIGHTGREEN, LIGHTRED, YELLOW, WHITE.

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);

unde a reprezinta tipul de caractere si poate avea urmatoarele valori:

DEFAULT_FONT -caractere 8 * 8 pixeli

TRIPLEX_FONT -trasat triplex

SMALL_FONT -caractere mici

SANSERIF_FONT -caractere sans-serif

GOTHIC_FONT -caractere gotice

b reprezinta directia de reprezentare si poate avea valorile:

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.

Instructiunile getmaxx getmaxy


Au sintaxa:

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 graphdriver = DETECT, graphmode;

int ax = 640, ay = 200;

int a, b, c, d, i;

float x[501], y[501], pi = 3.1415;

main()

{
initgraph(&graphdriver, &graphmode, "\\tc" );

setbkcolor(LIGHTBLUE);

setcolor(YELLOW);

settextstyle(GOTHIC_FONT, HORIZONTAL_DIR, 1 );

line(0, 0, 0, ay);

line(0, ay/2, ax, ay/2);

outtext(60, 20, " grafic ");

for(i=0; i <= 500; i++ )

x[i] = 2 * pi * i / 500;

y[i] = sin( x[ i ] );

for(i = 1; i <= 500; 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();
}

In program s - a inserat instructiunea getch() pentru a evita disparitia graficului de pe ecran,


calculatorul asteptand sa se introduca de la tastatura un caracter, dupa care dispare imaginea
grafica.

Fisiere in C
Vom prezenta un mod simplu de scriere in fisiere care nu necesita cunostiinte aprofundate
asupra operatiilor cu fisiere.

La inceputul programului va trebui sa apara instructiunea:

FILE *nume1;

unde nume1 reprezinta numele dat fisierului cu care se opereaza in program.

Deschiderea fisierului se face cu instructiunea :

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:

r -pentru citire din fisier

w -pentru scriere in fisier

a -pentru adaugare de date in fisier

Este posibil sa utilizam si combinatii "w+r" pentru cazul in care se scrie in fisier apoi se
citeste din el.

Inchiderea fisierului se va face cu instructiunea :

fclose(nume1);

Pentru scrierea intr - un fisier asignat cu nume1 se foloseste instructiunea:

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.

Pentru citirea din fisier se va folosi instructiunea:


fscanf(nume1,"formate",lista_de_adrese);

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()

printf("\n Introduceti numele fisierului de intrare :");

scanf("%s",nume);

et:f=fopen(nume, "r" );

if ( f == 0)

printf("\n Eroare la deschiderea fisierului!\n");

exit();

goto et;

}
for(i=0; i <= N; i++ )

fscanf(f, "%d %d" , &cu, &a);

x[i] = cu + a;

printf("\n Nume fisier de iesire ? :");

scanf( "%s" , nume );

et: co=fopen(nume, "w+a");

if ( co == 0)

printf("\n Eroare la deschiderea fisierului!\n");

goto et;

for(j=0; j < N; j++ )

BIBLIOGRAFIE
 
1. Vlad Caprariu - Ghid de utilizare - Turbo C.0, Micro - Informatica, Cluj Napoca, 1991.

2. BORLAND CORPORATION - Turbo C, Functions manual, vol 2, BORLAND CO, 1989.


3. Ionut Muslea - C++, Programare orientata pe obiecte, Microinformatica, Cluj Napoca, 1992.

4. Adrian Kacso, Daniela Kacso, Vlad Caprariu - Turbo C; Tehnici de programare,

Microinformatica, Cluj Napoca, 1991.

5. B. Kernigan and D. Ritchie - The C programing language, Engelwood Cliffs, 1979.

6. D. Somnea, D. Turturea - Initiere in C++, Ed. Tehnica,Bucuresti, 1993.

 
 
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;

scanf ("%d", &n);

f =1.0;

i =2;

while (i<=n)

f =f*i;

i++;

printf("n =%d n != %e \ n", n, f);

}
 

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;

printf("x=%f y=%f \ n", x, y);

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;

scanf ("%d %d", &a, &b);

if (a>b)

c=a;

else

c=b;

printf("a=%d b=%d max(a,b)=%d \ n",

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>

main( ) / * scrie un text la terminal * /

printf(" Incepem limbajul C \ n");

/ * cursorul coboara pe alt rand

dupa scrierea mesajului * /

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);

while (scanf("%d",&i)= =1)

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;

while ((c=getchar( ))!=EOF)

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;

while ((getchar( ) != EOF))

n++;

printf("numarul caracterelor citite: %d \ n",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;

while ((c=getchar( ) != EOF))

if (c = =’\n’)

n++;

printf("numarul liniilor citite: %d \ 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;

for (n=0; getchar( ) != EOF; n++);

printf("numarul caracterelor citite: %d \ n",n);

APLICAŢIA 12:

Să se scrie un program care numără liniile de la intrare utilizându-se instrucţiunea "for".

# include <stdio.h>

void main( )

int c, n;

for (n=0; (c=getchar( ) )!= EOF;)

if (c = =’\n’)

n++;
printf("numarul liniilor citite: %d \ n",n);

APLICAŢIA 13:
Sa se rezolve ecuatia de gradul doi.

# include <stdio.h> // pentru functiile scanf si printf

# include <conio.h> // pentru functia getch

# include <math.h> // pentru functia sqrt

void main (void)

float a, b, c;

float rex1, rex2, imx1, imx2, delta;

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;

printf("x1=%f+i*(%f)=%f \n", rex1, imx1, rex1);

printf("x2=%f+i*(%f)=%f \n", rex2, imx2, rex2);

else

rex1 = rex2 = -b/(2*a);

imx1 = sqrt(-delta)/(2*a);

imx2 = - imx1;

printf("x1=%f+i*(%f) \n", rex1, imx1);

printf("x2=%f+i*(%f) \n", rex2, imx2);

getch( );

S-ar putea să vă placă și