Cần giải thích về bài tập cấp phát bộ nhớ động cho mảng 2 chiều

đề bài: Viết chương trình nhập vào 1 số n. Khởi tạo và nhập vào một mảng 2 chiều gồm n hàng và n cột. Tính tổng tất cả các số có trên đường chéo chính.
Yêu cầu sử dụng 2 hàm sau:
Prototype: void nhap(int **a, int n)//nhập mảng 2 chiều [nxn] do con trỏ a trỏ tới
int tong_cheo (int **a, int n)// trả về tổng các phần tử trên đường chéo chính
Lúc nhập giá trị các phân tử xong rồi thì nó bị lỗi ở dòng này ạ: s += ((a+i)+j);
và báo lỗi : Exception thrown at 0x013C618C in Project16.exe: 0xC0000005: Access violation reading location 0x00000000.
e tìm hiểu mãi không biết, nên mới đăng lên hỏi các ac, e cảm ơn ạ.

using namespace std;
void nhap(int **a, int n)
{
    a = new int *[n];
    for (int i = 0; i < n; i++) {
        a[i] = new int [n];
        for (int j = 0; j < n; j++)
        {
            cout << "A[" << i << "]" << "[" << j << "]= ";
            cin >> *(*(a+i)+j);
        }
    }
}
int tong_cheo(int **a, int n)
{
    int s = 0;
    int j = 0;
    for (int i = 0; i < n; i++)
    {
        s += *(*(a+i)+j);
    }
    return s;
}

int main()
{
    int **a=0;
    int n;
    cout << "Nhap gia tri cua n:"; cin >> n;
    nhap(a, n);
    cout << "Tong cac phan tu tren duong cheo chinh= " << tong_cheo(a,n);
    cout << endl;
    system("pause");
    return 0;
    for (int i = 0; i < n; i++)
        delete [] * (a + i);
    delete[] a;
}

Đường chéo thì tăng i là đc rồi không cần j nữa đâu.
Bạn xuất mảng sau khi nhập xem có ra kết quả không?

1 Like

Thôi, viết bt đi cho nó dễ đọc :slight_smile: mà sai ngay chỗ hàm nhập rồi. Xem lại tham trị và tham biến (qua tham chiếu).

1 Like
void nhap(int **&a, int n)

thêm 1 dấu & là xong

xóa luôn cái return 0; nữa

1 Like

đoạn đó e thiếu j++; ở trong.
e bỏ j thì nó ra tổng các phần tử ở dòng đầu chứ k ra tổng đường chéo ạ

e cám ơn a ạ, e ra rồi.
a giải thích cho e 1 chút tại sao thêm dấu & được k ạ,

a giải thích cho e tí được k ạ?

Với void nhập dữ liệu vào 1 mảng a, bạn cần phải nạp 1 tham biến, vì việc nhập làm thay đổi nội dung của mảng. Mà tất nhiên là bạn muốn nhập dữ liệu cho mảng a đúng không? Thêm & để hàm biết rằng cần thay đổi nội dung của 1 mảng a đã có sẵn.

2 Likes

Tham chiếu là một… đối tượng (first-class object) và có thể khai báo đại loại như: T &rf = tf; với đặc điểm buộc phải khởi tạo bằng đối tượng kiểu T hay subclass của T. và nó sẽ thay mặt cho đối tượng này (binding). Chính vì tính đại diện này mà thực hiện được việc truyền tham biến.

1 Like

E cám ơn nhiều ạ :blush:

//program 107- con tro -mang ...........
#include <iostream>
using namespace std;

void nhap(int**a, int h, int c){
	for(int i=0; i<h; i++){
		for(int j=0; j<c; j++){
			cout<<"a["<<i<<"]["<<j<<"]= "; 
			cin>>a[i][j];
			cout<<endl;
		}
	}
	
}

int tong_cheo(int**a, int h, int c){
	int tong=0;
	for(int i=0; i<h; i++){
		for(int j=0; j<c; j++){
			if(i==j) {
				tong+=a[i][j];
			}
		}
	}
	return tong;
}

int main(){
	int n, c, h;
	int **a;
	cout<<"Nhap gia tri cua N = ";
	cin>>n;
	c=n;
	h=n;
	a=new int*[h];
	for(int i=0; i<h; ++i) 
		a[i]=new int[c];
	nhap(a, h, c);
	
	cout<<"Tong tat ca cac so tren duong cheo chinh la: "<<tong_cheo(a, n, n)<<endl;
	return 0;
}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?