cân giúp về lập trình hướng đối tượng

killeroflove1989

Youtube Master Race
Tham gia ngày
26/4/06
Bài viết
35
Reaction score
0
mình đang học lập trình hướng đối tượng trên C++, có 1 bài tập như thế này:
xây dựng class sinh viên với các thành phần tên, mã sinh viên,điểm trung bình, các hàm thành phần làm nhiệm vụ nhập,hiển thị dữ liệu của sinh viên, sau đó viết hàm main() thực hiện các công việc sau: đưa ra danh sách các sinh viên có điểm trung bình lớn nhất, đưa ra danh sách các sinh viên có điểm trung bình trên 5.
đây là code mà mình viết:

#include<iostream.h>
#include<conio.h>

enum sosanh{nhohon,lonhon,bang};
class sinh_vien
{private:
int MaSV;
char HoTen[50];
float DiemTB;
public:
void Nhap();
void HT();
int KiemTraDiem();
sosanh SoSanhDiem(sinh_vien);
};

void sinh_vien::Nhap()
{cout<<"ten : ";cin>>HoTen;cout<<"\n";
cout<<"diem : ";cin>>DiemTB;cout<<"\n";}

void sinh_vien::HT()
{cout<<"ten : "<<HoTen<<"\n";
cout<<"diem : "<<DiemTB<<"\n";

int sinh_vien::KiemTraDiem()
{ if(DiemTB>5)
return(1);
else
return(0);}

sosanh sinh_vien::SoSanhD(sinh_vien p)
{if(DiemTB<p.DiemTB)
return(nhohon);
else
if(DiemTB>p.DiemTB)
return(lonhon);
else
return(bang);}


main()
{ clrscr();
sinh_vien SinhVien[100];
sinh_vien MaxDiem;
int i,n;
cout<<"hay cho biet so sinh vien : ";cin>>n;
cout<<"\n";
cout<<"hay cho biet ten va diem trung binh tung nguoi: \n";
for(i=0;i<n;i++)
{cout<<"sinh vien thu"<<(i+1);
SinhVien.Nhap();}

cout<<"danh sach sinh vien co diem trung binh tren 5 la: ";
for(i=0;i<n;i++)
if(SinhVien.KiemTraDiem()==1)
{cout<<"sinh vien thu "<<(i+1);
SinhVien.HT();}

MaxDiem=SinhVien[0];
for(i=1;i<n;i++)
if(MaxDiem.SoSanhDiem(SinhVien)==nhohon)
MaxDiem=SinhVien;

cout<<"danh sach sinh vien co diem trung binh lon nhat la: \n";
for(i=0;i<n;i++)
if(SinhVien.SoSanhDiem(MaxDiem)==bang)
SinhVien.HT(); }

sau khi chạy chương trình thì nó báo lỗi là giới hạn đối với hàm SoSanhDiem(); mình đã chạy trên turbo c++ và dev C++; ai biết lỗi nằm ở đâu và cách khắc phục thì vào chỉ mình với
.
___________Auto Merge________________

.
ah nhầm,sorry là lỗi với hàm KiemTraDiem() chứ ko phải SoSanhDiem() ai biết giúp mình với nha, thanks::)
 
chỗ kiemtradiem là int mà ko có tham số truyền vào sao......theo bài của thì : int kiemtradiem(sinh_vien p).....mới đúng....
 
Giống hệt bài tập tuần 3,5 của bọn mình =)).
Cái hàm SoSanhDiem bạn viết nhầm thành SoSanhD, ko biết đây có phải code copy nguyên lại ko.
Cái đoạn kiemtradiem ko sai đâu
 
bạn ấy ghi lại là sosanhdiem không sai mà.......chắc là đã chỉnh;)).........
 
chỗ kiemtradiem là int mà ko có tham số truyền vào sao......theo bài của thì : int kiemtradiem(sinh_vien p).....mới đúng....

mình ko hiểu cách làm của bạn, nếu muốn kiểm tra điểm của sinh_vien P có lớn hơn 5 ko thì chỉ cần gọi hàm:
P.KiemTraDiem();
nếu lớn hơn nó trả ra 1, nếu nhỏ hơn nó trả ra 0;
nhưng mình viết như vậy nó lại báo lỗi
.
___________Auto Merge________________

