学生信息管理系统

时间:2021-09-09 20:19:43
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h> 
#include<string.h>
#define Rule_Teacher 1
#define Rule_Student 2 
struct stuAccountInfo
{
//账号密码权限 
char szAccount[21];
char szPassword[21];
int iRule;
//使用fwrite和fread可以将结构体直接写入文件 
};
typedef struct StuInfo
{
char StuNum[21];
char StuName[21];
char StuSex[2];
int StuAge;
}StuInfo_TYPE; 


/*
StuInfo_TYPE[10000]设置缓存
先把文档里所有的数据全部加载到缓存中
以后所有的访问或修改数据都是对缓存进行操作
软件退出或程序在某个时候保存一下数据
有可能造成数据丢失(非正常退出的情况下) 
意义:可以不用频繁的读取文件 
*/ 
int RegisterAccount(void)
{
char account[21];
char password[21];
char bufAccount[21]={0};
int len,rule;
bool accountFlag = true;
FILE *pfile = fopen("AccountInfo.txt","r+");
if(pfile == NULL)
{
return 0;
}
printf("请输入账号:"); 
gets(account);
while(accountFlag)//判断账号是否已经存在并且符合要求 
{
len = strlen(account);
accountFlag = false;
if(len<6 || len>20)
{
printf("账号长度应为6-20\n请重新输入:");
accountFlag = true; 
}
while(fgets(bufAccount,len+1,pfile))
{
if(strcmp(bufAccount,account) == 0)
{
printf("此账户已存在\n请重新输入:");
accountFlag = true;
break;

}
if(accountFlag)
gets(account);
}
printf("请输入密码:"); 
gets(password); 
printf("请问你是老师(1)还是学生(2):");
scanf("%d",&rule); 


fprintf(pfile,"%s %s %d\n",account,password,rule); 
fclose(pfile);
return rule;
}
int EnterSystem(void)
{
int len,rule;
char szCurAccount[21];
char szCurPassword[21];
char bufAccountAndPass[45]={0};
char bufStr[45]={0};
printf("******欢迎使用学生信息管理系统******\n");
printf("输入用户名(输入res注册):\n");
gets(szCurAccount);
if(strcmp(szCurAccount,"res") == 0)
{
rule = RegisterAccount();
if(rule);
return rule;

printf("输入密码:\n");
gets(szCurPassword); 

sprintf(bufAccountAndPass,"%s %s",szCurAccount,szCurPassword);
FILE *AccountInfo = fopen ("AccountInfo.txt","r");
if(AccountInfo == NULL)
{
printf("打开失败\n");
return false; 
}
while(fgets(bufStr,45,AccountInfo))
{
len = strlen(bufAccountAndPass); 
if(strncmp(bufStr,bufAccountAndPass,len) == 0)
{
len= strlen(bufStr)-2;//文件一句话后面的换行符 
rule = bufStr[len]-'0';
fclose(AccountInfo);
return rule; 

}
fclose(AccountInfo);
return false; 

void ShowTeacherWindow(void)
{
printf("******欢迎使用学生信息管理系统******\n");
printf("0:添加学生信息    ");
printf("1: 删除学生信息\n");
printf("2: 修改学生信息    ");
printf("3: 查找学生信息\n"); 
printf("4: 打印所有学生信息");
printf("5: 退出\n");
}
void ShowStudentWindow(void)
{
printf("******欢迎使用学生信息管理系统******\n");
printf("0: 查找学生信息     ");
printf("1: 打印所有学生信息\n");
printf("2: 退出\n");

bool IsStuNumExist(char *StuNum)
{
char bufStuNum[21];
int len = strlen(StuNum);
FILE *fp = fopen("StudentInfo.txt","r+");
while(fgets(bufStuNum,45,fp))
{
if(strncmp(bufStuNum,StuNum,len) == 0)
{
return true;
}
}
return false;
}
void AddStuInfo(void)
{
StuInfo_TYPE newStu;
FILE *fp = fopen("StudentInfo.txt","a+");
if(fp == NULL)
{
printf("打开文件失败\n");
return ;
}
printf("增加同学的学号:");
gets(newStu.StuNum);
if( IsStuNumExist(newStu.StuNum) )
{
int command; 
printf("此同学信息已被添加\n继续添加请输入1(按其他任意键退出):");
scanf("%d",&command); getchar();
if(command == 1)
{
printf("增加同学的学号:");
gets(newStu.StuNum);
}
else
return;
}
printf("这位同学的名字: ");
gets(newStu.StuName);
printf("这位同学的性别: ");
scanf("%s",&newStu.StuSex);
printf("这位同学的年龄: ");
scanf("%d",&newStu.StuAge); getchar();
fprintf(fp,"%s %s %s %d\n",newStu.StuNum,newStu.StuName,newStu.StuSex,newStu.StuAge); 
fclose(fp); 

void DeleteStuInfo(void)
{
char bufStuNum[45];
char StuNum[21]; 
FILE *fp = fopen("StudentInfo.txt","r+");
printf("请输入要删除信息学生的学号: ");
gets(StuNum); 
int len = strlen(StuNum);
while(fgets(bufStuNum,45,fp))
{
if(strncmp(bufStuNum,StuNum,len) == 0)
{
len = strlen(bufStuNum)+1; 
fseek(fp,-len,SEEK_CUR); 
fprintf(fp,"NULL"); 
break;


fclose(fp);

void ChangeStuInfo(void)
{
char newInfo[45]; 
char StuNum[21]; 
char bufStuNum[45];
FILE *fp = fopen("StudentInfo.txt","r+");
printf("请输入要修改信息学生的学号");
gets(StuNum);
int len = strlen(StuNum);
while(fgets(bufStuNum,45,fp))
{
if(strncmp(bufStuNum,StuNum,len) == 0)
{
printf("请输入修改后的学生信息: ");
gets(newInfo); 
len = strlen(bufStuNum) + 1;
fseek(fp,-len,SEEK_CUR); 
fprintf(fp,"%s\n",newInfo); 
break;

}
fclose(fp); 
}
void FindStuInfo(void)
{
char bufStuNum[45];
char StuNum[21]; 
FILE *fp = fopen("StudentInfo.txt","r+");
printf("请输入要查找信息学生的学号: "); 
gets(StuNum);
int len=strlen(StuNum);
while(fgets(bufStuNum,45,fp))
{
if(strncmp(bufStuNum,StuNum,len) == 0)
{
printf("该学生信息为:\n%s",bufStuNum);
break;

}
fclose(fp); 
}
void PrintAllStuInfo(void)
{
char bufStu[45]; 
FILE *fp = fopen("StudentInfo.txt","r+");
while(fgets(bufStu,45,fp))
{
printf("%s",bufStu);
}
fclose(fp);
}
int main()
{
bool flag = 1;
int Command,iRule;
iRule = EnterSystem();
if(iRule == Rule_Teacher)
{
printf("账号登陆成功\n");
while(flag)
{
ShowTeacherWindow();
scanf("%d",&Command); getchar();
switch (Command)
{
case 0:AddStuInfo();
  break;
case 1:DeleteStuInfo();
  break;
case 2:ChangeStuInfo();
  break;
case 3:FindStuInfo();
  break;
case 4:PrintAllStuInfo();
  break;
case 5:flag = 0;
  break;
default:printf("请输入0-5的操作数\n");
}
}

else if(iRule == Rule_Student)
{
printf("账号登陆成功\n");
while(flag)
{
ShowStudentWindow();
scanf("%d",&Command); getchar();
switch (Command)
{
case 0:FindStuInfo();
  break;
case 1:PrintAllStuInfo();
  break;
case 2:flag = 0;
  break;
default:printf("请输入0-2的操作数\n");
}
}
}
else
printf("账号密码错误,登陆失败\n"); 
    return 0;
}