Programare C Elemente Avansate

28
1 CURS FINAL 1 DIRECTIVE DE PREPROCESARE Preprocesarea este prelucrarea textului sursa al programului inaintea etapei de compilare. In limbajul C preprocesarea se realizeaza cu ajutorul directivelor de preprocesare. Acestea sunt recunoscute de compilator prin prezenta caracterului “#”. INCLUDEREA FISIERELOR Includerea fisierelor sursa se realizeaza prin intermediul directivei #include care are doua forme: #include <fisier_sursa> #include "fisier_sursa" Ambele forme au ca efect includerea totala a fisierului sursa in fisierul care contine directiva. Diferentele intre cele doua forme se refera la locatia unde este cautat fisierul sursa: - In cazul in care se foloseste prima varianta, fisierul este cautat in directoarele standard (specificate prin optiuni sau prin variabile de mediu in functie de compilator). - In in cazul celei de-a doua varianta fisierul este cautat intai in directorul curent, iar dupa aceea, daca nu este gasit, in directoarele standard. Forma cu "..." permite si specificarea caii complete catre fisierul inclus; in acest caz, nu se mai face cautarea si in directoarele standard. Exemplu /* include fisierul stdio.h, din directoarele standard */ #include <stdio.h> /* include fiserul functii.h; * cautarea se face intai in directorul * curent si dupa aceea in directoarele standard */ #include "functii.h"

description

Programare C Elemente Avansate

Transcript of Programare C Elemente Avansate

Page 1: Programare C Elemente Avansate

1

C U RS FI N AL

1 DIRECTIVE DE PREPROCESARE Preprocesarea este prelucrarea textului sursa al programului inaintea etapei de compilare. In limbajul C preprocesarea se realizeaza cu ajutorul directivelor de preprocesare. Acestea sunt recunoscute de compilator prin prezenta caracterului “#”.

INCLUDEREA FISIERELOR

Includerea fisierelor sursa se realizeaza prin intermediul directivei #include care are doua forme: #include <fisier_sursa> #include "fisier_sursa" Ambele forme au ca efect includerea totala a fisierului sursa in fisierul care contine directiva. Diferentele intre cele doua forme se refera la locatia unde este cautat fisierul sursa:

- In cazul in care se foloseste prima varianta, fisierul este cautat in directoarele standard (specificate prin optiuni sau prin variabile de mediu in functie de compilator).

- In in cazul celei de-a doua varianta fisierul este cautat intai in directorul curent, iar dupa aceea, daca nu este gasit, in directoarele standard. Forma cu "..." permite si specificarea caii complete catre fisierul inclus; in acest caz, nu se mai face cautarea si in directoarele standard.

Exemplu

/* include fisierul stdio.h, din directoarele standard */ #include <stdio.h> /* include fiserul functii.h; * cautarea se face intai in directorul * curent si dupa aceea in directoarele standard */ #include "functii.h"

Page 2: Programare C Elemente Avansate

2

/* include fisierul Siruri.c din directorul D:\Work; * Daca fisierul nu exista nu mai este cautat in alta parte * si se genereaza o eroare de compilare */ #include "D:\Work\Siruri.c"

CONSTANTE SIMBOLICE

Definirea constantelor simbolice se face prin intermediul directivei #define cu sintaxa: #define simbol valoare Directiva are ca efect inlocuirea tuturor aparitiilor lui simbol in codul sursa (cu exceptia aparitiilor in cadrul unor constante de tip sir, in comentarii sau in componenta unui alt identificator) cu valoare inaintea compilarii textului sursa. In acest caz valoare este cosiderata intreaga portiune pana la sfarsitul liniei. Daca se doreste definirea unei valori pe mai multe linii, atunci se va folosi caracterul \ la sfarsitul fiecarei linii ce urmeaza a fi continuata. In cazul in care valoare lipseste, textul specificat prin simbol va fi eliminat din codul sursa. O constanta simbolica poate fi redefinita in cadrul celuiasi fisier folosind inca o data directiva define: #define simbol alta_valoare Valabilitatea unei definiri se incheie in urmatoarele cazuri:

- la sfarsitul fisierului sursa - la invalidarea simbolului prin intermediul directivei #undef simbol

