Limbajul c si C++ abc-doar


nosound(); printf("OPERATIE ILEGALA ! \n")



Yüklə 4,6 Mb.
səhifə53/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   ...   47   48   49   50   51   52   53   54   55

nosound();

printf("OPERATIE ILEGALA ! \n");

sleep(1);

signal(SIGILL,(fptr)eroare());

};

};

exit(1);

}

eroare()

{ printf(" EXCEPTIE DE CALCUL \n");

printf(" x=%d nu este o valoare admisibila ! \n",x);

}

In exemplul de mai sus,functia de tratare a erorii (eroare() ) nu executa

un return imediat si nici nu intrerupe executia programului,pentru ca

sa fie cat mai evident modul de actiune al functiei signal(),cea care a

apelat rutina de tratare a erorii.


-403- [ time.h - asctime() ]

CONSTANTE,TIPURI DE DATE si VARIABILE GLOBALE

-mesaje predefinite pentru signal sunt: SIG_DFL,SIG_IGN si SIG_ERR

-CONSTANTE sunt: SIGABRT,SIGFPE,SIGILL,SIGINT,SIGSEGV si SIGTERM sunt

descrise detailat la functia signal
BIBLIOTECA C++ directorul SYS(lipseste in Turbo C)

-contine filele antet locking.h,stat.h,timeb.h si types.h
Fila antet locking.h contine parametrii de blocare a filelor:

LK_UNLCK =0 unlock file region

LK_LOCK =1 lock file region,try for 10 seconds

LK_NBLCK =2 lock file region,don't block

LK_RLCK =3 same as LK_LOCK

LK_NBRLCK =4 same as LK_NBLCK
Fila antet stat.h a fost descrisa pe larg la biblioteca C

Fila antet timeb.h contine functia ftime() care arhiveaza ora sistemului

in structura de tip timeb care este definita dupa cum urmeaza:

struct timeb { long time;

short millitm;

short timezone;

short dstflag;

};

Fila antet types.h contine tipuri de date pentru functiile care opereaza

cu timpul sistemului.Tipurile de date declarate sunt:

typedef short dev_t;

typedef short ino_t;

typedef short mode_t;

typedef short nlink_t;

typedef int uid_t;

typedef int gid_t;

typedef long off_t;

Utilizatorii versiunii Turbo C DOS,pot copia directorul SYS dintr-o ver-

siune de C++,dar ATENTIE-necesita mici modificari pentru realizarea com-

patibilitatii,motiv pentru care nu se recomanda incepatorilor.
BIBLIOTECA C fila antet

-declara si defineste o serie de functii utilizate pentru diverse operatii

asupra orei si datei sistemului,impreuna cu tipurile de date necesare

pentru executia acestor functii
FUNCTIA asctime()

-converteste data si ora in format ASCII

SINTAXA GENERALA este: char *asctime(const struct tm *tblock);

Functia utilizeaza o structura de tip tm(definita in time.h) pentru a

salva data si ora sistemului si a realiza conversia datelor arhivate la

un sir de 26 de caractere similar cu cel returnat de functia ctime().

Exemplu: Sun Sep 16 01:03:52 1973\n\0

Functia returneaza un pointer spre sirul de date care contine data si ora.

Sirul astfel rezultat este de fapt o variabila de tip static si este

suprascris la fiecare apel al functiei asctime().


-404- [ time.h - clock() ]

EXEMPLU: #include

#include

#include

#include

struct tm t;

char str[80];

main()

{ t.tm_sec=10;

t.tm_min=20;

t.tm_hour=17;

t.tm_mday=6;

t.tm_mon=5;

t.tm_year=106;

t.tm_wday=2;

strcpy(str,asctime(&t));

printf("data si ora este: \n %s \n",str);

sleep(3);

}
FUNCTIA clock()

-determina ceasul procesorului

SINTAXA GENERALA este: clock_t clock(void);

Functia se utilizeaza pentru a determina intervalul de timp dintre doua

