Creeaza.com - informatii profesionale despre


Cunostinta va deschide lumea intelepciunii - Referate profesionale unice
Acasa » referate » informatica » c
Functii de lucru cu timpul - utilizare primitive grafice

Functii de lucru cu timpul - utilizare primitive grafice




Functii de lucru cu timpul

getdate intoarce data sistemului

#include <dos.h>

void getdate (struct date *datep);

In structura referita de datep se intoarce data sistemului.

struct date;

gettime intoarce timpul sistem

#include <dos.h>



void gettime (struct time *timep);

struct time;

time intoarce timpul in secunde

#include <time.h>

time_t time (time_t *timer);

Functia time() intoarce timpul in secunde masurat de la 1 ianuarie 1970 00:00:00 GMT si il memoreaza in locatia indicata de pointerul timer (acest pointer nu trebuie sa fie NULL).

Exemplu de utilizare:

#include <time.h>

#include <stdio.h>

#include <dos.h>

int main(void)

gmtime Converteste data si timpul in GMT (Greenwich Mean Time)

#include <time.h>

struct tm *gmtime (const time_t *timer);

Accepta adresa unei valori intoarse de time() si intoarce un pointer la structura de tip tm care contine rezultatul conversiei in GMT.

timezone = variabila globala de tip long care trebuie setata la diferenta in secunde intre GMT si timpul standard local;

daylight = variabila globala care trbuie setata la valoare diferita de 0 numai in SUA (U.S.Daylight Savings time conversion)

struct tm ;

Aceasta structura este un static suprascris de fiecare data.

Exemplu de utilizare:

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <dos.h>

/* Pacific Standard Time & Daylight Savings */

char *tzstr = 'TZ=PST8PDT';

int main(void)

ctime Conversia datei si timpului intr-un sir de caractere

#include <time.h>

char *ctime (const time_t *time);

Functia ctime() realizeaza conversia parametrului time intr-un sir de 26 caractere. Acest sir are forma urmatoare terminandu-se cu caracterele new line (n) si terminator de sir (0):

DDD MMM dd hh:mm:ss YYYY

unde:

DDD = Day (Mon, Tue, Wed, etc.)

MMM = Month (Jan, Feb, Mar, etc.)

dd = Date (1, 2, , 31)

hh = Hour (1, 2, , 24)

mm = Minutes (1, , 59)

ss = Seconds (1, , 59)

YYYY = Year

Exemplu:

Mon Oct 20 11:31:54 1952n0

Toate campurile au o lungime constanta.

Functia intoarce un pointer la un sir de caractere ce contine data si timpul. Acest sir este o variabila statica, suprascrisa la fiecare apel al functiei.

Exemplu de utilizare:

#include <stdio.h>

#include <time.h>

int main(void)

asctime Conversia datei in format ASCII

#include <time.h>

char *asctime (const struct tm *tblock);

Functia asctime() realizeaza conversia parametrului intr-un sir de 26 caractere. Fiormatul acestui sir este acelasi ca in cazul functiei ctime(). De remarcat faptul ca functiile ctime() si asctime() au acelasi efect, diferenta constand in modul in care este stocat argumentul functiei.

Functia intoarce un pointer la un sir de caractere ce contine data si timpul. Acest sir este o variabila statica, suprascrisa la fiecare apel al functiei.

Exemplu de utilizare:

#include <stdio.h>

#include <string.h>

#include <time.h>

int main(void)

stime Set time of day

#include <time.h>

int stime (time_t *tp);

Functia stime() seteaza data si timpul sistem, avand ca data de referinta 1 ianuarie 1970 00:00:00 GMT. Parametrul tp reprezinta noua valoare a timpului data in secunde, iar functia intoarce 0.

Exemplu de utilizare:

#include <stdio.h>

#include <time.h>

int main(void)

Elemente ale fisierului GRAPHICS.H

Pentru compilarea unui program care utilizeaza primitive grafice se include fisierul graphics.h:

#include <graphics.h>