// definire parametru #define DIM_VECTOR 20 // definire tip vector #define TIP double // definire mesaj #define MESAJ "Calcul suma" // definire cod pe mai multe linii #define SEPARATOR printf( \ "\n----------------\n" \ ); TIP suma( TIP v[], int n ) { int i; // validare lungime

Page 3: Programare C Elemente Avansate

3

if (n > DIM_VECTOR) // DIM_MAX nu este inlocuit in sirul de caractere // cau in comentariu printf( "dimensiunea este mai mare ca DIM_VECTOR\n" ); // calcul suma TIP suma = 0; for ( i = 0; i < n; i++) suma += v[i]; return suma; } void main( ) { // declarare vector folosind // simbolurile specificate TIP v[ DIM_VECTOR ] = { 1.1, 3.23, 6.62 }; int n = 3; // utilizare simboluri pentru mesaj printf( MESAJ ); // inserare cod prin preprocesor SEPARATOR; // apel functie printf( " %lf ", suma(v, 3) ); }

DIRECTIVELE CONDIŢIONALE

Compilarea conditionata permite includerea/excluderea unor sectiuni din codul sursa in functie de anumite criterii. In C se folosesc directivele de compilare conditionata prezentate mai jos: #if #ifdef #ifndef #else #elif #endif

Page 4: Programare C Elemente Avansate

4

Sintaxa este: #if expresie_1 /* sectiune_1 */ #elif expresie_2 /* sectiune_2 */ /* * ... */ #else /* sectiune_n */ #endif unde:

- expresie_n este o expresie formata din constante sau simboluri definite cu #define; expresia este considerata adevarata daca este diferita de 0;

- partile #elif si #else sunt optionale;

- sectiune_n reprezinta o secventa de cod de inclus in codul sursa al programului in functie de valoarea expresiei;

In cadrul expresiilor se poate folosi cuvantul cheie defined pentru a testa daca un anumit simbol de preprocesare a fost definit. Exemplu:

#if defined( DIM_MAX ) ... ) In cazul in care se doreste doar testarea existentei unei variabile se pot folosi directivele:

- #ifdef (echivalent cu #if defined ) sau - #ifndef (echivaled cu #if !defined )

Semnificaţia lor este uşor de depistat, în continuare dând un exemplu de utilizare: #if CPU_TYPE == 80286 #include < mode_16.h > #elif CPU_TYPE == 80386 #include < mode_32.h > #else #error Procesor de tip necunoscut #endif

Directiva #error are ca efect tipărirea mesajului în faza de compilare ( mai curând precompilare), în fereastra de erori ( se generează o eroare cu textul directivă specificat după #error, până la sfarşitul liniei ).

Page 5: Programare C Elemente Avansate

5

EXEMPLU

//-----------------fisierul header.h --------- #ifndef _HEADER.H_ #define _HEADER.H_ #include <math.h> //exemplu definire constanta #define NMAX 10 //#define HEXA #define OCTAL #define DEBUG //exemplu macrodefinitie #define radical(x) sqrt(x) //exemplu operator de conversie la sir de caractere #if defined(HEXA) #ifdef DEBUG #define afisval(x) printf(#x"=%x Adresa=%p",x,&x)

Page 6: Programare C Elemente Avansate

6

#else #define afisval(x) printf(#x"=%x",x) #endif #elif defined(OCTAL) #ifdef DEBUG #define afisval(x) printf(#x"=%o Adresa=%p",x,&x) #else #define afisval(x) printf(#x"=%o",x) #endif #else #ifdef DEBUG #define afisval(x) printf(#x"=%d Adresa=%p",x,&x) #else #define afisval(x) printf(#x"=%d",x) #endif #endif #endif //-----------------fisierul main.c --------- #include <stdio.h> #include "header.h" void main( void ) { int val=20; unsigned space; printf("NMAX=%d\n",NMAX); printf("radical(20)=%f\n",radical(20)); afisval(val); //Determinarea spatiului de memorie neutilizat #if defined(NEARPOINTERS) space = farcoreleft(); #elif defined(FARPOINTERS) space = coreleft(); #endif //Daca modul de lucru este DEBUG se afiseaza //spatiul de memorie neutilizat #ifdef DEBUG printf("\nTotal space %d\n", space); #endif }

MACRODEFINIŢII

Macrodefinitiile sunt secvente de cod parametrizate care pot fi inlocuite in textul sursa. Pentru definirea lor se foloseste o extensie a directivei #define: #define macro(param) corp

