01/10/2018, 13:47

Struct trong C++: Hàm tính chu vi đa giác N đỉnh

Em gặp Abort khi chạy chương trình sau:
Không biết bị lỗi ở đâu, mong anh/ chị giúp đỡ:

//Câu 3. Viết hàm tính chu vi đa giác N đỉnh (N>=3), bắt buộc sử dụng kiểu dữ liệu tự định nghĩa. (2 điểm)
#include <iostream>
using namespace std;

struct daGiac
{
	int socanh;//số cạnh
	float length[100]; // chiều dài mỗi cạnh
};
void nhapDaGiac(daGiac a);

void nhapDaGiac(daGiac a)
{
	cout << "Nhap so canh cua da giac"; 
	cin >> a.socanh;
	for (int i = 0; i <= a.socanh-1; i++)
	{
		cout << "Nhap canh thu " << i+1 << ": ";
		cin >> a.length[i];
	}
}
float chuViDaGiac(daGiac a);

float chuViDaGiac(daGiac a)
{
	float chuVi = 0;
	for (int i = 0; i <= a.socanh - 1; i++)
	{
		chuVi += a.length[0];
	}
	return chuVi;
}

int main()
{
	daGiac a;
	nhapDaGiac(a);
	cout << "Chu vi da giac do la:" << chuViDaGiac(a) << endl;
	cout << "

==================================

" << endl;
	return 0;
}

Hello World viết 16:02 ngày 01/10/2018

Mọi người giúp em với ạ.

Tao Không Ngu. viết 15:52 ngày 01/10/2018

Hi Hello World.
Bạn thử debug chưa ?

HK boy viết 15:47 ngày 01/10/2018
for (int i = 0; i <= a.socanh - 1; i++)
{
	chuVi += a.length[0];
}

Đọc cho kĩ đoạn này vào.

Tùng Đào viết 15:53 ngày 01/10/2018

Không biết sao chứ mình chạy chương trình của bạn bằng codeblock vẫn bình thường, không bị Abort.

Chỗ bạn noname00 chỉ ra đúng là sai nhưng chỉ sai về mặt tính toán thôi chứ không ảnh hưởng đến chương trình.

Mình có lời khuyên cho bạn là đặt tên project hay tên folder, tên file … không nên dùng tiếng Việt có dấu.
Ví dụ: de1 thay vì Đề_1

Trần Hoàn viết 16:01 ngày 01/10/2018
struct daGiac
{
	int socanh;
	float length[100];
};

int main()
{
	daGiac a;
	nhapDaGiac(a);

error C4700: uninitialized local variable 'a' used

Lỗi này thì sửa bằng cách int socanh = 0; thay vì int socanh;. Nhưng mà không liên quan lắm…

rogp10 viết 15:50 ngày 01/10/2018

Hàm nhập hoàn toàn vô tác dụng.

Trần Hoàn viết 15:56 ngày 01/10/2018

Yep. daGiac.socanh kiểu int, daGiac là struct ⇨ hàm để tác động daGiac.socanh phải sử dụng tham chiếu địa chỉ. Việc không sử dụng tham chiếu khiến cho socanh luôn là một giá trị rác nào đó có sẵn trong ô nhớ chứ không phải giá trị bạn nhập vào. Nếu a.socanh ≥ 100 (do bạn khai báo float length[100];) thì hàm sau sẽ truy cập đến một ô nhớ chưa được cấp phát cho chương trình, dẫn tới hệ điều hành ngăn chặn không cho chương trình chạy tiếp. RUN TIME ERROR!!!

float chuViDaGiac(daGiac a)
{
	float chuVi = 0;
	for (int i = 0; i <= a.socanh - 1; i++)
	{
		chuVi += a.length[0];
	}
	return chuVi;
}
Bài liên quan
0