PHẦN 1: Các câu lệnh duyệt mảng 2 chiều thường gặp
*Ghi chú: n là số dòng, m là số cột
-Nhập mảng
-Nhập mảng
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cout<<"nhap vao phan tu thu "<<i<<j<<": ";
cin>>a[i][j];
}-Xuất mảng
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<a[i][j]<<" ";
cout<<endl;}
*Một số câu lệnh chỉ có trong ma trận vuông: ( số dòng bằng số cột n=m):
-Xuất các phần tử nằm trên đường chéo chính
for(int i=0;i<n;i++)
cout<<a[i][i];
-Xuất các phần tử nằm phía trên đường chéo chính(còn gọi là tam giác trên)
for(int i=0;i<n;i++) for(int i=0;i<n;i++)
for(int j=0;j<i;j++) OR for(int j=i+1;j<n;j++)
cout<<a[j][i]<<" "; cout<<a[i][j]<<" ";
-Xuất các phần tử nằm phía dưới đường chéo chính( còn gọi là tam giác dưới)
for(int i=0;i<n;i++)
for(int j=0;j<i;j++)
cout<<a[i][j]<<" ";
-Xuất các phần tử nằm trên đường chéo phụ
for(int i=0;i<n;i++)
cout<<a[i][n-1-i)<<” “;
-Xuất các phần tử nằm phía trên đường chéo phụ
for(int i=0;i<n;i++) for(int i=0;i<n;i++)
for(int j=0;j<n-1-i;j++) OR for(int j=n-i;j<n;j++) cout<<a[i][j]<<" "; cout<<a[n-1-j][n-1-i]<<" ";
-Xuất các phần tử nằm phía dưới đường chéo phụ
for(int i=0;i<n;i++)
for(int j=n-i;j<n;j++)cout<<a[i][j]<<" ";
PHẦN 2: Một số bài tập tham tham khảo
1. viết hàm tính tổng các phần tử trên cùng một dòng.
void tongpttrendong(int a[][100],int n,int m)
{
for(int i=0;i<n;++i)
{
int S=0;
for(int j=0;j<m;++j)
S+=a[i][j];
cout<<"dong "<<i<<" la: "<<S<<endl;
}
}
2. viết hàm tính tổng các phần tử trên cùng một cột
void tongpttrencot(int a[][100],int n,int m)
{
for(int i=0;i<m;i++)
{
int s=0;for(int j=0;j<n;j++)
s=s+a[j][i];
cout<<"cot "<<i<<" la: "<<s<<endl;
}
}
3. viết hàm tính tổng các phần tử thuộc đường chéo chính trong ma trận
vuông.
int tongptdcchinh(int a[][100],int n,int m)
{
int s=0;
for(int i=0;i<n;i++)
s=s+a[i][i];return s;
}
4. Viết hàm tính tổng các giá trị lớn nhất trên mỗi dòng.
int maxdong(int a[][100],int n,int m)
{
int s=0;
for(int i=0;i<n;i++)
{
int max=a[i][0];for(int j=1;j<m;j++)
if(a[i][j]>max)
max=a[i][j];
s=s+max;
}
return s;
}5. Viết hàm tính giá trị trung bình của các phần tử nhỏ nhất trên mỗi cột.
float tbmincot(int a[][100],int n,int m)
{
float s=0;
for(int i=0;i<m;i++)
{int min=a[0][i];
for(int j=1;j<n;j++)
if(a[j][i]<min)
min=a[j][i];
s=s+min;
}
return (float)s/m;
}6. Viết hàm tính tổng các giá trị nhỏ nhất thuộc từng đường chéo song song với đường chéo chính
chính.
int tongminssdcchinh(int a[][100],int n,int m)
{
int s=0;for(int i=1;i<n;i++)
{
int m1=32768,m2=32768;
for(int j=i;j<n;j++) {
if(a[j][j-i]<m1)
m1=a[j][j-i];
if(a[j-i][j]<m2)
m2=a[j-i][j];
}
s=s+m1+m2;}
return s;
}
7. Viết hàm tìm vị trí phần tử lớn nhất trong ma trận số nguyênvoid vtphantumax(int a[][100],int n,int m)
{
int d=0,c=0;
for(int i=0;i<n;i++)
for(int j=1;j<m;j++)
if(a[d][c]<a[i][j])
{
d=i;
c=j;
}
cout<<"dong thu "<<d<<" cot thu "<<c;
}
8. Viết hàm tìm vị trí phần tử chẳn cuối cùng trong mảng
void vtchancuoicung(int a[][100],int n,int m)
{
int i,j;
for( i=n-1;i>=0;i--)
{
for(j=m-1;j>=0;j--)
if(a[i][j]%2==0)
break;
break;
}
cout<<"dong thu "<<i<<" ,cot thu "<<j;
}
9. Viết hàm tìm phần tử âm lẻ và lớn nhất trong ma trận
int ptamle(int a[][100],int n,int m)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if((a[i][j])<0 && (a[i][j])%2==-1)
return a[i][j];
return 0;
}
int ptamlemax(int a[][100],int n,int m)
{
int max=ptamle(a,n,n);
if(max!=0)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(a[i][j]>max && a[i][j]<0 && a[i][j]%2==-1 )
max=a[i][j];
}
return max;
}
10. Viết hàm tìm phần tử chẳn dương và nhỏ nhất trong ma trận
int ptchanduong(int a[][100],int n,int m)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if((a[i][j])>0 && (a[i][j])%2==0)
return a[i][j];
return 0;
}
int ptchanduongmin(int a[][100],int n,int m)
{
int min=ptchanduong(a,n,m);
if(min!=0)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(a[i][j]<min && a[i][j]>0 && a[i][j]%2==0 )
min=a[i][j];
}
return min;
}
11. Viết hàm tìm phần tử lớn nhất trên đường chéo chính của ma trận vuôngint maxdcchinh( int a[],int n)
{
int max=a[0][0];
for(int i=1;i<n;i++)
if(a[i][i]>max)
max=a[i][i];
return max;
}
12. Viết hàm hoán vị 2 dòng, hoán vị 2 cột trong ma trận
void hoanvi(int &a,int &b)
{
int t=a;
a=b;
b=t;
}
void hoanvicot(int a[][100],int n,int m,int c1,int c2){
if((c1>=0 && c1<m)&&(c2>=0 && c2<m))
{
for(int i=0;i<n;i++)
hoanvi(a[i][c1],a[i][c2]);
}
xuat(a,n,m);
}void hoanvidong(int a[][100],int n,int m,int d1,int d2)
{
if((d1>=0 &&d1<n) &&(d2>=0 && d2<n))
{
for(int j=0;j<m;j++)
hoanvi(a[d1][j],a[d2][j]);
}
xuat(a,n,m);
}
13. Viết hàm xóa một dòng, xóa một cột trong ma trận
void xoacot(int a[][100],int n,int &m,int c)
{
if(c>=0 && c<m){
for(int i=0;i<n;i++)
for(int j=c;j<m-1;j++)
a[i][j]=a[i][j+1];
m--;
}
xuat(a,n,m);
}
void xoadong(int a[][100],int &n,int m,int d)
{
if(d>=0 &&d<n)
{
for(int i=d;i<n-1;i++)
for(int j=0;j<m;j++)
a[i][j]=a[i+1][j];
n--;
}
}
14. Viết hàm chèn một dòng, chèn một cột trong ma trận
void chencot(int a[][100],int n,int &m,int c)
{
if(c>=0 && c<m)
{
for(int i=0;i<n;i++)
for(int j=m;j>c;j--)
a[i][j]=a[i][j-1];
m++;
for(int i=0;i<n;i++)
{
cout<<"nhap phan tu dong "<<i<<" ";
cin>>a[i][c];
}
}
}
void chendong(int a[][100],int &n,int m,int d)
{
if(d>=0 &&d<n)
{
for(int i=n;i>d;i--)
for(int j=0;j<m;j++)
a[i][j]=a[i-1][j];
n++;
for(int j=0;j<m;j++)
{
cout<<"nhap phan tu cot "<<j<<" ";
cin>>a[d][j];
}
}
}
15. Viết hàm tìm phần tử chẳn dương nhỏ nhất trong ma trận(Câu 10)
int ChanDuongMin(int a[][Max],int d, int c)
{
int min=-1, i, j;
for(i=0;i<d;i++)
for(j=0;j<c;j++)
if(a[i][j]%2==0 && a[i][j]>0)
{
if(min==-1)
min=a[i][j];
else
if(a[i][j]<min)
min=a[i][j];
}
return min;
}
16 .Viết hàm tìm vị trí xuất hiện đầu tiên của x trong ma trận
void timx(float a[][100],int d,int c,float x,int &xd,int &xc)
{
xd=xc=-1;
for(int i=0;i<d;i++)
for(int j=0;j<c;j++)
if(a[i][j]==x)
{
xd=i;
xc=j;
return;
}
17 .Viết hàm xóa dòng có tổng lớn nhất của ma trận số thực(Trường hợp chỉ có một dòng có tổng lớn nhất)
void xoadongtonglonnhat(float a[][100],int &d,int c)
{
float max,tong;
int dong;
tong=0;
for(int j=0;j<c;j++)
tong+=a[0][j];
max=tong;
dong=0;
for(int i=1;i<d;i++)
{ tong =0;
for(int j=0;j<c;j++)
tong+=a[i][j];
if(tong>max)
{
max=tong;
dong=i;
}
}
for(int i=dong;i<d;i++)
{
for(int j=0;j<c;j++)
a[i][j]=a[i+1][j];
d--;
}
}
18 .Viết hàm sắp xếp ma trận tăng dần từ trái sang phải từ trên xuống dưới
void Interchangersort(int a[][Max],int d,int c)
{
for(int i=0;i<c*d-1;i++)for(int j=i+1;j<c*d;j++)
if(a[i/c][i%c]>a[j/c][j%c])
hoanvi(a[i/c][i%c],a[j/c][j%c]);
}
void hoanvi(int &a,int &b)
{
int t=a;
a=b;
b=t;
}
*HÀM KHỞI TẠO MẢNG 2 CHIỀU
Mảng Tăng:
void nhap(int a[][max],int d,int c)
{
srand((unsigned) time(NULL));
int t=abs(rand()%100);
for(int i=0;i<d;i++)
for(int j=0;i<c;j++)
{
a[i][j]=t+abs(rand()%100);
t= a[i][j];
}
}
Mảng Giảm:
void nhap(int a[][max],int d,int c)
{
srand((unsigned) time(NULL));
int t=abs(rand()%100);
for(int i=d-1;i>=0;i--)
for(int j=c-1;i>=0;j--)
{
a[i][j]=t+abs(rand()%100);
t= a[i][j];
}
}
19.Viết hàm tính tích 2 ma trận
void Output_Matrix(int a[][100], int d, int c)
{
for(int i=0; i<d; i++)
{
for(int j=0; j<c; j++)
cout<<a[i][j]<<"\t";
cout<<endl<<endl;
}
}
// A(m,n) x B(n,k) = C(m,k)
// A(da, ca) x B(db,cb) = C(da,cb)
void Tich_Matrix(int a[][100], int b[][100], int ab[][100], int da, int ca, int db, int cb)
{
int i, j, k;
if(ca != db)
cout<<"Hai ma tran khong thoa tinh chat NHAN MA TRAN!";
else
{
cout<<"\n\nTich cua 2 Ma tran la: \n\n";
for(i=0; i<da; i++)
for(j=0; j<cb; j++)
ab[i][j]=0;
for(i=0; i<da; i++)
for(j=0; j<cb; j++)
for(k=0; k<ca; k++)
ab[i][j]+=a[i][k]*b[k][j];
Output_Matrix(ab, da, cb);
}
}
20.Viết hàm tính tổng 2 ma trận
void Output_Matrix(int a[][100], int d, int c)
{
for(int i=0; i<d; i++)
{
for(int j=0; j<c; j++)
cout<<a[i][j]<<"\t";
cout<<endl<<endl;
}
}
void Sum_Matrix(int a[][100], int b[][100], int ab[][100], int da, int ca, int db, int cb)
{
if(da != db || ca != cb)
cout<<"Hai ma tran khong thoa tinh chat cua CONG MA TRAN!";
else
{
cout<<"\n\nTong cua 2 Ma tran la: \n\n";
for(int i=0; i<da; i++)
for(int j=0; j<ca; j++)
ab[i][j]=a[i][j]+b[i][j];
Output_Matrix(ab, da, ca);
}
}
20.Tính tổng các phần tử trên biên ma trận
long tong_bien(int a[][100],int d,int c)
{
long tong=0;
for(int i=0;i<c;i++)
{
tong += a[0][i];
tong += a[d-1][i];
}
for(int i=1;i<d-1;i++)
{
tong += a[i][0];
tong += a[i][c-1];
}
return tong;
}
21.Tìm phần tử có giá trị lớn nhất trên biên ma trận
long max_bien(int a[][100],int d,int c)
{
int max=a[0][0];
for(int i=0;i<c;i++)
{
if(max<a[0][i])
max=a[0][i];
if(max<a[d-1][i])
max= a[d-1][i];
}
for(int i=1;i<d-1;i++)
{
if(max<a[i][0])
max=a[i][0];
if(max<a[i][c-1])
max<a[i][c-1];
}
return max;
}
21.Ma trận ZigZag ngang
#include <iostream>
using namespace std;
int a[100][100],d,c;
void XuLy(int a[][100],int d,int c)
{
int dem=1;
for(int i=0;i<d;i++)
{
if(i%2==0)
for(int j=0;j<c;j++)
a[i][j]=dem++;
else
for(int j=c-1;j>=0;j--)
a[i][j]=dem++;
}
}
void Xuat(int a[][100],int d,int c)
{
for(int i=0;i<d;i++)
{
for(int j=0;j<c;j++)
if(a[i][j]>=10)
cout<<a[i][j]<<" ";
else
cout<<" "<<a[i][j]<<" ";
cout<<endl<<endl;
}
}
void main()
{
cout<<"Nhap dong: ";cin>>d;
cout<<"Nhap cot: ";cin>>c;
XuLy(a,d,c);
cout<<"Ma tran zigzag ngang la: \n\n";
Xuat(a,d,c);
}
21.Ma trận xoắn ốc theo chiều kim đồng hồ
#include <iostream>
using namespace std;
int a[100][100],d,c;
void TaoMaTran()
{
int trai=0,tren=0,phai=c,duoi=d,dem=0,soluong=c*d;
while(dem<soluong)
{
for(int i=trai;i<phai;i++)
if(dem<soluong)
a[tren][i]=dem++;
tren++;
for(int i=tren;i<duoi;i++)
if(dem<soluong)
a[i][phai-1]=dem++;
phai--;
for(int i=phai-1;i>=trai;i--)
if(dem<soluong)
a[duoi-1][i]=dem++;
duoi--;
for(int i=duoi-1;i>=tren;i--)
if(dem<soluong)
a[i][trai]=dem++;
trai++;
}
}
void XuatMaTran()
{
for(int i=0;i<d;i++)
{
for(int j=0;j<c;j++)
if(a[i][j]>=10)
cout<<a[i][j]<<" ";
else
cout<<" "<<a[i][j]<<" ";
cout<<endl<<endl;
}
}
void main()
{
cout<<"Nhap dong,cot: ";
cin>>d>>c;
TaoMaTran();
cout<<"Ma tran xoan oc la: \n";
XuatMaTran();
}
0 comments:
Post a Comment