Page 7: Programare C Elemente Avansate

7

Unde: - macro – numele macrodefinitiei - param – lista de parametri, fara tip - corp – corpul macrodefinitiei

Macrodefinitiile sunt expandate in textul sursa inainte de compilare in doua etape:

- apelul macrodefinitiei din codul sursa este inlocuit cu corpul acesteia - parametrii macrodefinitiei sunt inlocuiti cu valorile primite ca parametrii

Exemplu: // definire macro #define MAX(x,y) (x>y ? x : y) // exemplu de utilizare int a = 7, b = 10, c; c = MAX( a, b );

Desi apelul de macrodefinitii este similar unui apel de functie, cele doua constructii sintactice nu sunt echivalente. In cazul macrodefinitiilor, parametrii nu sunt evaluati inaintea apelului, fapt care poate crea confuzii: // macrodefinitie #define PATRAT(x) x*x; int x = 2, y; // problema 1: folosirea parantezelor pentru a impune prioritatilor y = PATRAT(x+5) // => va fi expandata ca y = x+5*x+5; <=> y = 17 // problema 2: constructii cu efecte colaterale int x = 2; y = PATRAT(++x) // => va fi expandata ca y = ++x*++x

OPERATORUL DE CONCATENARE A SIMBOLURILOR ( TOKEN-PASTING )

Adaugă un simbol la altul creând un al treilea simbol disponibil. #define TYPE1 0x4d4d #define TYPE2 0x4949 #define TYPE(n) TYPE##n

Prin utilizarea:

Page 8: Programare C Elemente Avansate

8

- TYPE( 1 ) ne referim la TYPE1, iar prin

- TYPE(2), ne referim la constanta TYPE2.

OPERATORUL DE CONVERSIE LA UN ŞIR DE CARACTERE

( STRING-SIZING OPERATOR )

Acest operator transformă în şir de caractere orice parametru precedat de caracterul # scriind parametrul între ghilimele.

#define Trace( x ) printf( #x" = %d\n", x )

Utilizarea se face sub forma: Trace( flag );

Efectul fiind: flag = 3

Exemplu,

Unde flag ar fi numele unei variabile având valoarea 3 în momentul apelării macrocomenzii. Am folosit printf(..) deoarece ne referim la standardul ANSI C. Convenţiile rămân valabile şi pentru standardul C++.

Page 9: Programare C Elemente Avansate

9

Page 10: Programare C Elemente Avansate

10

2 OPERATII CU FISIERE SI DIRECTOARE

Functiile ce realizeaza aceste operatii sunt declarate in fisierul <dir.h>. Limbajul C dispune de functii ce pot opera cu nume de fisiere si directoare precum si alte operatii auxiliare ( copiere, mutare, creare, redenumire, etc)

<DIR.H>

[ Functii ]

chdir findfirst findnext setdisk

fnmerge fnsplit getcurdir

getcwd getdisk mkdir

mktemp rmdir searchpath

[ Constante, tipuri de date si variabile globale ]

DIRECTORY DRIVE EXTENSIONS MAXPATH

ffblk FILENAME MAXDIR

MAXDRIVE MAXEXT MAXFILE

Aplicatie

[ dir_lst.c ]

/* exemplu cu findfirst si findnext. Listeaza continutul directorului curent */ #include <stdio.h> #include <dir.h> int main( int argc, char *argv[] ) { struct ffblk fisiser; int done; char *type = "*.*";

Page 11: Programare C Elemente Avansate

11

/* preia din linia de comanda valoarea primului parametru ca fiind typul / numele fisierului ce urmeaza a fi listat */ if ( argc > 1 ) type = argv[ 1 ]; clrscr(); printf( "Listingul directorului curent este [%s]:\n", type ); done = findfirst(type, &fisiser, 0 ); //gaseste primul fisier din director while ( !done ) { printf("%12s\t", fisiser.ff_name); done = findnext( &fisiser ); //gaseste urmatorul fisier din director } return 0; }

Lansand in executie programul fara nici un argument in linia de comanda vom obtine urmatorul efect.

D:\(Work)\PRJ\Multime> dir_lst.exe

Lansand in executie programul cu un argument in linia de comanda ( *.c ) vom obtine urmatorul efect.

D:\(Work)\PRJ\Multime> dir_lst.exe *.c

