01/10/2018, 14:50

Con trỏ và mảng (giả) 2 chiều

Nhờ mọi người chỉ giúp em tại sao lúc chạy chỉ nhập được a[0][0] rồi bị lỗi không chạy được nữa ạ.

#include<iostream>
using namespace std;
void nhapmtr(int *a, int &dong, int &cot)
{	
	for (int i = 0; i < dong*cot; i++)
	{
		cout << "a[" << i / cot << "][" << i % cot << "]= ";
		cin >> *(a + i);
	}
}
void xuatmtr(int *a, int dong, int cot)
{
	for (int i = 0; i < dong*cot; i++)
	{
		cout << *(a + i) << "	";
		if (i%cot == cot - 1)
		{
			cout << endl;
		}
	}
}
int tongduong(int *a, int dong, int cot) // tổng các phần tử dương trong ma trận
{
	int tong = 0;
	for (int i = 0; i < dong*cot; i++)
	{
		if (*(a + i)>0)
			tong += *(a + i);
	}
	return tong;
}
bool laSNT(int soA) // kiểm tra số nguyên tố
{
	if (soA < 2)
		return false;

	for (int i = 2; i <= sqrt((float)soA); i++)
	{
		if (soA%i == 0)
		{
			return false;
		}
	}
	return true;
}
int demSNT(int *a, int dong, int cot)// đếm số nguyên tố 
{
	int dem = 0;
	for (int i = 0; i < dong*cot; i++)
	{
		if (laSNT(*a + i))
		{
			dem++;
		}
	}
	return dem;
}
int maxinbien(int *a, int dong, int cot) // phần tử lớn nhất trên biên
{
	int max = *a;
	for (int i = 0; i <= cot - 1; i++)
	{
		if (*(a + i) > max)
			max = *(a + i);
	}
	for (int i = 0; i <= cot * (dong - 1) - 1; i += cot)
	{
		if (*(a + i) > max)
			max = *(a + i);
	}
	for (int i = cot - 1; i <= dong*cot - 1; i += cot)
	{
		if (*(a + i) > max)
			max = *(a + i);
	}
	for (int i = (dong*cot - 5); i <= dong * cot - 1; i++)
	{
		if (*(a + i) > max)
			max = *(a + i);
	}
	return max;
}
int main()
{
	int dong, cot;
	int *a=NULL;
	cout << "nhap so dong: ";
	cin >> dong;
	cout << "nhap so cot: ";
	cin >> cot;
	nhapmtr(a, dong, cot);
	xuatmtr(a, dong, cot);
	int s=tongduong(a, dong, cot);
	cout << "Tong cac so duong bang: " << s << endl;
	int d = demSNT(a, dong, cot);
	cout << "So luong so nguyen to la: " << d << endl;
	int m = maxinbien(a, dong, cot);
	cout << "So lon nhat tren bien ma tran la: " << m << endl;	
    return 0;
}
Tên Gì Cũng Được viết 17:01 ngày 01/10/2018

con trỏ kiểu int thì chỉ như mảng 1 chiều thôi mà?

Nui Pham Quang viết 16:56 ngày 01/10/2018

quên chưa cấp phát =))))

Jacaré Junior viết 17:01 ngày 01/10/2018

nhập dữ liệu bằng offset pointer thì sao dùng được *().

rogp10 viết 16:52 ngày 01/10/2018

nhập dữ liệu bằng offset pointer thì sao dùng được.

Chẳng qua là bạn nhìn không quen thôi, đó không phải là vấn đề ở đây.

Jacaré Junior viết 16:58 ngày 01/10/2018

ý tôi là thớt trên nhập dữ liệu bằng *(v + b);

rogp10 viết 17:05 ngày 01/10/2018

a[i] chỉ là cách viết khác của *(a+i) thôi, ý nghĩa tương tự.

Jacaré Junior viết 17:04 ngày 01/10/2018

bạn không hiểu ý tôi, nếu output nó ra thì ta dùng offset với *, nhưng đây đang nhập dữ liệu vào, dùng *() nó bị lỗi biên dịch mà

Jacaré Junior viết 16:55 ngày 01/10/2018

rogp10 viết 17:05 ngày 01/10/2018

Vậy bạn có bao giờ thắc mắc vì sao câu này đúng:
cin >> a[i];
mà câu này lại sai?
scanf("%d", *(a + i));

Đây là hai câu khác nhau hoàn toàn bạn à.

Jacaré Junior viết 16:52 ngày 01/10/2018

cin >> a[i]: dùng array subcript để nhận giá trị, nó tương đương với (a + i): pointer offset với con trỏ là tên mảng. Tôi chưa học c++ nên nếu c++ có thể cin bằng cách ấy thì tôi xin nhận là tôi sai. Nhưng tôi chỉ biết là *(a + i) mà sử dụng trong scanf thì chẳng phải dụng dụng biến không có “&”.

Văn Dương viết 16:52 ngày 01/10/2018

a khai báo là con trỏ cấp 1

int *a=....

Thì a[0][0] là như thế nào nhỉ ?

Bài liên quan
0