Góp ý về đồ án nhỏ mình tự viết

Em có chương trình nhỏ mất gần 2 tháng mới viết xong. Dù đã hết hạn nộp bài nhưng cảm giác khá là sung sướng khi tự mình viết hết tất cả. Mấy anh chị chạy rồi cho em xin lời gốp ý với ạ. Có sai sót ở thiếu ở một số kiều kiện nhập ạ.

#include<iostream>
#include<iomanip>
using namespace std;
struct date{
	int ngay;
	int thang;
	int nam;
};
struct thongtinlophoc{
	char malophoc[5];
	char hotengiaovien[30];
	int siso;
	char chude[30];
	date ngaybatdau;
	date ngayketthuc;
};
struct danhsach{
	int solophoc;
	thongtinlophoc danhsachlophoc[50];
};
void nhapthongtin(thongtinlophoc &lh){
	cout << "\nNhap ma so lop hoc:";
	fflush(stdin);
	cin.getline(lh.malophoc, 6);
	cout << "\nNhap ho ten giao vien:";
	fflush(stdin);
	cin.getline(lh.hotengiaovien, 31);
	cout << "\nNhap chu de cua lop hoc:";
	fflush(stdin);
	cin.getline(lh.chude, 31);
	cout << "\nNhap si so:";
	cin >> lh.siso;
	cout << "\nNhap ngay bat dau:";
	cin >> lh.ngaybatdau.ngay >> lh.ngaybatdau.thang >> lh.ngaybatdau.nam;
	cout << "\nNhap ngay ket thuc:";
	cin >> lh.ngayketthuc.ngay >> lh.ngayketthuc.thang >> lh.ngayketthuc.nam;
}
void xuatthongtin(thongtinlophoc lh){
	cout << "\nMa lop hoc: " << lh.malophoc;
	cout << "\nHo ten giao vien :" << lh.hotengiaovien;
	cout << "\nChu de: " << lh.chude;
	cout << "\nSi so: " << lh.siso;
	cout << "\nNgay bat dau: " << lh.ngaybatdau.nam << "/" << lh.ngaybatdau.thang << "/" << lh.ngaybatdau.nam;
	cout << "\nNgay ket thuc: " << lh.ngayketthuc.thang << "/" << lh.ngayketthuc.thang << "/" << lh.ngayketthuc.nam;
}
void nhaplophoc(danhsach &list){
	cout << "\nNhap so luong lop hoc: ";
	cin >> list.solophoc;
	for (int i = 0; i < list.solophoc; i++)
	{
		cout << "\nNhap lop hoc thu: " << i + 1;
		nhapthongtin(list.danhsachlophoc[i]);
	}
}
void xuatlophoc(danhsach list)
{
	for (int i = 0; i < list.solophoc; i++){
		cout << "\nLop hoc thu: " << i + 1<<"\n";
		xuatthongtin(list.danhsachlophoc[i]);

	}
}
void themlophoc(danhsach &list){
	int n;
	cout << "\nNhap so lop hoc can them: " ;
	cin >> n;
	int t = list.solophoc;
	list.solophoc += n;
	for (int i = t; i < list.solophoc; i++){
		cout << "\nNhap lop hoc thu: " << i + 1;
		nhapthongtin(list.danhsachlophoc[i]);
	}
}

