Documente Academic
Documente Profesional
Documente Cultură
al Republicii Moldova
Colegiul Politehnic Bălţi
Catedra „Tehnica de Calcul”
Indicaţii metodice
pentru efectuarea lucrărilor practice
la disciplina Limbaje de programare
Bălţi, 2023
Conţinutul lucrărilor practice:
Probleme rezolvate:
Probleme propuse spre rezolvare
Probleme rezolvate:
De calculat valoarea funcţiei, in dependenţă de condiţie:
Probleme propuse spre rezolvare 1
De calculat valoarea funcţiei, in dependenţă de condiţie:
Probleme propuse spre rezolvare 2
Probleme rezolvate 1:
Exemplu 1: De calculat valoarea functiei pe intervalul dat, cu pasul argumentului dat, în
dependenţă de condiţia dată.
Probleme propuse spre rezolvare 1
De calculat valoarea funcţiei pe intervalul dat, cu pasul argumentului dat, în dependenţă de condiţia
dată.
Probleme rezolvate 2:
Exemplul 1. Este dat n întreg. Să se afle prima cifra a lui n (n=123, prima cifră este 1).
#include<stdio.h>
#include<conio.h>
void main()
{
int n,c;
clrscr();
printf("n=");
scanf("%d",&n);
//cât n este mai mare ca 9 se face împărţirea lui n la 10, până se
ajunge la prima cifră
while(n>9) n=n/10;
printf("prima cifra este=%d",n);
getch();
}
Exemplul 2.Este dat n întreg. Să se numere din câte cifre este compus n (n=345, c=3).
#include<stdio.h>
#include<conio.h>
void main()
{
int n,c; //c este un contor, iniţial are valoarea zero
c=0;
clrscr();
printf("n=");
scanf("%d",&n);
//atât cât n este mai mare ca zero, n se împarte la zece şi c creşte
while(n>0){
n=n/10;
c=c+1; }
printf("c=%d",c);
getch();
}
Exemplul 3. Date a, b două numere întregi. Să se afle cel mai mic multiplu comun al lor.
#include<stdio.h>
#include<conio.h>
void main()
{
int i,min,a,b,div;
float mult;
clrscr();
printf("a, b");
scanf("%d%d",&a,&b);
if(a<b) min=a; else min=b; //mai întâi găsim minimul dintre a şi b
//parcurgem ciclul până la minim
for(i=1;i<=min;i++) //găsim cel mai mare divizor comun a lui a şi b
if((a%i==0)&&(b%i==0)) div=i;
//calculăm multiplu comun
mult=(a*b)/(float)div; //float în faţa lui div-pentru conversie de tip
printf("multiplu comun a 2 numere=%.2f", mult);
getch();
}
b. Să se calculeze expresia: ;
c. Să se calculeze expresia: , , .
#include<stdio.h>
#include<conio.h>
#include<math.h>
void main()
{
int i,n,f,s1,s2,x,y,n1;
float s=0,s3,e;
char c;
clrscr();
s1=s2=0; s=0; x=y=1; f=1;
printf("n=");
scanf("%d",&n);
do{
printf("\n1:se verifica daca este perfect");
printf("\n2:sa se calculeze expresia din punctual b");
printf("\n3:sa se calculeze suma din punctual c");
printf("\n4:esirea\n");
c=getch(); //aşteapta alegerea unei operaţii
switch(c){ //c primeşte una din valorile (1- 4)
case '1':
for(i=1; i<n; i++){
// aflăm divizorii lui n şi calculăm suma lor
if(n%i==0) s1=s1+i;}
if(s1==n) printf("numar perfect");
else printf("nu este numar perfect");break;
case '2':
for(i=1; i<n; i++) {
f=f*i; //calculăm factorialul
s=s+(pow(-1,i)*(i+1))/f; }
printf("factorial=%d\tsuma=%f\n",f,s); break;
case '3':
printf("dati x"); scanf("%d",&x);
e=0,0001; s3=1; n1=1; y=x;
while(abs(y)>e)
{
n1=n1+1;
s3=s3+y;
y=y*(float)(x/n1);
}
printf("\ns=%f\tn=%d\n",s3,n1);
printf("\ny=%d\n",y); break; }}
while(c!='4'); //ciclul lucrează atât timp pân[ c va primi valoarea 4
getch();
}
Exemplul 7. Să se afişeze toate numerele prime din intervalul [2;50].
#include<stdio.h>
#include<conio.h>
void main(){
int i,j;
int prim=0; //
for(i=2; i<50; i++) {
for(j=2; j<i; j++)
{// dacă restul împărţirii nu e zero, atunci are loc instrucţiunea
//de continue, în caz contrar se trece la else
if(i%j) continue;
else {
prim=1; break; //dacă s-a găsit un număr prim se iese din ciclu
}
}
if(!prim) printf("%3d",i); prim=0;
}
getch();
}
a. ;
b. ;
8. Pentru n şi x numere întregi date să se calculeze:
a. ;
b. ;
9. Pentru n şi x numere întregi date să se calculeze:
a. ;
b. ;
10. Pentru n şi x numere întregi date să se calculeze:
a. b. ;
11. Pentru n şi x numere întregi date să se calculeze:
a. s=
b.
15. Sa se afle toate numerele întregi pozitive formate din 3 cifre, egale cu media aritmetica a
numerelor obţinute din fiecare din aceste numere în urma efectuării tuturor permutărilor
(inclusiv cea identica) din cifrele sale.
16. Sa se scrie un program care să calculeze cel de-al n-lea număr al şirului lui Fibonacci (Astfel,
fiecare număr Fibonacci este suma celor două numere Fibonacci anterioare, rezultând
secvenţa 0, 1, 1, 2, 3, 5, 8, 13,...).
17. Sunt date a, b numere întregi. Să se determine toate numerele prime din intervalul [a, b].
18. Pentru un număr n dat să se determine dacă n este număr polindrom (număr polindrom
6789876).
19. Sunt date a, b numere întregi. Să se afişeze toate numerele perfecte din intervalul [a,b].
20. De la tastatură se citesc trei numere întregi pozitive a, b, c mai mici ca 100000. Să se afişeze
toţi divizorii comuni.
Lucrare practică № 4
Tema: “Rezolvarea problemelor cu funcții matematice”
Scopul lucrării:
- Obţinerea deprinderii practice de elaborare şi depanare a programelor ciclice.
- Utilizarea funcțiilor.
- Prelucrarea programelor cu funcții.
Conținutul lucrării:
1. De compus o procedură cu ajutorul datelor introduse de la tastatură.
2. De alcătuit algoritmul de rezolvare al problemei conform variantei.
3. De alcătuit programul corespunzător algoritmului.
Indicaţii metodice:
Datele iniţiale se întroduc de la tastatura. Rezultatele se afişează pe ecran.
Suport teoretic:
Autoapelul se face în conformitate cu antetul funcției recursive. Astfel:
● dacă funcția recursivă este de tip non-void, autoapelul se va face într-o expresie;
● dacă funcția recursivă este de tip void, autoapelul se va face într-o instrucțiune de sine
stătătoare; dacă funcția întoarce valori, se vor folosi parametri de ieșire.
Exemple:
if(n == 0) int r;
r = 1; if(n == 0)
else{ r = 1;
r = r * n; r = n * fact(n - 1);
} return r;
} }
17. Să se definească o funcţie care să testeze dacă un număr întreg este par.
18. Să se definească o funcţie care să calculeze o cifră hexazecimală a unui număr întreg.
▪ nestandard (utilizator)
Definiţia conţine antetul funcţiei şi corpul acesteia. Nu este admisă definirea unei funcţii în
corpul altei funcţii.
Sintaxa antetului:
sau
Lista parametrilor formali este o listă separată prin virgule de nume de variabile şi tipurile
asociate lor, care primesc valorile argumentelor atunci când este apelată funcţia. O funcţie poate să
nu aibă parametri. Totuşi, parantezele sunt necesare, chiar dacă nu există parametri. Toţi parametrii
funcţiei trebuie declaraţi individual, fiecare conţinând atât tipul cît şi numele. Ei sînt creaţi la
intrarea în funcţie şi distruşi la ieşirea din ea. Parametrilor formali li se pot aplica atribuiri sau
folosiţi în expresii. Aceste variabile îndeplinesc sarcina de primire a valorilor argumentelor
transmise funcţiei.
Observaţie: în C++ toate funcţiile au acelaşi nivel de influenţă. Asta înseamnă că nu pot fi
definite într-o funcţie alte funcţii.
Funcţia se utilizează prin apelare la ea. Apelul funcţiei este o construcţie urmată de punct şi
virgulă, numită instrucţiune de apel, de forma:
nume_funcţie (lista_parametrilor_efectivi);
Parametrii declaraţi în antetul unei funcţii sunt numiţi formali, pentru a sublinia faptul că ei
nu reprezintă valori concrete, ci numai ţin locul acestora pentru a putea exprima procesul de calcul
realizat prin funcţie. Ei se concretizează la execuţie prin apelurile funcţiei.
1. Funcţia schimbă cu locurile simbolul cu cod maxim cu simbolul cu cod minim într-un şir de
caractere
2. Programul prelucrează un şir numeric. Se utilizează o funcţie de citire a elementelor şi o
funcţie ce returnează numărul de elemente pare negative din şir.
3. Programul afişează elementul maxim de pe liniile unei matrice. Se utilizează o funcţie care
primeşte drept argumenţi un pointer la matrice şi numărul liniei.
4. Programul sumează componentele unui şir numeric. Se utilizează o funcţie recursivă
5. Funcţia cu număr variabil de parametri sumează numere întregi.
6. Să se realizeze un program care conţine o funcţie ce citeşte elementele unui vector de
dimensiunea n cu valori întregi şi o funcţie ce returnează câte elemente impare pozitive sunt.
7. Să se realizeze un program care conţine o funcţie ce citeşte elementele unui vector de
dimensiunea n cu valori întregi şi o funcţie ce returnează produsul elementelor pare pozitive.
8. Să se realizeze un program care conţine o funcţie ce citeşte elementele unui vector de
dimensiunea n cu valori reale şi o funcţie ce returnează indicele celui mai mare element.
9. Să se realizeze o funcţie care primeşte un simbol ca parametru şi returnează numărul lui de
ordine dacă-i literă şi -1 în caz contrar. (De ex.: şi ‘c’ şi ‘C’ sunt litere cu numărul de ordine
3).
10. Să se realizeze o funcţie care primeşte un şir de simboluri ca parametru şi returnează 1 dacă
şirul e palindromic (se citeşte la fel din ambele direcţii) şi 0 în caz contrar.
11. Să se realizeze un program care conţine o funcţie ce citeşte elementele unui vector de
dimensiunea n cu valori întregi şi o funcţie ce returnează lungimea celui mai lung subşir
nedescrescător din acest tablou.
12. Să se scrie o funcţie care dintr-o dată calendaristică definită prin numărul zilei din an şi anul
respectiv, determină luna şi ziua din luna respectivă.
13. Să se scrie o funcţie care afişează caracterele unui tablou şi citeşte un întreg.
14. Să se scrie o funcţie care calculează produsul, suma şi numărul elementelor pozitive ale unui
tablou n-dimensional.
15. Să se scrie o funcţie care citeşte un întreg care aparţine unui interval dat.
16. Să se scrie o funcţie care citeşte o dată calendaristică şi determină data calendaristică pentru
ziua următoare.
17. Să se scrie o funcţie care calculează produsul, suma şi numărul elementelor negative ale unui
tablou n-dimensional.
18. Să se scrie o funcţie care calculează produsul, suma şi numărul elementelor unui tablou n-
dimensional dintr-un interval indicat.
19. Să se scrie o funcţie care calculează valoarea unui polinom de gradul n.
20. Într-un tablou de N numere reale de găsit elementul minimal şi de schimbat cu primul
element.
21. Funcţia afisare afişează 65 de simboluri ‘*’ consecutive.
22. Programul efectuează acelaşi lucruca și în varianta1; dar funcţia are doi parametri : un
caracter şi un întreg.
23. Programul înmulţeşte două valori întregi, utilizând o funcţie.
24. Programul calculează factorialul pentru numerele din intervalul 0 – 170, utilizând o funcţie.
25. Funcţia calculează cel mai mare divizor comun a două numere întregi fără semn.
26. Programul citeşte două numere întregi fără semn şi calculează cel mai mic multiplu comun al
lor.
27. Funcţia cu număr variabil de parametri sumează numere întregi.
28. Să se realizeze un program care conţine o funcţie ce citeşte elementele unui vector de
dimensiunea n cu valori întregi şi o funcţie ce returnează câte elemente impare pozitive sunt.
29. Să se realizeze un program care conţine o funcţie ce citeşte elementele unui vector de
dimensiunea n cu valori întregi şi o funcţie ce returnează produsul elementelor pare pozitive.
30. Să se scrie o funcţie care calculează produsul, suma şi numărul elementelor unui tablou n-
dimensional dintr-un interval indicat.
Lucrare practică № 6
Tema: „Procesarea structurilor”
Scopul lucrării:
- Obţinerea deprinderii practice de elaborare şi depanare a programelor cu un grad mai înalt de
complicitate.
- Studierea şi utilizarea instrucţiunilor structurate ale limbajului C++ pentru elaborarea
programelor;
Conținutul lucrării:
De alcătuit algoritmul de rezolvare al problemei conform variantei.
1. Despre studenţi din grupă este dată următoarea informaţie: FNP, anul, ziua şi luna naşterii,
anul de studii, anul înmatriculării la Colegiu, semestrul, notele pe fiecare semestru.
1. Este determinată înregistrarea:
struct denum: string[M];
aria : real;
popul, scoli, spitale, IM: Integer; end;
Indicaţii metodice:
1. De alcătuit programul, care permite afişarea informaţiei iniţiale şi a informaţiei conform
variantei indicată în formă de tabel.
2. Datele de ieşire(rezultatele) se afişează la ecran în LC++.
Suport teoretic:
Un mod de grupare al datelor este tabloul. Tabloul este un set ordonat de date de acelaşi tip.
Un alt mod de grupare al datelor este structura. Structura reuneşte date de diferite tipuri, dar care
se află într-o legătură logică. Obiectele ce fac parte din structură se numesc câmpuri sau membrii
structurii. La definirea şi utilizarea structurilor e necesar a cunoaşte trei lucruri: 1) definirea
structurii; 2) declararea variabilei, care corespunde acestui tip; 3) asigurarea accesului la
componentele variabilei-structură.
O declaraţie de structură are forma:
struct nume { lista de declaraţii } nume1, nume2,…, numen;
Accesul la membrii stucturii se face în două moduri: global sau pe componente. Referirea
globală este permisă numai în operaţia de atribuire, cu condiţia ca ambele variabile (sursă şi
destinaţie) să aibă acelaşi tip. Referirea pe componente (prin numele lor) este o reflectare a faptului
că articolul este o structură cu acces direct. Referirea câmpurilor unei structuri se face prin
calificare, folosind operatorul. (punct).
Se pot declara pointeri către structuri. Există două întrebuinţări ale pointerilor pentru
structuri : generarea unei apelări de funcţii prin referinţă şi crearea listelor înlănţuite. De exemplu :
struct bal { float bilanţ; char nume[80]; } pers, *pstr;. Atunci pstr=&pers; plasează adresa
structurii pers în pstr. Pentru a avea acces la membrii structurii folosind acest pstr se utilizează
operatorul ->: pstr->bilanţ , pstr->nume[0].
Probleme propuse spre rezolvare:
● calcularea mediilor;
26. Programul realizează admiterea la un liceu şi permite:
● înlocuirea unui elev cu alt elev;
Lucrare practică № 7
Tema: “Crearea şi prelucrarea masivelor unidimensionale”
Scopul lucrării:
- Obţinerea deprinderii practice de elaborare şi depanare a programelor ciclice.
- Studierea şi utilizarea instrucţiunilor de bază ale limbajului pentru crearea şi prelucrarea
masivelor unidimensionale;
Conținutul lucrării:
De alcătuit algoritmul de rezolvare al problemei conform variantei.
Indicaţii metodice:
Datele iniţiale se întroduc de la tastatura. Rezultatele se afişează pe ecran.
Probleme rezolvate:
Sunt date 2 masive unidimensionale X şi Y cu n elemente. De creat un nou masiv Z(n) astfel, încît:
Schema-bloc a programului:
Probleme propuse spre rezolvare
Sînt date 2 masive unidimensionale cu n elemente.
De calculat valoarea funcţiei în conformitate cu condiţia
Lucrare practică № 8
Tema: „Modificarea masivelor unidimensionale”
Scopul lucrării:
- Obţinerea deprinderii practice de elaborare şi depanare a programelor ciclice.
- Studierea şi utilizarea instrucţiunilor de bază ale limbajului pentru prelucrarea şi modificarea
masivelor unidimensionale;
Conținutul lucrării:
De alcătuit algoritmul de rezolvare al problemei conform variantei.
Indicaţii metodice:
Datele iniţiale se întroduc de la tastatura. Rezultatele se afişează pe ecran.
Probleme rezolvate:
1. Este dat un masiv unidimensional X cu n elemente. Aranjaţi elementele primei jumătăţi din
masiv în ordine descrescătoare. Afişaţi masivul rezultant ca răspuns.
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
void main(void) {
int x[20],n,k,i,j,max,aux,r;
printf("\nCulege mărimea masivului n<=20\n");
scanf("%d",&n);
for(i=0;i<n;i++){
printf("Culege elementul %d\n",i);
scanf("%d",&x[i]);}
printf("Masivul iniţial este:\n");
for(i=0;i<n;i++){
printf("%d ",x[i]);}
if (fmod(n,2)==0) k=floor(n/2); else k=floor(n/2)+1;
for(j=0;j<k;j++){ max=x[j];
for(i=j+1;i<k;i++){
if (x[i]>max) {max=x[i]; r=i; aux=x[j]; x[j]=max; x[r]=aux;}
}}; printf("\nMasivul final este:\n");
for(i=0;i<n;i++){
printf("%d ",x[i]);}
getch();
}
2. Este dat un masiv unidimensional X(11). De comparat suma elementelor pare cu
produsul elementelor negative în afară de primul şi ultimul element.
#include<stdio.h>
#include<conio.h>
#include<math.h>
void main (void) {
int x[11],i,s=0,p=1;
clrscr();
printf("Culegeti masivul x[11]\n");
for(i=0;i<11;i++) {
printf("x[%d] = ",i);
scanf("%d",&x[i]); }
printf("Masivul initial:\n");
for(i=0;i<11;i++) printf("%d ",x[i]);
for(i=1;i<10;i++){
if(fmod(x[i],2)==0) s+=x[i];
if(x[i]<0) p*=x[i];}
printf("\nSuma elementelor pare in afara de primul si ultimul element = %d",s);
printf("\nProdusul elementelor negative in afara de primul si ultimul element =
%d",p);
if(s>p) printf("\nSuma > Produsul");
else if (s<p) printf("\nSuma < Produsul");
else printf("\nSuma = Produsul");
getch();}
Probleme propuse spre rezolvare 1
Este dat un masiv unidimensional cu n elemente:
Var Condiţia Masiv
1. Aranjaţi elementele masivului în ordine inversă. X(N)
2. Echivalaţi elementele negative cu modulul lor. Z(N)
3. Aranjaţi elementele primei jumătăţi a masivului în ordine inversă. A(N)
4. Elementele divizibile la 4 de înlocuit cu produsul tuturor elementelor S(N)
din masiv.
5. Aranjaţi elementele masivului în ordine crescătoare. Y(N)
6. Inlocuiţi elementele negative cu suma tuturor elementelor din masiv. R(N)
7. Aranjaţi elementele jumătăţii a doua a masivului în ordine crescătoare. X(N)
8. Schimbaţi cu locul elementele primei jumătăţi a masivului cu X(N)
elementele jumătăţii a doua.
9. Aranjaţi elementele jumătăţii a doua din masiv în ordine K(N)
descrescătoare.
10. Aranjaţi în ordine inversă elementele jumătăţii a doua. M(N)
11. Schimbaţi cu locul elementele: 1 cu 2; 3 cu 4; 5 cu 6 … B(N)
12. Aranjaţi în ordine crescătoare elementele primei jumătăţi. N(N)
13. Aranjaţi pe primele locuri ale masivului elementele negative, apoi – Z(N)
cele pozitive .
14. Aranjaţi elementele masivului în ordine descrescătoare. D(N)
15. Elementele negative echivalaţi cu 0, iar cele pozitive – cu 1. P(N)
Probleme propuse spre rezolvare 2
Este dat un masiv unidimensional:
Var Condiţia Masiv
1. De aflat suma şi cantitatea elementelor pare din masiv. X[12]
2. De calculat media aritmetica şi produsul elementelor cu poziţii impare. Z[15]
3. De comparat produsul elementelor positive cu suma elementelor pare. A[10]
4. De determinat elementul maximal al masivului şi de aflat dacă el este S[13]
pozitiv sau negativ.
5. De calculat diferenţa dintre produsul elementelor şi media lor Y[12]
aritmetică. De determinat paritatea diferenţei.
6. De calculat produsul şi cantitatea elementelor pozitive din masiv. R[11]
7. De aflat cantitatea şi media aritmetică a elementelor divizibile la trei. X[14]
8. De calculat produsul sumelor elementelor pare şi celor impare din X[10]
masiv.
9. De aflat produsul dintre cantitatea elementelor divizibile la doi şi suma K[15]
lor.
10. De calculat media aritmetica a elementelor impare din prima 3/4 din M[16]
masiv.
11. De calculat suma dintre primul element al masivului şi ultimul element B[11]
impar al masivului.
12. De aflat suma şi cantitatea elementelor negative din prima jumătate a N[13]
masivului.
13. De aflat cantitatea elementelor impare printre elementele pozitive ale Z[10]
masivului.
14. De comparat suma elementelor din prima jumătate a masivului cu D[14]
media aritmetică a elementelor din a doua jumătate a masivului.
15. Determinaţi elementul minimal printre elementele cu poziţii pare ale P[13]
masivului.
Lucrare practică № 9
Tema: “Prelucrarea rîndurilor şi coloanelor în masive bidimensionale”
Scopul lucrării:
- Studierea şi utilizarea tehnicilor şi instrucţiunilor de bază ale limbajului pentru
- prelucrarea diagonalelor masivelor bidimensionale.
- Obţinerea deprinderii practice de elaborare şi depanare a programelor cu
- structură “ciclu în ciclu”.
- Însuşirea prelucrării masivelor bidimensionale la nivel de linii şi coloane.
Conținutul lucrării:
De alcătuit algoritmul de rezolvare al problemei conform variantei.
Indicaţii metodice:
Datele iniţiale se întroduc de la tastatura. Rezultatele se afişează pe ecran.
Probleme rezolvate:
Este dat un masiv bidimensional X[n,n]. Determinaţi elementul minimal printre
elementele minimale ale coloanelor impare.
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
void main(void) {
int x[20][20],n,k,i,j,min,minim;
printf("\nCulege mărimea masivului n<=20\n");
scanf("%d",&n);
printf("\nCulege elementele masivului\n");
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("\nCulege elementul x[%d][%d]\n",i,j);
scanf("%d",&x[i][j]);}}
printf("\nMasivul iniţial este:\n");
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",x[i][j]);}
printf("\n");}
minim=x[1][1]; k=1;
for(i=0;i<n;i++){
if (x[i][1]<minim) minim=x[i][1];}
j=1;
while (j<n){
min=x[1][j];
for(i=0;i<n;i++){
if(x[i][j]<min) min=x[i][j];}
printf("\npe coloana %d minimalul este=%d\n",j,min);
if(min<minim) {minim=min; k=j;}
j+=2;}
printf("\nMinimalul dintre minimali este pe coloana %d si=%d\n",k,minim);
getch();
}
Probleme propuse spre rezolvare:
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
void main(void) {
int x[20][20],n,i,j,min;
printf("\nCulege mărimea masivului n<=20\n");
scanf("%d",&n);
printf("\nCulege elementele masivului\n");
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("\nCulege elementul x[%d][%d]\n",i,j);
scanf("%d",&x[i][j]);}}
printf("\nMasivul iniţial este:\n");
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",x[i][j]);}
printf("\n");}
min=x[1][1];
for(i=0;i<n;i++){
if(x[i][i]<min) min=x[i][i];}
if(fmod(min,2)==0)
printf("\nElementul minimal de pe diagonala principală este par si=%d\n",min);
else printf("\nElementul minimal de pe diagonala principală este
impar şi=%d\n",min);
getch();
}
Probleme propuse spre rezolvare
Este dat un masiv bidimensional [n,n]:
Scopul lucrării:
- Obţinerea deprinderii practice de elaborare şi depanare a programelor cu un grad mai înalt de
complicitate.
- obţinerea deprinderilor practice la utilizarea pointerilor, însuşiri aritmeticii pointerilor în
limbajul C++ şi a legăturii dintre pointeri şi tablouri.
Conținutul lucrării:
De alcătuit algoritmul de rezolvare al problemei conform variantei.
Indicaţii metodice:
Datele iniţiale se întroduc de la tastatura. Rezultatele se afişează pe ecran.
Suport teoretic:
Un pointer este o variabilă valorile căreia sunt adrese de memorie. Pe adresele-valori ale unui
pointer se pot păstra date de un anumit tip. Acest tip se indică în declaraţia variabilei de tip pointer
şi se numeşte tipul de bază al pointerului sau tipul spre care pointează pointerul.
Declaraţia de pointer are formatul: tip *id1, *id2,_, *idn, unde tip este un tip de date care
arată ce tip de date se vor păstra pe adresele-valori ale variabilelor id1, id2,_,idn. De
exemplu: int *pi, i; Aici i este o variabilă simplă de tip int, iar pi este un pointer ce indică spre
tipul int, adică în pi se vor păstra adrese ale datelor de tip int. La fel char *c; c este pointer la un
obiect de tipul char. Se pot declara şi tablouri de pointeri: char *s[80].
Alocarea memoriei pentru pointeri. Unui pointer i se alocă, de obicei, un cuvânt al
calculatorului, adică 2 octeţi. Însă modificatorii near, far, huge pentru tipul pointer modifică modul
de alocare a pointerilor în memorie. Modificatorii far şi huge alocă 2 cuvinte, adică 4 octeţi de
memorie pentru pointeri, iar near sau lipsa oricărui modificator semnifică alocarea pointerului pe
un cuvânt, adică pe 2 octeţi de memorie.
Operatori specifici pentru pointeri: * - se utilizează pentru accesul la conţinutul variabilei
adresate; & - se utilizează pentru aflarea adresei variabilei. Pentru tipărirea adreselor se foloseşte
specificatorul de format %p. Pentru a atribui pointerului pi adresa variabilei i scriem pi=&i. Dacă
pi este un pointer, atunci *pi este data stocată pe adresa-valoare a lui pi. De exemplu, fie i=10 şi
pi=&i. Atunci pi are ca valoare adresa lui i, iar *pi este chiar valoarea 10 a lui i. La declaraţie
pointerii se pot iniţializa: float w, *y=&w; sau char *pc=”Informatica”; Aici pc este un pointer
de tipul char * şi lui i se atribuie ca valoare adresa de început a şirului de caractere ”Informatica”,
adică adresa primului caracter din şir.
Se pot declara pointeri de tipul void *, adică pointeri la care nu se indică tipul de bază. În acest
caz nu se ştie în prealabil tipul datelor ce se vor păstra pe adresele-valori ale pointerului. De
exemplu: int x=10, *pi; void *pv; Atribuirea pi=&x şi pv=pi sunt corecte. Atribuirea pi=pv nu
este corectă. La atribuirea sau citirea datelor de pe adresele-valori ale unui pointer de tip void *
trebuie explicit indicat tipul datelor respective, adică pi=(int*)pv.
1. Programul determină elementul maxim dintr-un şir numeric; sunt demonstrate diferite moduri de
adresare la elementele unui tablou unidimensional.
2. Programul inversează un şir de caractere.
3. Programul afişează doar numerele prime dintr-un tablou de numere întregi pozitive.
4. Programul determină caracterul de cod maxim într-un şir de caractere.
5. Programul ordonează crescător un şir de caractere.
6. Programul formează din vectorul x de numere întregi un vector y de numere întregi, în care y[i] să
fie restul împărţirii lui x[i] la suma cifrelor lui.
7. Programul afişează doar simbolurile cuprinse între simbolurile ( şi ). Se presupune că nu există mai
multe paranteze.
8. Programul afişează doar simbolurile cuprinse între simbolurile ( şi ). Se presupune că nu există mai
multe paranteze. (Alt variant)
9. Programul determină şi afişează elementul maxim pe liniile unui tablou bidimensional. Sunt
demonstrate diferite moduri de adresare la elementele tabloului.
10. Se va aloca un vector de 5 componente tip double folosind operatorul new. Se vor citi
componentele vectorului de la tastatură şi se va calcula suma componentelor.
11. Se va aloca un vector de 3 componente tip double folosind operatorul malloc. Se vor citi
componentele vectorului de la tastatură şi se va calcula suma componentelor.
12. Fie doi vectori, x şi y, cu câte trei componente de tip double fiecare. Elementele acestor vectori se
vor citi de la tastatură. Să se facă un program care să calculeze suma celor doi vectori. Vectorii se
vor aloca cu instrucţiunea new.
13. Fie doi vectori, a şi b, cu câte trei componente de tip double fiecare. Elementele acestor vectori se
vor citi de la tastatură. Să se facă un program care să calculeze produsul scalar al celor doi vectori.
Probleme rezolvate:
Este dat un şir de caractere. De şters din şir caracterele minuscule de pe poziţii impare.
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<conio.h>
void main (void) {
char s[256],g[256]; int i,n,z,k;
clrscr(); puts("Culege un sir de caractere\n");
gets(s); n=strlen(s); z=0;
for(i=0;i<n;i++){ k=s[i];
if((k<97)||(k>122)) {g[z]=s[i]; z++;}
if((fmod(i,2)==0)&&(k>=97)&&(k<=122)) {g[z]=s[i]; z++;} }
g[z]='\0'; clrscr();
puts("\nSirul initial s:"); puts(s);
strcpy(s,g);
puts("\nSirul final:"); puts(s);
printf(“\nCaracterele minuscule de pe pozitiile impare au fost sterse”);
getch();
}
Probleme propuse spre rezolvare:
Va Condiţia
r
1. Este dat un şir de caractere. De comparat cantitatea vocalelor cu cantitatea
consoanelor din şir.
2. Este dat un şir de caractere. De determinat de cite ori in şir se intilneşte fiecare pereche de
caractere identice aşezate alături. Exemplu: aa…bb…aa…
3. Este dat un şir de caractere. De şters din şir toate spaţiile de prisos. Astfel, intre
cuvinte va fi numai cite un spaţiu.
4. Este dat un şir de caractere. De aranjat caracterele din şir in ordine alfabetică.
5. Este dat un şir de caractere. De aflat de cite ori este intilnit in şir fiecare din
caractere.
6. Este dat un şir de caractere. De şters din şir toate vocalele.
7. Este dat un şir de caractere. De şters din şir toate perechile de caractere identice aşezate
alături. Exemplu: aa, bb.
8. Este dat un şir de caractere. De determinat valorile şi poziţiile ultimelor două
vocale din şir.
9. Este dat un şir de caractere. De schimbat cu locul caracterele unu cu trei, cinci cu şapte, nouă
cu unsprezece ş.a.m.d. Dacă ultimul caracter va fi fără pereche, el va rămine neschimbat.
10. Este dat un şir de caractere. De indicat simbolurile care se intilnesc o singură dată in text.
11. Este dat un şir de caractere. De inversat şirul, folosind principiile clasice de
inversare a masivelor.
12. Este dat un şir de caractere. De şters simbolul “ , “ din şir şi de calculat numărul de inlăturări.
13. Este dat un şir de caractere. De determinat valorile şi poziţiile primelor trei
consoane din şir.
14. Este dat un şir de caractere. Din textul dat de şters caracterele majuscule şi de
calculat lungimea textului rămas.
15. Este dat un şir de caractere. De şters din şir caracterele de pe poziţii impare.