📄 main.cpp
字号:
/* ==================================================== */
/* */
/* 学生宿舍管理系统Ver 1.00.1 源代码 */
/* 文件名: Main.cpp */
/* 作用: 源代码的主文件,负责实现整体程序控制 */
/* 版权所有 (c) 2007 张元龙 保留所有权利 */
/* */
/* ==================================================== */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <graphics.h>
#include <conio.h>
#include <dos.h>
#include <bios.h>
#include <time.h>
#include "MyIco.h"
#include "MyChn.h"
#include "MyMouse.h"
#include "MyImm.h"
#include "MyWindow.h"
#include "Login.h"
#include "DES.h"
typedef struct Tdorm;
typedef struct TStu;
typedef struct Tpay {
char value[16]; /*付款金额*/
char date[20]; /*付款日期*/
char payee[20]; /*收款人*/
TStu *stu; /*学生*/
Tpay *pre; /*前一项记录*/
Tpay *next; /*后一项记录*/
} *ppay;
typedef struct TStu { /*学生类型定义*/
char name[14]; /*学生姓名*/
char num[14]; /*学生学号*/
char sex[6]; /*学生性别*/
char birthday[20]; /*出生日期:19XX/XX/XX*/
char type[10]; /*学生类别*/
char LengthOfEdu[10]; /*学制*/
char InYear[10]; /*入学年份*/
char Class[30]; /*班级*/
char roomnum[14]; /*宿舍房间号码*/
char room[30]; /*宿舍信息=house+roomnum*/
char phone[16]; /*联系电话*/
char EMail[30]; /*E-Mail*/
char lack[16]; /*欠费金额*/
char need[16]; /*应缴金额*/
char payed[16]; /*已缴金额*/
int year; /*入学年份*/
int month; /*入学月份*/
int count; /*总缴费次数*/
float tot; /*已缴费金额*/
Tdorm *phouse; /*所属宿舍*/
TStu *pre; /*链表中的上一个学生*/
TStu *next; /*链表中的下一个学生*/
ppay first; /*第一项收款记录*/
} TStudent,*pStudent,*pStu;
typedef struct Tdorm{ /*宿舍楼类型定义*/
char name[14]; /*宿舍楼名字*/
char manager[14]; /*宿舍管理员*/
char phone[16]; /*值班室电话*/
char rooms[10]; /*房间数目*/
char beds[10]; /*床位数*/
char cost[16]; /*一年的住宿费用*/
char students[16]; /*已住学生数*/
char spare[16]; /*剩余床位*/
char rate[10]; /*入住率*/
char earning[10]; /*收入*/
int count; /*学生总数*/
Tdorm *pre; /*前一栋宿舍*/
Tdorm *next; /*下一栋宿舍*/
pStudent first; /*第一个学生*/
} Thouse,*pHouse;
/*窗体句柄定义*/
Hwnd AboutWindow,LoginWindow,MainWindow,ChgPassWindow,HouseWindow,StuWindow,StatHouseWindow;
Hwnd HelpWindow;
struct { /*编辑宿舍楼窗体*/
Hwnd handle; /*句柄*/
Hwnd Edit1; /*窗体内的编辑筐*/
Hwnd Edit2;
Hwnd Edit3;
Hwnd Edit4;
Hwnd Edit5;
Hwnd Edit6;
} EditHouse;
struct { /*编辑学生信息窗体*/
Hwnd handle; /*句柄*/
Hwnd Edit1; /*窗体内的编辑筐*/
Hwnd Edit2;
Hwnd Edit3;
Hwnd Edit4;
Hwnd Edit5;
Hwnd Edit6;
Hwnd Edit7;
Hwnd Edit8;
Hwnd Edit9;
Hwnd Edit10;
Hwnd Edit11;
Hwnd Edit12;
} EditStu;
struct {
Hwnd handle; /*学生付款窗体*/
Hwnd Label1; /*窗体内的标签*/
Hwnd Label2;
Hwnd Label3;
Hwnd Label4;
Hwnd Label5;
Hwnd Label6;
Hwnd Label7;
Hwnd Edit1;
Hwnd Edit2;
} PayWindow;
/*编辑筐句柄定义*/
Hwnd PassEdit,OrgPass,NewPass,RePass,FindHouseEdit,FindStuEdit;
Hwnd HouseList,StuList,PayList,StatHouseList;
bool Changed=false; /*信息是否被更改过*/
int TotOfHouse=0;
char Password[50]; /*记录密码的MD5密文*/
char CommonBuf[512]; /*公共缓冲区*/
Thouse Head,*head=&Head; /*定义头指针*/
bool CheckValue(char *str){ /*检查字符串是否为数字*/
bool haved;
for (haved=false;*str;str++)
if (*str=='.')
if (haved) return false;
else haved=true;
else if (*str>'9' || *str<'0') return false;
return true;
}
bool CheckDate(Pchar date){ /*检查日期是否为年月*/
if (strlen(date)<6) return false;
if (date[4]!='-') return false;
int i;
for (i=0;i<4;i++)
if (date[i]>'9' || date[i]<'0') return false;
for (i=5;date[i];i++)
if (date[i]>'9' || date[i]<'0') return false;
return true;
}
/*=================================*/
/* 从磁盘文件中读取数据 */
/*=================================*/
void DecryptRead(void *pMem,int size,FILE *fp){ /*以密码的MD5密文为密钥进行DES解密读取*/
pchar p=(pchar)pMem;
while (size>=sizeof CommonBuf){
fread(CommonBuf,sizeof CommonBuf,1,fp);
DESDecrypt(CommonBuf,Password,sizeof CommonBuf);
memcpy(p,CommonBuf,sizeof CommonBuf);
size-=sizeof CommonBuf;
p+=sizeof CommonBuf;
}
if (size){
if (size % 8)
fread(CommonBuf,size/8*8+8,1,fp);
else
fread(CommonBuf,size,1,fp);
DESDecrypt(CommonBuf,Password,size);
memcpy(p,CommonBuf,size);
}
}
void ReadPay(int count,pStu stu,FILE *fp){
int i;
stu->first=NULL;
ppay p;
ppay pre=NULL;
for (i=0;i<count;i++){
p=(ppay)malloc(sizeof *p);
DecryptRead(p,sizeof *p,fp);
p->next=NULL;
p->pre=pre;
p->stu=stu;
if (pre) pre->next=p;
else stu->first=p;
pre=p;
}
}
void ReadStu(int count,pHouse House,FILE *fp){
int i;
House->first=NULL;
pStu p;
pStu pre=NULL;
for (i=0;i<count;i++){
p=(pStu)malloc(sizeof *p);
DecryptRead(p,sizeof *p,fp);
p->next=NULL;
p->pre=pre;
p->phouse=House;
if (pre) pre->next=p;
else House->first=p;
ReadPay(p->count,p,fp);
pre=p;
}
}
void ReadHouse(int count,FILE *fp){
int i;
pHouse p=head->next;
pHouse pre=head;
for (i=0;i<count;i++){
p=(pHouse)malloc(sizeof *p);
DecryptRead(p,sizeof *p,fp);
p->next=NULL;
p->pre=pre;
pre->next=p;
ReadStu(p->count,p,fp);
pre=p;
}
}
void LoadDat(){
FILE *fp;
fp=fopen("Dat\\Info.dat","r+b");
if (!fp) return;
DecryptRead(&TotOfHouse,sizeof TotOfHouse,fp);
ReadHouse(TotOfHouse,fp);
fclose(fp);
}
/*=================================*/
/* 写入数据到磁盘文件中 */
/*=================================*/
void EncryptWrite(void *pMem,int size,FILE *fp){ /*以密码的MD5密文为密钥进行DES加密存储*/
pchar p=(pchar)pMem;
while (size>=sizeof CommonBuf){
memcpy(CommonBuf,p,sizeof CommonBuf);
DESEncrypt(CommonBuf,Password,sizeof CommonBuf);
fwrite(CommonBuf,sizeof CommonBuf,1,fp);
size-=sizeof CommonBuf;
p+=sizeof CommonBuf;
}
if (size){
memcpy(CommonBuf,p,size);
DESEncrypt(CommonBuf,Password,size);
if (size % 8)
fwrite(CommonBuf,size/8*8+8,1,fp);
else
fwrite(CommonBuf,size,1,fp);
}
}
void WritePay(int count,pStu stu,FILE *fp){
int i;
ppay p=stu->first;
for (i=0;i<count;i++){
EncryptWrite(p,sizeof *p,fp);
p=p->next;
}
}
void WriteStu(int count,pHouse House,FILE *fp){
int i;
pStu p=House->first;
for (i=0;i<count;i++){
EncryptWrite(p,sizeof *p,fp);
WritePay(p->count,p,fp);
p=p->next;
}
}
void WriteHouse(int count,FILE *fp){
int i;
pHouse p=head->next;
for (i=0;i<count;i++){
EncryptWrite(p,sizeof *p,fp);
WriteStu(p->count,p,fp);
p=p->next;
}
}
void SaveDat(){
FILE *fp;
fp=fopen("Dat\\Info.dat","w+b");
if (!fp) return;
EncryptWrite(&TotOfHouse,sizeof TotOfHouse,fp);
WriteHouse(TotOfHouse,fp);
fclose(fp);
Changed=false;
}
/*=================================*/
/* 更新学生欠费信息 */
/*=================================*/
void UpdateStuLack(pStu p){
date s;
int i,j;
getdate(&s);
i=p->year*12+p->month;
j=s.da_year*12+s.da_mon;
if (i>j) strcpy(p->lack,"0.00");
else {
i=(j-i)/12+1;
double need=atof(p->phouse->cost)*i;
double tot=0;
ppay pay=p->first;
while (pay){
tot+=atof(pay->value);
pay=pay->next;
}
sprintf(p->need,"%.2lf",need);
sprintf(p->payed,"%.2lf",tot);
sprintf(p->lack,"%.2lf",need-tot);
}
}
/*==================================*/
/* 链表删除操作 */
/*==================================*/
void DelPay(ppay p){
if (!p) return;
if (p->next) p->next->pre=p->pre;
if (p->pre) p->pre->next=p->next;
else p->stu->first=p->next;
free(p);
Changed=true;
}
void DelStu(pStu p){
if (!p) return;
while (p->first)
DelPay(p->first);
if (p->next) p->next->pre=p->pre;
if (p->pre) p->pre->next=p->next;
else p->phouse->first=p->next;
free(p);
Changed=true;
}
void DelHouse(pHouse p){
if (!p) return;
while (p->first)
DelStu(p->first);
if (p->next) p->next->pre=p->pre;
p->pre->next=p->next;
free(p);
Changed=true;
}
/*=================================*/
/* 以下为响应各事件的回调函数 */
/*=================================*/
void OnAboutWindowClose(Hwnd handle){
if (handle && !GetWindow(MainWindow)->Showed) ShowWindow(LoginWindow);
}
void OnLogin(){
if (!login(GetEdit(PassEdit)->Text)){
GetEdit(PassEdit)->Text[0]=0;
MessageBox("您输入的密码不正确!","提示");
} else {
strcpy(Password,GetEdit(PassEdit)->Text);
MD5(Password,strlen(Password));
LoadDat();
CloseWindow(LoginWindow);
ShowWindow(MainWindow);
}
}
/*=================================*/
/* 改变密码的按钮回调函数 */
/*=================================*/
void OnChgPass(){
if (strcmp(GetEdit(NewPass)->Text,GetEdit(RePass)->Text)){
MessageBox("您输入的两次密码不一致!","提示");
return;
}
if (!login(GetEdit(OrgPass)->Text)){
MessageBox("您输入的原密码不正确!","提示");
return;
}
if (!SetPassword(GetEdit(NewPass)->Text)){
MessageBox("密码文件写入失败!","提示");
return;
}
strcpy(Password,GetEdit(NewPass)->Text);
MD5(Password,strlen(Password));
SaveDat();
GetEdit(OrgPass)->Text[0]=0;
GetEdit(NewPass)->Text[0]=0;
GetEdit(RePass)->Text[0]=0;
CloseWindow(ChgPassWindow);
MessageBox("密码修改成功!","提示");
}
void ChgPassButtonClick(){
ShowWindow(ChgPassWindow);
}
void UpdateList(Hwnd handle){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -