⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 这是毕业设计的程序主要是图书管理功能,希望大家给给意见
💻 CPP
📖 第 1 页 / 共 3 页
字号:

/* ==================================================== */
/*                                                      */
/* 学生宿舍管理系统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 + -