Giúp em với,C+ bài tập về mảng 2 chiều

anh ơi, bộ trong C sau khi mình gán số vào mảng , thì lần sau nó cũng giữ cái số đó hả anh. ::( Bài em sai ở chỗ đó)


Chạy lần đâu thì good, nhưng đến lân thứ hai trở đi thì không chạy được nữa, do cái mảng b nó giữ các phần tữ ở lần chạy đầu, đem đi so sánh, ::(

Có cách nào làm mảng b như ở lần chạy đầu không vậy anh ?? :-/ ::(
nếu muốn mỗi lần chạy nó tạo 1 mảng b khác thì đưa cái câu khai báo mảng vào vòng lặp xem.(thực sự ko hiểu câu hỏi lắm,chỉ trả lời theo suy nghĩ thôi :)))
Mình có 1 bài như sau:
Nhập sô N,phát sinh ma trận vuông tương ứng.Nhìn vd là bạn rut ra quy luật
vd : Nhập n=3,phát sinh ma trận:
1 2 3
8 9 4
7 6 5
Nhập n=4 ,phát sinh ma trận:

1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
Bạn muốn giải bài này àh?
 
hix., anh giải giúp em hai bài 1 và 3 đi. Em thua rồi :((
 
Đây là bài phát sinh ma trận vuông của jupiter
PHP:
void nhap(int *a[],int n)
{
	int k,i=0,j=0,kiemtra=0,chantren=0,chanduoi=n-1,chanphai=n-1,chantrai=0;
	for (k=1;k<=n*n;k++)
	{
		a[i][j]=k;
		if (kiemtra==0)
		{
			if (j<chanphai) j++;
			else 
			{
				kiemtra=1;
				chantren++;
				i++;
			}
		}
		else if (kiemtra==1)
		{
			if (i<chanduoi) i++;
			else
			{
				kiemtra=2;
				chanphai--;
				j--;
			}
		}
		else if (kiemtra==2)
		{
			if (j>chantrai) j--;
			else 
			{
				kiemtra=3;
				chanduoi--;
				i--;
			}
		}
		else if (kiemtra==3)
		{
			if (i>chantren) i--;
			else 
			{
				kiemtra=0;
				chantrai++;
				j++;
			}
		}
	}
}

void xuat(int *a[],int n)
{
	for (int i=0;i<n;i++)
	{
		for (int j=0;j<n;j++)
			printf("%d ",a[i][j]);
		printf("\n");
	}
}
void main()
{
     int n;
	 int **param;	
	 printf(" - Nhap vao kich thuoc mang: ");
	 scanf("%d",&n);
	 param=new int* [n] ;
	 for (int i=0;i<n;i++)
		 param[i]=new int [n];
	 nhap(param,n);
     xuat(param,n);
}

@chan_doi: bạn thử dùng 1 mảng lưu trữ số lần xuất hiện của mỗi phần tử trong mảng rồi xử lý thử xem.
 
:(( thì em làm ở trên rồi đó, lấy một mảng mới để lưu trữ số lần xuất hiện của mỗi phần tữ trong mảng. Nhưng nó chỉ chạy đúng ở lần chạy đầu hà, các lần chạy tiếp theo đều sai hết :(( .

Bài của jupiter em cũng làm thử rồi nhưng phải chạy 4 vòng lặp , hix ::(

PHP:
#include <conio.h>
#include <stdio.h>
#include <math.h>




main()
{
    int n,a[100][100];
    printf("Nhap n: ");scanf("%d",&n);

    int k=1,i,j;
    for (i=1;i<=n;i++) { a[1][i]=k;k++; }
    int b=1,c=1,d=1,e=1;
    while (i<=n*n)
     {
       for (i=b+1;i<=n-b+1;i++) { a[i][n-b+1]=k;k++; }
       b++;

       for (i=n-c;i>=c;i--) { a[n-c+1][i]=k;k++; }
       c++;

       for (i=n-d;i>=d+1;i--) { a[i][d]=k;k++; }
       d++;

       for (i=e+1;i<=n-e;i++) { a[e+1][i]=k;k++; }
       e++;
     }

   for (i=1;i<=n;i++)
   {
      printf("\n");
      for (j=1;j<=n;j++) printf("%3d",a[i][j]);
   }




    getch();
}


em mới học mảng hai chiều, nên chưa quen dùng hàm thông cảm cho em nha ::(
 
Đây là câu 3, còn câu 1 chắc cũng tương tự vậy
PHP:
void check20(int *a,int n)
{
	for (int i=0;i<n;i++)
	{
		int j;
		for (j=i+1;j<n;j++)
			if (a[j]==a[i])	break;
		if (j==n) 
		{
			int dem=1;
			for (int k=0;k<i;k++)
				if (a[k]==a[i]) dem++;
			printf("\nSo %d xuat hien %d lan",a[i],dem);
		}
	}			
}
 
hix, anh giỏi quá ::(

em chắc cần phải train nhiều hơn. Anh cho bài giúp em tập làm thêm nha ::(
 
Đây là bài tui làm theo suy nghĩ...hix ko bít sai chỗ nào mong huunhon giúp hộ:D


PHP:
#include<stdio.h>
#include<conio.h>
void phatsinhMT(int a[][100],int n);
void xuat(int a[][100],int n);
void main()
{
   int n;
   int a[100][100];
   printf("Nhap N:");
   scanf("%d",&n);
   phatsinhMT(a,n);
   xuat(a,n);
}
void phatsinhMT(int a[][100],int n)
{
   int i=0,j=0,k=1;
   int chantren=0,chanduoi=n-1,chantrai=0,chanphai=n-1;
   while(k<=n*n)
   {
       if(j<=chanphai)
       {
	   for(j;j<=chanphai;j++)
	   {
	       a[i][j]=k;
	       k++;
	   }
	   j--;
	   chanphai--;
       }
       if(i<=chanduoi)
       {
	   for(i;i<=chanduoi;i++)
	   {
	       a[i][j]=k;
	       k++;
	   }
	   i--;
	   chanduoi--;
       }
       if(j>chantrai)
       {
	   for(j;j>chantrai;j--)
	   {
	       a[i][j]=k;
	       k++;
	   }
	   j++;
	   chantrai++;
       }
       if(i>chantren)
       {
	   for(i;i>chantren;i++)
	   {
	       a[i][j]=k;
	       k++;
	   }
	   i++;
	   chantren++;
       }
   }
}
void xuat(int a[][100],int n)
{
   printf("Ma tran vuong phat sinh ;");
   for(int i=0;i<n;i++)
   {
       printf("\n");
       for(int j=0;j<n;j++)
	   printf("%4d",a[i][j]);
   }
}
Mong huunhon đừng xài biến con trỏ,vì tui vừa học hơn 1 th thầy chưa cho phép xài:D
 
biến con trỏ :-/

anh huunhon giải thích giùm em đi ::(
 
Bài mình sửa giúp cho jupiter, bạn tự xem lại chỗ sai nha
@chan_doi: ý của jupiter nói về việc tạo mảng động thay vì khai báo trước kích thước. Bạn đọc hàm main của jupiter và của mình xem phần khai báo mảng sẽ hiểu.
PHP:
#include<stdio.h> 
#include<conio.h> 
void phatsinhMT(int a[][100],int n); 
void xuat(int a[][100],int n); 
void main() 
{ 
   int n; 
   int a[100][100]; 
   printf("Nhap N:"); 
   scanf("%d",&n); 
   phatsinhMT(a,n); 
   xuat(a,n); 
} 
void phatsinhMT(int a[][100],int n) 
{ 
   int i=0,j=0,k=1; 
   int chantren=0,chanduoi=n-1,chantrai=0,chanphai=n-1; 
   while(k<=n*n) 
   { 
       if(j<=chanphai && k<=n*n) 
       { 
			for(j;j<=chanphai;j++) 
			{ 
				a[i][j]=k; 
				k++; 
			} 
			j--; 
			i++;
			chantren++; 
       } 
       if(i<=chanduoi && k<=n*n) 
       { 
			for(i;i<=chanduoi;i++) 
			{ 
				a[i][j]=k; 
				k++; 
			} 
			i--;
			j--;
			chanphai--; 
       } 
       if(j>chantrai&& k<=n*n) 
       { 
			for(j;j>=chantrai;j--) 
			{ 
				a[i][j]=k; 
				k++; 
			} 
			j++; 
			i--;
			chanduoi--; 
       } 
       if(i>chantren&& k<=n*n) 
       { 
			for(i;i>=chantren;i--) 
			{ 
				a[i][j]=k; 
				k++; 
			} 
			i++; 
			j++;
			chantrai++; 
       } 
   } 
} 
void xuat(int a[][100],int n) 
{ 
   printf("Ma tran vuong phat sinh ;"); 
   for(int i=0;i<n;i++) 
   { 
       printf("\n"); 
       for(int j=0;j<n;j++) 
       printf("%4d",a[i][j]); 
   } 
}
 
:D em hiểu rồi , thx

( sao box này vắng hoe vậy :| ) (=.=)
 
Bài tập mảng 1 chiều:
Nhập 2 dãy số nguyên A (m phần tử) và B (n phần tử)
a.Tìm những số có trong A ko có trong B.
b.Sắp xếp A tăng dần, B tăng dần. Sau đó trộn lại để được mảng C tăng dần.
 
bài 1
PHP:
 int kiemtra(int *b,int m,int a)
      {
	int j;
	for (j=0;j<m;j++)
	  if (a==b[j]) return 0;
	return 1;
      }


     void check(int *a,int n,int *b,int m)
      {
	int i,j;
	for (i=0;i<n;i++)
	  if (kiemtra(b,m,a[i])==1) printf("\n%3d",a[i]);
      }

bài 2

PHP:
   void sapxep(int *a,int n)
      {
	int i,j;
	for (i=0;i<n;i++)
	  for (j=i+1;j<n;j++)
	    if (a[i]>a[j]) doicho(a[i],a[j]);
      }
 void check(int *a,int n,int *b,int m,int *c)
       {
	 int i,j=0,k=0;

	 for (i=0;i<n+m;i++)
	   if (a[j]>b[k]) { c[i]=b[k];k++; }
	   else { c[i]=a[j];j++; }
       }

em sắp xếp dãy a,b trước rồi mới gán vô mảng c ::)
 
bài 2 chạy ko đúng rồi. dãy a 1 2 3, dãy b 1 2 3 kết quả 1 1 2 2 3 -8374823
 
PHP:
      void check2(int *a,int n)
      {
	int i,j;
	for (i=0;i<n;i++)
	  for (j=i+1;j<n;j++)
	    if (a[i]>a[j]) doicho(a[i],a[j]);
      } 
  void check(int *a,int n,int *b,int m,int *c)
       {
	 int i,j=0,k=0;

	 for (i=0;i<n+m;i++)
	   if (a[j]>b[k]) { c[i]=b[k];k++; }
	   else { c[i]=a[j];j++; }
       }

main()
{
     int n,m;
     clrscr();scanf("%d",&n);

     int *a= new int[n];
	  in(a,n);

	  scanf("%d",&m);
     int *b= new int[m];

     in(b,m);

     check2(a,n);
     check2(b,m);

     int *c= new int[n+m];

     check(a,n,b,m,c);

     out(a,n);
     out(b,m);
     out(c,n+m);

     getch();
     return 0;
}

em chạy thử 3 lần với dãy a 1,2,3 dãy b 1,2,3 kết quả ra là 1 1 2 2 3 3

có sai đâu :-/
 
Định đưa ví dụ để bạn tự tìm chỗ sai mà máy bạn chạy ko sai. Thôi thì mình nói về cái sai của bài giải đó luôn. Giả sử dãy a 1 2 3 , dãy b 1 2 3. Dãy c sẽ là 1 1 2 2 3, đến đây thì bài giải sẽ phát sinh lỗi, giả sử giá trị 3 cuối cùng là b[2], vậy thì máy sẽ lấy b[2] so sánh với số nào? nó so sánh với a[3] mà a[3] giá trị của nó là random,vì nó ko nằm tầm quản lý mảng của mình.
 
PHP:
void check(int *a,int n,int *b,int m,int *c)
       {
	 int i,j=0,k=0;

	 for (i=0;i<n+m;i++)
	  {
                  if (a[j]>b[k]) { c[i]=b[k];k++; }
	       else { c[i]=a[j];j++; }
	     if (j==n&&k<m) { c[i]=b[k];k++;}
	     if (k==m&&j<n) { c[i]=a[j];j++; }
               }  
       }

em hiểu ý của anh rồi, vậy em thêm dòng này vào thì có ổn không vậy :-/
 
anh nào biết làm bài mà khi chạy nó cho ra các ký tự * và tạo thành 1 tam giác giống kiểu cây thông noel ấy em chỉ làm cho nó ra được hình tam giác vuông chứ không làm seo cho ra hình tam giác cân kiểu cây noel cả ai giúp em với

Mã:
#include<stdio.h>
#include<conio.h>
void main()
{
		int i, j, k;
		clrscr();
		i = 0;
		printf("\nNhap vao mot so: ");
		scanf("%d", &i);
		printf("\n");
		for (j = 0 ; j < i; j++)
		{
				printf("\n");
				for (k = 1; k <= j; k++)
						printf("*");
		}
		getch();
}

khi chạy nó cho mình nhập số VD ở đây em nhập số 5 thì nó ra:
*
**
***
****
*****

giờ em muốn làm kiểu cây thông thì làm thế nào help em cái thanks mấy bro nha
 
mình sửa lại bài của chan_doi theo hướng làm của bạn
PHP:
void check(int *a,int n,int *b,int m,int *c) 
{ 
     int i,j=0,k=0; 
     for (i=0;i<n+m;i++) 
     { 
         if (a[j]>b[k] && j<n && k<m) 
		 { 
			 c[i]=b[k];
			 k++; 
		 } 
         else if (a[j]<=b[k] && j<n && k<m)
		 { 
			 c[i]=a[j];
			 j++; 
		 } 
     }   
	 if (j<n)
	 {
		 for (int x=j;x<n;x++)
			 c[i-1]=a[j];
	 }
	 if (k<m)
	 {
		 for (int x=k;x<m;x++)
			 c[i-1]=b[k];
	 }
}

Còn cái này là bài in hình tam giác cân của babyrock88
PHP:
void main()
{
	int i, j, k, m=1,n;
	i = 0;
	printf("\nNhap vao mot so: ");
	scanf("%d", &n);
	printf("\n");
	for (i = 1 ; i <= n; i++)
	{
		k=n-i;
		for (j=0;j<k;j++)
			printf(" ");
		for (j=0;j<m;j++)
			printf("*");
		m=m+2;
		printf("\n");
	}
	getch();
}
 
Thx huuhon mình đã làm lại bài rùi ,làm như sau:D
PHP:
#include<stdio.h>
#include<conio.h>
void taoMTV( int a[][100],int n);
void xuat(int a[][100],int n);
void main()
{
   int a[100][100];
   int n;
   do
   {
       printf("Nhap n:");
       scanf("%d",&n);
   }while(n<=0||n>100);
   taoMTV(a,n);
   printf("Ma tran vuong phat sinh : \n");
   xuat(a,n);
   getch();
}
void taoMTV(int a[][100],int n)
{
   int t=0;
   int p=n-1;
   int k=1;
   while(p>=t)
   {
   //Vien tren
	for(int j=t;j<=p;j++)
       {
	    a[t][j]=k;
	    k++;
       }
   //Vien phai
       for(int i=t+1;i<=p;i++)
       {
	    a[i][p]=k;
	    k++;
       }
   //Vien duoi
       for(j=p-1;j>=t;j--)
       {
	    a[p][j]=k;
	    k++;
       }
   //Vien trai
       for(i=p-1;i>t;i--)
       {
	    a[i][t]=k;
	    k++;
       }
       t++;
       p--;
   }
}
void xuat(int a[][100],int n)
{
   for(int i=0;i<n;i++)
   {
       for(int j=0;j<n;j++)
	   printf("%4d",a[i][j]);
       printf("\n");
   }
}
Còn đây là cách mà mình làm bài trộn 2 mảng tăng thành 1 mảng tăng
PHP:
void tronmang(float a[],float b[],float c[],int&m,int n,int l)
{
   int vtb=0,vtc=0;
   int i=0;
   while(vtb<n&&vtc<l)
   {
       if(b[vtb]<=c[vtc])
       {
	   a[i]=b[vtb];
	   i++;
	   vtb++;
       }
       else
       {
	   a[i]=c[vtc];
	   i++;
	   vtc++;
       }
   }
   if(vtb<n)
       for(vtb;vtb<n;vtb++)
       {
	   a[i]=b[vtb];
	   i++;
       }
   else
       for(vtc;vtc<l;vtc++)
       {
	   a[i]=c[vtc];
	   i++;
       }
   m=i;
}
Bài sắp mảng tăng dần mình còn làm thêm 1 cách:
PHP:
void saptang(float a[],int n)
{
   for(int i=0;i<n-1;i++)
   {
       int vt=i;
       for(int j=i+1;j<n;j++)
	   if(a[j]<a[vt])
	       vt=j;
       float temp=a[i];
       a[i]=a[vt];
       a[vt]=temp;

   }
}
 
Bài xử lý 2 mảng tăng thành 1 mảng tăng của bạn cũng tương tự như của bạn chan_doi :).
Còn về cách sắp xếp dãy tăng thì cũng cải thiện được 1 chút vì ko phải đổi chỗ 2 phần tử mảng nhiều lần :)). Nhưng nói chung mình chưa bàn về các giải thuật sắp xếp bây giờ vì sợ các bạn rối. Chỉ cần các bạn biết 1 điều là việc sắp xếp = cách chạy 2 vòng lặp chồng lên là cách sắp xếp tệ nhất và cũng là cách đơn giản nhất.

@ Ko nghĩ ra được bài nào về mảng 1 chiều nữa rồi. Thôi chuyển sang mảng 2 chiều nha bà con :). Nếu ai thấy bài nào về mảng 1 chiều hay hay thì post lên mọi người cùng nghiên cứu.

Bài tập về mảng
Cho ma trận n x n số nguyên.
1) tạo ngẫu nhiên các giá trị từ 0 -> n đưa vào ma trận.
2) tính tổng các phần tử của mỗi hàng, mỗi cột và đường chéo chính.

2 câu để làm quen trước :))
 
Back
Top