evenimente.Functia utilizeaza ceasul procesorului,care este controlat de

macroul CLK_TCK.In versiunea Turbo C acesta este definit cu valoarea 18.2

iar in versiunea Borland C++ 5.0 este definit cu valoarea 1000.Pentru a

determina timpul dintre doua evenimente,rezultatul operatiei de scadare

a celor doua momente trebuie impartit la CLK_TCK(adica la numarul de batai

de ceas/secunda al procesorului).

Functia returneaza o valoare care reprezinta numarul de batati de ceas

pentru procesorul instalat.In caz de eroare,returneaza -1.

EXEMPLU: #include

#include

#include

clock_t start,stop;

main()

{ start=clock();

sleep(1);

stop=clock();

printf("Ceasul procesorului a masurat: \n");

printf("%d batati de ceas (CLK_TCK) \n",stop-start);

sleep(3);

}

Exercitiul masoara numarul de batai de ceas pe secunda.Ceasul procesorului

nu trebuie confundat cu cel care determina intarzierea/operatie si res-

pectiv viteza de lucru a procesorului(chiar daca poarta acelasi nume).

Functia clock() este doar o structura software,independenta de structura

fizica a procesorului (dar executa o operatie similara).Versiunea C++,

care are un clock() mai rapid,poate executa un numar mai mare de task-uri

pe secunda,si implicit,are nevoie de un procesor mai rapid decat versiunea

Turbo C care opereaza de 50 de ori mai lent(valoarea se poate reseta).


-405- [ ctime(),difftime() si gmtime() ]

FUNCTIA ctime()

-converteste data si ora la un sir de caractere

SINTAXA GENERALA este: char *ctime(const time_t *time);

Functia converteste valoarea returnata de functia time() la un sir de

caractere.Valoarea este de tip time_t si este pointata de pointerul *time.

Sirul rezultat este format din 26 de caractere.

Exemplu: Mon Nov 21 11:31:54 1983\n\0

Variabila globala _timezone contine diferenta dintre ora locala si ora

GMT exprimata in secunde iar variabila _daylight este nonzero doar daca

se aplica conventiile standard U.S.Ambele variabile sunt setate de tzset()

Functia returneaza un pointer spre sirul de caractere rezultat.Sirul este

de tip static si este suprascris la fiecare apel al functiei ctime().

EXEMPLU: #include

#include

#include

time_t t;

main()

{ time(&t);

printf("Data si ora este: %s \n",ctime(&t));

sleep(3);

}
FUNCTIA difftime()

-calculeaza diferenta dintre doua momente de timp

SINTAXA GENERALA este: double difftime(time_t time2,time_t time1);

Functia calculeaza intervalul de timp dintre doua momente diferite,

arhivate in campuri de date de tip time_t(timp2-timp1).

Functia returneaza o valoare de tip double (rezultatul diferentei)

EXEMPLU: #include

#include

#include

time_t start,stop;

char nume[80];

main()

{ start=time(NULL);

printf("Introduceti numele si prenumele: \n");

gets(nume);

stop=time(NULL);

printf("Pentru inregistrare s-au consumat: \n");

printf("%f secunde \n",difftime(stop,start));

sleep(3);

}
FUNCTIA gmtime()

-converteste data si ora la GMT (Greenwich mean time)

SINTAXA GENERALA este: struct tm *gmtime(const time_t *timer);

Functia returneaza un pointer spre o structura de tip tm care contine

datele despre data si ora curenta si realizeaza automat conversia la ora

si data GMT(meridianul zero).Diferenta dintre ora locala si ora GMT este

continuta in variabila globala de tip long _timezone sub forma ORAx60x60

Functia returneaza un pointer spre structura care arhiveaza datele.


-406- [ time.h-localtime() si stime() ]

EXEMPLU: #include

#include

#include

time_t t;

struct tm *gmt,*locala;

char *tzstr="TZ=PST-1PDT";

