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

do biết đến lập trình chưa được bao lâu, nên có anh nào giải thích giùm em hai dòng này được không, em không hiểu ::(

int *a=new int[n];

mình quên del cái mảng a trong phần code rồi. Bạn nào thêm dùm mình delete(a) trước getch() với
 
dòng 1 thì hiểu rồi, còn dòng 2 tại sao phải del a trước getch :(
 
int *a=new int[n] tức là xin cấp phát một mảng động kiểu số nguyên có n phần tử. Còn đelete(a) trước là để xóa mảng a đi trả ô nhớ về cho bộ nhớ.

câu 3 trong phần thuật toán mình đưa ra ở trang 4 thì j=j-1 chứ ko phải '+', mình gõ lộn, mấy bạn thông cảm
 
nếu vậy thì câu 3 làm vầy đúng hông?

do{
đảo vi trí của a và a[j]
i=i+1
j=j+1}
while(i<j)

mình nghĩ bạn nên viết code rõ ràng để hiện thực cho bài toán. Với lại bài toán nào cũng có cái hay của nó, bạn nên suy nghĩ cách giải tốt nhất mà mình có thể làm để tối ưu. Đó cũng là cách để rèn luyện khả năng lập trình của bản thân. Về bài 3 mình hiểu cách của bạn, nhưng mình nghĩ có 1 cách tốt hơn, nếu bạn làm thì post code lên để mọi người cùng xem.
Đây là code cho bài 2
PHP:
void max_min(int a[],int n)
{
	int min=a[0],max=a[0];
	for (int i=1;i<n;i++)
	{
		if (a[i]>max) max=a[i];
		if (a[i]<min) min=a[i];
	}
	printf("\n - Phan tu lon nhat trong mang la: %d",max);
	printf("\n - Phan tu nho nhat trong mang la: %d",min);
}
 
code là sao vậy, sao up cái code lên được ::)
 
có vấn đề rồi hình như nó nằm ở đây nè

int min=a[0],
if (a<min) min=a;


nếu vậy thì trong mảng không có số nào nhỏ hơn 0 thì sao :-/

Nó sẽ cho ra min=0, theo em thì đổi min=a[1] đúng hơn ::)
 
Code của bài 3 đây

PHP:
void Out(int *a,int n)
{	for (int i=0;i<n;i++)
		printf("%3d",a[i]);
}

void Swap(int &a,int &b)
{	int tam=a;
	a=b;
	b=tam;
}

void ChangePos(int *a,int n)
{	int i=0,j=n-1;
	do{
	Swap(a[i],a[j]);
	i+=1;
	j-=1;}
	while (i<j);
	Out(a,n);
}

@huunhon: Cách của bạn ra sao, đưa lên cho mình xem với. Mình thấy cách này là đơn giản và dễ viết nhất thôi
@chan__doi: trong cái khung ở trên chính là code đấy
 
có vấn đề rồi hình như nó nằm ở đây nè


Trích dẫn:

int min=a[0],
if (a<min) min=a;


nếu vậy thì trong mảng không có số nào nhỏ hơn 0 thì sao

Nó sẽ cho ra min=0, theo em thì đổi min=a[1] đúng hơn


Đâu có vấn đề gì ở đây đâu. Đây là ta giả sử a[0](phần tử đầu tiên của mảng) là min của mảng, rồi duyệt từ đầu tới cuối mảng, thằng nào nhỏ hơn min thì gán lại cho nó bằng min thôi:D. Mình đâu có gán min =0 đâu.
 
không được, mới vô nó gán a[0]=0 kìa (>.<)
 
code là sao vậy, sao up cái code lên được ::)
Bạn làm bài trên C++ rồi post lên đây bằng cách chèn vào thẻ php.
Mà bạn là người yêu cầu bài tập sao không thấy bạn viết vậy? Viết đúng viết sai cũng không quan trọng mà, tập viết cho quen :).
Đây là code bài 3 của mình, tối ưu hơn vì chỉ duyệt 1/2 mảng thôi.
PHP:
void reverse(int a[],int n)
{
	int temp;
	for (int i=0;i<n/2;i++)
	{
		temp=a[i];
		a[i]=a[n-1-i];
		a[n-1-i]=temp;
	}
}
Tối nay mình sẽ suy nghĩ vài bài khác để các bạn làm tiếp :)
 