.
Giống hệt bài tập tuần 3,5 của bọn mình =)).
Cái hàm SoSanhDiem bạn viết nhầm thành SoSanhD, ko biết đây có phải code copy nguyên lại ko.
Cái đoạn kiemtradiem ko sai đâu

bạn học trường nào thế, cái này la mình tự viết mà, lúc đầu code ra giấy để là SoSanhD(); sau code trên máy viết thành SoSanhDiem(); nên nó lẫn lung tung
 
Code ra giấy bạn chỉ nên cùng lắm là viết mã giả thôi, code 2 lần phí công lắm.
Bạn có thể copy chính xác cái thông báo lỗi trong DevC ko
 
#include<iostream.h>
#include<conio.h>

enum sosanh{nhohon,lonhon,bang};
class sinh_vien
{private:
int MaSV;
char HoTen[50];
float DiemTB;
public:
void Nhap();
void HT();
int KiemTraDiem();
sosanh SoSanhDiem(sinh_vien);
};

void sinh_vien::Nhap()
{cout<<"ten : ";cin>>HoTen;cout<<"\n";
cout<<"diem : ";cin>>DiemTB;cout<<"\n";}

void sinh_vien::HT()
{cout<<"ten : "<<HoTen<<"\n";
cout<<"diem : "<<DiemTB<<"\n";
thiếu }

int sinh_vien::KiemTraDiem()
{ if(DiemTB>5)
return(1);
else
return(0);}

sosanh sinh_vien::SoSanhD(sinh_vien p)
{if(DiemTB<p.DiemTB)
return(nhohon);
else
if(DiemTB>p.DiemTB)
return(lonhon);
else
return(bang);}


main()
{ clrscr();
sinh_vien SinhVien[100];
sinh_vien MaxDiem;
int i,n;
cout<<"hay cho biet so sinh vien : ";cin>>n;
cout<<"\n";
cout<<"hay cho biet ten va diem trung binh tung nguoi: \n";
for(i=0;i<n;i++)
{cout<<"sinh vien thu"<<(i+1);
SinhVien.Nhap();}

cout<<"danh sach sinh vien co diem trung binh tren 5 la: ";
for(i=0;i<n;i++)
if(SinhVien.KiemTraDiem()==1)
{cout<<"sinh vien thu "<<(i+1);
SinhVien.HT();}

MaxDiem=SinhVien[0];
for(i=1;i<n;i++)
if(MaxDiem.SoSanhDiem(SinhVien)==nhohon)
MaxDiem=SinhVien;

cout<<"danh sach sinh vien co diem trung binh lon nhat la: \n";
for(i=0;i<n;i++)
if(SinhVien.SoSanhDiem(MaxDiem)==bang)
SinhVien.HT(); }

sau khi chạy chương trình thì nó báo lỗi là giới hạn đối với hàm SoSanhDiem(); mình đã chạy trên turbo c++ và dev C++; ai biết lỗi nằm ở đâu và cách khắc phục thì vào chỉ mình với
.
___________Auto Merge________________

.
ah nhầm,sorry là lỗi với hàm KiemTraDiem() chứ ko phải SoSanhDiem() ai biết giúp mình với nha, thanks::)

Ở những chỗ mà mình đánh dấu bạn thiếu }, và SoSanhD chưa đổi lại thành SoSanhDiem. Chỉ có thế thôi, bên dưới là code mình đã sửa lại, chạy tốt. Sau này bạn nên viết theo cách phân biệt như bên dưới để dễ dàng debug, k nên viết kiểu như trên sẽ khó phát hiện lỗi , bằng chứng là lần này bạn viết chính xác hết mà k phát hiện ra được lỗi đơn giản nhất
Mã:
#include<iostream.h>
#include<conio.h>

enum sosanh{nhohon,lonhon,bang};
class sinh_vien
{private:
int MaSV;
char HoTen[50];
float DiemTB;
public:
void Nhap();
void HT();
public: int KiemTraDiem();
sosanh SoSanhDiem(sinh_vien);
};

void sinh_vien::Nhap()
{
	cout<<"ten : ";cin>>HoTen;cout<<"\n";
	cout<<"diem : ";cin>>DiemTB;cout<<"\n";
}