main()

{ putenv(tzstr);

tzset();

t=time(NULL);

locala=localtime(&t);

printf("ora locala este: %s \n",asctime(locala));

gmt=gmtime(&t);

printf("ora GMT este: %s \n",asctime(gmt));

sleep(3);

}
FUNCTIA localtime()

-converteste data si ora din tipul time_t la o structura de tip tm

SINTAXA GENERALA este: struct tm *localtime(const time_t *timer);

Functia converteste valoarea din *timer la o structura de tip tm,care va

contine toate elementele datei si orei respective.

Functia returneaza un pointer spre structura de tip tm care arhiveaza

datele. Structura tm are forma generala:

struct tm { int tm_sec;

int tm_min;

int tm_hour;

int tm_mday;

int tm_mon;

int tm_year;

int tm_wday;

int tm_yday;

int tm_isdst; }

EXEMPLU: #include

#include

#include

time_t timp;

struct tm *t;

main()

{ timp=time(NULL);

t=localtime(&timp);

printf("Ora locala este: %s \n",asctime(t));

sleep(3); }
FUNCTIA stime()

-seteaza data si ora

SINTAXA GENERALA este: int stime(time_t *tp);

Functia reseteaza data si ora sistemului utilizand un pointer spre o

valoare de tip time_t care contine data si ora dorita exprimata in secunde

trecute fata de data de referinta 1 Ianuarie 1970 ora 00:00:00.

Functia returneaza valoarea zero.


-407- [ time.h-time() si tzset() ]

EXEMPLU: #include

#include

#include

time_t t,new;

main()

{ t=time(NULL);

printf("data actuala este: %s \n",ctime(&t));

new=t-53L*60L*60L;

stime(&new);

printf("In urma cu 53 de ore a fost data de: \n");

printf("%s \n",ctime(&new));

stime(&t); /* resetam data actuala */

sleep(3);

}
FUNCTIA time()

-citeste data si ora sistemului

SINTAXA GENERALA este: time_t time(time_t *timer);

Functia citeste data si ora curenta sub forma unei valori de tip time_t,

reprezentand numarul de secunde care au trecut fata de data de referinta

1 Ianuarie 1970 ora 00:00:00 si arhiveaza valoarea citita la adresa spre

care pointeaza pointerul timer.

Functia returneaza valoarea citita (timpul scurs exprimat in secunde)

EXEMPLU: #include

#include

#include

time_t t;

main()

{ t=time(NULL);

printf("Timpul exprimat in secunde,fata de 1 Ian 1970:\n");

printf("%ld secunde \n",t);

sleep(3);

}
FUNCTIA tzset()

-seteaza variabilele globale _daylight,_timezone si _tzname.

SINTAXA GENERALA este: void tzset(void);

Functia este accesibila pentru sistemele Xenix.

Functia seteaza cele trei variabile globale,utilizand variabila de mediu

TZ (enviroment) care este de forma: TZ= zzz [+ sau -] d [d] [lll]

unde: zzz sunt trei caractere pentru codul zonei geografice (de exemplu

PST pentru Pacific Standard Time).

=sau - este semnul valorii de tip int care specifica difernta

dintre ora locala si ora GMT

lll sunt caractere optionale care specifica un subset al zonei

locale (Exemplu: PDT specifica Pacific daylight time )

Daca variabila TZ nu este prezenta in env (enviroment=mediul de operare),

sau nu respecta notatia de mai sus,atunci se va utiliza valoarea implicita

care este: TZ=EST5EDT (ora New York-ului).

In versiunea win32 TZ nu are o valoare implicita (trebuie specificata).

Functia nu returneaza nici o valoare.


-408- [ time.h - CONSTANTE ]

EXEMPLU: #include

#include

#include

#include

time_t timp;

main()