void timkiemlophoc(danhsach list){
	int n,kq;
	do{
		cout << "\n0. Thoat";
		cout << "\n1. Tim kiem theo ma lop hoc.";
		cout << "\n2. Tim kiem theo chu de.";
		cout << "\n3. Tim kiem theo ho ten giao vien.";
		cout << "\n4. Tim kiem theo si so.";
		cout << "\n5. Tim kiem theo ngay bat dau.";
		cout << "\n6. Tim kiem theo ngay ket thuc.";
		do{
			cout << "\nNhap lua chon: ";
			cin >> n;
		} while (!(n >= 0 && n <= 7));
		switch (n)
		{
		case 1:
			kq = 0;
			char h[5];
			cout << "\nNhap ma lop hoc can tim kiem: ";
			fflush(stdin);
			cin.getline(h, 6);
			for (int i = 0; i < list.solophoc; i++)
			{
				if (strcmp(h,list.danhsachlophoc[i].malophoc) == 0)
				{
					xuatthongtin(list.danhsachlophoc[i]);
					kq++;
				}
			}
			if (kq = 0){
				cout << "\nKhong co ma lop hoc nay trong danh sach.";
				break;
			}
			else break;
		case 2:
			kq = 0;
			char chude[30];
			cout << "\nNhap chu de can tim kiem: ";
			fflush(stdin);
			cin.getline(chude, 31);
			for (int i = 0; i < list.solophoc; i++)
			{
				if (strcmp(chude, list.danhsachlophoc[i].chude) == 0)
				{
					xuatthongtin(list.danhsachlophoc[i]);
					kq++;
				}
			}
			if (kq == 0)
			{
				cout << "\nKhong co chu de can tim kiem trong danh sach.";
				break;
			}
			else 
				break;
		case 3:
			kq = 0;
			char tengiaovien[30];
			cout << "\nNhap ten giao vien can tim kiem: ";
			fflush(stdin);
			cin.getline(tengiaovien, 31);
			for (int i = 0; i < list.solophoc; i++){
				if (strcmp(tengiaovien, list.danhsachlophoc[i].chude) == 0)
				{
					xuatthongtin(list.danhsachlophoc[i]);
					kq++;
				}
			}
			if (kq == 0){
				cout << "\nKhong co ten giao vien trong danh sach.";
				break;
			}
			else break;
		case 4:
			kq = 0;
			int siso;
			cout << "\nNhap si so can tim kiem: ";
			cin >> siso;
			for (int i = 0; i < list.solophoc; i++)
			{
				if (siso == list.danhsachlophoc[i].siso)
				{
					xuatthongtin(list.danhsachlophoc[i]);
					kq++;
				}
			}
			if (kq == 0){
				cout << "\nKhong co si so nay trong danh sach.";
				break;
			}
			else break;
		case 5:
			kq = 0;
			int a, b, c;
			cout << "\nNhap ngay thang nam bat dau: ";
			cin >> a;
			cin >> b;
			cin >> c;
			for (int i = 0; i < list.solophoc; i++)
			{
				if ((list.danhsachlophoc[i].ngaybatdau.nam == a) && (list.danhsachlophoc[i].ngaybatdau.thang == b) && (list.danhsachlophoc[i].ngaybatdau.nam == c))
				{
					xuatthongtin(list.danhsachlophoc[i]);
					kq++;
				}
			}
			if (kq == 0){
				cout << "\nKhong co thoi gian nam trong danh sach.";
				break;
			}
			else break;
		case 6:
			kq = 0;
			int n, m, d;
			cout << "\nNhap ngay thang nam ket thuc: ";
			cin >> n;
			cin >> m;
			cin >> d;
			for (int i = 0; i < list.solophoc; i++)
			{
				if ((list.danhsachlophoc[i].ngayketthuc.ngay == n )&& (list.danhsachlophoc[i].ngayketthuc.thang == m)&&(list.danhsachlophoc[i].ngayketthuc.nam == d))
				{
					xuatthongtin(list.danhsachlophoc[i]);
					kq++;
				}
			}
			if (kq == 0){
				cout << "\nThoi gian nay khong co trong danh sach.";
				break;
			}
			else break;
		}
	} while (n != 0);
}
void xoalophoc(danhsach &list){
	int flag = 0;
	char malophoc[30];
	cout << "\nNhap ma so lop hoc can xoa: ";
	fflush(stdin);
	cin.getline(malophoc, 31);
	for (int n = 0; n < list.solophoc; n++)
	{
		if (strcmp(malophoc, list.danhsachlophoc[n].malophoc) == 0)
			flag = 1;
	}
	if (flag == 1)
	{
		for (int i = 0; i < list.solophoc; i++)
		{
			if (strcmp(malophoc, list.danhsachlophoc[i].malophoc) == 0)
			{
				list.danhsachlophoc[i] = list.danhsachlophoc[i + 1];
				for (int n = i + 1; n < list.solophoc; n++)
				{
					list.danhsachlophoc[n] = list.danhsachlophoc[n + 1];
				}

				list.solophoc--;
			}
		}
	}
	else cout << "\nKhong co ma lop hoc nay trong danh sach.";
}
void capnhaplophoc(danhsach &list)
{
	int a, u;
		cout << "\nCap nhap lop hoc thu: ";
		cin >> u;
		u -= 1;
		do{
			cout << "\n0. Thoat.";
			cout << "\n1. Cap nhap lai ma so lop hoc.";
			cout << "\n2. Cap nhap lai chu de.";
			cout << "\n3. Cap nhap lai si so.";
			cout << "\n4. Cap nhao lai ten giao vien.";
			cout << "\n5. Cap nhap lai thoi gian bat dau.";
			cout << "\n6. Cap nhap lai thoi gian ket thuc.";
			cout << "\nNhap lua chon: ";
			do{
				cin >> a; 
			} while (!(a >= 0 && a <= 6));
			switch (a)
			{
			case 1:
				cout << "\nNhap ma lop hoc moi: ";
				fflush(stdin);
				cin.getline(list.danhsachlophoc[u].malophoc, 6);
				break;
			case 2:
				cout << "\nNhap lai chu de moi: ";
				fflush(stdin);
				cin.getline(list.danhsachlophoc[u].chude, 31);
				break;
			case 3:
				cout << "\nNhap lai si so moi: ";
				cin >> list.danhsachlophoc[u].siso;
				break;
			case 4:
				cout << "\nNhap lai ten giao vien moi: ";
				fflush(stdin);
				cin.getline(list.danhsachlophoc[u].hotengiaovien, 31);
				break;
			case 5:
				cout << "\nNhap lai thoi gian bat dau moi: ";
				cin >> list.danhsachlophoc[u].ngaybatdau.ngay;
				cin >> list.danhsachlophoc[u].ngaybatdau.thang;
				cin >> list.danhsachlophoc[u].ngaybatdau.nam;
				break;
			case 6:
				cout << "\nNhap lai thoi gian ket thuc moi: ";
				cin >> list.danhsachlophoc[u].ngayketthuc.ngay;
				cin >> list.danhsachlophoc[u].ngayketthuc.thang;
				cin >> list.danhsachlophoc[u].ngayketthuc.nam;
				break;
			}
		} while (a != 0);
}
void dongnhat(danhsach list){
	int max = list.danhsachlophoc[0].siso;
	for (int i = 0; i < list.solophoc; i++)
	{
		if (max < list.danhsachlophoc[i].siso)
			max = list.danhsachlophoc[i].siso;
	}
	cout << "\nLop hoc co si so dong nhat la: \n";
	for (int i = 0; i < list.solophoc; i++)
	{
		if (max == list.danhsachlophoc[i].siso)
			xuatthongtin(list.danhsachlophoc[i]);
	}
}
void thongke(danhsach list){
	int i = 0; int j = 0;
	while (i < list.solophoc){
		int dem = 1;
		j = i;
		while (j < list.solophoc){
			if (strcmp(list.danhsachlophoc[j + 1].chude, list.danhsachlophoc[j].chude) == 0){
				j++;
				dem++;
			}
			else break;
		}
		cout << "\nChu de " << list.danhsachlophoc[i].chude << "xuat hien " << dem << " lan";
		i = i + dem;
	}
}
void sapxep(danhsach list){
	int temp;
	for (int i = 0; i < list.solophoc-1; i++){
		for (int n = i + 1; n>0; n--){
			if (list.danhsachlophoc[n].siso > list.danhsachlophoc[n + 1].siso)
			{
				temp = list.danhsachlophoc[n].siso;
				list.danhsachlophoc[n].siso = list.danhsachlophoc[n + 1].siso;
				list.danhsachlophoc[n + 1].siso = temp;
			}
		}
	}
}
void main(){
	danhsach list;
	list.solophoc = 0;
	int luachon;
	do{
		cout << "\n0. Thoat.";
		cout << "\n1. Nhap lop hoc.";
		cout << "\n2. Xuat lop hoc.";
		cout << "\n3. Them lop hoc.";
		cout << "\n4. Tim kiem lop hoc.";
		cout << "\n5. Xoa lop hoc.";
		cout << "\n6. Cap nhap lai thong tin lop hoc.";
		cout << "\n7. Lop hoc co si so dong nhat la.";
		cout << "\n8. Sap xep lai hoc giam dan.";
		cout << "\n9. Thong ke cac lop hoc co cung chu de.";
		cout << "\nNhap lua chon: ";
		cin >> luachon;
		switch (luachon)
		{
		case 0:
			exit(0);
		case 1:
			nhaplophoc(list);
			break;
		case 2:
			if (list.solophoc == 0)
				cout << "\nKhong co lop hoc nao ca.";
			else 
				xuatlophoc(list);
			break;
		case 3:
			if (list.solophoc == 0)
				cout << "\nPhai nhap lop hoc truoc khi them.";
			else
				themlophoc(list);
			break;
		case 4:
			if (list.solophoc == 0)
				cout << "\nKhong co lop hoc nao trong danh sach de tim kiem.";
			else
				timkiemlophoc(list);
			break;
		case 5:
			if (list.solophoc == 0)
				cout << "\nKhong co lop hoc nao trong danh sach.";
			else xoalophoc(list);
			break;
		case 6:
			if (list.solophoc == 0)
				cout << "\nKhong co lop hoc nao de cap nhap.";
			else capnhaplophoc(list);
			break;
		case 7:
			if (list.solophoc == 0){
				cout << "\nKhong co lop hoc nao trong danh sach.";
				break;
			}
			else
				dongnhat(list);
			break;
		case 8:
			if (list.solophoc == 0){
				cout<<"\nKhong co lop hoc nao trong danh sach.";
				break;
			}
			else 
				sapxep(list);
			break;
		case 9:
			if (list.solophoc == 0){
				cout << "\nKhong co lop hoc nao trong danh sach.";
				break;
			}
			else thongke(list);
			break;
		}
	} while (true);
}
6 Likes

