30/09/2018, 17:06

Tại sao khi vào hàm thì mảng 2 chiều bị clear hết

#include <stdio.h>
#define max2(a,b) (a>b)?a:b
#define max3(a,b,c) max2(max2(a,b),c)
int		maxArray(int a[], int n)
{
	int i;
	int max=0;
	for (i=1;i<=n;i++)
		max=max2(max,a[i]);
	return max;
}
void	input(int a[][100],int &m, int &n)
{
	int i,j;
	printf("Hay nhap so tang: ");
	scanf("%i",&m);
	printf("Hay nhap so phong moi tang: ");
	scanf("%i",&n);
	for (i=1;i<=m;i++)
		for (j=1;j<=n;j++)
			scanf("%i",&a[i][j]);
}
int findRoad(int L[][100], int a[][100], int m, int n)
{
	int i,j;
	for (i=1;i<=m;i++)
		for (j=1;j<=n;j++)
			L[i][j]=a[i][j]+max3(L[i-1][j-1],L[i-1][j],L[i-1][j+1]);
	return maxArray(L[m],n);
}
int main()
{
	int m,n;
	int L[100][100]={0};
	int a[100][100]={0};
	input(a,m,n);
	int s=findRoad(L,a,m,n);
	printf("Gia tri lon nhat la: %i",s);
	getchar();
	getchar();
	return 0;
}

hàm input vẫn bình thường, vào hàm main mảng a vẫn còn, sau khi nhảy vào hàm findRoad thì bị clear hết
Mình thử mang ra hàm main thì thằng L cũng không thay đổi giá trị.


mình kiếm ra lỗi rồi nhưng không biết vì sao mọi người giải thích giùm mình luôn nhé
sai ở #define max3 nếu viết một hàm int max3 thì chương trình chạy đúng kết quả

int max3so(int a, int b, int c)
{
	return max2(max2(a,b),c);
}

@ltd @thanhmssl10 @david15894

Mai Anh Dũng viết 19:21 ngày 30/09/2018

Đặt tên biến khó hiểu quá

kiểm tra thử ở cuối hàm input gía trị của mảng a là gì?

Minh Hoàng viết 19:22 ngày 30/09/2018

nhảy ra khỏi hàm input thì nó vẫn còn giá trị anh ơi. Nhảy vào hàm findRoad thì a bị chuyển thành mảng 1 chiều hay sao ấy (địa chỉ của a vẫn giống, có điều trong bảng locals thì không xem được các giá trị)

Thành Phạm viết 19:13 ngày 30/09/2018

À nhầm, vẫn chưa được


Mà bác muốn kết quả như nào thế, em chạy code gốc nó tím ra đúng số lớn nhất mà

X viết 19:07 ngày 30/09/2018

printf dùng %i hay %d như nhau, nhưng scanf dùng %i thì hình như nó tự chuyển hệ 10 sang 8 thì phải

Minh Hoàng viết 19:22 ngày 30/09/2018

input:

3 (tầng)
3 (phòng)
1 2 3
4 5 6
7 8 9

output:

18 (bằng 9+6+3)

@david15894 compile giùm em với :(( chả hiểu sao thằng L không có giá trị nào cả
@thanhmssl10 mới up lại code nhé ~~

X viết 19:20 ngày 30/09/2018

L[i][j]=a[i][j]+max3(L[i-1][j-1],L[i-1][j],L[i-1][j+1]);

mảng L toàn = 0 hết thì tìm max sao nhỉ tìm max trong mảng a chứ

Minh Hoàng viết 19:18 ngày 30/09/2018

mảng L toàn = 0 hết thì tìm max sao nhỉ tìm max trong mảng a chứ

có cộng a[i][j] vào mà. ít nhất cũng phải có giá trị a[i][j] chứ nhỉ :((

Thành Phạm viết 19:20 ngày 30/09/2018

Em không hiểu lắm, sao mảng L lúc đầu là 2 chiều L[i][j] mà lại dùng hàm tìm maxArray có 1 chiều thôi L[m]

Minh Hoàng viết 19:22 ngày 30/09/2018

à, tại vì anh chỉ muốn tìm max ở một tầng thôi (tầng cuối m)

Minh Hoàng viết 19:17 ngày 30/09/2018

kiếm ra lỗi rồi nhưng không biết vì sao mọi người giải thích giùm mình luôn nhé
sai ở #define max3 nếu viết một hàm int thì đúng hoàn toàn

Thành Phạm viết 19:08 ngày 30/09/2018

Hàm max em thấy chạy ổn đấy chứ

Hay nhap so tang: 3
Hay nhap so phong moi tang: 3
1 2 3
4 5 6
7 8 9

[1][1] 2
[1][2] 3
[1][3] 3
[2][1] 5
[2][2] 6
[2][3] 6
[3][1] 8
[3][2] 9
[3][3] 9
Gia tri lon nhat la: 0

Process returned 0 (0x0)   execution time : 14.010 s
Press any key to continue.
Minh Hoàng viết 19:17 ngày 30/09/2018

nếu anh viết hàm int max3 mới như sau thì chương trình chạy đúng kết quả :(( còn viết kiểu define thì tạch luôn

int max3(int a, int b, int c)
{
	return max2(max2(a,b),c);
}
Thành Phạm viết 19:21 ngày 30/09/2018

2 thử 2 hàm max cho kết quả giá trị các max hệt nhau
Vậy mà:

  1. Gia tri lon nhat la: 0
  2. Gia tri lon nhat la: 18
int i,j;
for (i=1;i<=m;i++)
	for (j=1;j<=n;j++)
        {

		printf("\n[%d][%d] %d ",i,j,max3(a[i][j-1],a[i][j],a[i][j+1]));

        }

Hay nhap so tang: 3
Hay nhap so phong moi tang: 3
1 2 3
4 5 6
7 8 9

[1][1] 2
[1][2] 3
[1][3] 3
[2][1] 5
[2][2] 6
[2][3] 6
[3][1] 8
[3][2] 9
[3][3] 9
Gia tri lon nhat la: 18

Process returned 0 (0x0)   execution time : 6.740 s
Press any key to continue.
Gió viết 19:17 ngày 30/09/2018

Vì max2 không có đóng ngoặc nên nó tính a…+L sau đó so sánh nên kết quả là L đầu của max3= 0. Ngược lại khi có hàm thì nó tìm max sau đó mới cộng a vào.

Thành Phạm viết 19:17 ngày 30/09/2018

Oh sh*i, thế là vấn đề “chỉ là” 2 dấu ngoặc sao , @Rok_Hoang thêm code gốc 2 dấu ngoặc là xong

(max3(L[i-1][j-1],L[i-1][j],L[i-1][j+1]))
Minh Hoàng viết 19:11 ngày 30/09/2018

ồ không để ý thằng define này
cảm ơn mọi người nhé

Bài liên quan
0