Page 12: Programare C Elemente Avansate

12

Structura ffblk dispune de urmatoarele campuri:

struct ffblk { char ff_reserved[21]; /* rezervat de DOS */ char ff_attrib; /* atributul gasit */ int ff_ftime; /* timpul fisierului */ int ff_fdate; /* data fisierului */ long ff_fsize; /* dimensiunea fisierului */ char ff_name[13]; /* numele fisierului gasit */ };

Observatie

Campurile ff_ftime si ff_fdate sunt structuri de 16 biti, divizate la nivel de bit pentru a accesa campurile referitoare la data si timp.

ff_ftime ¦15.....11¦10........5¦4.......0¦ ore Minute Secunde/2 ff_fdate ¦15..........9¦8.....5¦4.......0¦ anul luna ziua incepand de la 1980

Page 13: Programare C Elemente Avansate

13

3 GENARATORUL NUMERE ALEATOARE In acest scop sunt utilizate doua functii, din biblioteca stdlib.h:

- functia randomize( ); - functia random( val ).

#include <stdio.h> #include <stdlib.h> void main() { int x, YourNumber; randomize(); //initializeaza generatorul printf ("Numerele sunt:\n\n"); for ( x = 1; x < 7; x++) // genereaza 6 nr. aleatoare { YourNumber = random( 48 ) + 1; //numarul creat printf( "%d: %d\n", x, YourNumber ); } }

Page 14: Programare C Elemente Avansate

14

4 GESTIUNEA PROCESELOR Orice program ce se executa sub sistemul de operare DOS poate sa lanseze in executie alte programe ( aplicatii ) ca si procese fiu. In momentul lansarii in executie programul tata este suspendat si intra in executie procesul fiu. La terminarea procesului fiu executia continua cu procesul tata din punctul in care a ramas. Functiile ce pot lansa in executie procese fiu sunt declarate in fisierul <process.h>. Se vor utiliza aceste functii atunci cand sunt cunoscute separat argumentele ce urmeaza a fi transmise procesului fiu.

- int execl (char *path, char *arg0, ..., NULL); - int execle (char *path, char *arg0, ..., NULL, char **env); - int execlp (char *path, char *arg0, ...); - int execlpe(char *path, char *arg0, ..., NULL, char **env);

Se vor utiliza urmatoarele functii atunci cand nu sunt cunoscute separat argumentele ce urmeaza a fi transmise procesului fiu.

- int execv (char *path, char *argv[]); - int execve (char *path, char *argv[], char **env); - int execvp (char *path, char *argv[]); - int execvpe(char *path, char *argv[], char **env);

Argumentul │ ce reprezinta ═══════════+════════════════════════════════════════════════════════════════

path │ calea catre procesul fiu

argN │ argumentele transmise separat

argv[N] │ un sir de pointeri

env │ sir de pointeri catre variabilele de mediu.

Valoarea returnata:

- pt. succes, functia nu returneaza cod de eroare.

- in caz de eroare, functia returneaza -1 si seteaza variabila errno cu una din valorile:

o E2BIG lista de argumente prea mare

Page 15: Programare C Elemente Avansate

15

o EACCES acces interzis

o EMFILE prea multe fisiere deschise

o ENOENT cale sa fiser negasit

o ENOEXEC format executabil incorect

o ENOMEM insuficienta memorie

APLICATIE

#include <stdio.h> #include <process.h> int main( int argc, char *argv[] ) { int loop; printf("%s ruleaza...\n\n", argv[0]); if (argc == 1) // daca nu sunt parametri in linia de comanda { printf("%s se apeleaza din nou...\n", argv[0]); execl(argv[0], argv[0], "UNU", "DOI", "TREI", NULL); perror("EXEC:"); exit(1); } printf("%s apelat cu argumente:\n", argv[0]); for (loop = 1; loop <= argc; loop++) puts( argv[loop] ); // afiseaza parametrii in linia de comanda return 0; }

Lansand in executie programul vom obtine urmatorul efect.

D:\(Work)\PRJ\Multime> process.exe

Page 16: Programare C Elemente Avansate

16

APLICATIE