{ putenv("TZ=ROM-7BUC");

tzset();

time(&timp);

printf("La Bucuresti este ora: %s \n",asctime(localtime(&timp)));

printf("La New York este ora: %s \n",asctime(gmtime(&timp)));

sleep(3);

}
CONSTANTE,TIPURI DE DATE si VARIABILE GLOBALE
CLK_TCK -este constanta si defineste numarul de batai per secunda.Pentru

Turbo C este declarata 18.2 iar pentru Borland C++ 1000.0

_daylight -este o constanta.Este 1 pentru daylight sau 0 (standard time)

size_t -este o valoare unsigned int returnata de operatorul sizeof

time_t -este o variabila utilizata pentru functiile declarate in time.h

-salveaza timpul exprimat in secunde fata de 1 Ian 1970 00:00:00

Valoarea maxima acceptata este data de: 01/19/2038 ora 3:14:07

dupa care se epuizeaza domeniul de valori

_timezone -este o variabila si contine diferenta dintre ora locala si ora

GMT,exprimata in secunde.In versiunea Win32,valoarea pentru

_timezone este obtinuta de la sistemul de operare

tm -este o structura destinata pentru arhivarea datei si orei.

Are forma generala:

struct tm { int tm_sec; /* secundele */

int tm_min; /* minutele */

int tm_hour; /* orele */

int tm_mday; /* ziua din luna */

int tm_mon; /* luna calendaristica */

int tm_year; /* anul (minus 1900 ) */

int tm_wday; /* ziua din saptamana (0-6) */

int tm_yday; /* ziua din an (0-365) */

int tm_isdst; /* zi lumina (0 sau 1) */

};

_tzname[C++] -este o arie de pointeri spre siruri care contin abrevieri

de trei caractere ale zonelor cu fus orar diferit.Dintre

acestea _tzname[0] pointeaza in variabila TZ sirul de trei

caractere ce reprezinta zona geografica iar _tzname[1]

pointeaza in variabila TZ din enviroment sirul de trei