Pentru a se rula un program care utilizeaza functii si definitii din graphics.h sunt necesare unul sau mai multe drivere grafice (fisiere cu extensia .BGI), iar daca se scrie si text in mod grafic, unul sau mai multe fisiere cu extensia .CHR

Exista drivere pentru o clasa larga de ineterfete grafice. Tabelul din figura 1 prezinta cateva drivere si adaptorul grafic corespunzator:

Driver-ul grafic

Adaptorul grafic

CGA.BGI

IBM CGA, MCGA

EGAVGA.BGI

IBM EGA, VGA

HERC.BGI

Hercules monocolor

ATT.BGI

ATT400

PC3270.BGI

IBM 3270

IBM8514.BGI

IBM 8514

Figura 1 - Drivere grafice

Un numar de functii sunt puse la dispozitia utilizatorului pentru exploatarea facilitatilor grafice ale calculatoarelor personale :

Functia initgraph realizeaza initializarea sistemului grafic;

void far initgraph (int far *graphdriver, int far *graphmode, char far *pathtodriver);

Prototipul acestei functii se afla in graphics.h.

graphdriver este un pointer far la o expresie de tip intreg care precizeaza driverul;

graphmode este un pointer far la o expresie de tip intreg care precizeaza modul grafic;

pathtodriver este un pointer far la o expresie de tip sir de caractere care precizeaza catalogul ce contine fisierul .BGI curent.

graphdriver si graphmode trebuie setate corect. Ele pot fi detectate automat daca graphdriver=DETECT. Dupa apel *graphdriver este setat la driverul grafic curent si *graphmode la modul grafic curent.

Exista un indicator intern de eroare pe care functia il seteaza in urma executiei sale. Valoarea sa se poate afla prin apelul functiei graphresult().

error = graphresult();

Fiecarui nume de eroare grafica ii este atribuita cate o valoare intreaga unica denumita in tabelul din Figura 2 cod de eroare.

Cod eroare

Constanta eroare

Explicatii

grOk

Fara eroare

grNoInitGraph

Driver grafic BGI neinstalat

grNoDetected

Nu sesizeaza hardware-ul grafic (placa grafica negasita)

grFileNotFound

Lipseste driver-ul (fisier .BGI negasit)

grInvalidDriver

Driver (fisier .BGI) invalid

grNoLoadMem

Memorie insuficienta pentru driverul grafic

grNoScanMem

Memorie insuficienta (apel fillpoly)

grNoFloodMem

Memorie insuficienta (apel floodfill)

grFontNotFound

Fisier de font negasit

grNoFontMem

Memorie insuficienta pentru incarcarea fisierului de font

grInvalidMode

Mod grafic invalid pentru driverul grafic ales

grError

Eroare grafica

grIOError

Eroare grafica de intrare/iesire

grInvalidFont

Fisier de font invalid

grInvalidFontNum

Numar de font invalid

grInvalidDeviceNum

Numar de driver invalid

grInvalidVersion

Versiune invalida

Figura 2 - Mesaje de eroare obtinute cu functia graphresult()

Se poate detecta placa accelerator grafic si modul utilizand functia:

void far detectgraph (int far *graphdriver, int far *graphmode);

Aceasta functie detecteaza placa grafica si alege modul care asigura cea mai mare rezolutie suportata de acest adptor grafic.

Functia detectgraph poate fi apelata inainte de a initializa modul grafic cu functia initgraph.

Functia closegraph indeparteaza driverul din memorie si restaureaza modul video precedent. Se elibereaza emoria ocupata de driver, fonturi si bufferul I/O (se apeleaza graphfreeem). Sintaxa functiei este:

void far closegraph (void);

Functia setgraphmode trece sistemul in mod grafic, eventual seteaza un mod diferit de cel implicit si sterge si ecranul. Daca se indica un mod inexistent pentru placa video prezenta, functia graphresult() intoarce -10 (grInvalidMode). Sintaxa functiei setgraphmode este:

void far setgraphmode (int mode);