#include <stdio.h> #include <process.h> int main() { FILE *fl; system("ping 127.0.0.1 > temp.txt"); fl = fopen("temp.txt", "rt" ); printf("\nFISIERUL: temp.txt\n"); if( fl ) { while( !feof( fl ) ) printf( "%c", fgetc( fl ) ); fclose(fl); } printf("\nEND: temp.txt\n"); return 0; }

In acelasi mod, putem da comenzi DOS, de tipul:

system("dir"); system("cd mydir"); system("format a:"); system("xcopy *.* c:\mydir");

Page 17: Programare C Elemente Avansate

17

MAT ERI AL - N E F O R M A T

Page 18: Programare C Elemente Avansate

18

5 MODURI VIDEO

MODUL TEXT

Fisierele au ca principala atributie intr.-un sistem de calcul de a stoca informatii (date, aplicatii). Un #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <dos.h> #include <process.h> #include <stdarg.h> #include "meniu.h" char *luni[]={"ianuarie", "februarie", "martie", "aprilie","mai", "iunie", "iulie", "august", "septembrie", "octombrie", "noiembrie", "decembrie" }; // F U N C T I I la meniu //Aafiseaza meniul si returneaza noua pozitie selectata int AfisareMeniu( int yMeniu, char *meniu[], char *titlu ) { int i, n=0, l; char c; for(l=0; strlen(meniu[l]) > 0; l++ ); //stabileste fereastra activa pentru intregul meniu window(1, 1, strlen(meniu[0])+2, l+4);//stabileste fereastra relativa de afisare clrscr(); // sterge continutul fereastrei ative gotoxy(1, 1 ); cprintf("Ö"); for(i=1; i < strlen(meniu[0])+1; i++ ) cprintf("Ä"); cprintf("·"); gotoxy( ( strlen(meniu[0])-strlen(titlu) ) / 2, 1 ); cprintf(titlu); gotoxy(1, 2 ); cprintf("º"); for(i=1; i < strlen(meniu[0])+1; i++ ) cprintf(" "); cprintf("º"); for(i=0, n=0; strlen(meniu[i]) > 0; i++ ) { gotoxy(1,i+3);

Page 19: Programare C Elemente Avansate

19

cprintf("%c",'º'); cprintf(meniu[i]); cprintf("%c",'º'); } gotoxy(1,i+3); cprintf("È"); for(i=1; i < strlen(meniu[0])+1; i++ ) cprintf("Í"); cprintf("¼"); _setcursortype(_NOCURSOR); //stabileste fereastra activa pentru optiunile de meniu window(2, 3, strlen(meniu[0])+2, l+3); do{ for(i=0, n=0; strlen(meniu[i]) > 0; i++ ) { gotoxy(1,i+1); if(i==yMeniu) textbackground(6); // seteaza culoarea fondului- selectie cprintf(meniu[i]); if(i==yMeniu) textbackground(0); // seteaza culoarea originala n++; } flushall(); if( (c = getch()) == 0x00 ) // caracter special (tasta sus, jos, ...) { c=getch(); if(c== JOS) //Tasta JOS = 0x50 (80)-codul tastei { if( yMeniu < n-1) yMeniu++; else yMeniu = 0; } else if(c== SUS) //Tasta SUS = 0x48 (72)-codul tastei { if( yMeniu > 0) yMeniu--; else yMeniu = n-1; } } else // In cazul in care este apasata prima litera X:, ... { for(i=0; strlen(meniu[i]) > 0; i++ ) if(toupper(c) == meniu[i][0] && meniu[i][1] == ':') yMeniu = i; } }while( c != ENTER ); // Tasta Enter _setcursortype(_NORMALCURSOR); return yMeniu; } // afiseaza informatii despre autor

Page 20: Programare C Elemente Avansate

20