void sinh_vien::HT()
{
	cout<<"ten : "<<HoTen<<"\n";
	cout<<"diem : "<<DiemTB<<"\n";
[COLOR="Red"][B]} đã thêm [/B][/COLOR]
int sinh_vien::KiemTraDiem()
{
	if(DiemTB>5)
		return(1);
	else
		return(0);
}

[B][COLOR="Red"]sosanh sinh_vien::SoSanhDiem(sinh_vien p)[/COLOR][/B]
{
if(DiemTB<p.DiemTB)
	return(nhohon);
else
if(DiemTB>p.DiemTB)
	return(lonhon);
else
	return(bang);
}


main()
{
clrscr();
	sinh_vien SinhVien[100];
	sinh_vien MaxDiem;
	int i,n;
cout<<"hay cho biet so sinh vien : ";cin>>n;
cout<<"\n";
cout<<"hay cho biet ten va diem trung binh tung nguoi: \n";
	for(i=0;i<n;i++)
		{
		cout<<"sinh vien thu"<<(i+1);
		SinhVien[i].Nhap();
		}

cout<<"danh sach sinh vien co diem trung binh tren 5 la: ";
	for(i=0;i<n;i++)
	if(SinhVien[i].KiemTraDiem()==1)
	{
		cout<<"sinh vien thu "<<(i+1);
		SinhVien[i].HT();
	}

	MaxDiem=SinhVien[0];
	for(i=1;i<n;i++)
	if(MaxDiem.SoSanhDiem(SinhVien[i])==nhohon)
	MaxDiem=SinhVien[i];

cout<<"danh sach sinh vien co diem trung binh lon nhat la: \n";
	for(i=0;i<n;i++)
	if(SinhVien[i].SoSanhDiem(MaxDiem)==bang)
		SinhVien[i].HT();
		getch();
                
}
 
Theo như bạn ấy nói thì mấy lỗi đó là do giấy và code trên máy, chứ ko phải là lỗi :-?
 
lỗi thì vẫn là lỗi, tuy nhiên lỗi cú pháp thì có thể dễ dàng sửa bởi trợ giúp của debuger kèm theo các chương trình soạn thảo, các lỗi logic thì thật khó, vì khi đó chương trình vẫn run nhưng kết quả hoàn toàn sai
 
lỗi thì vẫn là lỗi, tuy nhiên lỗi cú pháp thì có thể dễ dàng sửa bởi trợ giúp của debuger kèm theo các chương trình soạn thảo, các lỗi logic thì thật khó, vì khi đó chương trình vẫn run nhưng kết quả hoàn toàn sai

Chính xác =))

Sai lỗi cấu trúc thì debug, còn sai lỗi logic thì chịu khó manual binding :'>
 
Ở những chỗ mà mình đánh dấu bạn thiếu }, và SoSanhD chưa đổi lại thành SoSanhDiem. Chỉ có thế thôi, bên dưới là code mình đã sửa lại, chạy tốt. Sau này bạn nên viết theo cách phân biệt như bên dưới để dễ dàng debug, k nên viết kiểu như trên sẽ khó phát hiện lỗi , bằng chứng là lần này bạn viết chính xác hết mà k phát hiện ra được lỗi đơn giản nhất
Mã:
#include<iostream.h>
#include<conio.h>

enum sosanh{nhohon,lonhon,bang};
class sinh_vien
{private:
int MaSV;
char HoTen[50];
float DiemTB;
public:
void Nhap();
void HT();
public: int KiemTraDiem();
sosanh SoSanhDiem(sinh_vien);
};

void sinh_vien::Nhap()
{
	cout<<"ten : ";cin>>HoTen;cout<<"\n";
	cout<<"diem : ";cin>>DiemTB;cout<<"\n";
}

void sinh_vien::HT()
{
	cout<<"ten : "<<HoTen<<"\n";
	cout<<"diem : "<<DiemTB<<"\n";
[COLOR="Red"][B]} đã thêm [/B][/COLOR]
int sinh_vien::KiemTraDiem()
{
	if(DiemTB>5)
		return(1);
	else
		return(0);
}

[B][COLOR="Red"]sosanh sinh_vien::SoSanhDiem(sinh_vien p)[/COLOR][/B]
{
if(DiemTB<p.DiemTB)
	return(nhohon);
else
if(DiemTB>p.DiemTB)
	return(lonhon);
else
	return(bang);
}