Functia restorecrtmode restaureaza modul initial salvat (detectat) de initgraph. In conjuctie cu setgraphmode se foloseste pentru a comuta din mod grafic in mod alfanumeric daca este necesara o introducere de date. Sintaxa functiei este urmatoarea:

void far setgraphmode (int mode);

Modul text

In modul text, ecranul poate fi impartit in 40 sau in 80 de coloane si 25, 43 sau 50 de linii, astfel ca ecranul apare ca fiind format din niste celule, in fiecare celula putandu-se inscrie un singur caracter.

Cursorul este vizibil:

dupa ultimul caracter afisat;

in prima coloana a liniei urmatoare daca s-a scris in ultima coloana;

in prima coloana, ultima linie daca s-a scris in ultima linie, ultima coloana; se realizeaza defilare cu o linie a continutului ecranului (scroll);

Modul grafic


Cursorul CP (Current Posotion) este invizibil; el se afla in punctul final al deplasarii produse de functiile moveto() si lineto(). Exemple:

moveto (0, 0); /* muta cursorul in origine */

lineto (20, 20); /*se traseaza linia din origine pana in punctul de coordonate (20, 20) */

Exemple de constante utilizate in modul grafic

Driverele grafice recunoscute de Borland C sunt prezentate in tabelul din Figura 3, fiecarui driver grafic corespunzandu-i o constanta:

COD DRIVER
CONSTANTA DRIVER

DETECT

CGA

MCGA

EGA

EGA64

EGAMOND

IBM8514

HERCMONO

ATT400

VGA

PC3270

CURRENT_DRIVER

Figura 3 - Constantele corespunzatoare driverelor grafice

Constantele corespunzatoare culorilor sunt prezentate in tabelul din Figura 4:

Cod culoare

Constanta culoare

Culoarea

BLACK

Negru

BLUE

Albastru

GREEN

Verde

CYAN

Turcoaz

RED

Rosu

MAGENTA

Violet

BROWN

Maro

LIGHTGRAY

Gri deschis

DARKGRAY

Gri inchis

LIGHTBLUE

Albastru deschis

LIGHTGREEN

Verde deschis

LIGHTCYAN

Turcoaz deschis

LIGHTRED

Rosu deschis

LIGHTMAGENTA

Violet deschis

YELLOW

Galben

WHITE

Alb

Figura 4 - Constantele corespunzatoare culorilor

Constantele corespunzatoare stilurilor de linie sunt prezentate in tabelul din Figura 5. De remarcat ca utilizatorul isi poate defini propriul stil de linie, un model de linie fiind reprezentat pe 16 biti.



 

Cod linie

Constanta linie

Stil linie

Exemplu

SOLID_LINE

Linie neintrerupta

 

DOTTED_LINE

Linie punctata

 

CENTER_LINE

Linie intrerupta si cu puncte

 

DASHED_LINE

Linie intrerupta

 

USERBIT_LINE

Stil linie definita utilizator

 

Figura 5 - Constantele corespunzatoare stilurilor de linie

Constantele corespunzatoare grosimii liniei sunt prezentate tabelul din Figura 6.

Cod grosime

Constanta grosime

Grosimea liniei

NORM_WIDTH

Normala (1 pixel grosime)

THICK_WIDTH

Tripla (3 pixeli grosime)

Figura 6 - Constanatele corespunzatoare grosimii de linie

Se permite scrierea de texte in mod grafic, aliniate in mai multe moduri. Sunt permise urmatoarele moduri de aliniere:

Cod aliniere

Constanta aliniere

Modalitate aliniere

LEFT_TEXT

Orizontala stanga

CENTER_TEXT

Orizontala centrata

RIGHT_TEXT

Orizontala dreapta

BOTTOM_TEXT

Verticala jos

CENTER_TEXT

Verticala centrata

TOP_TEXT

Verticala sus

Figura 7 - Constante de aliniere text

Sunt prevazute mai multe moduri de umplere a unei suprafete. Tabelul din Figura 8 prezinta constantele predefinite de umplere a contururilor inchise, cu mentiunea ca se pot declara propriile stiluri de umplere. Stilurile de umplere sunt definite pe 8x8 biti.

