Mô Tả Đề Tài: Giả sử : chúng ta có một nhà trọ có 5 phòng và 7 sinh viên.Nhiệm vụ của đề tài là quản lý danh sách siên viên có trong nhà trọ,thực hiện thêm một sinh viên vào nhà trọ hoặ
Trang 1ĐỀ TÀI:
QUẢN LÝ NHÀ TRỌ
I Mô Tả Đề Tài:
Giả sử : chúng ta có một nhà trọ có 5 phòng và 7 sinh viên.Nhiệm vụ của đề tài là quản lý danh sách siên viên có trong nhà trọ,thực hiện thêm một sinh viên vào nhà trọ hoặc xóa một sinh viên ra khỏi nhà trọ,có thể xem tiền phòng của bất cứ phòng nào và số tiền mà mỗi sinh viên trong phòng đó phải trả,…
II Nội Dung Chi Tiết Của Đề Tài:
1.Dữ Liệu:
-Dữ liệu vào là các file text(hoặc có thể từ bàn phím):
+ nhapsv.inp: là file text chứa thông tin sinh viên muốn đưa vào nhà trọ.
+ nhappt.inp: là file text chứa thông tin về các sinh viên có trong phòng và những thông tin khác của phòng.
+nhapnt.inp: là file text chứa thông tin các phòng trọ,các sinh viên,và các thông tin khác về nhà tro.
-Dữ liệu vào là các file text(hoặc có thể xuất ra màn hình):
+xuatsv.out: là file text chứa thông tin sinh viên sau khi đã nhập sinh viên từ file nhapsv.inp hoặc từ bàn phím.
+xuatpt.inp: là file text chứa thông tin về các sinh viên có trong phòng và những thông tin khác của phòng sau khi đã nhập phòng trọ từ file nhappt.inp hoặc từ bàn phím.
+xuatnt.out: là file text chứa thông tin các phòng trọ,các sinh viên,và các thông tin khác về nhà tro sau khi đã nhập nhà trọ từ file nhapnt.inp hoặc từ bàn phím.
2.Các Lớp , Các Phương Thức và Các Giả Thuật Tương Ứng:
a./Class Date:
+Date.h:
Gồm có các thuộc tính:ngày(d),tháng(m),năm(y).Dùng để quản lý các biến kiểu Date.
#pragma once
#include "iostream"
using namespace std;
class Date {
private:
int d,m,y;
public:
Date();//phương thức Khởi Tạo Không đối số Date(int,int,int);// phương thức Khởi tạo có đối số Date(const Date&);// phương thức coppy
~Date();//phương thức hủy void Nhap();//phương thức Nhập void In()const;// phương thức Xuất bool ktNgay(int,int,int);// phương thức Kiểm tra ngày int getDay();//phương thức Lấy ngày của một biến kiểu ngày
Trang 2int getMonth();//phương thức Lấy tháng của một biến kiểu ngày int getYear();//phương thức Lấy năm của một biến kiểu ngày void setDay(int); // phương thức đưa số int làm ngày void setMonth(int); // phương thức đưa số int làm ngày void setYear(int); // phương thức đưa số int làm ngày void cong(int n);//Cộng số int n và lấy ngày sau khi cộng n void tru(int n);//Trừ số int n và lấy ngày sau khi cộng n char* toString()const;//Chuyển biến kiểu ngày sang chuỗi friend istream& operator>>(istream& is,Date&);//Nạp Chồng pt Nhập friend ostream& operator<<(ostream& os,Date&);//Nạp Chồng pt xuất
void operator=(const Date&);//Nạp Chồng pt copy void operator+(int n);//Nạp chồng pt cộng một số void operator-(int n);// Nạp chồng pt trừ một số };
b./Class Sinhvien:
Gồm có các thuộc tính:mã sinh viên(masv),họ tên sinh viên(hoten),quê quán sinh viên(quequan),số thứ tự của sinh viên(stt) và ngày sinh của sinh
viên(ngaysinh)
#include "Date.h"
class Sinhvien
{
private:
char *masv,*hoten,*quequan;
int stt;
Date ngaysinh;
public:
Sinhvien();
Sinhvien(char*,char*,char*,int,Date);
Sinhvien(const Sinhvien&);
~Sinhvien();
void Nhap();
void Nhapsvt();
void In() const;
void Insvt();
char* get_masv() const;
char* get_hoten() const;
char* get_quequan() const;
int get_stt()const;
Date get_ngaysinh() const;
void set_masv(char*);
void set_hoten(char*);
void set_quequan(char*);
void set_stt(int);
void set_ngaysinh(Date);
friend istream& operator>>(istream& is,Sinhvien&);
friend ostream& operator<<(ostream& os,Sinhvien&);
void operator=(const Sinhvien&);
};
Thiết kế:
+Sinhvien::Sinhvien():ngaysinh()//phương thức khởi tạo không đối
số:
Các thuộc tính masv,hoten,quequan được gán bằng NULL,stt gán bắng 0
Vd:
Trang 3masv=new char[1];
masv[0]=NULL;
stt=0;
+Sinhvien::Sinhvien( char * ma, char * ht, char * qq, int s,Date d) :ngaysinh(d)//phương thức khởi tạo có đối số:
Đối với thuộc tính masv:Trước hết ta kiểm tra xem masv có bằng NULL hay không,nếu bằng thì ta thực hiện công việc xóa bằng hàm delete[].Sau đó ta cắp phát bộ nhớ với số phần tử bằng chiều dài của chuỗi ma được truyền vào
Vd:
if(masv!=NULL)
delete[] masv;
masv=new char[strlen(ma)+1];
strcpy(masv,ma);
Tương tự đối với các thuộc tính hoten và quequan
Đối với thuộc tính stt thì ta gán trực tiếp bằng biến s được truyền vào
Vd: stt=s;
Đối với thuộc tính ngaysinh thì ta thực hiện việc copy bằng phương thức copy được hỗ trợ bên class Date
+ Sinhvien::Sinhvien( const Sinhvien &s)//phương thức copy
Ta chỉ cần copy từng thuộc tính của Sinhvien s qua là xong
Vd:
masv=s.masv;
+Sinhvien::~Sinhvien()//phương thức hủy
Đối với các thuộc tính masv,hoten,quequan ta thực hiện việc xóa bằng hàm delete []
Vd:
delete[] masv;
Đối với thuộc tính stt thì ta gán bắng 0;
Đối với thuộc tính ngaysinh thì ta gọi lạ hàm hủy bên lớp ngày Vd:
ngaysinh.~Date();
+ void Sinhvien::Nhap()//phương thức nhập sinh viên từ bàn phím
Đối với thuộc tính masv:để tránh dư thừa bộ nhớ ,trước hết ta khai báo một chuỗi char *tam,cấp phát và thực hiện nhập mã sinh viên vào tam.Sau đó ta kiễm tra nếu masv khác NULL thì xóa,kế tiếp cấp phát bộ nhớ với số phần tử chính là chiểu dài của chuỗi tam , tiếp theo dùng hàm strcpy(chuỗi đích,chuỗi nguồn) là xong Vd:
char *tam;
tam=new char[100];
cout<<"Nhap vao ma so Sinh Vien: "; gets(tam);
if(masv!=NULL)
delete[] masv;
masv=new char[strlen(tam)+1];
strcpy(masv,tam);
flushall();//xóa vùng đệm Tương tự đối với các thuộc tính hoten và quequan
Đối với thuộc tính stt và ngaysinh ta dùng hàm cin>>{tên biến} để nhập trực tiếp
+ void Sinhvien::In() const//phương thức xuất ra màn hình
Ta dùng cout<<{tên biến} để xuất ra từng thuộc tính
Vd:
cout<<masv<<"\t\t"<<hoten<<"\t\t"<<quequan<<"\t\t"<<stt<<endl; cout<<"Ngay Sinh cua Sinh Vien nay la:"<<endl;
Trang 4ngaysinh.In();//hoặc cout<<ngaysinh cout<<endl;
+ void Sinhvien::Nhapsvt()//phương thức nhập một sinh viên
từ file nhapsv.inp
Trước hết ta include thư viên fstream vào.Sau đó ta khai báo biến kiểu ifstream f.Tiếp theo thực hiện việc mở file nhapsv.inp để đọc
dữ liệu
Đối với thuộc tính masv:ta khai báo một chuỗi char * matam , cấp phát và thực hiện việc nhập vào chuỗi matam bằng hàm f.get(matam,100);thực hiên lệnh f.ignore() để bỏ qua những kí tự không cần thiết và xuống dòng.Kế tiếp, ta cấp phát bộ nhớ cho masv
và copy là xong
Vd:
char *matam;
matam=new char[100];
ifstream f;
f.open("nhapsv.inp");
f.get(matam,100);
f.ignore();
if(masv!= NULL) delete[] masv;
masv=new char[strlen(matam)+1];
strcpy(masv,matam);
Đối với các thuộc tính stt thì ta nhập trực tiếp bằng: f>>stt; Đối với thuộc tính ngaysinh thì ta nhập vào từng biến kiểu int và thực hiện những phương thức set được hỗ trợ bên class Date
Vd:
f>>dtam;
ngaysinh.setDay(dtam);
f>>mtam;
ngaysinh.setMonth(mtam);
f>>ytam;
ngaysinh.setYear(ytam);
Cuối cùng ta đống việc nhập bằng hàm f.close(); là xong
+ void Sinhvien::Insvt()//phương thức xuất ra file xuatsv.out
Trước hết ta khai báo con trỏ FILE *f,tiếp theo ta mỡ file xuatsv.out để ghi.Sau đó ta dùng hàm fprintf(f,”chuỗi”,biến) để xuất.Cuối cùng đóng file là xong
Vd: FILE *f;int d,y,m;
d=ngaysinh.getDay();
m=ngaysinh.getMonth();
y=ngaysinh.getYear();
f=fopen("Xuatsv.out","wt");
fprintf(f,"%s",masv);
fprintf(f,"\n");
fprintf(f,"%s",hoten);
fprintf(f,"\n");
fprintf(f,"%s",quequan);
fprintf(f,"\n");
fprintf(f,"%d",stt);
fprintf(f,"\n");
fprintf(f,"%d %d %d",d,m,y);
fclose(f);
+ char* Sinhvien::get_masv() const//phương thức lấy masv
Để tránh việc dữ liệu masv bị thay đỗi ngoài ý muốn,ta thực hiện việc copy masv qua chuỗi char *kq,sau đó trả về chuỗi kq
Vd:
char *kq;
Trang 5kq=new char[strlen(masv)+1];
strcpy(kq,masv);
return kq;
+Tương tự đối với các phương thức lấy hoten,quequan
+ Date Sinhvien::get_ngaysinh() const//phương thức lấy ngaysinh.
Ta chỉ việc trả về ngaysinh
Vd:
return ngaysinh;
+Tương tự với phương thức lấy stt
+ void Sinhvien::set_masv( char *st)//phương thức đưa một chuỗi st
vào làm mã số của sinh viên
Ta kiễm tra nếu masv bằng NULL thì xóa,cấp phát bộ nhớ và copy Vd:
if(masv!=NULL)
delete[] masv;
masv=new char[strlen(st)+1];
strcpy(masv,st);
+Tương tự với các phương thức set hoten và quequan
+void Sinhvien::set_stt( int s)//phương thức đưa một số s vào và
nhận giá trị của s làm stt
Ta chỉ cần gán stt=s là xong
+Tương tự với phương thức set ngaysinh
+istream& operator >>(std::istream &is,Sinhvien& S)//phương thức
nạp chồng phương thức nhập từ bàn phím
Giải thuật ta cũng làm giống như phương thức nhập từ bàn
phím.Nhưng cuối cùng ta trả về is( return is;)
Vd:
char *tam;
tam=new char[100];
cout<<"Nhap vao ma so Sinh Vien: "; gets(tam);
if(S.masv!=NULL)
delete[] S.masv;
S.masv=new char[strlen(tam)+1];
strcpy(S.masv,tam);
flushall();
+ostream& operator <<(std::ostream &os,Sinhvien& S)//nạp chồng
phương thức xuất ra màn hình
Giải thuật ta cũng làm giống như phương thức xuất ra màn
hình Nhưng cuối cùng ta trả về os( return os;)
Vd:
cout<<"Ma Sinh Vien/Ho Ten/Que Quan/So Thu TU"<<endl;
os<<S.get_masv()<<"\t"<<S.get_hoten()<<"\
t"<<S.get_quequan()<<"\t"<<S.get_stt()<<endl;
cout<<"Ngay Sinh cua Sinh Vien nay la:"<<S.get_ngaysinh()<<endl;
cout<<endl;
return os;
+ void Sinhvien:: operator =( const Sinhvien& S)//nạp chồng phương
thức copy Sinhvien
Ta copy từng thuộc tính của Sinhvien S là xong
Vd:
masv=S.masv;
Trang 6quequan=S.quequan;
ngaysinh=S.ngaysinh;
stt=S.stt;
c./Class Phongtro:
Gồm có các thuộc tính:số lượng sinh viên đang trọ trong phòng(sosv) , số điện(sodien) , số nước(sonuoc),số thứ tự của phòng(sttphong),ngày vào của phòng(ngayvao) và danh sách các sinh viên dó(dssv)
#include "Sinhvien.h"
#include "Date.h"
class Phongtro
{
private:
char *maphong;
int sosv,sodien,sonuoc,sttphong;
Sinhvien *dssv;
Date ngayvao;
public:
Phongtro();
Phongtro(char*,int,int,int,int,Sinhvien*,Date);
Phongtro(const Phongtro&);
~Phongtro();
void Nhap();
void Nhapptt();
void In();
void Inptt();
char* get_maphong()const;
Sinhvien* get_dssv()const;
int get_sosv()const;
int get_sodien()const;
int get_sonuoc()const;
int get_sttphong() const;
Date get_ngayvao()const;
Date get_ngaydongtien();
void set_maphong(char*);
void set_sosv(int);
void set_sodien(int);
void set_sonuoc(int);
void set_sttphong(int);
void set_ngayvao(Date);
void set_dssv(Sinhvien*);
void insert_sv(const Sinhvien&);
void delete_sv(char*);
friend istream& operator>>(istream& is,Phongtro&);
friend ostream& operator<<(ostream& os,Phongtro&);
void operator=(const Phongtro&);
void capphat(int);
Sinhvien & operator [](int );
};
Thiết kế:
+Phongtro::Phongtro():ngayvao()//phương thức khởi tạo không đối số + Phongtro::Phongtro( char *st, int ssv, int sd, int sn, int
sttp,Sinhvien *ds,Date d):ngayvao(d)//phương thức khởi tao có đối
số
Trang 7Giải thuật cũng giống như Class Sinhvien.Nhưng điểm cần chú ý là dssv của chúng ta phải được cấp phát với số phần tử là số lượng sv
Vd:
dssv=new Sinhvien[sosv+1];
f(sosv>0){
for(int i=0;i<sosv;++i){
tam=new char[strlen(ds[i].get_masv())+1];
strcpy(tam,ds[i].get_masv());
dssv[i].set_masv(tam);
tam=new char[strlen(ds[i].get_hoten())+1];
strcpy(tam,ds[i].get_hoten());
dssv[i].set_hoten(tam);
tam=new char[strlen(ds[i].get_quequan())+1];
strcpy(tam,ds[i].get_quequan());
dssv[i].set_quequan(tam);
dssv[i].set_ngaysinh(ds[i].get_ngaysinh());
}
+ Phongtro::Phongtro( const Phongtro &p):ngayvao(p.ngayvao)//hàm
copy
+ Phongtro::~Phongtro()//hàm hủy
+ void Phongtro::Nhap()//phương thức nhập từ bàn phím
Giải thuật cũng tương tự như class Sinhvien,điểm cần chú ý là là khi nhập dssv thì ta phải cấp phát bộ nhớ và gọi lại phương thức nhập của từng Sinhvien được hỗ trợ bên class Sinhvien
Vd:
if(sosv>0){
this->dssv=new Sinhvien[sosv+1];
for(i=0;i<sosv;++i){
cout<<endl;
flushall();
cout<<"Nhap ma so Sinh vien thu "<<i+1<<":"<<endl;
dssv[i].Nhap();
} + void Phongtro::Nhapptt()//phương thức nhập từ file nhappt.inp
+ void Phongtro::In()//phương thức xuất ra màn hình
+ void Phongtro::Inptt()//phương thức xuẩt ra file xuatpt.out
+ Các phương thức get và set giãi thuật cũng không khác gì class Sinhvien
vd:
Sinhvien* Phongtro::get_dssv()const{
Sinhvien *tam;
tam=new Sinhvien[100];
for(int i=0;i<sosv;++i){
tam[i]=dssv[i];
} return tam;
}
+ istream& operator >>(std::istream& is,Phongtro &P)//phương thức
nạp chống phương thức nhập từ bàn phím
Trang 8+ ostream& operator <<(std::ostream& os,Phongtro &P)//nạp chống
phương thức xuất ra màn hình
+ void Phongtro:: operator =( const Phongtro &p)//nạp chồng phương
thức copy
+ Date Phongtro::get_ngaydongtien()//phương thức lấy ngày đống
tiền của phòng
Ta chỉ cần lấy ngày vào của phòng và cộng cho 30 ngày
Vd:
ngayvao+30;
return ngayvao;
+ void Phongtro::insert_sv( const Sinhvien& S)//phương thức chèn
một sinh viên vào phòng tro
Giải thuật là:ta dùng một danh sách sinh viên tạm để lưu lại những sinh viên trong phòng trọ.Số phần tử của danh sách sinh viên tạm này chính là số sinh viên có trong phòn trọ
Vd:
Sinhvien *svtam;
svtam=new Sinhvien[sosv+1];
for(int i=0;i<sosv;++i){
svtam[i].set_masv(dssv[i].get_masv());
svtam[i].set_hoten(dssv[i].get_hoten());
svtam[i].set_quequan(dssv[i].get_quequan());
svtam[i].set_stt(dssv[i].get_stt());
svtam[i].set_ngaysinh(dssv[i].get_ngaysinh());
} Tiếp theo ta tăng số lượng sinh viên của phòng trọ lên một đơn vị,thực hiện xóa danh sách sinh viên của,cấp phát bộ nhớ lại cho danh sách sinh viên mới với số lượng sinh viên là số lượng sinh viên viên vừa tăng lên ,copy sinh viên từ svtam qua dssv mới,
ta thực hiện công việc này đến sinh viên thứ sosv-1
Vd:
sosv=sosv+1;
delete[] dssv;
dssv=new Sinhvien[sosv+1];
for(int i=0;i<sosv-1;++i){
dssv[i].set_masv(svtam[i].get_masv());
dssv[i].set_hoten(svtam[i].get_hoten());
dssv[i].set_quequan(svtam[i].get_quequan());
dssv[i].set_stt(svtam[i].get_stt());
dssv[i].set_ngaysinh(svtam[i].get_ngaysinh());
} Cống việc còn lại là thực hiện đưa sinh viên cần thêm vào vị trí thứ sosv-1 là ta đã hoàng thành công việc thêm vào một sinh viên Vd:
dssv[sosv-1].set_masv(S.get_masv());
dssv[sosv-1].set_hoten(S.get_hoten());
dssv[sosv-1].set_quequan(S.get_quequan());
dssv[sosv-1].set_stt(S.get_stt());
dssv[sosv-1].set_ngaysinh(S.get_ngaysinh());
+ void Phongtro::delete_sv( char *ma)//phương thức xóa một sinh
viên có mã số là ma
Trước tiên ta khai báo một danh sách sinh viên tam.Cấp phát bộ nhớ cho danh sách sinh viên này với số lượng phần tử là sosv.Tiếp đến
ta thực hiện công việc dò xem sinh viên có mã số là ma có trong phòng trọ hay không.Những sinh viên đã được tìm qua chúng ta sẽ đưa vào trong danh sách sinh viên tam
Trang 9int i=0,j,k;
Sinhvien *svtam;
svtam=new Sinhvien[sosv+1];
while((strcmp(dssv[i].get_masv(),ma)!=0)&&i<sosv){
svtam[i].set_masv(dssv[i].get_masv());
svtam[i].set_hoten(dssv[i].get_hoten());
svtam[i].set_quequan(dssv[i].get_quequan());
svtam[i].set_stt(dssv[i].get_stt());
svtam[i].set_ngaysinh(dssv[i].get_ngaysinh());
i++;
} Nếu thoát khỏi vòng lập while mà số i của chúng ta nhỏ hơn sosv thì có nghĩa là ta đã tìm được sinh viên có mã số là ma.Chúng ta tiếp tục thực hiện công việc copy sinh viên thứ i+1 từ dssv vào svtam
Vd:
if(i<sosv){
for(j=i+1;j<sosv;++j){
svtam[j-1].set_masv(dssv[j].get_masv());
svtam[j-1].set_hoten(dssv[j].get_hoten());
svtam[j-1].set_quequan(dssv[j].get_quequan()); svtam[j-1].set_stt(dssv[j].get_stt());
svtam[j-1].set_ngaysinh(dssv[j].get_ngaysinh()); }
} Nếu thoát khỏi vòng lập mà số i bằng với sosv thì ta kết luận là không tồn tại sinh viên có mã số là ma , và thực hiện thoát giải thuật
Vd:
if(i==sosv){
cout<<"Khong co sinh vien ngay trong danh sach"<<endl; return;
} Công việc tiếp theo là xóa danh sách sinh viên của , giảm sosv xuống một đơn vị,cấp phát lại cho dssv mới với số lượng sinh viên
là sosv
Sau đó thực hiện copy từ svtam qua là xong
Vd:
delete[] dssv;
sosv=sosv-1;
dssv=new Sinhvien[sosv];
for(k=0;k<sosv;++k){
dssv[k].set_masv(svtam[k].get_masv());
dssv[k].set_hoten(svtam[k].get_hoten());
dssv[k].set_quequan(svtam[k].get_quequan());
dssv[k].set_stt(svtam[k].get_stt());
dssv[k].set_ngaysinh(svtam[k].get_ngaysinh());
}
Trang 10+ void Phongtro::capphat(int a)//phương thức cấp phát bộ nhớ cho
dssv với số lượng phần tử là a
Vd:
delete[] dssv;
dssv=new Sinhvien[a+1];
+Sinhvien & Phongtro::operator [](int i)//phương thức lấy sinh viên thứ i của phòng trọ
{
if(i>0&&i<this->sosv)
return dssv[i];
}
d./Class Nhatro:
Gồm có các thuộc tính như mã nhà trọ(mant),tên nhà trọ(tennt),địa chỉ của nhà trọ(diachint),tổng số sinh viên đang tro(tgsosv),số phòng trong nhà
trọ(sophong), tiền điện (tiendien) , tiền nước(tiennuoc),tiền phòng(tienphong) và danh sách các phòng có trong nhà trọ(dspt).
#include "Phongtro.h"
class Nhatro
{
private:
char *mant,*tennt,*diachint;
int tgsosv,sophong;
float tiendien,tiennuoc,tienphong;
Phongtro *dspt;
public:
Nhatro();
Nhatro(char*,char*,char*,int,int,float,float,float,Phongtro*); Nhatro(const Nhatro&);
~Nhatro();
void Nhap();
void Nhapntt();
void In();
void Inntt();
char* get_mant()const;
char* get_tennt()const;
char* get_diachi()const;
int get_tgsosv()const;
int get_sophong()const;
float get_tiendien()const;
float get_tiennuoc()const;
float get_tienphong()const;
Phongtro* get_dspt()const;
void set_mant(char*);
void set_tennt(char*);
void set_diachi(char*);
void set_tgsosv(int);
void set_sophong(int);
void set_tiendien(float);
void set_tiennuoc(float);
void set_tienphong(float);
void set_dspt(Phongtro*);
float get_tienmoiphong(int);
float get_tienmoisv(int);