一.一些感受
写了大概一个月,中间零零散散修改了很多BUG,第一次写出来700行左右,但经过学长的测试(就是乱输入任何能想到的可能),还是有很多用户上的体验没有考虑到,只是规规矩矩的把该有的功能写出来了。通过这个事明白了用户体验还是挺重要的,,,要把用户当成智商下线的小朋友看待,写出来的东西才合适各个年龄段的人去使用。然后就是开始补需求,基本思路有了,写出来一个case的额外需求后,剩下的就是个复制粘贴的事。在已有的代码块补充功能很锻炼逻辑思维能力啊,一个不小心就会万劫不复。。。但最终还是顺利完成啦,中间有几次BUG看了一天看不出来到底错哪了,本来想求助学长,但总是最后一步突然灵光一现换个思维方式,就纠错成功啦。
废话不多说,贴上代码~
二.一些代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define BACKSPACE 8
//学生节点
typedef struct _STU
{
char arrStuNum[10];
char arrStuName[10];
int iStuScore;
struct _STU* pNext;
} STUNODE;
int JudgeIfRFight();
//判断指令输入的是否正确?是否需要重新输入
//声明链表的头和尾
STUNODE* g_pHead = NULL; //O
STUNODE* g_pEnd = NULL;
//通过姓名查找指定学生的信息
STUNODE * FindMSGByName(char* arrStuName);
//统计成绩低于60分学生的数量
void AddUpNumOfScoreLower60();
//查询成绩高于60分的学生并输出
void AddUpScoreHigher60();
//降序排序学生
void RankStuBymaxNum();
//升序排序学生
void RankStuByminNum();
//添加一个学生的信息
void AddStuMSG(char *arrStuNum, char arrStuName[10], char iStuScore[]);
//链表头添加一个节点
void AddStuMSGToLinkHead(char *arrStuNum, char arrStuName[10], int iStuScore);
//清空链表
void FreeLinkData();
//打印数据
void ShowStuData();
//显示指令
void ShowOrder();
//查找制定学生
STUNODE* FindStuByNum(char* arrStuNum); //【】
//指定位置插入节点
void InsertNode(STUNODE* pTemp, char *arrStuNum, char arrStuName[10], char iStuScore[100]);
//删除指定学生
void DeleteStuNode(STUNODE* pNode);
//保存信息进文件
void SaveStuToFile();
//读取文件中学生信息
void ReadStuFromFile();
//学生端读取信息
void STUReadStuFromFile();
int j,k,i,nCount;
int main(void)
{
FILE * fp = NULL;
FILE * pFile = NULL;
char strStuNum[10] = {
0};//检测是否重复
// int FindMsg = 0;//查找学号用到
char password[100] = {
"s123456"};
char vippassword[100] = {
"t123456"};
char vipaccount[100] = {
"tcaihong"};
char account[100] = {
"scaihong"};
char userpassword[100] = {
0};
char useraccount[100] = {
0};
char Print1Or2[100] = {
0};
char VipFirstAcount[100] = {
0};
//先将VIP的账号和密码保存在文件中
/* fp = fopen("NewCount","ab+");
strcpy(VipFirstAcount, vipaccount);
strcat(VipFirstAcount, ".");
strcat(VipFirstAcount, vippassword);
strcat(VipFirstAcount, ".");
fwrite(VipFirstAcount, 1, strlen(VipFirstAcount), fp);
fwrite("\r\n", 1, strlen("\r\n"), fp);
fclose(fp);
fp = NULL;
*/
printf("*******************欢迎您进入学生信息管理系统*********************\n");
printf("************1.登陆 2.注册新账户(教师端) 其他.程序结束*************\n");
printf("请输入指令\n再次提示,这一步请仔细输入指令,一旦输入错误,您将还有三次输入机会\n");
scanf("%s",Print1Or2);
getchar();
if ( (Print1Or2[0] != '1' && Print1Or2[0] != '2') || strlen(Print1Or2) != 1){
printf("Print1Or2[0] = %c,strlen(Print1Or2) = %d\n",Print1Or2[0],strlen(Print1Or2));
printf("您输入的指令不正确,您还有两次输入机会\n请重新输入\n");
scanf("%s",Print1Or2);
getchar();
if ( (Print1Or2[0] != '1' && Print1Or2[0] != '2') || strlen(Print1Or2) != 1){
printf("Print1Or2[0] = %c,strlen(Print1Or2) = %d\n",Print1Or2[0],strlen(Print1Or2));
printf("您输入的指令不正确,您还有一次输入机会\n警告,本次输入若再出现错误,将退出系统!\n请重新输入\n");
scanf("%s",Print1Or2);
getchar();
}
}
if ( strlen(Print1Or2) == 1 && Print1Or2[0] == '2' ){
pFile = fopen("NewCount","rb+");
if (NULL == pFile)
{
printf("文件打开失败\n");
return 0;
}
char AppalyCount[100] = {
0};
char AppalyPassWord[100] = {
0};
char TeacherNewAcount[100] = {
0};
char TeacherOldAcount[100] = {
0};
char TeacherNewPassWord[100] = {
0};
char TeacherOldPsaaWord[100] = {
0};
char TeacherOld[100] = {
0};
char TeacherNew[100] = {
0};
int m = 0;
// FILE * pFile = NULL;
// pFile = fopen("NewCount","wb+");
//先将VIP的账号和密码保存在文件中
puts("请输入教师端新账户的账号:");
scanf("%s",AppalyCount);//新账号
getchar();
puts("请输入教师端新账户的密码:");
scanf("%s",AppalyPassWord);//新密码
getchar();
//判断是否和已有账户重复
k = 0;
//判断与源文件中的账号密码是否重复。
// 现在问题是 比较之后明明新账号与之前账号相同,系统却显示不同,进入下一步。。。。
while ( fgets(TeacherOld, 100, pFile) != NULL && k == 0 && m != 1){
nCount = 0;
j = 0;
for ( i = 0; TeacherOld[i] != '\r'; i++ ){
if ( nCount == 0 ){
TeacherNewAcount[j] = TeacherOld[i];
j++;
if ( TeacherOld[i] == '.' ){
TeacherNewAcount[j-1] = '\0';
nCount++;
j = 0;
//这个break break掉while吗???
}
}
else if ( nCount == 1 ){
TeacherNewPassWord[j] = TeacherOld[i];
j++;
if ( TeacherOld[i] == '.' ){
TeacherNewPassWord[j-1] = '\0';
nCount++;
j = 0;
}
}
}
printf("%s %s\n",TeacherNewAcount, TeacherNewPassWord);
printf("%s %s\n",AppalyCount, AppalyPassWord);
//这样的话 一个密码就读取完毕
// 这里有问题,应该让新账户和文件中的所有账户比较完之后 再下结论。
if ( strcmp(TeacherNewAcount, AppalyCount) == 0 && strcmp(TeacherNewPassWord, AppalyPassWord) == 0 ){
printf("您输入的新账户的账号或密码与已有账户信息重复\n您还有一次机会,请重新输入您想要注册的账号信息\n");
m = 1;
puts("请输入教师端新账户的账号:");
scanf("%s",AppalyCount);//新账号
getchar();
puts("请输入教师端新账户的密码:");
scanf("%s",AppalyPassWord);//新密码
getchar();
//判断是否和已有账户重复
k = 0;
//判断与源文件中的账号密码是否重复。
// 现在问题是 比较之后明明新账号与之前账号相同,系统却显示不同,进入下一步。。。。
fclose(pFile);
pFile = NULL;
pFile = fopen("NewCount","rb+");
while ( fgets(TeacherOld, 100, pFile) != NULL && k == 0 ){
nCount = 0;
j = 0;
for ( i = 0; TeacherOld[i] != '\r'; i++ ){
if ( nCount == 0 ){
TeacherNewAcount[j] = TeacherOld[i];
j++;
if ( TeacherOld[i] == '.' ){
TeacherNewAcount[j-1] = '\0';
nCount++;
j = 0;
//这个break break掉while吗???
}
}
else if ( nCount == 1 ){
TeacherNewPassWord[j] = TeacherOld[i];
j++;
if ( TeacherOld[i] == '.' ){
TeacherNewPassWord[j-1] = '\0';
nCount++;
j = 0;
}
}
}
printf("%s %s\n",TeacherNewAcount, TeacherNewPassWord);
printf("%s %s\n",AppalyCount, AppalyPassWord);
if ( strcmp(TeacherNewAcount, AppalyCount) == 0 && strcmp(TeacherNewPassWord, AppalyPassWord) == 0 ){
printf("您又一次输入了已有的账户信息,系统将自动退出\n下次输入请认真对待,谢谢!\n");
return 0;
}
}
}
}//不用加任何,只要不return 0 就说明新账户不与原账户重复!
fclose(pFile);
pFile = NULL;
//问题在这
//char TeacherNew[100] = {0};
// if ( strcmp(TeacherNewAcount, AppalyCount) != 0 && strcmp(TeacherNewPassWord, AppalyPassWord) != 0 ){//文件中的一个密码与你输入的新密码比较,看是否相同
// 问题:新注册的账号在这里 但是没有保存进去文件,是不是strcpy的问题?
k = 1;
printf("恭喜,您申请的教师端新账户可用\n系统将进入登陆界面\n");//然后把账户啥的信息写进文件中去
pFile = fopen("NewCount","ab+");
if (NULL == pFile)
{
printf("文件打开失败\n");
return 0;
}
strcpy(TeacherNew, AppalyCount);
strcat(TeacherNew, ".");
strcat(TeacherNew, AppalyPassWord);
strcat(TeacherNew, ".");
// fwrite("\r\n", 1, strlen("\r\n"), pFile);
fwrite(TeacherNew, 1, strlen(TeacherNew), pFile);
fwrite("\r\n", 1, strlen("\r\n"), pFile);//**********将新账号信息保存到文件中去
fclose(pFile);
pFile = NULL;
//然后直接自动进入即可
// k = 1;
// }
// if ( strcmp(TeacherNewAcount, AppalyCount) == 0 && strcmp(TeacherNewPassWord, AppalyPassWord) == 0 ){
// printf("您输入的新账户的账号或密码与已有账户信息重复\n退出系统\n");
// return 0;
// }
}//写入完毕,下来就是输入密码了,
//}
// fclose(pFile);
// pFile = NULL;
printf("k = %d\n",k);
if ( (strlen(Print1Or2) == 1 && Print1Or2[0] == '1' ) || k == 1 ){
char AllUserMSG[100] = {
0};
int MSG = 0;
printf("************ 系统已进入登录界面,请您输入账号和密码 **************\n");
printf("-------------------------------------------------------------------\n");
printf("账号:\n");
scanf("%s",useraccount);
getchar();
puts("| |");
printf("密码:\n");
// scanf("%s",userpassword);
// getchar();
//使用 * 号输入:
//这里有问题 怎么输入密码
char ch;
i = 0;
while ( (ch = getch()) != '\r' && i < 100 ){
userpassword[i] = ch;
i++;
printf("*");
}
userpassword[i] = '\0';
printf("\n");
printf("%s\n",userpassword);
//下面检验当前输入的账号和密码与保存在文件中的任一除了系统初始设定的普通账号和密码不同的一组账号和密码,简单,在文件中只保存VIP的账号和密码
pFile = fopen("NewCount","rb+");
if (NULL == pFile)
{
printf("文件打开失败\n");
return 0;
}
// fwrite("zhanghao.mima.", 1, strlen("zhanghao.mima."), pFile);
//读入文件中每一行的账号和密码,每读入一次,把把账号和密码分别赋值给两个新创建的数组储存,再用strcmp函数作比较,只要有一次符合要求,就进入教师端
MSG = 0;
//这里有问题,UserTextPassword无法保存
while ( fgets(AllUserMSG, 100, pFile) != NULL && MSG == 0){
//把文件中的所有账号和密码都遍历一遍,与你现在输入的账号和密码做比较
char UserTextCount[100] = {
0};
char UserTextPassword[100] = {
0};
//这下面写 把每一行的账号和密码转化出来赋值给 UserTextCount 和 UserTextPassword
nCount = 0;
j = 0;
for ( i = 0; AllUserMSG[i] != '\r'; i++ ){
if ( nCount == 0 ){
UserTextCount[j] = AllUserMSG[i];
j++;
if ( AllUserMSG[i] == '.' ){
UserTextCount[j-1] = '\0';
j = 0;
nCount++;
// printf("nCount = %d\n",nCount);
}
}
// printf("j = %d\n",j);
else if ( nCount == 1 ){
UserTextPassword[j] = AllUserMSG[i];
j++;
if ( AllUserMSG[i] == '.' ){
UserTextPassword[j-1] = '\0';
j = 0;
nCount++;
// printf("nCount = %d\n",nCount);
}
}
// printf("AllUserMSG = %s\n",AllUserMSG);
// printf("111\n");
}
printf("UserTextCount = %s, UserTextPassword = %s\n",UserTextCount, UserTextPassword);
printf("useraccount = %s, userpassword = %s\n",useraccount, userpassword);
if ( strcmp(useraccount, UserTextCount) == 0 && strcmp(userpassword, UserTextPassword) == 0 ){
printf("您输入的账户信息正确\n");
MSG = 1;
// printf("111\n");
}
}
fclose(pFile);
pFile = NULL;
if ( MSG == 0 ){
printf("您输入的账号或密码不正确,您还有两次输入机会,请重新输入\n");
printf("账号:\n");
scanf("%s",useraccount);
getchar();
printf("密码:\n");
// scanf("%s",userpassword);
// getchar();
//使用 * 号输入:
//这里有问题 怎么输入密码
char ch;
i = 0;
while ( (ch = getch()) != '\r' && i < 100 ){
userpassword[i] = ch;
i++;
printf("*");
}
userpassword[i] = '\0';
printf("\n");
printf("%s\n",userpassword);
//下面检验当前输入的账号和密码与保存在文件中的任一除了系统初始设定的普通账号和密码不同的一组账号和密码,简单,在文件中只保存VIP的账号和密码
pFile = fopen("NewCount","rb+");
if (NULL == pFile)
{
printf("文件打开失败\n");
return 0;
}
// fwrite("zhanghao.mima.", 1, strlen("zhanghao.mima."), pFile);
//读入文件中每一行的账号和密码,每读入一次,把把账号和密码分别赋值给两个新创建的数组储存,再用strcmp函数作比较,只要有一次符合要求,就进入教师端
MSG = 0;
//这里有问题,UserTextPassword无法保存
while ( fgets(AllUserMSG, 100, pFile) != NULL && MSG == 0){
//把文件中的所有账号和密码都遍历一遍,与你现在输入的账号和密码做比较
char UserTextCount[100] = {
0};
char UserTextPassword[100] = {
0};
//这下面写 把每一行的账号和密码转化出来赋值给 UserTextCount 和 UserTextPassword
nCount = 0;
j = 0;
for ( i = 0; AllUserMSG[i] != '\r'; i++ ){
if ( nCount == 0 ){
UserTextCount[j] = AllUserMSG[i];
j++;
if ( AllUserMSG[i] == '.' ){
UserTextCount[j-1] = '\0';
j = 0;
nCount++;
// printf("nCount = %d\n",nCount);
}
}
// printf("j = %d\n",j);
else if ( nCount == 1 ){
UserTextPassword[j] = AllUserMSG[i];
j++;
if ( AllUserMSG[i] == '.' ){
UserTextPassword[j-1] = '\0';
j = 0;
nCount++;
// printf("nCount = %d\n",nCount);
}
}
// printf("AllUserMSG = %s\n",AllUserMSG);
// printf("111\n");
}
printf("UserTextCount = %s, UserTextPassword = %s\n",UserTextCount, UserTextPassword);
printf("useraccount = %s, userpassword = %s\n",useraccount, userpassword);
if ( strcmp(useraccount, UserTextCount) == 0 && strcmp(userpassword, UserTextPassword) == 0 ){
printf("您输入的账户信息正确\n");
MSG = 1;
// printf("111\n");
}
}
fclose(pFile);
pFile = NULL;
if ( MSG == 0 ){
printf("您输入的账号或密码不正确,您还有一次输入机会\n警告,如果再次输入不正确,将退出程序!\n请重新输入:\n");
printf("账号:\n");
scanf("%s",useraccount);
getchar();
printf("密码:\n");
// scanf("%s",userpassword);
// getchar();
//使用 * 号输入:
//这里有问题 怎么输入密码
char ch;
i = 0;
while ( (ch = getch()) != '\r' && i < 100 ){
userpassword[i] = ch;
i++;
printf("*");
}
userpassword[i] = '\0';
printf("\n");
printf("%s\n",userpassword);
//下面检验当前输入的账号和密码与保存在文件中的任一除了系统初始设定的普通账号和密码不同的一组账号和密码,简单,在文件中只保存VIP的账号和密码
pFile = fopen("NewCount","rb+");
if (NULL == pFile)
{
printf("文件打开失败\n");
return 0;
}
// fwrite("zhanghao.mima.", 1, strlen("zhanghao.mima."), pFile);
//读入文件中每一行的账号和密码,每读入一次,把把账号和密码分别赋值给两个新创建的数组储存,再用strcmp函数作比较,只要有一次符合要求,就进入教师端
MSG = 0;
//这里有问题,UserTextPassword无法保存
while ( fgets(AllUserMSG, 100, pFile) != NULL && MSG == 0){
//把文件中的所有账号和密码都遍历一遍,与你现在输入的账号和密码做比较
char UserTextCount[100] = {
0};
char UserTextPassword[100] = {
0};
//这下面写 把每一行的账号和密码转化出来赋值给 UserTextCount 和 UserTextPassword
nCount = 0;
j = 0;
for ( i = 0; AllUserMSG[i] != '\r'; i++ ){
if ( nCount == 0 ){
UserTextCount[j] = AllUserMSG[i];
j++;
if ( AllUserMSG[i] == '.' ){
UserTextCount[j-1] = '\0';
j = 0;
nCount++;
// printf("nCount = %d\n",nCount);
}
}