Limbajul c si C++ abc-doar


arhiveaza datele (inclusiv dupa oprirea calculatorului) si poate fi ele-



Yüklə 4,6 Mb.
səhifə12/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   ...   8   9   10   11   12   13   14   15   ...   55

arhiveaza datele (inclusiv dupa oprirea calculatorului) si poate fi ele-

ctromagnetica,optica,mecanica(benzi perforate) etc.Memoria de operare este

volatila,electrica,situata in procesoar (formata din porti logice si cir-

cuite redundante),se sterge automat la oprirea calculatorului si se utili-

zeaza pentru calcule si operatii cu datele procesate.Pentru a intelege

rostul memoriei de operare,considerati ca o functie oarecare efectueaza un

milion de operatii,utilizand o variabila volatila.Pentru a utiliza memoria

suport ar trebui ca variabila respectiva sa fie scrisa,stearsa si apoi

rescrisa de un milion de ori(fapt ce ar determina distrugerea suportului

de memorie si o intarziere considerabila).


-77-

Pentru eliminarea inconvenientelor de acest tip,toate operatiile se

efectueaza la nivelul memoriei de operare,care este o copie electrica a

memoriei se stocare ce se pastreaza in interiorul procesorului in niste

circuite speciale.Astfel,pentru comunicarea cu calculatorul sunt necesare

atat functii de stocare a datelor in memoria suport(arhivare),cat si

functii pentru comunicarea cu memoria de operare.

In limbajul C si C++,ca de altfel in aproape toate sistemele de ope-

rare,toate operatiile de intrare sau de iesire a datelor din calculator se

fac prin intermediul memoriei de operare.Astfel datele stocate in memoria

suport,trebuiesc preluate in memoria de operare inainte de a fi prelucrate

iar datele ce vor fi arhivate,se prelucreaza sau filtreaza in memoria de

operare inainte de a fi stocate pe suport.

Fiecare procesor,in functie de tipul constructiv,poate prelucra un

volum mai mic sau mai mare de date/unitatea de timp,in functie de numarul

de linii paralele pe care circula curentii si in functie de frecventa de

lucru.Pentru procesare,datele se grupeaza in blocuri de date,sau fragmente

denumite si fluxuri sau formate.Prin stream,se intelege un flux de date ce

intra in procesoar la un anumit moment dat,si apoi este recirculat in

memoria de operare sub forma de circuit redundant,pana cand nu mai este

necesar si va fi eliberat din circuit("flush").

Un stream va putea fi neorganizat(cu exceptia formatului),sau va putea

fi subimpartit in fragmente ce realizeaza file,fisiere,ferestre sau obi-

ecte de lucru etc.Cu alte cuvinte,in memoria de operare se realizeaza o

copie electrica a memoriei de stocare in care datele pot fi manevrate,

scrise si sterse cu viteza maxima,de un numar infinit de ori,fara sa

modifice cu nimic arhitectura sau structura sistemului.Se realizeaza

astfel o structura asemanatoare cu interfata grafica dintre un program si

utilizator(cea in care se selecteaza comenzile cu ajutoarul mouse-ului).

Practic,memoria de operare realizeaza suportul pentru toate operatiile de

intare si de iesire a datelor si pentru toate operatiile din timpul exe-

cutiei unui program.

Memoria de operare este inclusa in procesor,are dimensiuni variate de

la procesor la procesor(din ce in ce mai mare la cele recente) si are un

rol determinant in executia oricarui program.Din acest motiv,pentru a

facilita si mai mult si pentru a extinde capacitatea memoriei de operare,

majoritatea sistemelor permit adaugarea de placi cu procesoare ce formeaza

o memorie de operare auxiliara,denumita si memorie de RAM.Termenul de RAM

provine de la "random acces memory",dar si de la termenul de ramificatie.

Practic este o ramificatie a memoriei de operare in care datele pot fi

accesate aleator(nu ca in stiva de- gen "LIFO").Memoria de RAM,este ex-