caractere ce specifica subzona (respectiv daca este setat

sau nu standardul care identifica daca este zi sau noapte.

In versiunea WIN32 a C++,valorile pentru tzname se seteaza

automat.

Functiile din fila se pot utiliza pentru diverse operatii cu

datele calendaristice,dar mai ales pentru a selecta filele din program

in functie de data,sau pentru a executa operatii la ora si data fixata.


-409- [ values.h - CONSTANTE ]

BIBLIOTECA C fila antet

-defineste constante pentru limitele valorilor float si double
BITSPERBYTE =8 Numarul de biti per byte

DMAXEXP =308 Exponentul maxim admis pentru double

DMAXPOWTWO =0x3FF Cea mai mare putere a lui 2 (double)

DMINEXP =-307 Cel mai mic exponent admis pentru double

DSIGNIF =53 Numarul de biti semnificativi (double)

FMAXEXP =38 Exponentul maxim admis pentru float

FMAXPOWTWO =0x7F Cea mai mare putere a lui 2 (pentru float)

FMINEXP =-37 Cel mai mic exponent admis pentru float

FSIGNIF =24 Numarul de biti semnificativi (float)

_FEXPLEN =8 Numarul de biti din exponent (float)

HIBITS =0x8000 Bitii de nivel inalt tipul short

HIBITI =0x8000 Bitii de nivel inalt tipul int

HIBITL =0x80000000 Bitii de nivel inalt tipul long

_LENBASE =1 Baza pentru care se aplica exponentul

MAXDOUBLE =1.797693E+308 Cea mai mare valoare pentru tipul double

MAXFLOAT =3.37E+38 Cea mai mare valoare pentru tipul float

MAXINT =0x7FFF Cea mai mare valoare pentru tipul int

MAXLONG =0x7FFFFFFFL Cea mai mare valoare pentru tipul long

MAXSHORT =0x7FFF Cea mai mare valoare pentru tipul short

MINDOUBLE =2.225074E-308 Cea mai mica valoare pentru tipul double

MINFLOAT =8.43E-37 Cea mai mica valoare pentru tipul float

RECOMANDARI GENERALE
Limbajul C a fost conceput pentru programare (nu este un program destinat

pentru utilizatori),dar are limitele si inconvenientele oricarui limbaj de

nivel inalt.Numarul mare de functii (peste 500),impartite in file si

grupate pentru un anumit gen de operatii,confera limbajului foarte multa

suplete si eleganta,fata de alte limbaje cu forma fixa.In plus,filele

care contin functiile implicite pot fi permanent actualizate sau imbo-

gatite cu functii noi.Puteti realiza file cu functii,obiecte grafice sau

baze de date,astfel incat programul sa satisfaca orice gen de necesitati.

Limbajul C este foarte economicos,lucreaza cu volume mici de memorie si

rulat pe un calculator bun este extrem de performant si suficient de rapid

pentru necesitatile curente ale unui programator neinstitutionalizat.

Este recomandabil sa nu redactati programe foarte lungi,deoarece cea

mai mica eroare defecteaza intregul program si este foarte greu de depanat

Este bine sa impartiti programul in module,sau chiar in mai multe programe

mai mici,independente,care pot fi apoi apelate succesiv cu ajutorul unei

singure functii.In acest fel,programele sunt foarte usor de depanat si

sunt mai greu de defectat (o eroare de sector din memoria magnetica nu

va defecta intregul program,ci doar un singur modul).

Daca doriti ca programele sa poata fi utilizate si depanate si de

catre alti programatori,este bine sa insotiti programul cu explicatii cat

mai simple si cat mai clare.Explicatiile nu trebuie sa insoteasca fiecare

operatie,ci doar modulele mari sau functiile principale ale programului.

Fiecare program este bine sa contina si un antet,cu numele programatorului

si adresa de contact,in caz de nevoie.


-410-

Nu cautati solutii complicate sau excentrice.Solutia cea mai eleganta

este intotdeauna solutia cea mai simpla.Nu abuzati de expresii lungi sau

complicate.Atunci cand trebuiesc rezolvate ecuatii complicate,este bine

sa despartiti expresia in cat mai multe subunitati,pentru a evita feno-

menul de supraincarcare a operatorilor.Pe scurt,atunci cand exista mai

multi operatori decat registri de procesor in care sa se arhiveze valo-

rile,procesorul nu va mai tine cont de precedenta operatorilor,sau chiar

va ignora o parte dintre ei.In cursul procesului de compilare,expresia

va fi gasita OK,dar rezultatul returnat prin calcul va fi eronat.Feno-

menul este dependent de tipul de procesor si de tipul de memorie extinsa

cu care se lucreaza.Astfel,o expresie perfect valabila pentru un procesor

cu memorie extinsa va fi inaplicabila (va genera supraincarcare) daca

este aplicata pe un procesor mai rudimentar.Daca doriti ca programele

d-voastra sa poata fi aplicate pe orice calculator,evitati exprsiile care

pot genera incompatibilitati de hardware.

Daca doriti ca programele d-voastra sa fie utilizate si de altii,este

bine sa oferiti programele necodificate ("open source"),impreuna cu

toate filele si bazele de date accesorii,si eventual impreuna cu toate

driverele necesare.Fiecare program este bine sa contina si o fila cu

explicatii succinte.Nu incercati sa fiti prea savanti.Un program este cu

atat mai valoros cu cat este mai comprehensibil.

Programele pot rezolva o anumita problema fixa,caz in care sursa va

trebui mentinuta fixa,sau pot fi maleabile si adaptabile in functie de

necesitati.In acest din urma caz,este bine sa lasati in program o portita

pentru expandare,actualizare sau transformare.Programele formate din

module prezinta si un alt avantaj in plis:cu cateva module din programe

diferite se poate face un nou program,cu minimum de efort,respectiv bazele

de date pot fi utilizate simultan de catre doua sau mai multe programe.

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   47   48   49   50   51   52   53   54   55




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin