Sei sulla pagina 1di 8

1.

Să se realizeze programul care calculează suma elementelor unei


matrice dreptunghiulare de dimensiune mxn. Elementele matricei se vor citi
de la tastatură.
 a11 a12 ... a1n 
 
 a 21 a 22 ... a 2n 
Fie matricea A . Suma elementelor este: S=a11+a12+...
.......................
 
 
 a m 1 a m 2 ... a mn 
+a1n+a21 +...+a2n+...+am1+...+amn, dacă se însumează pe linii (lexicografic) sau
S=a11+a21+...+am1+a12+...+am2+...+a1n+...+amn, dacă se însumează pe coloane (invers
lexicografic). Matricea A poate fi privită ca un vector de dimensiune mn dacă este
liniarizată (lexicografic sau invers lexicografic). Pornind de la ipotezele formulate
la determinarea sumei elementelor unui vector, algoritmul (parcurgând matricea
lexicografic), poate fi descris astfel:

S=0
-------------------------
j=1 S = S + a11 = a11
j=2 S = S + a12 = a11 + a12
i=1 ...
j=n S = S + a1n = a11 +...+ a1n
-------------------------
j=1 S = S + a21 = a11 +...+ a21
i=2 ...
j=n S = S + a2n = a11 +...+ a2n
…………………….
j=1 S = S + am1 = a11 +...+ am1
i=m ...
j=n S = S + amn = a11 +...+ amn
-------------------------
Algoritmul recursiv poate fi descris astfel:
 formula de start: S = 0;
 formula recursivă: S = S + a(i,j); i=1,m; j=1,n
Parcurgând matricea invers lexicografic algoritmul este similar, cu deosebirea că
indicele liniilor (i) va lua toate valorile din intervalul [1,m] pentru o valoare dată a
indicelui de coloane (j). Elementele matricei se introduc de la tastatură, element cu
element, cu ajutorul a două structuri DO-FOR imbricate.
Observaţie: Trebuie să se ţină cont că în C indicii încep de la 0.

#include <stdio.h>
#include <conio.h>
void main(){
int n,m,i,j,s, a[100][100];
printf("Nr de linii= ");scanf("%d",&m);
printf("Nr de coloane= ");scanf("%d",&n);
for(i=0;i<m;i++)
for(j=0;j<n;j++){
printf("a[%d][%d]= ",i,j);scanf("%d",&a[i][j]);}
for(i=0;i<m;i++){
for(j=0;j<n;j++)
printf(" %d ",a[i][j]);
printf("\n");
}
s=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++) s+=a[i][j];
printf("\n Suma elementelor este= %d ",s);
getch();
}

2. Să se realizeze programul care determină elementele maxim şi minim


dintr-o matrice dreptunghiulară, de dimensiuni mxn.
 a11 a12 ... a1n 
 
 a 21 a 22 ... a 2n 
Fie matricea A . Liniarizând matricea lexicografic se
.......................
 
 
 a m1 a m 2 ... a mn 
obţine un vector de dimensiune mn: A=(a11,a12,...,a1n,a21,...,a2n,...,am1,...,amn).
Elementele maxim şi minim se determină astfel:
- MAX=max(a11,a12,...,a1n,a21,...,a2n,...,am1,...,amn)
- MIN= min(a11,a12,...,a1n,a21,...,a2n,...,am1,...,amn).
Algoritmul recursiv poate fi descris astfel:
 formulele de start: MAX = a(1,1); MIN = a(1,1);
 formulele recursive: MAX = max{MAX, a(i,j)}; i=1,m; j=1,n;
MIN = min{MIN, a(i,j)}; i=1,m; j=1,n.
Dacă matricea se consideră liniarizată invers lexicografic algoritmul este similar,
cu deosebirea că ordinea de variaţie a indicilor este inversă. Maximul şi minimul se
vor determina concomitent, pornind de la ipoteza că un element oarecare a(i,j) se
poate afla:
- în intervalul (MAX, +) şi este noua valoare maximă;
- în intervalul (-, MIN) şi este noua valoare minimă;
- în intervalul [MIN, MAX], caz în care nu afectează nici una din valorile căutate.
Observaţie: Trebuie să se ţină cont că în C indicii încep de la 0.

#include <stdio.h>
#include <conio.h>
void main(){
int n,m,i,j,s,max,min, a[100][100];
printf("Nr de linii= ");scanf("%d",&m);
printf("Nr de coloane= ");scanf("%d",&n);
for(i=0;i<m;i++)
for(j=0;j<n;j++) {
printf("a[%d][%d]= ",i,j); scanf("%d",&a[i][j]); }
for(i=0;i<m;i++){
for(j=0;j<n;j++)
printf(" %d ",a[i][j]); printf("\n");
}
max=a[0][0];min=a[0][0];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{if (max<a[i][j]) max=a[i][j];
if (min>a[i][j]) min=a[i][j];
}
printf("\n Maximul este= %d ",max);
printf("\n Minimul este= %d ",min);
getch();
}

3. Să se scrie programul care realizează determinarea elementului