Bên mình đồ án quản lí thư viện không cho xài struct làm trong 20 ngày (2k5 dòng)

thêm cái ghi thông tin ra tếp. khi bạn chạy lại chương trình thì có sẵn thông tin nạp vào danh sách nữa!!!

2 tháng nói thật là quá lâu cho một bài tập có thể clone lại trong chưa đầy 1 buổi chiều.
Về logic thì mình không nói vì không đọc kĩ được code, còn bổ sung cho bạn là lên có CSDL tức file txt lưu lại tất cả thông tin, và load ngược lại lên ct, chạy xong rồi tắt di mất hết tiêu rồi

2 Likes

Nghe từ đồ án mình tưởng n phải hoành tráng

1 Like

Hồi xưa đề này mình làm là bài tập lớn lấy điểm thực hành của môn Kỹ Thuật lt thôi. Cũng struct lồng ntn mình viết mất 2 ngày và khoảng 1 ngày để fix mấy lỗi lặt vặt. Thật sự bạn viết 2 tháng thì thật lâu quá rồi.

Các bạn trên bình tĩnh, bạn ấy sinh năm 1997 tức là chỉ mới học xong HKI năm nhất thôi mà ;)…

2 Likes

Mới 97 mà vậy là tốt lắm rồi :slight_smile:

