Limbajul c si C++ abc-doar


-129- [ stdio.h - vscanf() ]



Yüklə 4,6 Mb.
səhifə19/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   ...   15   16   17   18   19   20   21   22   ...   55

-129- [ stdio.h - vscanf() ]

EXEMPLU: #include

#include

#include
int functie(char *primul,...)

{

va_list numere;

int cnt;

va_start(numere,primul);

cnt=vscanf(primul,numere);

va_end(numere);

return(cnt);

}

int main()

{

printf("Selectati fereastra cu un click de mouse ! \n");

int z;

int w;

printf("Cate numere doriti sa introduceti(maxim 100) ?: \n");

scanf("%d",&z);

printf("Introduceti numerele: \n");

float date[100];

float suma=0;

int nr=0;

for ( w=0;w

{

functie("%f",&date[w]);

suma=suma+date[w];

nr++;

}

printf("Numerele introduse sunt: \n");

for ( w=0;w

{

printf("%f \n",date[w]);

}

printf("Media numerelor este: %f ",suma/nr);

sleep(5);

return 0;

}
Pentru formatul datelor se utilizeaza aceeasi formula ca si la scanf():

formula generala este de tipul:

% [*] [width] [F|N] [ h|l|L ] type_char

unde:

[*] -este caracterul de atribuire/supresie (suprima urmatorul camp)

[width] -specifica numarul maxim de caractere citite

[ F|N ] -specifica pointerul N=near pointer F=far pointer

[ h,l,L] -modificator al argumentului(schimba tipul implicit al acestuia)

h=short int l=long int sau double(pentru float) L=long double

type_char -este tipul de date utilizat (este obligatoriu de specificat,iar

restul sunt optionale)


-130- [ stdio.h - vfprintf() ]

Pentru a intelege modul de lucru cu o lista cu numar variabil de argumente

un exemplu foarte simplu este urmatorul:

EXEMPLU: #include

#include

#include

int functie(int primul,...)

{

int i=primul,numar=0,suma=0;

va_list medie;

va_start(medie,primul);

while (i !=-1 )

{

suma+=i;

numar++;

i=va_arg(medie,int);

}

sleep(1);

va_end(medie);

return(suma ? (suma/numar) : 0);

}

main()

{

printf("Media numerelor este: %d\n",functie(7,33,57,9,-1));

printf("Media este: %d\n",functie(57,13,29,83,99,-1,7,55));

sleep(5);

}

Observati ca in functia main(),puteti include in lista de argumente ce

urmeaza dupa functie,oricate numere doriti,cu conditia sa fie incluse

inaintea numarului -1(care termina citirea listei).Se pot utiliza doar

numere intregi,deoarece va_arg nu acepta decat tipul de date int.
FUNCTIA vfprintf()

-scrie date formatate in stream (in flux sau in fila virtuala)

SINTAXA GENERALA este:

int vfprintf(FILE *stream,const char *format,va_list arglist);

unde - FILE *stream este pointerul spre fila virtuala(spre flux)

-const char *format este formatul datelor

- va_list arglist este pointerul spre lista de argumente

Functia este o alternativa pentru functia fprintf(),cu deosebirea ca

utilizeaza o lista de argumente variabile in locul argumentului dintr-o

lista de argumente.Astfel functia accepta un pointer spre o serie de

argumente in locul unui pointer spre un singur argument din lista.Se poate

utiliza si atunci cand nu stiti exact cate argumente sunt in lista de

argumente(cu conditia ca lista sa fie de tipul va_list).Atunci cand se

utilizeaza mai multe liste de argumente,trebuie sa existe cate un speci-

ficator de format pentru fiecare lista de argumente.

Daca functia a fost executata cu succes,returneaza numarul de bytes

introdusi in stream(in memoria de operare),iar in caz de eroare returneaza

EOF.

Versiunea Visual C++ accepta si functia vfwprintf(),inclusa in fila

antet ,care opereaza doar cu majuscule.


-131- [ stdio.h - vfscanf() ]

EXEMPLU: #include

#include

#include

FILE *fila1;

int medie(char *primul,...)

{

va_list marker;

int cnt;

va_start(marker,primul);

cnt=vfprintf(fila1,primul,marker);

printf("Bytes(octeti) arhivati in stream: %d\n",cnt);

va_end(marker);

return(cnt);

}

main()

{

int numar=(50,3,22,7,91,15,23);

float numar1=(70.15,12.33,77.9311);

int date1;

float date2;

fila1=tmpfile();

medie("%d %f",numar,numar1);

rewind(fila1);

fscanf(fila1,"%d %f",&date1,&date2);

printf("Numerele citite sunt: %d si \n %f \n",date1,date2);

fclose(fila1);

sleep(5);

}

Observati ca puteti sa modificati numarul de elemente din lista de numere,

dar nu va fi arhivat decat ultimul dintre ele,iar spatiul scris in memorie

va fi influentat de formatul acestuia(de exemplu inlocuiti 23 prin 2355).

Functia este foarte utila atunci cand se introduc date in memoria de ope-

rare,mai ales atunci cand datele se preiau din mai multe fisiere in care

au fost arhivate in liste cu numar diferit de elemente.
FUNCTIA vfscanf()

-citeste si formateaza date preluate din stream (din memoria de operare)

SINTAXA GENERALA este:

int vfscanf(FILE *stream,const char *format,va_list arglist);

Functia este similara cu fscanf(),dar permite utilizarea unei liste de

argumente variabile pentru arhivarea datelor.Datele citite din fluxul

spre care pointeaza *stream,vor fi formatate conform cu specificatia din

const chat *format si vor fi arhivate in lista desemnata prin arglist.

Se pot utiliza un numar variabil de argumente cu conditia ca lista de

argumente sa fie de tip va_list (vezi si vscanf(),vfprintf() ).

Lista citeste datele caracter cu caracter,iar citirea poate fi intrerupta

de oricare dintre motivele specificate de format (vezi si scanf() ).

Daca a fost executata cu succes,returneaza numarul de campuri citite,

sau 0 daca nu a arhivat nici un camp,sau EOF in caz de eroare.

Pentru a nu genera erori,functia trebuie sa specifice un tip de format

si o adresa de memorie,pentru fiecare camp de date citit.


-132- [ stdio.h - vsprintf() ]

EXEMPLU: #include

#include

#include

FILE *fila;

int numere(char *unu,...)

{

va_list date;

int cnt;

va_start(date,unu);

cnt=vfscanf(fula,unu,date);

printf("Numarul de date citite este: %d \n\n",cnt);

va_end(date);

return(cnt);

}

int main()

{

int numar1=30;

int numar2=75;

int numar3=33;

fila=tmpfile();

fprintf(fila,"%d %d %d \n",numar1,numar2,numar3);

rewind(fila);

printf("Primul numar citit este: %d \n",numar1);

numere("%d",&numar1);

rewind(fila);

printf("Primele doua numere sunt: %d %d \n",numar1,numar2);

numere("%d %d",&numar1,&numar2);

rewind(fila);

printf("Primele trei numere: %d %d %d ",numar1,numar2,numar3);

numere("%d %d %d",&numar1,&numar2,&numar3);

sleep(10);

}

Observati ca am utilizat aceeasi functie pentru a citi un numar diferit de

campuri de date (am utilizat cnt pentru a numara campurile de date citite)
FUNCTIA vsprintf()

-scrie date formatate intr-un sir de caractere

SINTAXA GENERALA este:

int vsprintf(char *buffer,const char *format,va_list arglist);

unde: -buffer este adresa la care se vor scrie datele (sirul)

-format este formatul datelor

-va_list arglist este lista cu argumente variabile

Functia este o alternativa pentru functia sprintf(),fata de care accepta

o lista de argumente variabile in locul unui argument simplu.

Functia accepta un pointer spre o serie de argumente,pentru care aplica

formatul specificat si apoi le scrie in sirul specificat prin buffer.

Daca exista mai multe liste de argumente,trebuie sa existe cate un spe-

cificator de format,pentru fiecare tip de date(pentru fiecare lista).

Daca este executata cu succes,functia returneaza numarul de bytes

introdusi in sir,iar in caz de eroare returneaza EOF.

Versiunea Visual C++,accepta si functia vswprintf() (pentru majuscule).


-133- [ stdio.h - vsscanf() ]

EXEMPLU: #include

#include

#include

char tampon[80];

char functie(char *numar1,...)

{

va_list arg;

va_start(arg,numar1);

vsprintf(tampon,numar1,arg);

va_end(arg);

return 0;

}

main()

{

int x;

for(x=1;x<10;x++)

{

functie("%s","Text ");

printf("%s",tampon);

sleep(1);

}

}
FUNCTIA vsscanf()

-citeste si formateaza date preluate din stream (din file virtuale)

SINTAXA GENERALA este:

int vsscanf(const char *buffer,const char *format,va_list arglist);

unde: -buffer este adresa la care sunt stocate datele

-format este formatul datelor

-va_list arglist este lista de argumente variabile

Functia este o alternativa pentru sscanf(),cu deosebirea ca accepta o

lista de argumente variabile in locul unui argumet simplu pentru adresa

de stocare a datelor citite.Functia citeste campurile de date caracter cu

caracter,le formateaza corespunzator cu formatul specificat si le arhi-

veaza la adresa specificata prin lista de argumente.Pentru fiecare camp

de date citit,trebuie sa existe un specificator de format si o adresa de

arhivare a datelor.Functia respecta aceleasi reguli ca si scanf().

Daca a fost executata cu succes,functia returneaza numarul de campuri

de date citite,formatate si arhivate(valoarea returnata nu include si

campurile care au fost citite dar nu au fost salvate din lipsa de spatiu).

Daca nu a fost salvat nici un camp (adresa de arhivare insuficienta),

functia returneaza 0 (zero),iar in cazul in care se incearca citirea

datelor la sfarsitul filei virtuale functia returneaza EOF.

Functia intrerupe citirea ori de cate ori intalneste caracterul de

sfarsit de camp (spatiul gol sau caracterul null),daca intalneste un

caracter de suprimare a atribuirii (un asterix (*) dupa semnul %),daca

intalneste un caracter care nu poate fi convertit de catre formatul spe-

cificat prin definitia functiei,sau daca intalneste un caracter care nu

este inclus in lista de cautare a functiei (search set).

Atunci cand functia intalneste caractere ce genereaza un conflict,

acestea vor ramane nemodificate,ca si cand functia vsscanf nu le-a citit.


-134- [ stdio.h - C++ ]

EXEMPLU: #include

#include

#include

char arhiva[80]="Cluj 641234567 33.75"

int functie (char *prima,...)

{

va_list date;

va_start(date,prima);

vsscanf(arhiva,prima,date);

va_end(date);

return 0;

}

main()

{

char oras[80];

int telefon=0;

float suma=0;

functie("%s %d %f",oras,&telefon,&suma);

printf("%s %d %f",oras,telefon,suma);

sleep(5);

return 0;

}
Biblioteca stdio.h din versiunea C++ mai contine si urmatoarele constante,

variabile globale si tipuri de date:

BUFSIZ,EOF,_F_xxx (_F_RDWR=read and write,_F_READ=read only,_F_WRIT=write

only,_F_BUF=date tamponate in Malloc,_F_LBUF=fila cu tamon pentru linie,

_F_ERR=indicator de eroare,_F_EOF=indicator EOF,_F_BIN=indicator de fila

binara,_F_IN=intrare date,_F_OUT=iesire date,_F_TERM=fila este terminala),

FILE(tipul de data pentru structurile de tip stream=flux),SEEK_SET(care

poate fi:SEEK_SET=0 cauta inceputul filei,SEEK_CUR=1 cauta pozitia curenta

sau SEEK_END=2 cauta sfarsitul filei),fpos_t si size_t,_IOFBF(fila este

tamponata complet),_IOLBF(linia este tamponata complet),_IONBF(fila nu

este tamponata),L_ctermid(length of a device id string),L_tmpnam(size of

an array large enough to hold a temporary file name string),NULL(pentru

pointeri care nu pointeaza nici un obiect din program=pointeri nuli),

TMP_MAX(maximum number of unique file names),FOPEN_MAX(maximum files per

process),SYS_OPEN(maximum files for sistem),stdaux(standard auxiliary

device),stdin(standard input device),stdout(standard output device),stderr

(standard error output device) si stdprn(standard printer).

Biblioteca standard cuprinde functiile de intrare iesire a datelor,

asa cum au fost ele implementate de catre Kerningan si Ritchie,iar apoi

au fost extinse si pentru sistemul UNIX System V.

Aceasta biblioteca de functii este inclusa in toate versiunile de

programe C,indiferent de sistemul utilizat ca suport si este indispen-

sabila pentru munca de programare.Exista si alte biblioteci cu functii

pentru intrarea si iesirea datelor (de exemplu io.h pentru declaratii si

rutine la nivel inferior al datelor,sau iomanip.h pentru manipulatorii de

streamuri din C++).Functiile din biblioteca stdio.h pot necesita uneori

constante sau tipuri de date arhivate in alte biblioteci(de exemplu in

stdarg.h,stddef,h,stdiostr.h etc.).


-135- [ stdlib.h -abort() si abs() ]

BIBLIOTECA C (fila antet)

Fila contine un set de 43 de functii uzuale,cum ar fi cele

pentru conversia datelor sau rutinele pentru cautarea si sortarea datelor.

Biblioteca C++ mai adauga alte 13 functii,cuprinse in aceeasi fila de

antet.La fel ca si ,contine functii indispensabile pentru pro-

gramarea in limbaj C.Pentru utilizarea functiilor din aceasta biblioteca,

trebuie sa fie incarcata in etapa de preprocesare cu comanda :

#include
FUNCTIA abort()

-opreste executia unui program (oprire fortata)

SINTAXA GENERALA este: void abort(void);

Functia abandoneaza procesul curent si returneaza un cod de eroare.

Functia nu determina revenirea la procesul de baza (cel din care s-a

apelat functia) ci doar termina executia procesului si returneaza codul

pentru exit 3.Functia returneaza mesajul "abnormal program termination"

si apeleaza functia SIGABRT (din ) care are ca rezultat actiunea

_exit(3).Functia returneaza controlul la procesul din care a fost apelata

sau la sistemul de operare fara sa elibereze tampoanele din memoria de

operare si fara sa execute functiile (atexit/_onexit).Nu se recomanda

utilizarea decat in situatii exceptionale,deoarece memoria de operare

ramane blocata cu datele aflate in executie.

Daca este executata cu succes,functia returneaza procesului de origine

sau respectiv sistemului de operare _exit(3).

EXEMPLU: #include

#include

#include

int x;

main()

{

for (x=0;x<20;x++)

{

printf("Numarul este: %d\n",x);

sleep(1);

if (x==13)

abort();

}

}

Nu se recomanda utilizarea functiei pentru iesirea din programele obis-

nuite.Functia se poate utiliza pentru iesire fortata(de urgenta) sau

pentru abandonarea unui proces care risca sa suprasolicite procesorul sau

sa supraincarce memoria de operare.Dupa o iesire anormala din program cu

o comanda abort(),este bine sa eliberati memoria de operare(rulati un

program de eliberare a memoriei).
FUNCTIA abs()

-returneaza valoarea absoluta a unui intreg

SINTAXA GENERALA este: int abs(int x);

Functia este arhivata atat in stdlib.h cat si in math.h si se utilizeaza

pentru a returna valoarea absoluta a unui numar intreg din domeniul de

valori al tipului de data INT.


-136- [ stdlib.h - atexit() ]

In biblioteca stdlib.h,abs este integrata sub forma de macro.Pentru a

fi utilizata sub forma de functie simpla,poate fi dereferita cu comanda

#undef abs,caz in care se poate utiliza si pentru tipurile de date bcd

(binary-coded decimals) sau complex(clasa numerelor complexe).

Functia returneaza valoarea absoluta a argumentului.In caz de eroare nu

returneaza nimic.

OBSERVATIE:-functia este valabila doar in domeniul de valori al tipului

de data INT,care este diferit in functie de platforma pe care este imple-

mentat sistemul ( -128 la 127 pentru _int8 ,-32768 la 32757 pentru _int16

la versiunile de C sub MS-DOS,sau -2147483648 la 2147483647 pentru _int32

la versiunile care opereaza sub Windows,etc...).

Valoarea returnata va fi cuprinsa intre zero si valoarea maxima a

domeniului de valori definit in limit.h (in afara domeniului de valori

returneaza valori false).

EXEMPLU: #include

#include

#include

#include

float x;

int y;

main()

{

clrscr();

for (x=32760;x<32775;x++)

{

y=abs(-x);

printf("Valoarea absoluta a numarului %f este: %d\n",x,y);

sleep(2);

}

printf("ATENTIE-in afara domeniului(-32768)valorile sunt false!");

sleep(7);

}
FUNCTIA atexit()

-proceseaza functia specificata la iesirea din program (functie terminala)

SINTAXA GENERALA este: int atexit(void (_USERENTRY * func)(void));

atexit inregistreaza functia spre care pointeaza func sub forma de functie

terminala(ce va fi executata automat la iesirea din program).Functia ter-

minala va fi executata la iesirea normala din program (fara abort!),ime-

diat inainte de returnarea controlului la sistemul de operare.

Fiecare instructiune care contine atexit va inregistra o noua functie.

Se pot apela maxim 32 de astfel de functii terminale.Functiile terminale

vor fi executate in ordinea inversa fata de cea in care au fost apelate(

ultima apelata va fi executata prima).

Daca este executata cu succes,functia returneaza zero,iar in caz de

eroare returneaza o valoare nonzero.

Practic,functia atexit arhiveaza adresa functiei ce urmeaza a fi exe-

cutata la iesirea din program,iar in caz ca sunt mai multe astfel de

functii,se creaza un registru de tip LIFO(last in first out).

Functiile transferate catre atexit nu pot accepta parametri si sunt

arhivate in atexit() sub forma de stiva.


-137- [ stdlib.h -atof() ]

EXEMPLU: #include

#include

#include

void functie1()

{

printf("Functie executata la iesirea din program \n");

sleep(3);

}

void functie2()

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   15   16   17   18   19   20   21   22   ...   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