void Info( void) { int x, y, i; gotoxy(1, 1); cprintf(" ,//,"); gotoxy(1, 2); cprintf(" /_^_\\"); gotoxy(1, 3); cprintf(" ( o o )"); gotoxy(1, 4); cprintf("---------oOOO--(_)--OOOo---------"); gotoxy(1, 5); cprintf(" as.ing. Remus Catalin PRODAN"); gotoxy(1, 6); cprintf(" tel. : 0040.30.259541"); gotoxy(1, 7); cprintf(" e-mail: [email protected]"); gotoxy(1, 8); cprintf(" .oooO "); gotoxy(1, 9); cprintf(" ( ) Oooo."); gotoxy(1, 10);cprintf("-----------\\ (----( )---------"); gotoxy(1, 11);cprintf(" \\_) ) /"); gotoxy(1, 12);cprintf(" (_/"); // secventa de rotire a unui ochi _setcursortype(_NOCURSOR); x = wherex(); y = wherey(); flushall(); i=0; while(!kbhit()) { gotoxy(18,3); putchar(bar[i++ % 8]); delay(50); } gotoxy(x,y); _setcursortype(_NORMALCURSOR); clrscr(); // pana aici } //Afiseaza timpul sistem void AfisareTimp(void) { struct time t; /*struct time { unsigned char ti_min; // minute unsigned char ti_hour; // ore unsigned char ti_hund; // sutimi de secunde unsigned char ti_sec; // seconde };*/ int x, y; struct date d; /*struct date { int da_year; // anul curent char da_day; // ziua din luna (1, 2, 3, ..., 31) char da_mon; // luna (1 = Ianuarie, ...) };*/ _setcursortype(_NOCURSOR); x = wherex();

Page 21: Programare C Elemente Avansate

21

y = wherey(); getdate(&d);//primeste adresa structurii d si completeaza campurile //structurii cu informatii despre data curenta gotoxy(50,1); cprintf("%d %s %d ", d.da_day, luni[d.da_mon-1], d.da_year); gotoxy(1,1); cprintf("...Apasa o tasta pentru revenire"); flushall(); while(!kbhit()) { gotoxy(70,1); gettime(&t);//primeste adresa structurii t si completeaza campurile //structurii cu informatii despre timpul curent cprintf("%2d:%02d:%02d.%02d", t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund); } gotoxy(x,y); _setcursortype(_NORMALCURSOR); } // Se afiseaza tema lucrarii void TemaLucrare( char *tema ) { FILE *fp; char c; struct text_info ti;// o structura cu informatii despre fereastra curenta gettextinfo(&ti); // citeste aceste informatii if( (fp = fopen(tema, "rt")) == NULL) { CurrentWindow(fStatus); cprintf("Eroare la citirea lucrarii"); CurrentWindow(fConsola); cprintf("Verificati ca fisierul %s este in directorul curent", tema); return; } textcolor(6); // seteaza culoarea de scriere while( !feof(fp)) { c = fgetc(fp); if( c == '\t') cprintf(" "); else cprintf("%c",c); if( c == '\n') cprintf("\r"); if( wherey() == ti.winbottom - ti.wintop ) // daca depaseste { //inaltimea ferestrei curente textcolor(7); // seteaza culoarea de scriere CurrentWindow(fStatus); printf("\t...apasa o tasta");

Page 22: Programare C Elemente Avansate

22

getch(); CurrentWindow(fLucrare); textcolor(6); // seteaza culoarea de scriere } } textcolor(7); // seteaza culoarea de scriere // clrscr(); } // Se va stabili fereastra curenta de afisare, avand coordonatele transmise // prin parametrul "f" si va fi sters continutul ei. void CurrentWindow( Windows f ) { window(f.left, f.top, f.right, f.bottom); clrscr(); } /* Definirea unei functii cu un numar variabi de argumente!!! Choice(char arg1, ...); Functia primeste un mai multe argumente de tip char din care ultimul avand valoarea ZERO (0x00). Acest argument simbolizeaza sfarsitul listei de argumente. Functia Afiseaza un meniu cu aceste argumente si va returna optiunea selectata cu tastele(Stanga, Dreapta, ENTER) sau apasaand initialele optiunilor. */ char Choice(char f, ...) { char arg[20], c; int i=0, n, xMeniu=0; va_list ap; // un sir ce va tine lista argumentelor, necesar // macrourillor - va_start(...), va_arg(...), va_end(...) va_start(ap, f);//seteaza un indicator pe primul argument din lista arg[i++]=f; do arg[i] = va_arg(ap,char);//extrage urmatorul argument din lista while(arg[i++] != 0); clrscr(); _setcursortype(_NOCURSOR); do { for(i=0, n=0; arg[i] != 0; i++ ) { gotoxy(i*2+1, 1); if(i==xMeniu) textbackground(6); // seteaza culoarea fondului- selectie cprintf("%c", arg[i]); if(i==xMeniu) textbackground(0); // seteaza culoarea originala n++; } flushall();

Page 23: Programare C Elemente Avansate

23

if( (c = getch()) == 0x00 ) // caracter special (tasta sus, jos, ...) { c=getch(); if(c== DREAPTA) //Tasta DREAPTA =77 - 0x4D -codul tastei { if( xMeniu < n-1) xMeniu++; else xMeniu = 0; } else if(c== STANGA) //Tasta STANGA = 75 - 0x4B -codul tastei { if( xMeniu > 0) xMeniu--; else xMeniu = n-1; } } else //In cazul in care este apasata litera "X", ... { for(i=0; arg[i] != 0; i++ ) if(toupper(c) == toupper(arg[i])) xMeniu = i; } }while(c != ENTER); _setcursortype(_NORMALCURSOR); return arg[xMeniu]; } void Arhivare( void ) { char nume[80], fisiere[80]; gotoxy(1,1); cprintf("Doriti arhivarea proiectului <Y/N>?"); flushall(); if( toupper(getch()) == 'N') return; gotoxy(1,3); cprintf("Dati numele arhivei: "); flushall(); gets(nume); sprintf(fisiere, "F:\\NC\\ARJ.EXE a %s *.c *.h *.prj *.txt *.exe >nul", nume); _setcursortype(_NOCURSOR); gotoxy(1,5); cprintf("Arhivare in progres... "); gotoxy(1,6); if( system(fisiere) != 0 ) perror("system(...):"); else cprintf("Arhivare completa! "); _setcursortype(_NORMALCURSOR); }

MODUL VIDEO

Page 24: Programare C Elemente Avansate

24

Fisierele au ca principala atributie intr.-un sistem de calcul de a stoca informatii (date, aplicatii). Un #include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { /* request auto detection */ int gdriver = DETECT, gmode, errorcode; int xmax, ymax; /* initialize graphics and local variables */ initgraph(&gdriver, &gmode, ""); /* read result of initialization */ errorcode = graphresult(); /* an error occurred */ if (errorcode != grOk) { printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:"); getch(); exit(1); } setcolor(getmaxcolor()); xmax = getmaxx(); ymax = getmaxy(); /* draw a diagonal line */ line(0, 0, xmax, ymax); /* clean up */ getch(); closegraph(); return 0; }

http://www.programmersheaven.com/mb/CandCPP/93367/93367/egavgabgi-error-in-borland-c++-31-for-dos/

MODUL ANSI COLOR

Fisierele au ca principala atributie intr.-un sistem de calcul de a stoca informatii (date, aplicatii). Un

Page 25: Programare C Elemente Avansate

25

Page 26: Programare C Elemente Avansate

26

6 COMUNICATIE SERIALA/PARALELA Fisierele au ca principala atributie intr.-un sistem de calcul de a stoca informatii (date, aplicatii). Un

fisier http://electrosofts.com/serial/ http://electrosofts.com/parallel/ http://www.epanorama.net/circuits/parallel_output.html#circuithow

Page 27: Programare C Elemente Avansate

27

7 GENERAREA DE SUNETE sound(frecventa suntului); si dupa aia nosound(); sa se opreasca

http://www.onecore.net/howtosound-generation-in-turbo-c.htm #include <dos.h> unsigned mica_serenada[] = {392, 294, 392, 294, 392, 294, 392, 494, 588, 524, 440, 524, 440, 524, 440, 370, 440, 294, 392, 392, 494, 440, 392, 392, 370, 370, 440, 524, 370, 440, 392, 392, 494, 440, 392, 392, 370, 370, 440, 524, 370, 392, 0}; int main(void) { int i =0; do { sound(mica_serenada[i]); delay(400); nosound(); if(i==8 || i==17) delay(600); if(i==0 ||i==2 ||i==9 ||i==11 ||i==19 ||i==25 ||i==31 ||i==37 ) delay(300); }while(mica_serenada[i++]!=0); nosound(); return 0; }

#include <dos.h> unsigned a_ruginit[] = { 294, 392, 440, 494, 494, 523, 494, 440, 294, 392, 440, 494, 494, 523, 494, 294, 0}; int main(void) { int i =0; do { sound(a_ruginit[i]); if(i==3 ||i==7 ||i==11 ||i==15 ) delay(400); else delay(200); nosound(); delay(150); }while(a_ruginit[i++]!=0); nosound(); return 0; }

Page 28: Programare C Elemente Avansate

28