chim bay

Tuesday, October 13, 2015

Bài tập về ma trận Matrix

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
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ên
void 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ông

int 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