1 Like

Ủa, nếu không xài struct thì làm thế nào dc bn???

sẽ có struct cho bạn làm

ngày xưa thì ai mà chả như ai , cũng viết mấy chương trình consol , nhưng mà 2 tháng thì quá lâu thì phải , phân tích xong bài toán thì , viết code chắc trong 1 ngày là xong

Về thuật toán thì … mình lười đọc quá.
Mình chỉ nhận xét về cách tổ chức chương trình

  • Bạn bỏ hết trong 1 file .cpp à? - Không nên, tách ra để quản lí nhé
  • Có hàm quá dài - nên tách ra nhiều hàm
  • Các cách đặt tên (Biến, Hàm, Struct,…), một số điểm khác - nên tham khảo tài liệu Phong cách lập trình. Có thể tham khảo cơ bản tại đây hoặc tại đây

Mình lười đọc code quá, ahihi. Hai tháng thì hơi lâu, nhưng không sao, quan trọng là hai tháng đó học được gì thôi :smile:

1 Like

nghiên cứu về OOP đi em. nó sẽ giúp em thay 2 tháng = 2 giờ đó.

1 Like

:slight_smile: thì xài mảng 2 chiều bạn nhá,cứ mỗi 1 thông tin là một cái mảng 2 chiều :slight_smile:
Mỗi một hàm thì bạn phải cho một đống mảng thông tin vào viết muốn nhũng não
@Phong_Tran @stormitlv

Em cảm ơn mấy anh góp ý, sẽ cố gắng để đuổi kịp mấy anh

cứ học từ từ đi bạn , cố lên

ý mình là bạn có thể sẽ có 1 đa gần tương tự và dùng struct

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?