头文件:CommonData.h,用来定义本系统中所用到的各种重要的数据结构
/*头文件:CommonData.h,用来定义本系统中所用到的各种重要的数据结构*/
#ifndef __COMMONDATA__
#define __COMMONDATA__
typedef struct
{
int isValid; //标记该教师记录是否有效:1表示有效,0表示无效,别的数字非法
char TNo[12];//请输入11位教师编号;
char TGender;//教师性别:M表示男,F表示女;
char TName[21];//教师姓名;
int TGrade;//教师所教年级;
int TClass;//教师所教班级代码;
float TSalary;//教师工资;
}TeacherBasisInfor;
typedef struct
{
char UName[20];//用户名,不超过19个字符;
char UPassword[20];//用户名密码,不超过19个字符;
}UserInfo;
#endif
头文件Login.h,处理欢迎界面、用户的登录及注册功能,用户登录信息保存在文件UserInfo.dat文件中
/*头文件Login.h,处理欢迎界面、用户的登录及注册功能,用户登录信息保存在文件UserInfo.dat文件中*/
#include <stdio.h>
#include "CommonData.h"
#include <conio.h>
#include "graphics.h"
#include "windows.h"
/************************************************************/
/*函数:int UserRegister() */
/*功能:用户注册界面,返回0 */
/*参数:无 */
/*输入:用户输入用户名及密码 */
/*输出:注册成功信息 */
/*备注:本函数没有处理用户名重复的问题,请注册时自行注意 */
/************************************************************/
int UserRegister()
{
UserInfo oneUser;
char usernameInput[21]; //用户输入的用户名
char passwordInput[21]; //用户输入的密码
int isExist = false; //表示用户输入的用户名是否存在
FILE* fp;
if ((fp = fopen("UserInfo.dat", "rb")) == NULL) //用户信息文件不存在
{
fp = fopen("UserInfo.dat", "wb+"); //新建之
fclose(fp);
}
else
fclose(fp);
fp = fopen("UserInfo.dat", "rb");
InputBox(usernameInput, 21, "欢迎注册!\n请输入用户名(20个字符以内):");
while (true)
{
isExist = false;
rewind(fp);
while (!feof(fp))
{
int length = fread(&oneUser, sizeof(oneUser), 1, fp);
if (length == 0)
break;
if (strcmp(oneUser.UName, usernameInput) == 0) //用户存在
{
isExist = true;
break;
}
}
if (isExist) //如果用户已经存在,提示重新输入用户名
{
char strMsg[100];
sprintf(strMsg, "用户名%s已经存在!\n请重新输入一个用户名:", usernameInput);
memcpy(usernameInput, 0, 21); //清空原来输入的用户名
InputBox(usernameInput, 21, strMsg);
}
else
break;
}
fclose(fp);
InputBox(passwordInput, 21, "请输入密码(20个字符以内):");
strcpy(oneUser.UName, usernameInput);
strcpy(oneUser.UPassword, passwordInput);
fp = fopen("UserInfo.dat", "ab+");
fwrite(&oneUser, sizeof(oneUser), 1, fp); //将用户信息保存到文件中去
fclose(fp);
HWND wnd = GetHWnd(); //获取当前窗口句柄
::MessageBox(wnd, "注册成功,请登录系统", "注册成功", MB_OK); //弹出注册成功提示框
return 0;
}
/************************************************************/
/*函数:int UserLogin() */
/*功能:用户登录界面及验证,如果登录成功,返回1,失败返回0 */
/*参数:无 */
/*输入:用户输入用户名及密码 */
/*输出:登录是否成功信息 */
/************************************************************/
int UserLogin()
{
FILE* fp;
int n;
UserInfo oneUser;
char usernameInput[21]; //用户输入的用户名
char passwordInput[21]; //用户输入的密码
InputBox(usernameInput, 21, "请输入用户名(20个字符以内):");
InputBox(passwordInput, 21, "请输入密码:");
if ((fp = fopen("UserInfo.dat", "rb")) == NULL) //用户信息文件不存在,登录失败,提示用户先注册
{
HWND wnd = GetHWnd();
::MessageBox(wnd, "对不起,用户名不存在,请注册!", "登录失败", MB_OK);
return UserRegister();
}
while (!feof(fp))
{
int length = fread(&oneUser, sizeof(oneUser), 1, fp);
if (length == 0)
break;
if (strcmp(oneUser.UName, usernameInput) == 0) //用户存在
{
n = 0;
do {
n++;
if (strcmp(oneUser.UPassword, passwordInput) == 0) //密码匹配
{
fclose(fp);
HWND wnd = GetHWnd();
::MessageBox(wnd, "登录成功!", "登录成功", MB_OK);
return 1; //登录成功
}
else
{
InputBox(passwordInput, 21, "密码错误,请重新输入:");
}
} while (n < 3);
break;
}
}
fclose(fp);
HWND wnd = GetHWnd();
::MessageBox(wnd, "登录失败,请检查用户名和密码后重新登录!", "登录失败", MB_OK);
return 0; //登录失败
}
int Welcome()//用于用户注册,登录
{
int key;
char s1[]="学校工资管理系统";
char s2[]="1.用户登录";
char s3[]="2.用户注册";
char s4[]="0.退出系统";
char s5[]="请选择功能:";
char s6[]="开发:XXXXXXXXXXXX";
char s7[]="地址:XXXXXXXXXXXX"; //用户输入的功能号
while(TRUE)
{
setcolor(DARKGRAY);
setfont(40, 0, "黑体");
outtextxy(180, 10, s1);
setcolor(YELLOW);
setfont(25,0,"宋体");
outtextxy(230,100,s5);
setcolor(BLACK);
setfont(35,0,"宋体");
outtextxy(230,150,s2);
outtextxy(230,220,s3);
outtextxy(230,290,s4);
setfont(20,0,"LIGHTGRAY");
outtextxy(10,450,s6);
outtextxy(398,450,s7);
if(kbhit()) //如果某键被按下
{
key=getch(); //读取该键
if(key=='1') //如果划'1',表示用户登录
{
int res=UserLogin();
return res;
}
else if(key=='2') //如果是'2',表示用户注册
{
int res=UserRegister();
return res;
}else if(key=='0') //如果是'0',表示退出程序
{
HWND wnd = GetHWnd();
if(MessageBox(wnd,"是否退出系统?\n","退出系统", MB_ICONQUESTION | MB_YESNO)==IDYES)
{
closegraph();
exit(0);
}
}
}
}
}
效果图如下:
主要功能代码
#include <stdio.h>
#include <string.h>
#include "CommonData.h"
#include <conio.h>
#include "graphics.h"
int InputTeaBasisInfo()//输入教师信息
{
HWND wnd = GetHWnd();
TeacherBasisInfor oneTea;
char TNoInput[12];//请输入11位教师编号;
char TGenderInput[2];//教师性别:M表示男,F表示女;
char TNameInput[21];//教师姓名;
char TGradeInput[5];//教师所教专业代码;
char TClassInput[3];//教师所教班级代码;
char TSalaryInput[10];//教师工资;
int len; //用户输入的字符长度
int isExist; //是否存在
int isValid; //输入是否合法
FILE* fp;
if ((fp = fopen("TeaBasIn.dat", "rb")) == NULL) //学生基本信息文件不存在
{
fp = fopen("TeaBasIn.dat", "wb+");
fclose(fp);
}
else
fclose(fp);
InputBox(TNoInput, 12, "请输入11位教师编号");
len = strlen(TNoInput);
while (len != 11)
{
MessageBox(wnd, "教师编号只能为11位!\n请重新输入", "编号错误", MB_OK | MB_ICONWARNING);
InputBox(TNoInput, 12, "请输入11位教师编号");
len = strlen(TNoInput);
}
isExist = false;
fp = fopen("TeaBasIn.dat", "rb"); //重新打开教师基本信息文件
while (!feof(fp))
{
int length = fread(&oneTea, sizeof(TeacherBasisInfor), 1, fp);
if (length == 0)
break;
if (strcmp(oneTea.TNo, TNoInput) == 0) //该教师编号已存在
{
isExist = true;
break;
}
}
fclose(fp);
if (isExist) //如果该编号已存在,提示错误,直接返回
{
char strMsg[100];
sprintf(strMsg, "该教师编号%s(%s)已存在,请查正后再录入。\n录入教师失败!",
oneTea.TNo, oneTea.TName);
MessageBox(wnd, strMsg, "编号重复,添加失败", MB_OK | MB_ICONWARNING);
return 0;
}
InputBox(TNameInput, 21, "请输入教师姓名");
len = strlen(TNameInput);
while (len <= 0)
{
MessageBox(wnd, "姓名不能为空!\n请重新输入", "姓名错误", MB_OK | MB_ICONWARNING);
InputBox(TNameInput, 21, "请输入教师姓名");
len = strlen(TNameInput);
}
InputBox(TGenderInput, 2, "请输入教师性别(M男,F女):");
len = strlen(TGenderInput);
while (len != 1 || TGenderInput[0] != 'M' && TGenderInput[0] != 'F')
{
MessageBox(wnd, "性别只能是M或F!\n请重新输入", "性别错误", MB_OK | MB_ICONWARNING);
InputBox(TGenderInput, 2, "请输入教师性别(M男,F女):");
len = strlen(TGenderInput);
}
do {
isValid = true;
InputBox(TGradeInput, 5, "请输入教师所教年级(四位数,如:2015)");
if (strlen(TGradeInput) < 4)
{
MessageBox(wnd, "输入年级只能是4位整数,如2015\n请重新输入", "输入年级错误", MB_OK);
isValid = false;
continue;
}
int i = 0;
while (TGradeInput[i] != '\0')
{
if (TGradeInput[i] < '0' || TGradeInput[i]>'9')
{
isValid = false;
MessageBox(wnd, "输入年级只能是4位整数,如2015\n请重新输入", "输入年级错误", MB_OK);
break;
}
i++;
}
} while (!isValid);
do {
isValid = true;
InputBox(TClassInput, 5, "请输入教师所教班级(1-2位整数,如:2)");
if (strlen(TClassInput) < 1)
{
MessageBox(wnd, "输入班级只能是1或2位整数,如2\n请重新输入", "输入班级错误", MB_OK);
isValid = false;
continue;
}
int i = 0;
while (TClassInput[i] != '\0')
{
if (TClassInput[i] < '0' || TClassInput[i]>'9')
{
isValid = false;
MessageBox(wnd, "输入班级只能是1或2位整数,如2\n请重新输入", "输入班级错误", MB_OK);
break;
}
i++;
}
} while (!isValid);
do {
isValid = true;
InputBox(TSalaryInput, 10, "请输入教师工资");
if (TSalaryInput[0] == '0')
{
MessageBox(wnd, "工资首位不能为零", "输入工资错误", MB_ICONWARNING | MB_OK);
isValid = false;
continue;
}
int i = 0;
while (TSalaryInput[i] != '\0')
{
if (TSalaryInput[i] < '0' || TSalaryInput[i]>'9')
{
isValid = false;
MessageBox(wnd, "工资首位不能为零,每位都为整数", "输入工资错误", MB_OK);
break;
}
i++;
}
} while (!isValid);
char strOneTeaInfor[200] = "";
sprintf(strOneTeaInfor, "你录入的教师信息如下:\n\r编号:%s\n\r姓名:%s\n\r性别:%s\n\r所教年级:%s\n\r所教班级:%s\n\r工资: %s\n\r确认保存吗?",
TNoInput, TNameInput, TGenderInput, TGradeInput, TClassInput, TSalaryInput);
while (true)
{
if (MessageBox(wnd, strOneTeaInfor, "确认保存", MB_YESNO) == IDYES) //确认保存
{
TeacherBasisInfor tempTea;
tempTea.isValid = 1;
strcpy(tempTea.TNo, TNoInput);
strcpy(tempTea.TName, TNameInput);
tempTea.TGender = TGenderInput[0];
sscanf(TGradeInput, "%d", &(tempTea.TGrade));
sscanf(TClassInput, "%d", &(tempTea.TClass));
sscanf(TSalaryInput, "%f", &(tempTea.TSalary));
fp = fopen("TeaBasIn.dat", "ab+");
fwrite(&tempTea, sizeof(tempTea), 1, fp); //保存到文件的末尾
fclose(fp);
MessageBox(wnd, "保存成功!\n已录入一个教师", "保存成功", MB_OK | MB_ICONWARNING);
break;
}
else if (MessageBox(wnd, "真的放弃吗?", "确认放弃", MB_YESNO | MB_ICONQUESTION) == IDYES)
{
MessageBox(wnd, "已放弃保存,保存失败!", "已放弃保存", MB_OK | MB_ICONWARNING);
return 0;
}
}
return 1;
}
int Modifythesalary()//修改教师工资
{
HWND wnd = GetHWnd();
TeacherBasisInfor oneScore;
char TNoInput[12]; //用户输入的11位数字字符的教师编号
char TNameInput[21]; //输入教师姓名
char TSalaryInput[10]; //输入教师工资
int len;
int isExist;
FILE* fpss;
InputBox(TNoInput, 12, "请输入教师编号");
len = strlen(TNoInput);
while (len != 11)
{
MessageBox(wnd, "教师编号只能为11位!\n请重新输入", "编号错误", MB_OK | MB_ICONERROR);
InputBox(TNoInput, 12, "请输入11位教师编号");
len = strlen(TNoInput);
}
InputBox(TNameInput, 21, "请输入教师姓名");
len = strlen(TNameInput);
while (len <= 0)
{
MessageBox(wnd, "姓名不能为空!\n请重新输入", "姓名错误", MB_OK | MB_ICONWARNING);
InputBox(TNameInput, 21, "请输入教师姓名");
len = strlen(TNameInput);
}
if ((fpss = fopen("TeaBasIn.dat", "rb")) == NULL)
{
fpss = fopen("TeaBasIn.dat", "wb+");
fclose(fpss);
}
else
fclose(fpss);
fpss = fopen("TeaBasIn.dat", "rb+");
isExist = false;
while (!feof(fpss))
{
int length = fread(&oneScore, sizeof(oneScore), 1, fpss);
if (length == 0) break;
if (strcmp(oneScore.TNo, TNoInput) == 0 && //如果教师工资存在,确认修改
strcmp(oneScore.TName, TNameInput) == 0)
{
isExist = true;
InputBox(TSalaryInput, 10, "请输入要修改的工资");
len = strlen(TSalaryInput);
while (len <= 0)
{
MessageBox(wnd, "工资不能为空!\n请重新输入", "输入错误", MB_OK | MB_ICONWARNING);
InputBox(TSalaryInput, 10, "请输入要修改的工资");
len = strlen(TSalaryInput);
}
char strOneStuInfor[200] = "";
sprintf(strOneStuInfor, "教师编号:%s\n\r姓名:%s\n\r原工资:%.1f\n\r修改后工资:%s\n\r确认修改吗?",
oneScore.TNo, oneScore.TName, oneScore.TSalary, TSalaryInput);
if (MessageBox(wnd, strOneStuInfor, "确认修改", MB_YESNO) == IDYES) //确认保存
{
TeacherBasisInfor tempScore;
tempScore.isValid = 1;
strcpy(tempScore.TNo, TNoInput);
strcpy(tempScore.TName, TNameInput);
sscanf(TSalaryInput, "%f", &(tempScore.TSalary));
fseek(fpss, -sizeof(TeacherBasisInfor), SEEK_CUR);
fwrite(&tempScore, sizeof(tempScore), 1, fpss);
MessageBox(wnd, "修改成功!\n已修改一个教师工资", "修改成功",
MB_OK | MB_ICONWARNING);
}
else
MessageBox(wnd, "修改未完成", "修改失败", MB_OK | MB_ICONWARNING);
break;
}
}
fclose(fpss);
if (!isExist)
{
char strMsg[200];
sprintf(strMsg, "教师编号:%s\n姓名:%s\n该教师工资信息不存在。无法修改\n修改工资失败!",
TNoInput, TNameInput);
MessageBox(wnd, strMsg, "工资不存在,无法修改", MB_ICONWARNING | MB_OK);
return 0;
}
return 1;
}
int Querywages()//查询工资
{
HWND wnd = GetHWnd();
TeacherBasisInfor oneScore;
char TNoInput[12]; //用户输入的11位数字字符的教师编号
char TNameInput[21];//教师姓名
int len;
int isExist;
FILE* fpss;
InputBox(TNoInput, 12, "请输入教师编号");
len = strlen(TNoInput);
while (len != 11)
{
MessageBox(wnd, "教师编号只能为11位!\n请重新输入", "编号错误", MB_OK | MB_ICONERROR);
InputBox(TNoInput, 12, "请输入11位教师编号");
len = strlen(TNoInput);
}
InputBox(TNameInput, 21, "请输入教师姓名");
len = strlen(TNameInput);
while (len <= 0)
{
MessageBox(wnd, "姓名不能为空!\n请重新输入", "姓名错误", MB_OK | MB_ICONWARNING);
InputBox(TNameInput, 21, "请输入教师姓名");
len = strlen(TNameInput);
}
if ((fpss = fopen("TeaBasIn.dat", "rb")) == NULL)
{
fpss = fopen("TeaBasIn.dat", "wb+");
fclose(fpss);
}
else
fclose(fpss);
fpss = fopen("TeaBasIn.dat", "rb");
isExist = false;
while (!feof(fpss))
{
int length = fread(&oneScore, sizeof(oneScore), 1, fpss);
if (length == 0) break;
if (strcmp(oneScore.TNo, TNoInput) == 0 && //如果教师工资存在,查询
strcmp(oneScore.TName, TNameInput) == 0)
{
isExist = true;
char strOneStuInfor[200] = "";
sprintf(strOneStuInfor, "教师编号:%s\n\r姓名:%s\n\r工资:%.1f\n\r",
oneScore.TNo, oneScore.TName, oneScore.TSalary);
MessageBox(wnd, strOneStuInfor, "查询工资", MB_ICONINFORMATION | MB_OK);
}
}
fclose(fpss);
if (!isExist)
{
char strMsg[200];
sprintf(strMsg, "教师编号:%s\n姓名:%s\n该教师信息不存在。无法查询\n查询工资失败!",
TNoInput, TNameInput);
MessageBox(wnd, strMsg, "查询失败", MB_ICONWARNING | MB_OK);
return 0;
}
return 1;
}
int Hiddenpaybreak()
{
HWND wnd = GetHWnd();
TeacherBasisInfor oneScore;
char TNoInput[12]; //用户输入的11位数字字符的学生学号
char TNameInput[21]; //用户课程代码,固定为6个数字字符
int len;
int isExist;
FILE* fpss, * fptemp; //学生成绩文件、临时成绩文件指针
if ((fpss = fopen("TeaBasIn.dat", "rb")) == NULL) //如果成绩文件不存在,则新建之
{
fpss = fopen("TeaBasIn.dat", "wb+");
fclose(fpss);
}
else
fclose(fpss);
InputBox(TNoInput, 12, "请输入11位教师编号");
len = strlen(TNoInput);
while (len != 11)
{
MessageBox(wnd, "编号只能为11位!\n请重新输入", "编号错误", MB_OK | MB_ICONERROR);
InputBox(TNoInput, 12, "请输入11位教师编号");
len = strlen(TNoInput);
}
InputBox(TNameInput, 21, "请输入教师姓名");
len = strlen(TNameInput);
while (len <= 0)
{
MessageBox(wnd, "姓名不能为空!\n请重新输入", "姓名错误", MB_OK | MB_ICONWARNING);
InputBox(TNameInput, 21, "请输入教师姓名");
len = strlen(TNameInput);
}
fpss = fopen("TeaBasIn.dat", "rb");
isExist = false;
while (!feof(fpss))
{
int length = fread(&oneScore, sizeof(oneScore), 1, fpss);
if (length == 0) break;
if (strcmp(oneScore.TNo, TNoInput) == 0 && //如果该名教师工资已经存在
strcmp(oneScore.TName, TNameInput) == 0)
{
isExist = true;
break;
}
}
fclose(fpss);
if (!isExist)
{
char strMsg[200];
sprintf(strMsg, "编号%s\n教师%s信息不存在。无法删除\n删除信息失败!",
oneScore.TNo, oneScore.TName, oneScore.TSalary);
MessageBox(wnd, strMsg, "信息不存在,删除失败", MB_OK);
return 0;
}
char strOneStuInfor[200] = "";
sprintf(strOneStuInfor, "你要删除的教师信息如下:\n\r教师编号:%s\n\r教师姓名:%s\n\r工资:%.1f\n\r确认删除吗?",
oneScore.TNo, oneScore.TName, oneScore.TSalary);
if (MessageBox(wnd, strOneStuInfor, "请确认删除", MB_YESNO) == IDYES) //确认隐藏
{
if (MessageBox(wnd, "真的删除吗?\n删除后无法恢复", "确认删除",
MB_YESNO | MB_ICONQUESTION) == IDYES)
{
TeacherBasisInfor tempScore;
fpss = fopen("TeaBasIn.dat", "rb");
fptemp = fopen("TempStuScore.dat", "wb+");
while (!feof(fpss))
{
int length = fread(&tempScore, sizeof(oneScore), 1, fpss);
if (length == 0) break;
if (strcmp(tempScore.TNo, TNoInput) != 0 || strcmp(tempScore.TName, TNameInput) != 0)
fwrite(&tempScore, sizeof(tempScore), 1, fptemp);
}
fclose(fpss);
fclose(fptemp);
Sleep(20);
remove("TeaBasIn.dat"); //删除老文件
rename("TempStuScore.dat", "TeaBasIn.dat"); //将临时文件改名成绩文件
MessageBox(wnd, "删除成功!\n已删除一个教师的信息", "删除成功", MB_OK | MB_ICONWARNING);
return 1;
}
}
return 0;
}
void MainInter()
{
int id; //用户输入的功能号
while (TRUE)
{
cleardevice();
setcolor(DARKGRAY);
setfont(40, 0, "黑体");
outtextxy(150, 10, " 教师基本信息管理");
setcolor(YELLOW);
setfont(30, 0, "宋体");
outtextxy(220, 100, "请选择功能:");
setcolor(BLACK);
outtextxy(220, 160, "1.教师信息录入");
outtextxy(220, 210, "2.教师信息删除");
outtextxy(220, 260, "3.教师工资查询");
outtextxy(220, 310, "4.教师工资修改");
outtextxy(220, 360, "0.返回上一层");
setfont(15, 0, "黑体");
outtextxy(10, 460, "欢迎使用该系统");
id = getch(); //读取该键
if (id == '1') //录入教师基本信息
{
InputTeaBasisInfo();
}
else if (id == '2') //删除教师基本信息
{
Hiddenpaybreak();
}
else if (id == '3') //查询教师工资
{
Querywages();
}
else if (id == '4') //修改教师工资
{
Modifythesalary();
}
else if (id == '0') //如果是'0',表示退出教师基本信息管理功能
{
return;
}
}
}
void System()
{
int id;
while (TRUE)
{
cleardevice();
setcolor(DARKGRAY);
setfont(40, 0, "黑体");
outtextxy(180, 10, "学校工资管理系统");
setfont(25, 0, "宋体");
setcolor(YELLOW);
outtextxy(200, 100, "请选择功能:");
setfont(30, 0, "宋体");
setcolor(BLACK);
outtextxy(200, 170, "1.教师基本信息管理模块");
outtextxy(200, 240, "2.其它功能模块");
outtextxy(200, 310, "0.退出登录");
setfont(15, 0, "黑体");
outtextxy(160, 460, "欢迎使用该系统,如有Bug请前往其他功能模块");
id = getch();
if (id == '1')
{
MainInter();
}
else if (id == '2')
{
HWND wnd = GetHWnd();
MessageBox(wnd, "暂无其他功能模块!\n 敬请期待\nBug提交\n感谢您的使用", "模块", MB_ICONQUESTION | MB_OK);
}
else if (id == '0')
{
HWND wnd = GetHWnd();
if (MessageBox(wnd, "是否退出登录?\n", "退出登录", MB_ICONQUESTION | MB_YESNO) == IDYES)
{
cleardevice();
Welcome();
}
}
}
}
效果图如下:
mian函数如下:
#include <graphics.h>
#include <conio.h>
#include "CommonData.h"
#include <stdio.h>
#include "Login.h"
#include "TeaBasisInfo.h"
void main()
{
initgraph(640,480);//设置一个640 X 480 像素的窗口
setbkcolor(CYAN );//设置背景颜色为黄色
cleardevice();//清屏
while(!Welcome());
System();
closegraph();
}
注:本系统利用了EasyX图形库,请自行下载与查看使用教程
公众号搜索【潮流科技一周】获取全部源码
获取源码加入qq交流群:251413523,一起学习一起秃头。