C++: hàm main không return về 0

m.n cho mình hỏi, mình làm class như thế này, lúc chạy kết quả ra đúng nhưng được 1 lúc nó hiện lên như vầy và không return 0;

#include<iostream>
#include<cstring>
using namespace std;
class sinhvien{
	private:
		char hoten[50];
		int ma;
	public:
		void nhap(){
			cin.getline(hoten,50);
			cin>>ma;cin.ignore();
		}
		void xuat(){
			cout<<hoten<<" "<<ma<<endl;
		}
		void operator=(sinhvien a){
			strcpy(hoten,a.hoten);
			ma=a.ma;
		}
};
class danhsach{
	private:
		sinhvien *dssv;
		int tssinhvien;
	public:
		danhsach(){
			tssinhvien=0;
		}
		void nhapbp(){
			cin>>tssinhvien; cin.ignore();
			dssv=new sinhvien[tssinhvien];
			for(int i=0;i<tssinhvien;i++){
				dssv[i].nhap();
			}
		}
		void xemmh(){
			for(int i=0;i<tssinhvien;i++){
				dssv[i].xuat();
			}
		}
		void themsauk(sinhvien a, int k){ //them sinhvien a sau phan tu thu k 
			int i=tssinhvien; 
			tssinhvien++;
			while(i>k){
				dssv[i]=dssv[i-1];
				i--;
			}
			dssv[k]=a;
		}
};
int main(){
	danhsach x; x.nhapbp(); 
	sinhvien a; a.nhap(); x.themsauk(a,2); x.xemmh();
        return 0;
}

Tạo danh sách:

Khi thêm thì mảng dssv phải khai báo mới.
Bạn không khai báo mới thì khi thêm vào, bạn đang “lấn chiếm” bộ nhớ mà không phải của mảng dssv.

3 Likes

cái đấy mình để ở hàm nhập, mà lúc nhập thì mình cấp phát ô nhớ cho “dssv” chứ có xong lúc mình thêm vào có tăng 1 ô nhớ trong mảng lên chứ có lấn chiếm gì đâu nhỉ

Thế bạn tăng ô nhớ của mảng dssv ở chỗ nào thế?
tssinhvien++; à???
Bạn tăng giá trị biến tssinhvien chứ có tăng kích thước mảng dssv đâu.

4 Likes

à mình hiểu rồi, cảm ơn bạn nhiều nhaaa :blush:

bạn ơi, cho mình hỏi, giờ khắc phục thì khắc phục kiểu gì nhỉ, mình sửa thành cấp phát động mà không được, còn khai báo mới như nào bạn nhỉ

mình khai báo mới như thế này vẫn không được
image

Bạn phải sao chép mảng cũ qua mảng mới nữa.
Đối với trường hợp này, bạn có thể kết hợp vừa chép sang mảng mới và vừa chèn vào vị trí k.
Lưu ý: mảng mới là mảng tạm, sau khi sao chép xong thì mới gán về dssv.

sinhvien *tam = new sinhvien[tssinhvien]; // tssinhvien đã +1.
// Thực hiện sao chép từ dssv sang tam, có thể kết hợp với chèn vào k. Vòng lặp.
dssv = tam; // gán mảng mới cho dssv.

Làm thế này thì mỗi lần chèn là mỗi lần tạo mảng mới. Khá tốn thời gian và bộ nhớ.
Bạn có thể gán mảng ban đầu bằng 1 lượng nhiều hơn tssinhvien, khi nào chèn vào vượt số lượng phần tử mảng thì mới tạo mảng mới với số lượng cũng lớn hơn 1 tí. :smiling_imp:

3 Likes

à đúng, mình hiểu rồi, t thử và thành công rồi, mình còn thắc mắc cuối là sao khi thêm vào đầu danh sách thì không bị lỗi “lấn chiếm” như themsauk nhỉ, mình biết làm như ở dưới là sai nhưng sao chạy vẫn đúng nhỉ

void themdau(sinhvien a){
			int i=tssinhvien;
			tssinhvien++;
			while(i>0){
				dssv[i]=dssv[i-1];
				i--;
			}	
			dssv[0]=a;
		}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?