Mã:
#include <conio.h>
#include <stdio.h>
#include <math.h>

    void in(int a[100],int n)
      {
	int i;
	for (i=1;i<=n;i++) {printf("\na[%d]=",i);scanf("%d",&a[i]);}
      }

    void out(int a[100],int n)
      {
	int i;
	for (i=1;i<=n;i++) printf("\na[%d]=%d",i,a[i]);
      }

    void maxmin(int a[100],int n)
      {
	int max,min,i;
	min=a[1];max=a[0];
	for (i=1;i<=n;i++)
	  if (a[i]>max) max=a[i];
	    else if (a[i]<min) min=a[i];
	printf("\n%d la max %d la min",max,min);
      }

    void doicho(int a[100],int n)
      {
	int tam,i,j;
	for (i=1;i<=n/2;i++)
	  { tam=a[i];a[i]=a[n-i+1];a[n-i+1]=tam;}
      }

main()
{
     int a[100],n;
     clrscr();scanf("%d",&n);
     in(a,n);
     out(a,n);
     maxmin(a,n);
     doicho(a,n);out(a,n);
     getch();
     return 0;
}

bài mình đó, cái vụ a[0]=0 là đúng hay sai vậy
 
mình đọc code của bạn rồi, mình sẽ giải thích phần mảng mà bạn thắc mắc.
Vì trong C++ mảng được bắt đầu = 0 chứ không phải = 1. nếu khai báo 1 mảng là a[5] thì mảng sẽ gồm các phần tử a[0],a[1],a[2],a[3],a[4]. Và trong code của mình thì làm theo nguyên tắc này. Bạn nên tập làm quen với cách đếm này vì hầu như các ngôn ngữ lập trình đều đếm theo kiểu này cả.
Bạn nên xem cách tạo mảng như bạn maivietdung, việc tạo 1 mảng 100 phần tử như bạn ko được tốt lắm :).
 
Vì trong C++ mảng được bắt đầu = 0 chứ không phải = 1. nếu khai báo 1 mảng là a[5] thì mảng sẽ gồm các phần tử a[0],a[1],a[2],a[3],a[4].

không ý mình không phải vậy, mình chỉ hỏi a[0]=0 hay a[0]=random. Khi tạo một mảng thì máy tính sẽ cho vị trí đó bằng 0 hay bằng random số :-/

vì bài của các bạn gán min=a[0] , mình chạy nó kô ra (>.<).

test thử mới biết vi trí a[0] được máy tính gán bằng 0, vậy những vị trí khác có vậy không :( a[[1], a[2], a[3]....a[n]

hay là chỉ có a[0] thôi


Bạn nên xem cách tạo mảng như bạn maivietdung, việc tạo 1 mảng 100 phần tử như bạn ko được tốt lắm :).

ừh, thì mình có hỏi ở bài trên rồi đó, cái này sẽ khắc phục ::)
 
Không phải là vị trí a[0] máy tính gán =0 đâu bạn :).
Vì cách nhập của bạn là nhập từ phần tử a[1] trở đi, chứ không phải từ a[0] cho nên bạn chạy các hàm của mình không ra kết quả đúng được. Bạn kiểm tra lại từ hàm nhập mảng của bạn xem.
Giải thuật max min của mình như thế này. giả sử mình có mảng 5 phần tử
a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5
Đầu tiên mình sẽ cho max và min cùng bằng a[0] nghĩa là max=min=1
sau đó xét từ a[1]->a[4] nếu phần tử nào nhỏ hơn min thì gán min= phần tử đó, phần tử nào lớn hơn max thì gán max=phần tử đó.
 
à mình hiểu rồi, cám ơn nhiều nha ::)

tại mình mới biết lập trình C cách đây có nữa tháng hà, bạn có bài tâp thêm thì mình cám ơn trước nha ::)

à cho mình hỏi cái này tại sao phải delete(a) sau phần getch() kô del có sao kô
 
à cho mình hỏi cái này tại sao phải delete(a) sau phần getch() kô del có sao kô
khi bạn tạo 1 con trỏ thì máy tính sẽ cấp phát vùng nhớ cho con trỏ , nên khi sử dụng xong thường người ta sẽ thực hiện lệnh xoá để giải phóng vùng nhớ đó. Còn việc nên delete hay không thì nên, vì bây giờ bạn viết chương trình nhỏ, bộ nhớ máy tính lại nhiều nên bạn không cảm thấy có chuyện gì xảy ra. Nhưng sau này khi viết chương trình lớn thì việc đó là bắt buộc, nên tốt nhất là tập thói quen từ bây giờ :)).
Bài tập về mảng tiếp tục đây:
Nhập vào một mảng n số nguyên
1) Kiểm tra xem mảng có sắp thứ tự không, nếu có thì cho biết thứ tự tăng hay giảm.
2) Tìm vị trí của phần tử dương nhỏ nhất trong mảng.
3) Tình trung bình cộng các số dương lẻ trong mảng.

Vd: mảng a: -5 -3 0 1 2 3 9
Kết quả:
Mảng tăng dần.
Vị trí phần tử dương nhỏ nhất là 1
Trung bình cộng các số dương lẻ trong mảng là 4.3
 
Mã:
void check1(int *a,int n)
      {
	int i,d,j;
	d=1;
	for (i=1;i<=n-1;i++)
	   for (j=i+1;j<=n;j++)
	      if (a[i]<a[j]) { d=0;break; }
	if (d==1) printf("\nDay giam dan.");
	 else if (d==0)
	  {
	     d=1;
	     for (i=1;i<=n-1;i++)
	       for (j=i+1;j<=n;j++)
		 if (a[i]>a[j]) { d=0;break; }
	     if (d==0) printf("\nDay binh thuong.");
	       else printf("\nDay tang dan.");
	  }

bài 1, coi giùm mình coi có gì góp ý không ::)


Mã:
int max(int *a,int n)
      {
	int i,m;m=a[1];
	for (i=2;i<=n;i++)
	  if (a[i]>m) m=a[i];
	return m;
      }

    void check2(int *a,int n)
      {
	int i,m,j;m=max(a,n);
	for (i=1;i<=n;i++)
	  {
	    if (a[i]<m&&a[i]>0) m=a[i];
	  }
	printf("\n%d la phan tu duong nho nhat.",m);
      }

bai 2 nè ::)

muốn làm có màu cho dễ nhìn làm sao vậy chỉ mình với :-/
 
Vài ý kiến nhé :)
1. Bạn nên cho mảng bắt đầu từ phần tử 0, làm từ từ sẽ quen. Mình ví dụ 1 trường hợp sai khi bắt đầu từ 1. Giả sử kích thước tối đa của mảng mà bạn cho là 5, người dùng lại nhập vào mảng 5 phần tử, máy tính sẽ cho 5 phần tử từ 0->4 như vậy a[5] đâu có tồn tại. Nếu bạn bắt đầu từ 1 sẽ là 1->5 => lỗi phát sinh.

2. về bài 1 thì giải thuật của bạn sẽ chạy đúng nhưng có chỗ ko hay. Ví dụ mảng là 1 2 3 4, đầu tiên bạn cho 2 so sánh với 1, rồi 3 so sánh với 1, 4 so sánh với 1. Việc làm này đâu cần thiết? chỉ cần 2 với 1, 3 với 2, 4 với 3 cũng đủ để xác định được kết quả rồi mà.

3. về bài 2 thì bạn chạy thử trường hợp này rồi tự khắc phục lổi nhé :). Bạn cho mảng gồm 5 phần tử -7 -6 -5 -4 -3, bạn xem kết quả rồi khắc phục là được. Với lại có nhất thiết m phải là max của mảng ko? Đó là 2 lỗi của bài toán của bạn :).

4. Bạn nghĩ cách để duyệt mảng 1 lần thôi và ra kết quả cho bài 1 và bài 2.

@: bạn đưa vào thẻ PHP sẽ có màu mà
 
Đây là code của câu 2 và 3:

PHP:
void Search(int *a,int n)
{  int min,pos;
	for (int i=0;i<n;i++)
		if (a[i]>0) min=a[i];
	for (int j=0;j<n;j++)
		if ((a[j]>0)&&(a[j]<min))
		{	min=a[j];
			pos=j;
		}
	printf("\n - Vi tri cua phan tu duong ho nhat trong mang la: %3d",pos);
}

void Ave(int *a,int n)
{  int sum=0,time=0;
	for (int i=0;i<n;i++)
		if (a[i]>0)
		{	sum+=a[i];
			time+=1;
		}
	float ave=sum/time;

	printf("\n - Trung binh cong cac so duong trong mang bang: %3f",ave);
}
 
ý quên, trung binh cong làm lộn rồi xin lỗi trước nha
 
Back
Top