maxim de pe fiecare linie şi a elementului maxim dintr-o matrice
dreptunghiulară de dimensiuni mxn.
Fie matricea
 a11 a 12 . . . a1n   MAX1
 
 a 21 a 22 . . . a 2n   MAX 2
A= 
. . . . . . . . . . . . . . . . . ..........
 
   MAX m
 a m1 a m 2 . . . a mn 
Elementele maxime de pe fiecare linie vor forma un vector de dimensiune m:
MAX = (MAX1,MAX2,...,MAXm). Un element al vectorului MAX se determină
astfel:
 formula de start: MAX(i) = a(i,1);
 formula recursivă: MAX(i) = max{MAX(i),a(i,j)}, j=2,n.
Maximul din matrice (MAXM) se poate determina  în etape distincte, prin
determinarea elementului maxim al vectorului MAX după ce acesta a fost con-
struit: MAXM=max{MAX(i)}, i=1,m sau  în aceeaşi structură repetitivă,
comparând elementul MAX(i) recent determinat, cu variabila MAXM.

#include <stdio.h>
#include <conio.h>
void main(){
int n,m,j,i,M;
int a[100][100],max[100];
printf("\nNr de linii= ");scanf("%d",&m);
printf("\nNr de coloane= ");scanf("%d",&n);
for(i=0;i<m;i++)
for(j=0;j<n;j++){
printf("a[%d][%d]= ",i,j); scanf("%d",&a[i][j]); }
for(i=0;i<m;i++) {
for(j=0;j<n;j++)
printf(" %d ",a[i][j]);
printf("\n");
}
for(i=0;i<m;i++){
max[i]=a[i][0];
for (j=0;j<n;j++)
if (max[i]<a[i][j]) max[i]=a[i][j];
}
M=max[0];
for(i=1;i<m;i++) if (M<max[i]) M=max[i];
for(i=0;i<m;i++) printf("\n Maximul pe linia %d este =
%d",i,max[i]);
printf("\n Maximul este = %d",M);
getch();
}

4. Să se scrie programul care realizează determinarea poziţiei primei


apariţii a unei valori date într-o matrice dreptunghiulară, de dimensiuni mxn.
Matricea va fi parcursă în ordinea lexicografic. În momentul în care se găseşte
valoarea căutată se afişează poziţia (linia şi coloana elementului respectiv) şi se
abandonează parcurgerea matricei. Ieşirea "forţată" din structurile repetitive se
realizează cu ajutorul unei variabile care ia valoarea 1 dacă valoarea dată a fost
regăsită printre elementele matricei sau 0 în caz contrar. Testarea suplimentară a
variabilei, alături de condiţia de sfârşit de linii (i>m) şi sfârşit de coloane (j>n),
transformă structurile repetitive cu numărător (gândite pentru parcurgerea matricei)
în două structuri WHILE-DO imbricate. În final, dacă variabila este egală cu 0,
înseamnă că valoarea nu a fost regăsită şi se afişează un mesaj corespunzător.

#include <stdio.h>
#include <conio.h>
void main()
{
int n,m,i,j,s,pozl,pozc,gas,val, a[100][100];
printf("Nr de linii= ");scanf("%d",&m);
printf("Nr de coloane= ");scanf("%d",&n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{ printf("a[%d][%d]= ",i,j); scanf("%d",&a[i]
[j]); }
printf("Valoarea cautata este = ");scanf("%d",&val);
for(i=0;i<m;i++) {
for(j=0;j<n;j++)
printf(" %d ",a[i][j]);
printf("\n");
}
gas=0;
i=0;
while ((i<m)&&(!gas)){
j=0;
while ((j<=n)&&(!gas)) {
if (a[i][j]==val) {gas=1; pozl=i; pozc=j;
} j+=1;}i+=1;
}
if (gas) printf("\n Valoarea cautata se afla pe linia
%d si coloana %d",pozl,pozc);
getch();
}
5. Să se realizeze programul care sortează elementele unei matrice
pătratice în ordine crescătoare.
Deoarece este dificil de modificat liniile şi coloanele dintr-o matrice astfel încât să
rezulte o soluţie optimă la această problemă din cât mai puţine schimbări de linii şi
coloane, algoritmul următor apelează la un artificiu de programare şi anume
copierea tuturor elementelor din matrice într-un vector. Acest vector este sortat şi,
ulterior, elementele sortate sunt redistribuite în matrice.

#include<stdio.h>
#include<conio.h>
void main()
{
int n,m,p,q,j,i,k;
int a[100][100],c[100][100];
printf("\n Matricea ");
printf("\nNr de linii = ");scanf("%d",&n);
printf("\nNr de coloane = ");scanf("%d",&m);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
printf("a[%d][%d]= ",i,j);
scanf("%d",&a[i][j]);
}
for(i=0;i<n;i++)
{for(j=0;j<m;j++)
printf(" %d ",a[i][j]);printf("\n");}
k=0;
int v[100],aux;
for (i=0;i<n;i++)
for (j=0;j<m;j++)
{ v[k]=a[i][j];k++;}
for(i=0;i<k-1;i++)
for(j=i+1;j<k;j++)
if (v[i]>v[j])
{aux=v[i];v[i]=v[j];v[j]=aux;}
printf("\n");
for (i=0;i<k;i++) printf("%d ",v[i]);
int l=0;
while (l<n*m)
{i=0;
while (i<n)
{j=0;
while (j<m)
{ c[i][j]=v[l]; j++; l++;}
i++; }
} printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf(" %d ",c[i][j]); printf("\n");
}
getch();
}
6. Să se verifice dacă matricea A de ordinul n este un pătrat magic.
Matricea reprezintă un pătrat magic dacă sumele elementelor de pe fiecare linie
sunt egale cu sumele elementelor de pe fiecare coloană şi de pe cele două
diagonale.
#include<stdio.h>
#include<conio.h>
void main()
{
int n,m,p,q,j,i,k,ss,sd, gas;
int a[100][100],sl[100],sc[100];
printf("\n Matricea ");
printf("\nNr de linii/coloane = ");scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf("a[%d][%d]= ",i,j); scanf("%d",&a[i][j]);
}
sd=0;ss=0;
for (i=0;i<n;i++)
{(sd)+=a[i][i]; (ss)+=a[i][n-i-1]; }
if (ss==sd)
{
for(i=0;i<n;i++)
{ sl[i]=0;
for(j=0;j<n;j++) sl[i]+=a[i][j];
}
for(i=0;i<n;i++)
{ sc[i]=0;
for(j=0;j<n;j++) sc[i]+=a[j][i];
}
gas=0;
for (i=0;i<n;i++) if (sl[i]!=sc[i]) gas=1;
if (gas) printf("Matricea nu este un patrat
magic.");
else printf("Matricea este un patrat magic.");
}
getch();
}

7. Să se realizeze programul care verifică dacă o matrice este


triunghiulară inferior. În caz afirmativ să fie transformată într-o matrice
triunghiulară superior.
În cazul acestei probleme după ce se citeşte dimensiunea matricei, care este unică
deoarece, pentru a putea vorbi de triunghi inferior matricea trebuie să fie pătratică.
După citirea elementelor matricei se va trece la verificarea ipotezei, iar in cazul în
care se verifică se va aplica algoritmul matematic de transformare.

#include<stdio.h>
#include<conio.h>
void main()
{
int i,j,k,n,m,a[100][100], aux;
printf("Numarul de linii/coloane =");scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf(" a[%d][%d] = ",i,j);scanf("%d",&a[i][j]);
}
for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
printf("%d ",a[i][j]);printf("\n");
}
int gas=0;
for(i=1;i<n;i++)
for(j=0;j<i-1;j++) if(a[i][j]!=0) gas=1;
if (!gas)
{for (i=1;i<n;i++)
for (j=0;j<i;j++)
{ aux=a[j][i];
a[j][i]=a[i][j];
a[i][j]=aux; } }
printf("\n");
for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
printf("%d ",a[i][j]); printf("\n");}
getch();
}