pandabila,astfel incat in prezent poate cuprinde toate datele din calcu-

lator.Este foarte utila pentru filtrarea datelor,mai ales atunci cand

acestea provin dintr-o sursa nesigura(Exemplu: date de pe Internet).

Pentru acest scop,in memoria de operare (si implicit in cea de RAM),

se formeaza niste structuri software denumite tampoane ("buffers") sau

filtre,care actioneaza ca si un procesor virtual in care datele sunt se-

lectate prin comenzi conditionale,in loc sa fie selectate fizic prin

portile logice ale procesorului.Tampoanele pot fi utilizate pentru sal-

varea datelor pana in momentul in care sunt utile,pentru corectarea for-

matului,pentru verificarea conditiilor de intrare sau iesire etc.

Registrii sunt structuri similare,utilizate pentru constantele programului.


-78- [stdio.h-printf() ]

Functia printf(),la fel ca toate functiile din stdio.h,actioneaza la

nivel de stream (flux de date).

Daca se utilizeaza impreuna cu functia si specificatorii de format,

sintaxa generala pentru precizarea formatului este urmatoarea:

%[flag][width][.precision][{F|N|h|l|I|I64|L}]type unde:

-flag sunt caracterele de semnalizare(-,+,0,blank,#) si sunt utilizate

pentru a determina alinierea,semnele pentru imprimare,punctele decimale,

prefixul octal sau hexadecimal.Pot fi mai multe caractere flag in sir.

-width -este numarul optional care specifica numarul de caractere(n,0n,*)

-precision-este caracterul ce determina precizia datelor(c,C,d,i,u,o,x,X,

e,E,f,g,G,s,S) respectiv numarul de octeti de memorie ocupata

-F si N specifica tipul far sau near (doar la compilatoarele Microsoft)

-h,I,I64,L -sunt prefixe ce determina dimensiunea argumentului(h=1 byte,

l=4 bytes-tipul long,I64=8 bytes-tipul _int64 iar L=10 bytes)

-type -este caracterul care determina daca argumentul va fi interpretat

ca si caracter,sir sau numar(vezi tabelul c,C,d,i,o,u,x,X,e,E,f,g,G,p,s)

Versiunea C++ adauga si "s" pentru siruri de un singur byte si "S"

pentru siruri largi (caracterele vor fi tiparite pana la primul caracter

nul sau pana la epuizarea preciziei,iar pentru functia wprintf semnifi-

catia este inversata intre s si S).
Cea mai simpla modaliate de specificare a unui format,este utilizand

semnul % si caracterul ce determina tipul(Exemplu: %d).

Daca se utilizeaza un caracter fara semnificatie de format,atunci se va

afisa caracterul ca atare(Exemplu: %% va afisa caracterul %).

Specificarea formatului trebuie obligatoriu sa inceapa cu caracterul %.

Daca in specificarea formatului se utilizeaza mai multe caractere,atunci

pentru fiecare specificator de format trebuie sa exista si un argument ce

va fi trecut in lista,dupa format.Pentru interpretarea formatului,progra-

mul va citi primul caracter ce urmeaza dupa % si primul argument din lista

apoi cel de al doilea caracter si cel de al doilea argument,etc....pana

la epuizarea definitiei.Daca exista mai multe argumente decat specifica-

tori de format,atunci cele excedentare vor fi ignorate,iar daca exista mai

putine argumente decat specificatori,atunci rezultatul va fi nedefinit.

EXEMPLU: #include

#include

#include

void sleep();

void clrscr();

double nr;

float nrpi;

void main()

{

clrscr();

nr=203 << 14;

nrpi=-3.14159265;

printf("%G %f \n\n ",nr,nrpi);

printf(" iar dupa conversie la notatia stiintifica \n\n");

printf("%E %e ",nr,nrpi);

sleep(10);

}


-79- [stdio.h-printf()]

Pentru a intelege cat mai bine conversile de format realizate de fun-

ctia printf(),inlocuiti in exemplul de mai sus numerele exprimate prin

alte numere si respectiv inlocuiti specificatorii de format,pana cand

observati semnificatia fiecaruia dintre ele.In mod similar se pot prelua,

afisa cu sau fara conversie si elementele unei arii.

EXEMPLU: #include

#include

#include

void sleep();

void clrscr();

int arie[3][10];

int x;

void main()

{

clrscr();

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

{

arie[1][x]=x;

arie[2][x]=x*x;

arie[3][x]=x*x*x;

};

printf("\n\n Elementele din arie sunt: \n\n");

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

{

printf("\n %i ",arie[1][x]);

printf("%i ",arie[2][x]);

printf("%i ",arie[3][x]);

};

sleep(20);

}

In exemplul de mai sus,se atribuie si apoi se afiseaza valori de tip int

unei arii.Incercati eventual exemple similare cu elemente din alte tipuri

de structuri de date(structuri,uniuni clase etc.)

Functia printf() este probabil cea mai utilizata functie,apare in

aproape orice program sau aplicatie.Nu treceti mai departe pana ce nu a-ti

inteles complet,toate valentele acestei functii.Observati ca elementele

numerice pentru care formatul este nedefinit(indiferent de motiv) nu vor

putea fi reprezentate si nici afisate sau imprimate.

Atunci cand doriti sa utilizati un fragment dintr-un program sau apli-

catie,incarcati programul cu Load din meniul File,apoi selectati Write to

si schimbati numele programului,dupa care efectuati modificarile dorite si

salvati programul cu noul nume (daca este util).Nu puteti utiliza pentru

denumire cuvintele rezervate si numele functiilor,dar daca doriti sa

denumiti aplicatia dupa numele functiei utilizate puteti adauga un numar

la numele functiei,pentru a fi usor de identificat.(Exemplu:pentru functia

printf(),exemplele se por denumi PRINTF1,PRINTF2...etc.).

Este bine sa pastrati toate programele realizate,intr-o biblioteca

proprie.Pentru fiecare exemplu prezentat,puteti realiza un mic program sau

o aplicatie mai ampla.Daca programele incep sa ocupe prea mult loc,pot fi

copiate intr-un director special de arhivare(denumit back-up).Ulterior,

puteti utiliza filele sau fragmente din ele in programele viitoare.


-80- [stdio.h-scanf()]

FUNCTIA scanf()
Functia scanf() citeste date din "stream"(flux),si arhiveaza datele la

adresa specificata prin argumentele functiei.Fiecare argument trebuie sa

fie un pointer spre o variabila(sa specifice adresa de arhivare) din

acelasi tip de date cu cel specificat prin format.

SINTAXA GENERALA este: int scanf(const char *format[,argument]...);

De obicei se utilizeaza pentru a prelua si afisa datele citite de la tas-

tatura si este foarte mult utilizata in aproape toate programele.

Formatul se precizeaza la fel ca pentru functia printf() si recunoaste

aceiasi specificatori(cu exceptiile prezentate).

Functia returneaza numarul de campuri procesate(cele in care a inscris

date).Datele prelucrate vor fi procesate in functie de formatul lor iar

arhivarea in memorie se va face la locatiile specificate.Numarul de campuri

returnat nu include si campurile care au fost citite dar in care nu s-au

arhivat date.Daca nu a fost procesat nici un camp de date,functia returnea-

za 0.Daca la citirea datelor de tip caracter intalneste unul dintre carac-

terele "end-of-file" sau "end-of-string",atunci functia va returna EOF.

EXEMPLU: #include

#include

int arie[3][10];

int x;

int y;

void main()

{

clrscr();

x=1;

do

{

printf("\n Introduceti un numar intreg: \n");

y=scanf("%i",&arie[3][5]);

printf("%i",y);

printf("\n Numarul stocat in aria: arie[3][5] este ");

printf("%i",arie[3][5]);

printf("\n ");

x++;

} while (x<11);

}

In exemplu,numerele introduse succesiv se vor stoca in arie[3][5] si apoi

se va verifica numarul arhivat.Valoarea lui y(adica 1) reprezinta numarul

de arii procesate.Pentru a stoca cate doua numere,inlocuiti in exemplul

de mai sus urmatoarea expresie:

y=scanf("%i %i",&arie[3][5],&arie[3][7]);

In acest caz,functia va astepta sa introduceti cate doua numere,iar y va

returna valoarea 2.Pentru a verifica si valoarea stocata in arie[3][7],

adaugati si: printf("\n Numarul stocat in arie[3][7] este:");

printf("%i",arie[3][7]);

Apoi puteti sa verificati si conversiile de format,specificand de exemplu

formatul octal sau hexazecimal(prin %o sau %x in loc de %i).Observati ca

in acest caz,in loc de 10 se va afisa 16 etc.(numerele vor fi reprezentate

in format octal sau hexazecimal)


-81- [stdio.h-scanf() ]

Pentru a prelua de la tastatura un sir de caractere,se va utiliza speci-

ficatorul de format "%s" si se va specifica numarul de caractere intro-

duse.

EXEMPLU: #include

#include

#include

char nume[40];

char text[40];

int main()

{

clrscr();

printf("Introduceti numele d-voastra: ");

scanf("%40s",&nume);

printf("\n Introduceti adresa:");

scanf("40s",&text);

printf("\n\n ");

printf("Numele d-voastra este: ");

printf("%s",nume);

sleep(3);

}

in exemplul de mai sus,se vor putea introduce nume si adrese formate din

maximum 40 de caractere(inclusiv spatiile goale).

In aceeasi comanda se pot introduce simultan mai multe arii de stocare

a datelor,eventual pentru tipuri de date diferite.In acest caz,pentru

fiecare arie de date trebuie sa existe un specificator de format.Ariile se

vor trece in lista,dupa lista specificatorilor de format si este obliga-

toriu ca ariile sa fi fost declarate.

EXEMPLU: #include

#include

#include

char nume[40];

float suma;

int main()

{

clrscr();

printf(" Introduceti numele si suma depusa: ");

scanf("%40s \n%f",&nume,&suma);

printf("\n\n ");

printf("Numele d-voastra este: ");

printf("%s",nume);

printf("\n Suma totala + dobanda va fi : ");

suma=suma+suma*0.03;

printf("%f,suma);

sleep(3);

}

in exemplul de mai sus,functia scanf() va procesa ambele tipuri de date,

atat aria de tip caracter,cat si variabila in virgula mobila.Pentru a veri-

fica daca ambele arii sunt procesate,puteti salva valoarea functiei intr-o

variabila(ca in primul exemplu) si apoi verificati valoarea variabilei(

care va returna valoarea 2).Valoarea returnata de functie este utila doar

pentru depanarea programelor.


-82- [stdio.h-remove()]

FUNCTIA remove()

Sterge o fila din directorul curent.Daca fila respectiva este deschisa,

inchideti fila inainte sa o stergeti.Sintaxa generala este:

int remove(const char *numele filei);

Daca fila este in alt director decat cel curent,numele filei poate sa

includa si calea de acces la fila respectiva(EXEMPLU: C:\USR\Fila1.c)

In caz ca operatia de stergere a filei a fost realizata cu succes,

functia returneaza 0 iar in caz contrar returneaza -1 si seteaza in

variabila globala denumita "errno" una dintre urmatoarele valori:

EACCES -Permission denied sau ENOENT No such file or directory

Functia este de fapt un "macro" care sterge calea de acces la fila res-

pectiva,astfel incat aceasta devine "unlink" si nu mai poate fi apelata.

ATENTIE:-filele sterse nu vor mai putea fi recuperate decat daca exista o

fila de backup(cu extensia BAK).Nu va bazati pe fila de backup ci alegeti

cu atentie filele ce urmeaza a fi sterse.Exemplul urmator este functional

si poate fi utilizat pentru a sterge orice fila.Daca nu aveti de sters

nici o fila,introduceti un x sau un sir oarecare de caractere.Pentru a

sterge o fila,numele filei trebuie sa fie complet,inclusiv extensia(.c).

EXEMPLU:

#include

#include

char fila[40];

char stop[10];

int x;

void main()

{

clrscr();

printf("Introduceti numele filei pe care doriti sa o stergeti: \n");

scanf("%40s",&fila);

x=remove(fila);

if (x==0)

printf("\n Fila a fost stearsa cu succes !");

else

printf("\n File nu exista...sau este in alt director !");

printf("\n\n Introduceti orice caracter !");

scanf("%10s",&stop);

}

Pentru exercitiu,realizati o aplicatie care permite stergerea unei file,

doar dupa introducerea unei anumite parole de confirmare.
FUNCTIA rename()
Redenumeste o fila (cu conditia sa nu existe o alta fila cu acelasi

nume ca si cel specificat-nu sterge o fila preexistenta).Daca pentru noua

denumire se adauga si calea de acces cu numele unitatii de memorie,atunci

numele unitatii trebuie sa fie acelasi cu cel din vechea denumire(nu poate

copia fila de pe o unitate pe alta).Directorul in care se afla fila nu

este necesar sa fie acelasi(se poate utiliza pentru a muta a fila dintr-un

director in altul).Nu se pot utiliza caractere cu semnificatie generala

(de genul * sau ? ??).Pentru a operatia sa poata fi executata,trebuie ca

ambele file sa fie inchise.


-83- [stdio.h-rename]

Sintaxa generala este:

int rename(const char *nume vechi,const char *nume nou);

Daca operatia este executata cu succes,functia va returna 0 iar in caz

contrar,va returna -1 si va arhiva in variabila globala "errno" una dintre

urmatoarele valori:

EACCES Permision denied: filename already exists or has an invalid path

ENOENT No such file or directory

ENOTSAM Not same device

EINVAL Name contains invalid characters

Daca oricare dintre file (cea veche sau cea noua) este deschisa in timpul

procesului de redenumire,operatia va esua si se va returna EACCES(eroare

de acces).

Functia este portabila in DOS,WIN 16,WIN 32,ANSI C,ANSI C++ si OS/2,dar

nu si in UNIX.

Functia este foarte utila,atunci cand doriti sa modificati un program

existent fara ca sa modificati fila sursa.In acest caz puteti utiliza

meniul "Write to" din file sau puteti utiliza o aplicatie de genul:

EXEMPLU:

#include

char nume1[40];

char nume2[40];

int x;

char y[10];

void main()

{

printf("Introduceti numele vechi al fisierului: \n");

scanf("%40s",&nume1);

printf("\n Introduceti numele nou al fisierului: \n");

scanf("%40s",&nume2);

x=rename(nume1,nume2);

if (x==-1)

printf("\n EROARE!...Fisierul nu a fost redenumit !");

else

printf("\n Fisierul a fost redenumit cu succes !");

printf("\n\n Introduceti orice caracter,apoi ENTER: ");

scanf("%10s",y);

}

Exemplul este functional.Nu are rost sa multiplicati un fisier decat daca

aduceti imbunatatiri sau daca transformati si modernizati aplicatiile.

Pentru copia de siguranta,este mai bine sa pastrati programele utile pe

alta unitate de memorie(si cu acelasi nume).

Pentru exercitiu,puteti realiza o aplicatie in care numele unui fisier

este schimbat succesiv de mai multe ori.Daca ve-ti incerca sa reveniti

la numele initial,ve-ti obtine eroare de acces.Pentru verificarea opera-

tiilor puteti utiliza optiunea "Load" din meniul File.

Eventual realizati o aplicatie care arhiveaza orice program dupa o anumita

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   8   9   10   11   12   13   14   15   ...   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