Cod hasura

Constanta hasura

Tipul de hasura

EMPTY_FILL

Cu culoarea fondului

SOLID_FILL

Cu culoarea de desenare, nuanta uniforma

LINE_FILL

Cu linii orizontale (- - - - - - - - - - - - - - - -)

LTSLASH_FILL

Cu slash-uri dese subtiri (////////////////////////)

SLASH_FILL

Cu slash-uri dese groase (////////////////////////)

BKSLASH_FILL

Cu backslash-uri dese subtiri ()

LTBKSLASH_FILL

Cu backslash-uri dese groase ()

HATCH_FILL

Subtire deschisa

XHATCH_FILL

Cu deschizatura puternica in cruce

INTERLEAVE_FILL

Cu linii punctate dese (intretesute)

WIDE_DOT_FILL

Cu linii punctate rar

CLOSE_DOT_FILL

Cu puncte intermediare

USER_FILL

Stil definit de catre utilizator

Figura 8 - Constante corespunzatoare stilurilor de umplere

Exemple de functii grafice

bar - deseneaza o bara (dreptunghi fara frontiera) cu culoarea si modul de umplere curent. Sintaxa functiei:

void far bar (int left, int top, int right, int bottom);

Coordonatele se dau in pixeli.

bar3d - deseneaza o bara tridimensionala (paralelipiped dreptunghic) cu contur si hasureaza fata sa cu modelul curent si culoarea curenta. Sintaxa functiei este urmatoarea:

void far bar3d (int left, int top, int right, int bottom, int depth, int topflag);


a)

b)

Figura 9 - Optiuni ale functiei bar3d

daca topflag ≠ 0, atunci se deseneaza si partea de sus, ca in Figura 9 a)

daca topflag = 0, atunci partea de sus nu se mai deseneaza, ca in Figura 9 b)

circle - deseneaza un cerc de raza r data, cu centrul in (x, y) dat. Sintaxa functiei este urmatoarea:

void far circle (int x, int y, int raza);

Cercul se deseneaza cu culoarea curenta, netinandu-se cont de parametrul linestyle ci numai de parametrul thickness.

getc - citeste un caracter din sirul de intrare. Este un MACRO.

#include <stdio.h>

int getc (FILE *stream);

La end of file intoarce EOF.

getch - citeste un caracter de la tastatura fara ecou;

#include <conio.h>

int getch (void);

getchar - citeste un caracter din sirul de intrare. Este un MACRO.

#include <stdio.h>

int getchar (void); echivalent cu getc(stdin) */

getcolor - intoarce culoarea curenta;

int far getcolor (void);

getdrivername - intoarce un pointer spre un sir continand numele driverului curent. Se apeleaza dupa initgraph.

char * far getdrivername (void);

getgraphmode - intoarce modul grafic curent. Se apeleaza numai daca functia initgraph a fost apelata cu succes.

int far getgraphmode (void);

getimage - salveaza in memorie un bitmap al imaginii din regiunea indicata. Regiunea specificata este o zona de pe ecran ce contine imaginea ce va fi salvata intr-o zona tampon din memorie.

void far getimage (int left, int top, int right, int bottom, void far * bitmap);

putimage - afiseaza o iagine bitmap pe ecran. Imaginea salvata cu getimage este pusa la loc pe ecran intr-un dreptunghi cu coltul de sus stanga in (left, top).

void far putimage (int left, int top, void far *bitmap, int op);

Parametrul op reprezinta un indicator de calcul al culorii tinand cont si de ce era desenat pe ecran. Acest parametru poate lua una din urmatoarele valori:

- COPY_PUT pentru scriere directa;

- XOR_PUT pentru SAU EXCLUSIV intre imaginea ecran si imaginea din memorie;

- OR_PUT pentru SAU intre imaginea ecran si imaginea din memorie;

- AND_PUT pentru SI intre imaginea ecran si imaginea din memorie;