8. Fie o matrice Amxn care reprezintă notele obţinute de m studenţi la n


discipline. Să se determine:
a) studenţii integralişti (care au toate notele ≥ 5);
b) studenţii bursieri (integraliştii cu media ≥ 8,50);
c) disciplinele la care s-au înregistrat cei mai mulţi restanţieri;
d) media pe fiecare disciplină (se iau în calcul doar notele de
promovare).

#include<stdio.h>
#include<conio.h>
void main()
{
int i,j,k,n,m,p,s,nr,a[100]
[100],v[100],b[100],h,r[100],q;
float med[100];
printf("Numarul de studenti =");scanf("%d",&n);
printf("Numarul de materii =");scanf("%d",&m);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{ printf(" a[%d][%d] = ",i,j); scanf("%d",&a[i][j]);}
for(i=0;i<n;i++)
{ for(j=0;j<m;j++)
printf("%d ",a[i][j]); printf("\n");
}
for(i=0;i<n;i++)
{ int gas=0;
for(j=0;j<m;j++) if (a[i][j]<5) gas=1;
if(!gas) {v[k]=i;k++;}
}
printf("\nStudentii integralisti: ");
for(i=0;i<k;i++) printf("%d ",v[i]);
for(i=0;i<n;i++)
{s=0;
for(j=0;j<m;j++) s+=a[i][j];
float medie=s/m;
if (medie>8.50) {v[k]=i;k++;}
}
printf("\nStudentii bursieri: ");
for(i=0;i<k;i++) printf("%d ",b[i]);
for(i=0;i<m;i++)
{ nr=0;
for(j=0;j<n;j++)
if (a[i][j]<5) nr++;
r[i]=nr; }
int d=0; int nrr=r[0];
for(i=1;i<m;i++)
if ((nrr)<r[i]) {d=i;nrr=r[i];}
printf("\nDisciplina-restante: "); printf("%d - %d"
,d,nrr);
for (i=0;i<m;i++)
{ s=0; nr=0;
for(j=0;j<n;j++)
if (a[i][j]>=5) {s+=a[i][j];nr++;}
med[i]=s/nr; }
printf("Media pt fiecare disciplina.");
for(i=0;i<m;i++) printf("\n %d - %d ", i, med[i]);
getch();
}

Potrebbero piacerti anche