Breaking News
Loading...
Monday, December 5, 2011

Tổng hợp code các hàm về Mảng 2 Chiều

12/05/2011 12:59:00 PM
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();
}  
 


8 comments:

  1. cái xuất các phần tử phía trên đường chéo chính và phí dưới đường chéo chính Giống nhau

    ReplyDelete
  2. @Bong Hoang Anh: 2 hàm này giống về 2 dòng for nhưng khác ở chổ cout đó bạn. bạn nhìn kĩ lại sẽ thấy một cái là cout a[j][i] một cái là cout a[i][j].

    ReplyDelete
  3. máy a chị cho e hỏi c free .... nó có giống thế này không hả máy a chị .. e đang yếu môn này :V

    ReplyDelete
    Replies
    1. Mình không dùng cfree nên cũng chưa biết nó như thế nào

      Delete
    2. giống ấy pn, cái này viết theo C++

      Delete
  4. A Việt ơi! Mảng tăng theo cấp số nhân thì viết thế nào vậy a?
    Ví dụ như cấp số nhân 2 và 10 levels (lv1=2......lv10=1024)?
    Cảm ơn a nhé!

    ReplyDelete
    Replies
    1. có kèm theo điều kiện gì nữa ko bạn. Ví dụ: tăng dần theo hàng, cột hoặc ma trận đó là mxn phần tử hay ma trận vuông. Bạn cứ nêu cụ thể lên nhé. Còn nếu chỉ đơn giản là theo cấp số nhân thì khi tạo phần tử cho mảng cứ theo công thức phần tử thứ i+1 bằng phần tử thứ i*2

      Delete

 
Toggle Footer