Documente Academic
Documente Profesional
Documente Cultură
Studierea principiilor prelucrrii (descrierii, declarrii, formrii, etc.) tablourilor unidimensionale -variabilelor cu indici i instruciunilor ciclice n C i recapitularea n TP.
Studierea metodelor de introducere i afiare clar a tablourilor unidimensionale.
nsuirea tehnicilor fundamentale de programare a nmagazinrii diferitor valori n baza
elementelor: sumei i produsului; determinrii valorilor maxime i minime; diferitor cutri,
rearanjri i transformri ale elementelor tablourilor.
Elaborarea algoritmului i programului TP i C pentru rezolvarea problemei (variantele vezi n Anexa
L.lab nr.3), asigurnd universalitatea.
Depanarea programului i verificarea la PC a problemei trasate cu diverse combinaii de date.
Controlul corectitudinei programului cu ajutorul variantei de testare.
Analiza eficienei programului i soluiei problemei trasate.
Coninutul raportului
1. Drile de seam (rapoartele) la toate lucrrile de laborator, ncepnd cu aceast lucrare, se cere obligator s
se includ schemele logice ale algoritmilor cu exemplificarea corectitudinii prin date concrete. Analiza erorilor
admise pe parcursul efecturii lucrrii i modalitile de excludere. Restul vezi cerinele din lucrarea de
laborator nr.1.
Noiuni generale
1. Tipul tablou (array, masiv).
Tablouri: O metod de organizare a datelor este - t a b l o u l (tabele) cu iruri (de o lungime cunoscut) de
variabile de acelai tip. Structura:
Ansamblu omogen de variabile numite componentele tabloului
Toate componentele aparin aceluiai tip
Componentele sunt identificate cu ajutorul indicilor
Tablouri:
Unidimensionale (1 dimensionale)
Bidimensionale (2 dimensionale), etc.
Un ir de elemente de acelai tip se mai numete i vector sau tablou unidimensional. Deci tabloul este un
tip de date compus dintr-un numr precizat de date de acelai tip. Referirea la elementele tabloului se face
prin numele variabilei tablou urmat de indexul elementului pus ntre paranteze drepte [ ].
1.1 Tipul tablou i modurile de declarare n C
In C, tablourile unidimensionale sunt alctuite dintr-un grup de elemente de acelai tip (numit tip de baza)
si referite printr-un nume comun.
Variabilele de tip tablou se definesc in maniera:
tip_de_baza nume_var [dimensiune];
. Deci tabloul se poate caracteriza prin tip, nume i dimensiune. Formatul comun de descriere a tablourilor
este: tip nume[d1][d1][dn]; unde :
- tip este tipul comun pentru toate elementele tabloului, adic tipul tabloului de_baza. Tip al unui tablou
poate fi orice tip de date deja definit: ntreg, real, caracterial .a. nume este numele tabloului. In calitate de
nume al tabloului este folosit orice identificator. Mai mult ca att, deoarece numele tabloului este
identificator, asupra lui se rspndete totul ce-i indicat n compartimentul Nume de variabile
(identificatori), d1,d2,dn- dimensiunile tabloului (cifre ntregi sau variabile i atunci trebuie definite
nainte de declararea tablourilor).
[1]
Dimensiunea tabloului indica numarul de elemente prezente in tablou. Dimensiunea tabloului poate fi o
expresie constanta cu rezultat intreg.
Un element al tabloului este accesat folosind ca index poziia elementului, astfel tabloul_meu[6] va referi
al saptelea element al tabloului tabloul_meu.
Atentie! In C, "numerotarea" elementelor tablourilor ncepe cu poziia 0, astfel, daca avem definitia:
int tabloul_meu[100]; unde primul element al tabloului va fi tabloul_meu[0], iar ultimul
tabloul_meu[99].
Tablourile sunt stocate in memorie la locaii consecutive, un tablou ocupnd o zona contigua de memorie,
cu primul element al tabloului aflat la adresa mai mica.
Ex.:
int x[8];
[0]
valorile X
[1]
[2]
[3]
[4]
23
[5]
[6]
[7]
67
x[0]=23;
x[5]=67;
Atentie! O problema legata de tablouri este ca in C nu se face nici o verificare legata de "marginile"
tabloului, astfel ca se pot accesa greit elemente din afara tabloului. De exemplu, pentru definiia:
int tabloul_meu[100]; daca accesam tabloul_meu[105] nu se va semnala nici o eroare, returnndu-se
valoarea de la o locaie de memorie aflata la o distanta de 5 locaii fa de sfritul tabloului, fapt ce va duce la
comportri "bizare" ale programului. Aceeai situaie, dar fa de nceputul tabloului, se ntmpla la accesarea
tabloul_meu[-5].
Accesul la elementele tabloului Cu toate c tabloul este un tot ntreg, nu se poate vorbi
despre valoarea tabloului ntreg. Tablourile conin elemente cu valorile crora se opereaz n program. Fiecare
element n tablou i are indicele i valoarea sa. n calitate de indice a unui element se folosete un numr
ntreg ce indic numrul de ordine al elementului n tablou. Enumerarea elementelor n tablou conform
numrului de ordine se ncepe de la zero. Deci, indicele unui element poate avea valori de la 0 pna la d-1,
unde d este dimensiunea tabloului.
n calitate de valoare a unui element din tablou poate servi orice numr de tipul indicat la descrierea
tabloului, adica tipul valori atribuit oricrui element din tablou trebuie s fie compatibil cu tipul tabloului.
Sintaxa de acces la orice element a unui tablou este urmtoarea: nume[i1][i2]..[in]. Unde nume este numele
tabloului, i1 indicele elementului n dimensiunea 1, i2-indicele elementului n dimensiunea 2, in - indicele
elementului n dimensiunea n. n cele mai dese cazuri se opereaz cu massive unidimensionale i
bidimensionale. Accesul la un element al unui tablou unidimensional se face n felul urmtor: nume[i]; unde
nume - numele tabloului, i-numarul de ordine a elementului n tablou.
Iniializarea tablourilor. Deseori e necesar ca elementele tabloului s posede valori chiar la momentul
descrierii tabloului. Procesul de atribuire a valorilor elementelor tabloului n timpul descrierii lui se numete
iniializarea tabloului. Sintaxa de iniializare a unui tablou unidimensional este:
tip nume[d]={v0,v1,v2,,vn-1};
unde tip este tipul tabloului, nume este numele tabloului, v0,v1,v2,vn-1 valorile respective ale elementelor
nume[0],nume[1] etc. Exemplu:
int x[8]={1,3,15,7,19,11,13,5};
E de menionat faptul, c indicii tabloului se schimb ncepnd dela zero.Adic la descrierea tabloului
valoarea maxim a indicelui tabloului coincide cu numrul de elemente n tablou minus unu. La iniializarea
tabloului nu e numaidect de indicat dimensiunile tabloului.Compilatorul va determina numrul elementelor
dup descrierea tabloului i va forma un tablou cu mrimea respectiv. De exemplu:
int x[]={1,3,15,7,19,11,13,5};
2 Instruciunile ciclice i cele adiionale n C
Instruciunea while
Format:
while (expresie)
instruciune
Instruciunea se execut repetat atta timp ct valoarea expresiei este diferit de zero. Testul are loc
naintea fiecrei execuii a instruciunii. Prin urmare ciclul este urmtorul: se testeaz condiia din paranteze
dac ea este adevrat, deci expresia din paranteze are o valoare diferit de zero, se execut corpul instruciunii
while, se verific din nou condiia, dac ea este adevrat se execut din nou corpul instruciunii. Cnd
condiia devine fals, adic valoarea expresiei din paranteze este zero, se face un salt la instruciunea de dup
corpul instruciunii while, deci instruciunea while se termin.
[2]
Example:
a)calculeaz suma componentelor vectorului a de dimensiune m
suma=i=0;
while(++i< m) suma+=a[i];
b)citirea repetat de caractere pn la tastarea lui 'Y'
while(getche()!='Y');
c) char *adr; while(*adr!=NULL) { if(*adr=='*')*adr='+';
adr++;
};
d) while (*p == ' ') p++;
Instruciunea do
Format:
do instruciuni while (expresie);
Instruciunea se execut repetat pn Cnd valoarea expresiei devine zero. Testul are loc dup fiecare
execuie a instruciunii.
Example:
i = 1; n = 1;
do {
n *= i;
i++;
} while (i <= factorial);
Instruciunea for
Format:
for (expresie-1<opt>; expresie-2<opt>; expresie-3<opt>)
instruciune
Aceast instruciune este echivalent cu:
expresie-1;
while (expresie-2) {
instruciune;
expresie-3;
}
Expresie-1 constituie iniializarea ciclului i se execut o singur dat naintea ciclului.
Expresie-2 specific testul care controleaz ciclul. El se execut naintea fiecrei iteraii. Dac condiia din
test este adevrat atunci se execut corpul ciclului,
dup care se execut expresie-3, care const de cele mai multe ori n modificarea valorii variabilei de
control al ciclului. Se revine apoi la reevaluarea condiiei. Ciclul se termin Cnd condiia devine fals.
Oricare dintre expresiile instruciunii for sau chiar toate pot lipsi.
Dac lipsete expresie-2, aceasta implic faptul c clauza while este echivalent cu while (1), ceea ce
nseamn o condiie totdeauna adevrat. Alte omisiuni de expresii snt pur i simplu eliminate din expandarea
de mai sus.
Instruciunile while i for permit un lucru demn de observat i anume, ele execut testul de control la
nceputul ciclului i naintea intrrii n corpul instruciunii.
Dac nu este nimic de fcut, nu se face nimic, cu riscul de a nu intra niciodat n corpul instruciunii.
Examples:
for (i=0; i<100; i++)
sum += x[i];
for (i=0, t=string; i < 40 && *t; i++, t++)
putch(*t);
putch('\n');
Instruciunea continue
Format:
continue;
Aceast instruciune determin trecerea controlului la poriunea de continuare a ciclului celei mai
interioare instruciuni while, do sau for care o conine, adic la sfritul ciclului i reluarea urmtoarei iteraii a
ciclului. n while i do se continu cu testul, iar n for se continu cu expresie-3.
Mai precis n fiecare dintre instruciunile:
[3]
do {
while (...) {
for (...) {
...
...
...
contin:;
contin:;
contin:;
} while (...);
}
}
dac apare o instruciune continue aceasta este echivalent cu un salt la eticheta contin. Dup contin:
urmeaz o instruciune vid (vezi seciunea 6.11).
Poriunea de program din exemplul urmtor prelucreaz numai elementele pozitive ale unui masiv.
for (i=0; i<n; i++) {
if (a[i]<0)
/* sare peste elementele negative */
continue;
...
/* prelucreaz elementele pozitive */
}
Instruciunea return
O instruciune return permite ieirea dintr-o funcie i transmiterea controlului apelantului funciei. O
funcie poate returna valori apelantului su, prin intermediul unei instruciuni return.
Formate:
return;
return expresie;
n primul caz valoarea returnat nu este definit. n al doilea caz valoarea expresiei este returnat
apelantului funciei. Dac se cere, expresia este convertit, ca ntr-o atribuire, la tipul funciei n care ea apare.
Instruciunea vid
Format:
;
Instruciunea vid este util pentru a introduce o etichet naintea unei acolade drepte, ntr-o
instruciune compus, sau pentru a introduce un corp nul ntr-o instruciune de ciclare care cere corp al
instruciunii, ca de exemplu while sau for.
Exemplu:
for (nc=0; s[nc]!=0; ++nc) ;
Aceast instruciune numr caracterele unui ir. Corpul lui for este vid, deoarece tot lucrul se face n
partea de test i actualizare dar sintaxa lui for cere un corp al instruciunii. Instruciunea vid satisface acest
lucru.
Instruciune de salt Pernmite ntreruperea necondiionat a unei secvene i continuarea programului
dintr-un alt punct.
Instruciunea BREAK. Se utilizeaz n dou contexte, pentru a marca ncheierea secvenei de instruciuni
asociate unui selector case, i instruciunea de ciclare, pentru a determina ieirea forat dintr-un ciclu while,
do_while, sau for.
Instructiunea cu etichet GOTO:goto identificator. Are ca efect ntreruperea secvenei curente i
continuarea execuiei de la instruciunea cu eticheta identificatorului, ce trebuie s se afle n aceai funcie.
1.3 Organizarea prelucrrilor tablourilor n C
a)Citirea valorilor
Ex.
int tablou[10];
printf(\nIntroduceti dimensiunea tabloului);
scanf(%d,&n);
for(i=0;I,1;i++);
{
printf(\n tablou[%d]=,i); //se va afia tablou[i]= si se asteapta
scanf(%d,&tablou[i]); //introducerea valorii care se atribue variabilei tabloului
}
Obs:
1.Dimensiunea tabloului introdus de ctre utilizator (n) nu trebue sa depaeasca dimensiunea cu care a
fost declarat vectorul,(in cazul anterior n introdus de utilizator nu trebue sa depaseasca 10, ntruct declaraia a
fost tablou[10]).
2.Identificarea zonei de memorie unde va fi reinut tabloul se face cu ajutorul numelui tabloului. Acesta
are ca valoare adresa primului element din tablou, ceea ce il deosebete de variabilele simple care nu
reprezinta o adresa.
&stst&st[0];
3.Instructiunea printf() din interiorul buclei cu contorizare va afia numai numele variabilei care se
citeste.
[4]
if (p==n-1) t=1;
else t=0;}
printf("\nt=%d",t);
for(i=0;i<n;i++)
{
if(a[i]>0&&a[i+1]>0||a[i]==0) d++;
if(a[i]<0&&a[i+1]<0&&a[i+2]<0) r++;
if(d>=1||r>=1) t=0;
else t=1;
}
printf("\nt=%d",t);
for(i=0;i<n;i++)
{
if (y==a[i]) {k=i;break;}
if(a[i]>=0)
{z=z*a[i]; k=k+z;}
}
printf("\nk=%d",k);
getche();
}
3.Exerciii pentu analize: Ce se afiseaza pe ecran la executia urmatoarelor programe? Gasiti
raspunsul, dati justificarea, apoi verificati prin executie.
1.Ce valori va afia programul urmtor?
int m=10, i=7,n,k;
do for (k=5; k >2; k--)
{for (n=4; n!=0; n--) m++; i--;
while (i>3);
printf (k=%d m=%d\n,k,m);
2. Analizai i apreciai ce efectuiaz urmtorul program C:
#include <stdio.h>
main(){int sum = 0, card; char answer[36];
srand( getpid()); /* randomizare */
do{ printf( "Avei %d puncte. Inca? ", sum);
if( *gets(answer) == 'n' ) break; /* pentru c vor fi prea puine */
printf( " %d puncte\n", card = 6 + rand() % (11 - 6 + 1));}
while((sum += card) < 21);
/* SIC ! */
printf(sum == 21 ? "puncte\n" :sum >21 ? "depit\n": "%d puncte\n", sum);
}
3. Exemplu de secvent pentru afiarea a n ntregi cte m pe o linie :
for ( i=1;i<=n;i++) { printf ( "%5d%c",i, ( i%m==0 || i==n)? '\n':' ');
O variant mai explicit dar mai lung pentru secventa anterioar:
for ( i=1;i<=n;i++) { printf ("%6d ",i); if(i%m==0) printf("\n"); } printf("\n");
Una dintre conventii se refer la modul de scriere a acoladelor care ncadreaz un bloc de instructiuni ce face parte
dintr-o functie sau dintr-o instructiune if, while, for etc. Cele dou stiluri care pot fi ntlnite n diferite programe si crti
sunt ilustrate de exemplele urmtoare:
void main () // Afiare numere perfecte , stil Linux
{ int n,m,s,d; scanf (%d,&n);
for (m=2; m<=n; m++) { s=0;
for (d=1; d<m; d++) { if ( m % d ==0 ) s= s+ d; }
if ( m==s) printf (%6d\n,m); } }
// Afiare numere perfecte, stil K&R si Java
void main () { int n,m,s,d; scanf (%d,&n);
for (m=2; m<=n; m++){ s=0;
for (d=1; d<m; d++){
if ( m % d ==0 )
s= s+ d;
}
if ( m==s)
printf (%6d\n,m);
}
}
[6]
Obs.
Specific limbajului C este utilizarea de expresii aritmetice sau de atribuire drept conditii n instructiuni if,
while, for, do n absenta unui tip logic (boolean). Exemplu:
while (*d++ =*s++); // copiaza sir de la s la d
Pentru a facilita citirea programelor si trecerea de la C la Java este bine ca toate condiiile s apar ca expresii de
relaie si nu ca expresii aritmetice:
while (*s != 0)
*d++=*s++;
4. Exemplul formrii tabloului:
int main()
{
const int array_size = 10;
int ia[ array_size ];
for ( int ix = 0; ix < array_size; ++ ix )
ia[ ix ] = ix;
}
4. ntrebrile de autocontrol
3.1.Transcriei exemplul programului din lucrarea de laborator nr.2, utiliznd instruciunile ciclice.
3.2*. Elaborai algoritmul i programul pentru cazul dac suma a trei numere reale cu valori diferite x,y,z este mai mic
dect unitatea, atunci cel mai mic numr din aceste trei, de schimbat cu semisuma a celorlalte dou, n caz contrar (Cnd
suma este mai mare ) de schimbat valoarea minimal dintre x i y cu semisuma a celorlalte valori rmase.
3.3. Modificai exemplul 3.2* pentru trei tablouri unidimensionale X, Y, Z i efectuai aceleai calcule
3.4*. Elaborai algoritmul i programul pentru cazul cnd sunt date 100 numere ntregi pentru care trebuie de calculat
diferena maxim i minimim ntre ele.
3.5*. Elaborai algoritmul i programul pentru determinarea. dac un numr natural e perfect, adic care este egal cu suma
tuturor divizorilor.(de exemplu 6=1+2+3).
3.6. Ce subnelegem prin tablou i cum se noteaz n program elementele unui tabel?
3.7. Cum se organizeaz n program introducerea i extragerea unui tablou?
3.8. Ce operaii se pot efectua efectiv cu elementele unui tablou?
Xi / Yi ,
dac c=3;
i=1
n
F=
Xi / ec/yi ,
dac c=2;
i=1
dac c=1;
1<=j<=n
c)
d)
(xi
+yi + xi yi ),
dac k=1;
i=1
(X2i+X2i+...+X2i)(y2i+y2i+...+y2i),
F=
dac k=2;
(y3i + x3i),
j=1
dac k=3;
j=1
7. Este dat un ir de numere x1, x2, xi. xn. Printre aceste numere sunt mcar
dou numere negative. S se evidenieze n aceast succesiune elementele
tabloului unidimensional a1, a2,... ak, (k necunoscut anticipat)- puse ntre o
pereche de numere negative. Dac k>1, atunci s se calculeze :
2
2
2
a) max(a 1, a 2,a k);
b) min(a1, 2a2,... kak);
c) numrul cifrelor pare printre a1, a2,... ak;
8. Este dat tabloul unidimensional
V={ vi }, i=1,,n, cu valori aleatorii, n
baza cruia s se efectuieze urmtoarele:
a) s se aprecieze numrul de ordine i valoarea primului element pozitiv i
celui negativ din tablou, iar dac toate elementele tabloului sunt egale
cu
zero, atunci de afiat mesajul respectiv;
b) s se gseasc numrul de ordine i valoarea
primului element par al
tabloului V, iar dac nu sunt elemente pare, atunci de afiat numrul celor
valori care se gsesc ntr-o succesiune anumit (cretere/ descretere);
c) s se determine numrul i valoarea ultimului element impar al tabloului V,
iar dac nu sunt elemente impare, atunci de afiat numrul celor negative.
9. Este dat un tablou unidimensional de numere ntregi i pozitive
m2,... mn). S se calculeze valoarile sumelor:
S=
M=( m1,
M1 M2
Mn
N
... (e(n-j) /(j+i) -ij 3j/ ij )
i1=L1 i2=L2 in=Ln j=1
S=
M1 M2
Mn
N
... (Lj - Kij )
i1=L1 i2=L2 in=Ln j=1
ai/ ai+1
ai+ai+1
dac
dac
ai >0;
ai =0;
[8]
1- ai/ ai+1,
dac
ai/ ai +1// an
dac
Yi = 1+ai +ai +1++ an dac
ai ai +1 an,
dac
ai <0;
ai > 0;
ai = 0;
ai < 0;
(xi*xi +yi * yi + xi * yi ),
dac w=1;
i=1
V=
(x1*x1+...+xn*xn)(y1*y1+...+yi*yi++yn*yn),
n
x1 + xj + yi ),
j=1
dac w=2;
dac w=3;
i=1
19. Sa se scrie un program care citeste ciclic cate trei intregi x,i,j, pana la introducerea lui CTRL/Z, pentru
fiecare grup citit afisandu-se pe cate un rand nou:
- -reprezentarea lui x in zecimal, binar, hexazecimal si octal
- -reprezentarea in zecimal, binar, hexazecimal si octal a complementului lui x
[9]