学生信息管理系统
本系统主要使用C语言的结构体、数组、文件读写知识点完成数据的增删查改,本系统主要包括学生信息以及系统用户信息的维护。用户查询数据需要输入账号密码才能登录系统查看学生信息。
主菜单
学生信息管理
登录
登录是输入的密码是不可见的
查询学生信息
可按不同属性查询信息:
- 查询所有学生信息
- 按学号查询学生信息
- 按姓名查询学生信息
- 按性别查询学生信息
- 按出生日期查询学生信息
新增学生信息
修改学生信息
删除学生信息
系统设置
主要是用于用户的信息维护,包括注册用户信息、退出登录、修改密码等
注册用户
若是登录状态注册用户,需要先退出才可登录新的账号,达到账号的切换
若是非登录状态注册用户,可直接返回进行登录
退出当前用户
重置密码
代码实现
代码主要有四部分,附上数据存储的文本文件
main.c
#include <stdio.h>
#include <stdlib.h>
#include "student.h"
int main()
{
initUser();//初始化用户信息
initStudentData();//初始化学生信息
//system("cls");
int flag = 1;
char menustr[100];
char str[100];
while(flag){
int choose = mainMenu();
int choose1 = 0;
int stuFlag = 1;
int userFlag = 1;
switch(choose){
case 1:
while(currtUser == NULL){
int ret = Login();//进行登录操作
if(ret != 1){
char continuFlag[2];
printf("是否继续登录?(Y/N)\n");
scanf("%s",continuFlag);
if(strcmp(continuFlag,"N") == 0 || strcmp(continuFlag,"n") == 0){
stuFlag = 0;
break;
}else{
stuFlag = 1;
}
system("cls");
}
}
system("cls");
while(stuFlag){
choose1 = studentMenu("学生信息管理");
system("cls");
switch(choose1){
case 1:
QuaryStuInfo("学生信息管理》查询学生信息");
break;
case 2:
AddStuInfo("学生信息管理》新增学生信息");
break;
case 3:
ModifyStuInfo("学生信息管理》修改学生信息");
break;
case 4:
DeleteStuInfo("学生信息管理》删除学生信息");
break;
case 0:
stuFlag = 0;
break;
default:
break;
}
}
break;
case 2:
while(userFlag){
int ret;
choose1 = userMenu("系统设置");
switch(choose1){
case 1:
AddUser("系统设置》注册用户");
break;
case 2:
ret = CancleUser("系统设置》退出当前用户");
break;
case 3:
ret = ModifyPassword("系统设置》重置密码");
break;
case 0:
userFlag = 0;
break;
default:
break;
}
if(ret == 1){
userFlag = 0;//密码重置成功后需重新登录系统
}
}
break;
case 0:
flag = 0;
break;
default:
break;
}
}
saveUserInfo();//将内存中的数据更新到文本文件中
saveStuInfo();
return 0;
}
int studentMenu(char menustr[]){
printf("******************学生信息管理系统***************\n");
printf("当前用户| %s | %s\n",currtUser->account,currtUser->userName);
printf("当前位置| %s:\n",menustr);
printf("1、查询学生信息\n");
printf("2、新增学生信息\n");
printf("3、修改学生信息\n");
printf("4、删除学生信息\n");
printf("0、返回\n");
printf("*************************************************\n");
int choose;
printf("请输入0-4的数字选择选项:");
int input = scanf("%d",&choose);
while(input != 1 || choose < 0 || choose > 4){
fflush (stdin);
printf("请输入0-4的数字选择选项:");
input = scanf("%d",&choose);
}
system("cls");
return choose;
}
int mainMenu(){
printf("******************学生信息管理系统***************\n");
printf("主菜单:\n");
printf("1、学生信息管理\n");
printf("2、系统设置\n");
printf("0、退出\n");
printf("*************************************************\n");
int choose;
printf("请输入0-2的数字选择选项:");
int input = scanf("%d",&choose);
while(input != 1 || choose < 0 || choose > 2){
fflush (stdin);
printf("请输入0-2的数字选择选项:");
input = scanf("%d",&choose);
}
system("cls");
return choose;
}
int userMenu(char menustr[]){
printf("******************学生信息管理系统***************\n");
printf("当前位置| %s :\n",menustr);
printf("1、注册用户\n");
printf("2、退出当前用户\n");
printf("3、重置密码\n");
printf("0、返回\n");
printf("*************************************************\n");
int choose;
printf("请输入0-3的数字选择选项:");
int input = scanf("%d",&choose);
while(input != 1 || choose < 0 || choose > 3){
fflush (stdin);
printf("请输入0-3的数字选择选项:");
input = scanf("%d",&choose);
}
system("cls");
return choose;
}
student.h
#ifndef STUDENT_H_INCLUDED
#define STUDENT_H_INCLUDED
#define STUDATA "F:\\项目练习\\CProject\\学生信息管理系统\\studentdata.txt"
#define MAXSTUNUM 1000//最大学生数量
#include "user.h"
#endif // STUDENT_H_INCLUDED
//学生结构体
typedef struct Stu{
char num[15];//学号
char name[40];//姓名
char sex[5];//性别
char birthday[15];//出生日期
char nativePlace[40];//籍贯
}Student;
Student students[MAXSTUNUM];
int stuNum = 0;//当前学生总数
void initStudentData(){
FILE *fin = NULL;
fin = fopen(STUDATA, "r");
if(fin == NULL){
printf("无法读取学生信息文件\n");
}else{
int ret = fscanf(fin,"%[^,],%[^,],%[^,],%[^,],%s\n",students[stuNum].num,students[stuNum].name,students[stuNum].sex,students[stuNum].birthday,students[stuNum].nativePlace);
while(ret >= 1){
stuNum++;
ret = fscanf(fin,"%[^,],%[^,],%[^,],%[^,],%s\n",students[stuNum].num,students[stuNum].name,students[stuNum].sex,students[stuNum].birthday,students[stuNum].nativePlace);
}
}
fclose(fin);
}
//查询学生信息
void QuaryStuInfo(char menustr[]){
int flag = 1;
while(flag){
printf("******************学生信息管理系统***************\n");
printf("当前用户| %s | %s\n",currtUser->account,currtUser->userName);
printf("当前位置| %s :\n",menustr);
printf("1、查询所有学生信息\n");
printf("2、按学号查询学生信息\n");
printf("3、按姓名查询学生信息\n");
printf("4、按性别查询学生信息\n");
printf("5、按出生日期查询学生信息\n");
printf("0、返回\n");
printf("*************************************************\n");
printf("请输入0-5的数字选择选项:");
int choose;
int ret = scanf("%d",&choose);
while(ret != 1 || choose < 0 || choose > 5){
printf("请输入0-5的数字选择选项:");
ret = scanf("%d",&choose);
}
system("cls");
switch(choose){
case 1:
findAllStu();//查找所有学生信息
break;
case 2:
QuaryStuInfoByNum("学生信息管理》查询学生信息》按学号查询");
break;
case 3:
QuaryStuInfoByName("学生信息管理》查询学生信息》按姓名查询");
break;
case 4:
QuaryStuInfoBySex("学生信息管理》查询学生信息》按性别查询");
break;
case 5:
QuaryStuInfoByBirth("学生信息管理》查询学生信息》按出生日期查询");
break;
case 0:
flag = 0;
break;
default:
break;
}
}
}
int findStuByNum(char num[]){
int index = -1;
for (int i = 0; i < stuNum; i++){
if(strcmp(num,students[i].num) == 0){
index = i;
break;
}
}
return index;
}
void QuaryStuInfoByNum(char menustr[]){
printf("******************学生信息管理系统***************\n");
printf("当前用户| %s | %s\n",currtUser->account,currtUser->userName);
printf("当前位置| %s :\n",menustr);
char num[15];
printf("请输入学生学号:");
int ret = scanf("%s",&num);
while(ret != 1){
fflush (stdin);
printf("请输入学生学号:");
ret = scanf("%s",&num);
}
int index = findStuByNum(num);
if(index<0){
printf("未找到学号为\"%s\"的学生信息\n",num);
}else{
printf("%-15s%-10s%-8s%-15s%-40s\n","学号","姓名","性别","出生日期","籍贯");
printf("%-15s%-10s%-8s%-15s%-40s\n",students[index].num,students[index].name,students[index].sex,students[index].birthday,students[index].nativePlace);
}
}
void QuaryStuInfoByName(char menustr[]){
printf("******************学生信息管理系统***************\n");
printf("当前用户| %s | %s\n",currtUser->account,currtUser->userName);
printf("当前位置| %s :\n",menustr);
char name[40];
printf("请输入学生姓名:");
int ret = scanf("%s",&name);
while(ret != 1){
fflush (stdin);
printf("请输入学生姓名:");
ret = scanf("%s",&name);
}
Student stu;
for (int i = 0; i < stuNum; i++){
if(strcmp(name,students[i].name) == 0){
stu = students[i];
break;
}
}
if(strlen(stu.num) == 0){
printf("未找到姓名为\"%s\"的学生信息\n",name);
}else{
printf("%-15s%-10s%-8s%-15s%-40s\n","学号","姓名","性别","出生日期","籍贯");
printf("%-15s%-10s%-8s%-15s%-40s\n",stu.num,stu.name,stu.sex,stu.birthday,stu.nativePlace);
}
}
void QuaryStuInfoBySex(char menustr[]){
printf("******************学生信息管理系统***************\n");
printf("当前用户| %s | %s\n",currtUser->account,currtUser->userName);
printf("当前位置| %s :\n",menustr);
char sex[5];
printf("请输入学生性别:");
int ret = scanf("%s",&sex);
while(ret != 1){
fflush (stdin);
printf("请输入学生性别:");
ret = scanf("%s",&sex);
}
Student stu[stuNum];
int j = 0;
for (int i = 0; i < stuNum; i++){
if(strcmp(sex,students[i].sex) == 0){
stu[j] = students[i];
j++;
}
}
if(j == 0){
printf("未找到性别为\"%s\"的学生信息\n",sex);
}else{
printf("%-15s%-10s%-8s%-15s%-40s\n","学号","姓名","性别","出生日期","籍贯");
for(int i = 0; i < j; i++){
printf("%-15s%-10s%-8s%-15s%-40s\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].birthday,stu[i].nativePlace);
}
}
}
void QuaryStuInfoByBirth(char menustr[]){
printf("******************学生信息管理系统***************\n");
printf("当前用户| %s | %s\n",currtUser->account,currtUser->userName);
printf("当前位置| %s :\n",menustr);
char birth[10];
printf("请输入学生出生日期:");
int ret = scanf("%s",&birth);
while(ret != 1){
fflush (stdin);
printf("请输入学生出生日期:");
ret = scanf("%s",&birth);
}
Student stu[stuNum];
int j = 0;
for (int i = 0; i < stuNum; i++){
if(strcmp(birth,students[i].birthday) == 0){
stu[j] = students[i];
j++;
}
}
if(j == 0){
printf("未找到性别为\"%s\"的学生信息\n",birth);
}else{
printf("%-15s%-10s%-8s%-15s%-40s\n","学号","姓名","性别","出生日期","籍贯");
for(int i = 0; i < j; i++){
printf("%-15s%-10s%-8s%-15s%-40s\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].birthday,stu[i].nativePlace);
}
}
}
//新增学生信息
void AddStuInfo(char menustr[]){
printf("******************学生信息管理系统***************\n");
printf("当前用户| %s | %s\n",currtUser->account,currtUser->userName);
printf("当前位置| %s :\n",menustr);
Student inputInfo;
printf("请输入以下信息并使用换行隔开:%-10s%-10s%-10s%-15s%-10s\n","学号","姓名","性别","出生日期","籍贯");
scanf("%s%s%s%s%s",inputInfo.num,inputInfo.name,inputInfo.sex,inputInfo.birthday,inputInfo.nativePlace);
int index = findStuByNum(inputInfo.num);
if(index<0){
students[stuNum] = inputInfo;//更新内存中的数据,退出系统时将数据更新到文本文件中;
stuNum ++;
printf("学号为\"%s\"的学生信息已保存成功\n", students[stuNum].num);
}else{
printf("学号为\"%s\"的学生信息已存在\n",students[index].num);
}
printf("%-15s%-10s%-8s%-15s%-40s\n","学号","姓名","性别","出生日期","籍贯");
printf("%-15s%-10s%-8s%-15s%-40s\n",inputInfo.num,inputInfo.name,inputInfo.sex,inputInfo.birthday,inputInfo.nativePlace);
}
//修改学生信息
void ModifyStuInfo(char menustr[]){
printf("******************学生信息管理系统***************\n");
printf("当前用户| %s | %s\n",currtUser->account,currtUser->userName);
printf("当前位置| %s :\n",menustr);
findAllStu();
printf("请输入需要修改的学生学号:\n");
char num[15];
scanf("%s",num);
int index = findStuByNum(num);
if(index<0){
printf("学号为%s的学生信息不存在,请核实\n",num);
}else{
int flag = 1;
while(flag){
printf("请选择需要修改的信息;\n");
printf("1、修改姓名\n");
printf("2、修改性别\n");
printf("3、修改出生日期\n");
printf("4、修改籍贯\n");
printf("0、返回\n");
printf("请输入0-4的数字选择选项:\n");
int choose;
int input = scanf("%d",&choose);
Student stu;
while(input != 1 || choose < 0 || choose > 4){
fflush (stdin);
printf("请输入0-4的数字选择选项:\n");
input = scanf("%d",&choose);
}
switch(choose){
case 1:
printf("学号为%s的原姓名为\"%s\"\n",students[index].num,students[index].name);
printf("请输入姓名:\n");
scanf("%s",students[index].name);
printf("学号为%s的姓名已更新为\"%s\"\ns",students[index].num,students[index].name);
break;
case 2:
printf("学号为%s的原性别为\"%s\"\n",students[index].num,students[index].sex);
printf("请输入性别:\n");
scanf("%s",students[index].sex);
printf("学号为%s的性别已更新为\"%s\"\n",students[index].num,students[index].sex);
break;
case 3:
printf("学号为%s的原出生日期为\"%s\"\n",students[index].num,students[index].birthday);
printf("请输入出生日期:\n");
scanf("%s",students[index].birthday);
printf("学号为%s的出生日期已更新为\"%s\"\n",students[index].num,students[index].birthday);
break;
case 4:
printf("学号为%s的原籍贯为\"%s\"\n",students[index].num,students[index].nativePlace);
printf("请输入籍贯:\n");
scanf("%s",students[index].nativePlace);
printf("学号为%s的籍贯已更新为\"%s\"\n",students[index].num,students[index].nativePlace);
break;
case 0:
flag = 0;
break;
default:
break;
}
}
}
}
//删除学生信息
void DeleteStuInfo(char menustr[]){
printf("******************学生信息管理系统***************\n");
printf("当前用户| %s | %s\n",currtUser->account,currtUser->userName);
printf("当前位置| %s :\n",menustr);
findAllStu();
printf("请输入需要删除的学生学号:\n");
char num[15];
scanf("%s",num);
int index = findStuByNum(num);
Student oldStu = students[index];
if(index<0){
printf("学号为%s的学生信息不存在,请核实\n",num);
}else{
for(int i = index; i < stuNum-1; i++){
students[i] = students[i+1];
}
stuNum -- ;
printf("已删除学生信息:%-15s%-10s%-8s%-15s%-40s\n","学号","姓名","性别","出生日期","籍贯");
printf(" %-15s%-10s%-8s%-15s%-40s\n",oldStu.num,oldStu.name,oldStu.sex,oldStu.birthday,oldStu.nativePlace);
}
}
void findAllStu(){
printf("所有学生信息如下:\n");
printf("%-15s%-10s%-8s%-15s%-40s\n","学号","姓名","性别","出生日期","籍贯");
if(stuNum == 0){
printf("暂无数据\n");
}
for(int i = 0;i<stuNum; i++){
printf("%-15s%-10s%-8s%-15s%-40s\n",students[i].num,students[i].name,students[i].sex,students[i].birthday,students[i].nativePlace);
}
}
void saveStuInfo(){
FILE *fp = NULL;
fp = fopen(STUDATA, "w");
if(fp == NULL){
printf("无法读取学生信息文件\n");
}else{
for(int i = 0; i < stuNum; i++){
fprintf(fp,"%s,%s,%s,%s,%s\n",students[i].num,students[i].name,students[i].sex,students[i].birthday,students[i].nativePlace);
}
}
fclose(fp);
}
user.h
#include<dos.h>
#include "utils.h"
#ifndef USER_H_INCLUDED
#define USER_H_INCLUDED
#define MAXUSERNUM 500//最大用户数量
#endif // USER_H_INCLUDED
#define USERDATA "F:\\项目练习\\CProject\\学生信息管理系统\\userdata.txt"
typedef struct Users{
char type[10];//admin:管理员;normal:普通用户
char account[30];
char userName[30];
char password[20];
}User;
User users[MAXUSERNUM];
User *currtUser = NULL;
int usercount = 0;
void initUser(){
FILE *fin = NULL;
fin = fopen(USERDATA, "r");
if(fin == NULL){
printf("无法读取用户信息文件\n");
}else{
int ret=fscanf(fin,"%[^,],%[^,],%[^,],%s\n",users[usercount].type,users[usercount].account,users[usercount].userName,users[usercount].password);
while(ret >= 1){
usercount++;
ret = fscanf(fin,"%[^,],%[^,],%[^,],%s\n",users[usercount].type,users[usercount].account,users[usercount].userName,users[usercount].password);
//usercount++;
}
}
fclose(fin);
}
int findUserByAccount(char account[]){
int index = -1;
for(int i=0; i < usercount; i ++){
if(strcmp(users[i].account,account) == 0){
index = i;
break;
}
}
return index;
}
void AddUser(char menustr[]){
if(currtUser != NULL){
printf("当前用户| %s | %s\n",currtUser->account,currtUser->userName);
}
printf("当前位置| %s :\n",menustr);
User inputInfo;
printf("请输入邮箱账号:");
scanf("%s",inputInfo.account);
int index = findUserByAccount(inputInfo.account);//查询用户信息是否已存在
if(index >= 0){
printf("该账号信息已注册!\n");
printf("%s\n",users[index].userName);
}else{
printf("请选择要注册的用户类型(请输入1-2的数字):\n");
printf("1、普通用户\n");
printf("2、管理员\n");
int userType;
int ret = scanf("%d",&userType);
while(ret != 1 || userType < 1 || userType > 2){
printf("请选择要注册的用户类型(请输入1-2的数字):\n");
ret = scanf("%d",&userType);
}
/** 创建普通用户和管理员的详细逻辑 **/
if(userType == 1){
strcpy(inputInfo.type, "normal");
}else if(userType == 2){
strcpy(inputInfo.type, "admin");
}
printf("请输入用户名:");
scanf("%s",inputInfo.userName);
char password1[20];
char password2[20];
printf("请输入密码:");
scanf("%s",password1);
printf("请确认密码:");
scanf("%s",password2);
while(strcmp(password1,password2) != 0){
printf("前后密码不一致,请重新输入:");
scanf("%s",password1);
printf("请确认密码:");
scanf("%s",password2);
}
char *str = encode(password1);
strcpy(inputInfo.password,str);
users[usercount] = inputInfo;
printf("用户已创建,账号为%s\n",users[usercount].account);
usercount ++;
}
}
//登录系统,验证密码
int Login(){
char account[100];
char pwd[20];
printf("**************用户登录*************\n");
printf("请输入登陆账号:\n");
scanf("%s",&account);
int index = findUserByAccount(account);
if(index < 0){
printf("未找到该用户信息,请核对登录账号是否正确\n");
return 0;
}
printf("请输入登陆密码:\n");
strcpy(pwd,getPwd());
int pwdCorrect = checkPwd(users[index].password,pwd);
if(pwdCorrect == 1){
currtUser = (User *)malloc(sizeof(User));
strcpy(currtUser->userName,users[index].userName);
strcpy(currtUser->account,users[index].account);
strcpy(currtUser->password,users[index].password);
strcpy(currtUser->type,users[index].type);
return 1;
}else{
return 0;
}
}
int checkPwd(char password[],char pwd[]){
char *str = encode(pwd);
if(strcmp(password,str) == 0){
printf("密码正确\n");
return 1;
}else{
printf("密码错误\n");
return 0;
}
}
void findAllUser(){
printf("%-10s%-30s%-30s%\n","角色","账号","用户名");
for(int i = 0; i < usercount; i++ ){
printf("%-10s%-30s%-30s%\n",users[i].type,users[i].account,users[i].userName);
}
}
int CancleUser(char menustr[]){
if(currtUser != NULL){
printf("当前用户| %s | %s\n",currtUser->account,currtUser->userName);
printf("当前位置| %s :\n",menustr);
char str[2];
printf("您确定退出吗?(Y/N)\n");
scanf("%s",str);
if(strcmp(str,"Y") == 0 || strcmp(str,"y") == 0 ){
free(currtUser);
currtUser = NULL;
return 1;
}
return 0;
}else{
return 1;
}
}
void saveUserInfo(){
FILE *fp = NULL;
fp = fopen(USERDATA,"w");
if(fp == NULL){
printf("读取用户信息文件出错\n");
}else{
for(int i = 0; i < usercount; i++){
fprintf(fp,"%s,%s,%s,%s\n",users[i].type,users[i].account,users[i].userName,users[i].password);
}
}
fclose(fp);
}
int ModifyPassword(char menustr[]){
printf("当前位置| %s :\n",menustr);
User inputInfo;
printf("请输入账号:");
scanf("%s",inputInfo.account);
int index = findUserByAccount(inputInfo.account);//查询用户信息是否已存在
if(index < 0){
printf("该账号信息已不存在!\n");
}else{
char oldpwd[20];
char newpwd[20];
char newpwd1[20];
//todo 可增加一些忘记密码的操作来重置密码
printf("请输入原密码:");
scanf("%s",oldpwd);
int checkRet = checkPwd(users[index].password,oldpwd);
if(checkRet == 1){
printf("请输入新密码:");
scanf("%s",newpwd);
printf("请确认密码:");
scanf("%s",newpwd1);
while(strcmp(newpwd,newpwd1) != 0){
printf("请输入新密码:");
scanf("%s",newpwd);
printf("请确认密码:");
scanf("%s",newpwd1);
}
char *str = encode(newpwd1);
strcpy(users[index].password,str);
printf("密码已重置,可重新登录系统\n");
return 1;
}
}
return 0;
}
utils.h
#ifndef UTILS_H_INCLUDED
#define UTILS_H_INCLUDED
#include<conio.h>
#endif // UTILS_H_INCLUDED
char * encode(char pwd[]){
int length = strlen(pwd);
char* encodePwd = (char*)calloc(200, sizeof(char*) );
for(int i = 0; i < length; i++){
encodePwd[i]=pwd[i]+i+5;
}
return encodePwd;
}
char * decode(char decodePwd[]){
int length = strlen(decodePwd);
char* pwd = (char*)calloc(200, sizeof(char*) );
for(int i = 0; i < length; i++){
pwd[i]=decodePwd[i]-i-5;
}
return pwd;
}
char * getPwd(){
char* pwd = (char*)calloc(20, sizeof(char*) );
int i=0;
while(1){
pwd[i]=getch();
if(pwd[i]=='\r'){
break;
}
if(pwd[i] == '\b' && i>0){
i--;
putchar('\b');
continue;
}
i++;
}
pwd[i]='\0';
return pwd;
}
数据附件
学生数据信息
用户数据信息
密码保存的是加密后的密文