Code danh sách liên kết quản lý sinh viên bị has stopped working

#include <iostream>
#Include <mylib.h> // thư viện này định nghĩa mấy hàm setcolor với gotoxy 
#include <iomanip>
using namespace std ;
#define MAXLIST 100

const int so_itemp = 8 ; // so yeu cau cua bai toan
const int cot = 20 ;
const int dong=5 ;
const int Up=72 ; // di len 
const int Down=80 ; // di xuong

struct Sinhvien{
	int maso ;
	char ho[31] ;
	char ten[31] ;
};
struct List{
	int n ; // so hoc vien co trong danh sach
	Sinhvien *Node[MAXLIST] ; // Mang con tro  
};


//Set color 
void Normal(){
	SetColor(15) ; // White
	SetBGColor(0) ; // Black
}
// Set color 
void HightLight(){
	SetColor(15) ; //White
	SetBGColor(1); //Blue
}
//Menu
char Thucdon[so_itemp][50]=   {"1.Nhap danh sach hoc vien	 		",
								"2.Liet ke hoc vien       	 		",
								"3.Sap xep danh sach theo ten		",
								"4.Them hv vao danh sach va sap xep ",
								"5.Tim hv bang ma so				",
								"6.Save danh sach hv				",
								"7.Load danh sach hv				",
								"8.Ket thuc (maso <= 0)				"} ;
// Tao mang dong
int MenuDong(char Thucdon[so_itemp][50]){
	system("cls") ;
	int chon=0 ;
	// xuat menu ra
	for(int i=0 ; i<so_itemp ; i++){
		gotoxy(cot, dong+i) ;
		cout<<Thucdon[i] ;
	}
	HightLight() ;
	gotoxy(cot,dong+chon) ;
	cout<<Thucdon[chon] ;
	char kytu ;
	do{
		kytu=getch() ;
		switch(kytu){
		//if(kytu==0) kytu=getch() ;
		case Up: if(chon+1>1){
					Normal() ;
					gotoxy(cot,dong+chon) ;
					cout<<Thucdon[chon] ;
					chon-- ;
					HightLight();
					gotoxy(cot,dong+chon);
					cout<<Thucdon[chon] ;
		}break;
		case Down: if(chon+1<so_itemp){
					Normal() ;
					gotoxy(cot,dong+chon) ;
					cout<<Thucdon[chon] ;
					chon++ ;
					HightLight() ;
					gotoxy(cot,dong+chon);
					cout<<Thucdon[chon];
		}break;
		case 13 : return chon+1 ;
	}	
	}while(true) ;
}
// Tim kiem ma so sinh vien
int Search(List &ds,int x){
	for(int i=0 ; i<ds.n ; i++){
		if(ds.Node[i]->maso==x) return i ;
	}
	return -1 ;
}
// Nhap chuoi
void Nhapchuoi(char *Tieude , char *s){
	cout<<"Tieu de:"; cin.ignore() ;
	do{
		gets(s) ;
	}while(strcmp(s,"")==0);
}
// Nhap danh sach 1 sinh vien
int NhapSV(List &ds, Sinhvien &sv){
	while(1){
		cout<<"Nhap ma so: ";
		cin >> sv.maso ;
		if(sv.maso<=0) return 0;
		if (Search(ds, sv.maso)>=0){
       		cout<<"Ma so sinh vien bi trung\n";
       		continue;
       	}
       	Nhapchuoi("Nhap ho: ",sv.ho) ;
       	Nhapchuoi("Nhap ten: ",sv.ten) ;
		return 1 ;	
	}
}
// Nhap danh sach sinh vien
void NhapDSSV(List &ds,int flag){
	Sinhvien sv ;
	// Xoa node khi flag = 0
	if(flag==0){
		while(ds.n>0){
			delete ds.Node[ds.n-1] ;
			ds.n-- ; 
		}
	}
	// Nhap danh sach hoc vien
	while(ds.n<MAXLIST){
		if(NhapSV(ds,sv)==0) return ;
		ds.Node[ds.n]= new Sinhvien ;
		*ds.Node[ds.n] = sv ;
		ds.n++ ;
	}
	if(ds.n==MAXLIST){
		cout<<"Danh sach day\n";
	}
}
// Liet ke danh sach
void Lietkeds(List ds){
	cout<<setw(20) <<"DANH SACH HOC VIEN\n";
	cout<<setw(10)<<"Ma so"<<setw(10)<<"Ho "<<setw(10)<<"Ten\n";
	for(int i=0 ; i<ds.n ; i++){
		cout<<setw(10)<<ds.Node[i]->maso<<setw(10)<<ds.Node[i]->ho<<setw(10)<<ds.Node[i]->ten<<endl ;
	}
}
int main(){
	List ds ;
        ds.n=0 ;
	Sinhvien sv ;
	//MenuDong(Thucdon) ;
	NhapDSSV(ds,0);
	return 0 ;
}

Dòng 2: #Include <mylib,h>, viết hoa (i -> I) và dấu phẩy mà vẫn biên dịch được luôn á? :thinking:

Nếu vẫn biên dịch và chạy đươc:

Lúc này ds.n đang bằng bao nhiêu nhỉ? Bạn thử in ra ngay sau khi khai báo ds thử xem.

	List ds ;
	cout<< ds.n << endl;
2 Likes

Em đã khởi tạo số phần tử cho danh sách rồi , nhưng khi em nhập tên thì nó lại mất kí tự đầu tiên , em thử cin.ignore() rồi nhưng vẫn không được ạ

Em sửa được rồi ạ , anh giải thích giúp em cái hàm Nhapchuoi()

void Nhapchuoi(char *Tieude , char *s){
   cout<<"Tieu de:"; cin.ignore() ; // em xóa cin.ignore() thì nó lại không mất kí tự đầu khi nhập tên ạ
   do{
   	gets(s) ;
   }while(strcmp(s,"")==0);
}
1 Like

cin.ignore là như này: nó bỏ qua 1 (hay nhiều) kí tự trong cin. Xem cppreference để biết thêm chi tiết.

Ngoài ra nhập xuất cơ bản (conio, ncurses ko phải) trong C/C++ phải qua bộ đệm (buffered). Sau khi khắc ghi hai điều này thì hiện tượng trôi chuỗi là như này:

  • Khi yêu cầu nhập thì chtr sẽ rút từ bộ đệm, nếu hết thì mới hiện dấu nhắc.
  • Khi nhập số thì số đi, \n hay [khoảng trắng] ở lại.
  • Vì nó ở lại nên tiếp theo mà nhập chuỗi thì sẽ “hưởng” luôn mấy kí tự này không cho nhập luôn.
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?