|
arhiveaza datele (inclusiv dupa oprirea calculatorului) si poate fi ele-
|
səhifə | 12/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| 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
Dostları ilə paylaş: |
|
|