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;
}
Bài liên quan
con trỏ kiểu int thì chỉ như mảng 1 chiều thôi mà?
quên chưa cấp phát =))))
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.
ý tôi là thớt trên nhập dữ liệu bằng *(v + b);
a[i] chỉ là cách viết khác của *(a+i) thôi, ý nghĩa tương tự.
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à
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 à.
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ó “&”.
a khai báo là con trỏ cấp 1
Thì a[0][0] là như thế nào nhỉ ?