- NOT_PUT pentru NEGATIA desenului existent;

getmaxcolor - intoarce valoarea maxima ce se poate da functiei setcolor;

int far getmaxcolor (void);

getmaxx - intoarce coordonata x maxim;

int far getmaxx (void) ;

getmaxy - intoarce coordonata y maxim;

int far getmaxy (void);

getpixel - intoarce culoarea pixelului de coordonate specificate;

unsigned far getpixel (int x, int y);

getx - intoarce coordonata x a pozitiei cursorului grafic;

int far getx (void);

gety - intoarce coordonata y a pozitiei cursorului grafic;

int far gety (void);

gotoxy - pozitioneaza cursor in fereastra text;

#include <conio.h>

void gotoxy (int x, int y);

graphresult - intoarce cod de eroare pentru ultima operatie efectuata. Codurile de eroare intoarse de aceasta functie au fost prezentate in Figura 2.

int far graphresult (void);

line - deseneaza o linie intre 2 puncte (x1, y1), (x2, y2). Desenarea se produce cu culoarea curenta, stilul de linie curent si grosimea de linie curenta. Nu se modifica pozitia cursorului CP (Current Posotion).

void far line (int x1, int y1, int x2, int y2);

lineto - traseaza o linie de la pozitia cursorului (CP) la punctul de coordonate (x, y); In urma executarii acestei instructiuni, CP se muta in punctul de coordonate (x, y).

void far lineto (int x, int y);

moveto - muta pozitia cursorului CP in punctul de coordonate (x, y);

void far moveto (int x, int y);

outtext - afiseaza la (CP) un text in fereastra de vizualizare utilizand fontul curent, dimensiunea si stilul curente. CP este marit cu textwidth (textstring) numai daca sunt indicate atributele LEFT_TEXT pentru horizontal text justification si HORIZ_DIR pentru text_direction. In caz contrar CP ramane neschimbat.

void far outtext (char far *textstring);

outtextxy - afiseaza textul dat ca parametru, incepand cu pozitia specificata;

void far outtextxy (int x, int y, char far *textstring);

perror - afiseaza un mesaj de eroare sistem. Se scrie pe stderr.

#include <<stdio.h>

void perror (const char *s);

Se afiseaza:

"string s": text corespunzator lui errno n

Conventie: s este numele fisierului care contine progrmul. errno se utilizeaza ca un indice in tabelul de mesaje sys_errlist.

putpixel - deseneaza un punct la coordonatele specificate;

void far putpixel (int x, int y, int color);

rectangle - deseneaza un dreptunghi. Desenarea se produce cu stilul, grosimea si culoarea curenta.

void far rectangle (int left, int top, int right, int bottom);

(left,top) reprezinta coordonatele coltului stanga-sus, iar (right,bottom) pe cele ale coltului dreapta-jos.

setcolor - seteaza culoarea de desenare. Parametrul color poate lua valori in intervalul 0.getmaxcolor.

void far setcolor (int color);

setfillstyle - setare model de hasurare (pattern) si culoare de umplere. Stilurile de umplere a contururilor inchise sunt definite in tabelul din Figura 8. In cazul ultimului stil de hasura, nu se utilizeaza valoarea 12, ci se apeleaza functia setfillpattern.

void far setfillstyle (int pattern, int color);

setfillpattern - selecteaza modul de hasurare definit de catre utilizator. Parametrul upattern este pointer la o zona de 8 octeti definind un model de 8x8 biti. Valoarea 0 pentru un bit semnifica faptul ca acel pixel nu va fi desenat, iar valoarea 1 semnifica desenarea pixelului respectiv.

void far setfillpattern (char far *upattern, int color);

setlinestyle - seteaza grosimea si stilul curent pentru linie;

void far setlinestyle (int lynestyle, unsigned upattern, int thickness);

In graphics.h este declarata structura linesettingstype astfel:

struct linesettingstype;

Campul upattern este pe 16 biti si se foloseste numai in conjunctie cu USERBIT_LINE.