main()
{
clrscr();
	sinh_vien SinhVien[100];
	sinh_vien MaxDiem;
	int i,n;
cout<<"hay cho biet so sinh vien : ";cin>>n;
cout<<"\n";
cout<<"hay cho biet ten va diem trung binh tung nguoi: \n";
	for(i=0;i<n;i++)
		{
		cout<<"sinh vien thu"<<(i+1);
		SinhVien[i].Nhap();
		}

cout<<"danh sach sinh vien co diem trung binh tren 5 la: ";
	for(i=0;i<n;i++)
	if(SinhVien[i].KiemTraDiem()==1)
	{
		cout<<"sinh vien thu "<<(i+1);
		SinhVien[i].HT();
	}

	MaxDiem=SinhVien[0];
	for(i=1;i<n;i++)
	if(MaxDiem.SoSanhDiem(SinhVien[i])==nhohon)
	MaxDiem=SinhVien[i];

cout<<"danh sach sinh vien co diem trung binh lon nhat la: \n";
	for(i=0;i<n;i++)
	if(SinhVien[i].SoSanhDiem(MaxDiem)==bang)
		SinhVien[i].HT();
		getch();
                
}
thanks bạn nhiều nha, nhân tiện hỏi luôn cai turbo C++ 3.0 hôm wa mình vẫn dùng tốt ,hôm nay lắp cái card đồ họa mới vào thì ko chạy dc, nó báo thế này: 16bit MS-DOS Subsystem:
Turbo C++ IDE
The NTVDM CPU has encountered and illegal intructions.....
nó bị sao vậy?:whew:
 
không biết. Thử cài driver cho card đồ họa + cài lại turbo C.
 
sài visual c 6.0 cho đêp dzời or visual c2008 express đi debug mê ly luôn
 
Theo như mình biết thì 90% dân lập trình chuyên nghiệp vẫn dùng VSC++ 2005...
 
không biết. Thử cài driver cho card đồ họa + cài lại turbo C.

liên quan gì driver card màn hình, vì các hàm đồ họa đó hồi máy tính hồi đơn sơ giờ chơi máy tính xịn quá seo mà chạy, thử bỏ lên máy 386 hay 486 thì chạy đì đùng àh.

VSC++ 2005 cùng bản với VSc++ 2008 mà có gì khác đâu, chỉ khác là phiên bản free của vsc ++ 2008 cho ạo ứng dụng MFC thui, cái express 2005 hem có cái template này .

Giờ mấy cái soft chạy qua nền dotnet nhìu quá: ghost, true image, nero 9.0 ... toàn loại danh tiếng hem àh
 
Khác, thử tải 1 project lớn = VS2005 mở được = 2008 nhưng hay bị compile lỗi
 
Khác, thử tải 1 project lớn = VS2005 mở được = 2008 nhưng hay bị compile lỗi

bạn che thử cái mục chọn loại nền dot net xem, vì cái vc2008 tạo dc trên 2.0, 3.0, 3.5 mà. Còn nếu lập trình theo chuẩn iso C thì chắc là hên xui thui hà.
Mà nói thiệt học trên mấy cái viusual của microsoft có hỗ trợ help rất đã cứ bấm f1 là có đồ coi, bên java chả có cái bộ help nào giống như msdn cả. Chỉ buồn truờng mình dạy java mới ác chiến.
 
Ko, ví dụ đơn giản nhất là mở Chromium = vs2008 là biết liền. Có nhiều thứ chỉ tương thích với vs2005 thôi. Đa số lập trình vẫn trên nền v2005
 
bạn che thử cái mục chọn loại nền dot net xem, vì cái vc2008 tạo dc trên 2.0, 3.0, 3.5 mà. Còn nếu lập trình theo chuẩn iso C thì chắc là hên xui thui hà.
Mà nói thiệt học trên mấy cái viusual của microsoft có hỗ trợ help rất đã cứ bấm f1 là có đồ coi, bên java chả có cái bộ help nào giống như msdn cả. Chỉ buồn truờng mình dạy java mới ác chiến.

sao lại không có :o, bác lên trang chủ của java mà tải bộ "doc" của nó, giống MSDN của VS nhưng chỉ có info về các class libary trong java, học java mà ko đọc cái này thì học cũng như không :o
 
Back
Top