Stilurile de linie (line styles) sunt definite in Figura 5, iar thickness sunt prezentate in cadrul Figurii 6.

settextjustify - setare aliniere text pentru functii grafice (in raport cu CP). Valorile implicite pentru alinierea textului sunt LEFT_TEXT pentru orizontala, respectiv TOP_TEXT pentru verticala. Aceasta functie afecteaza textele scrise cu outtext sau outtextxy si nu se foloseste in mod text sau cand se lucreaza cu functii stream.

void far settextjustify (int horiz, int vert);

Modurile de aliniere ale textelor sunt prezentate in Figura 7.

settextstyle - seteaza caracteristicile textului pentru afisare grafica. Aceasta functie afecteaza functiile de scriere in mod grafic outtext si outtextxy.

void far settextstyle (int font, int direction, int charsize);

textcolor - seteaza noua culoare pentru text;

#include <conio.h>

void textcolor (int newcolor);

Utilizarea recursivitatii pentru desenarea de curbe

Un numar important de curbe pot fi desenate prin apeluri recursive ale unor functii care deseneaza elemente ale acestor curbe. Sunt posibile mai multe abordari, dintre care vom exemplifica doua

Curbe (Hilbert, Sierpinski) definite recursiv, care pot fi desenate prin apeluri recursive ale unor functii care deseneaza curbe de ordin inferior. Iesirea din recursivitate se produce in momentul desenarii curbei de ordin 0.

Curbe desenate cu ajutorul elementelor grafice de tip 'turtle graphics'. Aceste primitive grafice descriu miscarile de rotatie si translatie ale unei broaste testoase, care in deplasarea sa lasa urme in planul in care evolueaza.

Curbe Hilbert

Curba Hilbert de ordinul 0 este vida. Asa cum este prezentat in Figura 10, o curba Hilbert de ordinul 1, H1 este compusa din patru curbe de ordin 0 unite prin trei segmente de dreapta (doua orizontale si unul vertical). La randul ei, curba Hilbert de ordin 2, H2, este compusa din patru curbe H1 cu diferite orientari, unite prin aceleasi trei segmente de dreapta. Curba de ordinul 3 este compusa din patru curbe H2, etc.

In general curba Hilbert de ordin i Hi+1 se obtine din patru curbe Hi cu dimensiunea o jumatate din cea a curbei Hi+1, rotite in diferite sensuri si legate intre ele cu segmente avand aceeasi dimensiune cu cea a elementelor curbelor Hi.

H3

 


Figura 10 - Curbele Hilbert de ordin 1, 2, si 3

Schema de recursivitate este prezentata in Figura 11. In Figura 12 este prezentata o implementare in limbajul C a unui algoritm de desenare a unei familii de curbe Hilbert pana la ordinul n dat. Curbele umplu un spatiu de forma patrata, dimensiunile si pozitiile lor initiale fiind astfel alese incat liniile diferitelor curbe din familie sa nu se suprapuna.


Figura 11 - Schema de recursivitate

#include <stdio.h>

#include <graphics.h>

const int h0=256;

int TipDriver, ModGrafic;

int Nivel, NivelMax;

int xc, yc;

int x0, y0;

int h;

void A(int);

void B(int);

void C(int);

void D(int);

void A(int N)

} /*A*/

void B(int N)

} /*B*/

void C(int N)

} /*C*/

void D(int N)

} /*D*/

void main()

do while(!kbhit());

closegraph();

Figura 12 - Programul Hilbert.c

In Figura 13 sunt prezentate modificarile aduse programului, pentru ca curbele de diferite ordine din familie sa fie desenate cu culori diferite.

#include <stdio.h>

#include <graphics.h>

const int h0=256;

int TipDriver, ModGrafic;

int Nivel, NivelMax;

int xc, yc;

int x0, y0;

int h;

unsigned char culoare;

void main()

do while(!kbhit());

closegraph();

Figura 13 - Programul Hilbert1.c







Politica de confidentialitate







creeaza logo.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.