一.一些感受

写了大概一个月,中间零零散散修改了很多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 和 UserTextPasswordnCount = 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 和 UserTextPasswordnCount = 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 和 UserTextPasswordnCount = 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;}}//   后面那个while的大括号记得去掉if ( MSG == 1 ){//只要成立,自动认为是教师端账户//    MSG = 1;printf("您的账号密码输入均正确\n您已成功进入教师端学生成绩管理系统\n");
//  int nOrder = -1; //nOrder iOrder  s db arr p//初始化char arrStuNum[10] = {'\0'};char arrStuName[10] = {'\0'};
//  int  iStuScore = -1;int Select;int nFlag = 1;int RankSelect;//这也得改成char雷迪奥迪//  int AgainCarryOut;//回到选择命令行,重新输入指令int RealSelectBy;//用于打印信息的case//  int InterSelectByOneAndTwo[100] = {0};//  getchar();STUNODE* pTemp = NULL;ShowOrder();//取其一选择//读取文件中学生信息ReadStuFromFile();//  char nOrder[100] = {0};
//    int i;//   int InterNOrder[100] = {0};while(nFlag){int AgainCarryOut;int kNum = 1;int RealSelectByOneAndTwo = 0;char SelectByOneAndTwo[100] = {0};char FindMsg[100] = {0};char iStuScore[100] = {0};int InteriStuScore[100] = {0};int NumiStuScore = 0;int kScore = 1;int InterSelectByOneAndTwo[100] = {0};char nOrder[100] = {0};k = 1;int SwitchNumber = 0;int InterNOrder[100] = {0};printf ("请输入指令(10、查看指令):");//    getchar();//必须加gechar()要不然前面有%sscanf("%s",nOrder);
//      printf("strlen(nOrder) = %d\n",strlen(nOrder));for ( i = 0; i < strlen(nOrder); i++ ){InterNOrder[i] = nOrder[i] - 48;//          printf("%d\n",InterNOrder[i]);}for ( i = strlen(nOrder)-1; i >= 0; i-- ){SwitchNumber += k * InterNOrder[i];k *= 10;}//   getchar();
//        int i;int Flag1;int Num1;int Num2;int Num3;int Num4;char strBuf[50] = {0};char strStuNum[10] = {0};int nCount;
//      int j;int MarkOrLogo;int LogoIfTextHaveReapper;//      atoi(nOrder);//     printf("SwitchNumber= %d\n",SwitchNumber);if ( SwitchNumber < 1 || SwitchNumber > 14 ){printf("您输入的指令有误,请重新输入!\n");}else {//   getchar();switch (SwitchNumber)//两种可能 输入错误的话还得加一种 选择退出或者是继续输入。{case 1://      int InterSelectByOneAndTwo[100] = {0};nCount = 0;LogoIfTextHaveReapper = 0;j = 0;MarkOrLogo = 0;NumiStuScore = 0;kScore = 1;RealSelectBy = 0;kNum = 1;RealSelectByOneAndTwo = 0;Num1 = 0;Num2 = 0;Num3 = 0;Num4 = 0;AgainCarryOut = 0;system("cls");//尾添加//把他们也写到一个函数中去//    JudgeIfRFight();if (JudgeIfRFight() == 1)//判断指令是否输入正确,如果 == 1 说明指令输入不正确{printf("指令输入不正确,请重新输入指令\n");//break一般只跳出一层大括号,进入上一层的下一句。}else {//添加一个学生的信息printf ("请输入8位学号:");scanf ("%s", arrStuNum);getchar();fp = NULL;fp = fopen("dat.dat", "rb+");if (NULL == fp){printf("文件打开失败\n");return 0;}//操作指针,读取函数while( NULL !=  fgets(strBuf, 50, fp) && LogoIfTextHaveReapper == 0 )  //EOF  feof   3部分{i = 0;nCount = 0;j = 0;for (i = 0; strBuf[i] != '\r'; i++){if(0 == nCount) //没到'.'{strStuNum[j] = strBuf[i];j++;if ('.' == strBuf[i]){strStuNum[j-1] = '\0';nCount++;j = 0;}}}if ( strcmp(arrStuNum, strStuNum) == 0 ){printf("您输入的学号和之前系统中保存的学号相同\n请仔细检查您的学号输入是否有误!\n");MarkOrLogo = 1;LogoIfTextHaveReapper = 1;}if ( MarkOrLogo == 1 ){printf ("PS:这次不要再输入重复学号啦!\n请输入8位学号:");scanf ("%s", arrStuNum);getchar();if (strlen(arrStuNum) != 8){printf("由于您学号格式输入有误,系统自动进入以下选择界面:\n键入1:我不想继续输入了,返回至选择命令界面\n键入2:收到系统提示并进行第二次输入\n键入其他,将返回选择命令行\n");scanf("%s",SelectByOneAndTwo);getchar();for ( i = 0; i < strlen(SelectByOneAndTwo); i++ ){InterSelectByOneAndTwo[i] = SelectByOneAndTwo[i]-48;}for ( i = strlen(SelectByOneAndTwo)-1; i >= 0; i-- ){RealSelectByOneAndTwo += InterSelectByOneAndTwo[i] * kNum;kNum *= 10;}printf("RealSelectByOneAndTwo = %d\n",RealSelectByOneAndTwo);switch(RealSelectByOneAndTwo){case 1:printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");AgainCarryOut = 1;break;case 2:printf("您输入的学号不够或超过8位,您还有一次输入机会,如果您再次因粗心输入错误,将回到选择界面!\n请认真核对后重新输入学号:\n");Num2 = 1;break;default:Num2 = 2;printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");break;}//   if ( AgainCarryOut == 1 ){//不行的话把这句话放外面 变成 else if//       break;//  }}if ( AgainCarryOut == 1 ){//不行的话把这句话放外面 变成 else ifbreak;}if ( Num2 == 2 ){break;}//    if ( AgainCarryOut != 1 && Num2 != 2)if ( strlen(arrStuNum) == 8 ){//else 里面是判断如果输入学号刚好8位,那么是否全是数字for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("您输入的学号不正确,可能是您输入了字母,您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学号:\n");Num1 = 1;break;}}}if (Num1 == 1 || Num2 == 1){//这两种可能都是因为输入的学号格式不正确,重新输入scanf ("%s", arrStuNum);getchar();}if ( strlen(arrStuNum) != 8 ){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}}}fclose(fp);if ( MarkOrLogo == 0 ){if (strlen(arrStuNum) != 8){printf("由于您学号格式输入有误,系统自动进入以下选择界面:\n键入1:我不想继续输入了,返回至选择命令界面\n键入2:收到系统提示并进行第二次输入\n键入其他,将返回选择命令行\n");scanf("%s",SelectByOneAndTwo);getchar();for ( i = 0; i < strlen(SelectByOneAndTwo); i++ ){InterSelectByOneAndTwo[i] = SelectByOneAndTwo[i]-48;}for ( i = strlen(SelectByOneAndTwo)-1; i >= 0; i-- ){RealSelectByOneAndTwo += InterSelectByOneAndTwo[i] * kNum;kNum *= 10;}printf("RealSelectByOneAndTwo = %d\n",RealSelectByOneAndTwo);switch(RealSelectByOneAndTwo){case 1:printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");AgainCarryOut = 1;break;case 2:printf("您输入的学号不够或超过8位,您还有一次输入机会,如果您再次因粗心输入错误,将回到选择界面!\n请认真核对后重新输入学号:\n");Num2 = 1;break;default:Num2 = 2;printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");break;}//   if ( AgainCarryOut == 1 ){//不行的话把这句话放外面 变成 else if//       break;//  }}if ( AgainCarryOut == 1 ){//不行的话把这句话放外面 变成 else ifbreak;}if ( Num2 == 2 ){break;}if ( AgainCarryOut != 1 && Num2 != 2 ){if ( strlen(arrStuNum) == 8 ){//else 里面是判断如果输入学号刚好8位,那么是否全是数字for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("您输入的学号不正确,可能是您输入了字母,您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学号:\n");Num1 = 1;break;}}}if (Num1 == 1 || Num2 == 1){//这两种可能都是因为输入的学号格式不正确,重新输入scanf ("%s", arrStuNum);getchar();}if ( strlen(arrStuNum) != 8 ){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}}/*   printf("您输入的学号不够8位,您还有一次输入机会,如果您再次因粗心输入错误,将退出程序!\n请认真核对后重新输入学号:\n");Num2 = 1;}else{for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("您输入的学号不正确,可能是您输入了字母或键入学号不够8位,您还有一次输入机会,如果您再次因粗心输入错误,将退出程序!\n请认真核对后重新输入学号:\n");Num1 = 1;break;}}}if (Num1 == 1 || Num2 == 1){//输入的学号格式不正确,重新输入scanf ("%s", arrStuNum);}*/printf ("请输入姓名:");scanf ("%s", arrStuName);getchar();//      printf("strlen(arrStuName) = %d\n",strlen(arrStuName));for ( i = 0; i < strlen(arrStuName); i++ ){//            printf("arrStuName[i] = %d\n",arrStuName[i]);if (arrStuName[i] >= 48 && arrStuName[i] <= 57){printf("您输入的姓名格式不正确,可能是您输入了数字\n因为您已经成功输入了正确的学号,系统默认您要把该生信息全部输入完毕。此时系统只有继续输入的选项。\n您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学生姓名:\n");Num3 = 1;break;}}if (Num3 == 1){//输入的学号格式不正确,重新输入scanf ("%s", arrStuName);getchar();for ( i = 0; i < strlen(arrStuName); i++ ){if (arrStuName[i] >= 48 && arrStuName[i] <= 57){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}}//下面这些函数声明 写到上面去 最后// char iStuScore[100] = {0};//   int InteriStuScore[100] = {0};//   int NumiStuScore = 0;//    int kScore = 1;printf ("输入分数:");//   scanf ("%d", &iStuScore);scanf("%s",iStuScore);getchar();for ( i = 0; i < strlen(iStuScore); i++ ){if ( 48 <=  iStuScore[i] && iStuScore[i] <= 57){InteriStuScore[i] = iStuScore[i] - 48;}else{InteriStuScore[i] = 1000;//分数有两种可能break;}}for ( i = strlen(iStuScore)-1; i >= 0; i-- ){NumiStuScore += InteriStuScore[i] * kScore;kScore *= 10;}if (NumiStuScore < 0 || NumiStuScore > 650){printf("您输入的分数超过了满分650分,也可能是您输入了负分,还有极大可能您输入了字母\n因为您已经成功输入了正确的学号和姓名,系统默认您要把该生信息全部输入完毕。此时系统只有继续输入的选项。\n您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对分数后重新输入学生分数:\n");Num4 = 1;}if (Num4 == 1){scanf ("%s", iStuScore);getchar();for ( i = 0; i < strlen(iStuScore); i++ ){if ( iStuScore[i] < 48 || iStuScore[i] > 57 ){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}}AddStuMSG(arrStuNum, arrStuName, iStuScore);}}printf("该指令已经执行完毕\n下面为您显示选择命令行,方便进行下一个指令的输入\n");ShowOrder();break;case 11:  //中间插入添加NumiStuScore = 0;nCount = 0;LogoIfTextHaveReapper = 0;j = 0;MarkOrLogo = 0;kScore = 1;RealSelectBy = 0;kNum = 1;RealSelectByOneAndTwo = 0;Num1 = 0;Num2 = 0;Num3 = 0;Num4 = 0;AgainCarryOut = 0;system("cls");//尾添加//把他们也写到一个函数中去//    JudgeIfRFight();if (JudgeIfRFight() == 1)//判断指令是否输入正确,如果 == 1 说明指令输入不正确{printf("指令输入不正确,请重新输入指令\n");//break一般只跳出一层大括号,进入上一层的下一句。}else {printf ("以下为已有学生信息\n请输入8位学号(已有学生的学号),来选择将新学生插入到哪个学生的后面去:\n");//输入已添加学号ShowStuData();scanf ("%s", arrStuNum);getchar();if (strlen(arrStuNum) != 8){printf("由于您学号格式输入有误,系统自动进入以下选择界面:\n键入1:我不想继续输入了,返回至选择命令界面\n键入2:收到系统提示并进行第二次输入\n键入其他,将返回选择命令行\n");scanf("%s",SelectByOneAndTwo);getchar();for ( i = 0; i < strlen(SelectByOneAndTwo); i++ ){InterSelectByOneAndTwo[i] = SelectByOneAndTwo[i] - 48;}for ( i = strlen(SelectByOneAndTwo)-1; i >= 0; i-- ){RealSelectByOneAndTwo += InterSelectByOneAndTwo[i] * kNum;kNum *= 10;}printf("RealSelectByOneAndTwo = %d\n",RealSelectByOneAndTwo);;switch(RealSelectByOneAndTwo){case 1:printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");AgainCarryOut = 1;break;case 2:printf("您输入的学号不够或超过8位,您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学号:\n");Num2 = 1;break;default:Num2 = 2;printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");break;}//   if ( AgainCarryOut == 1 ){//不行的话把这句话放外面 变成 else if//       break;//  }}if ( AgainCarryOut == 1 ){//不行的话把这句话放外面 变成 else ifbreak;}if ( Num2 == 2 ){break;}printf("strlen(arrStuNum) = %d\n",strlen(arrStuNum));if ( strlen(arrStuNum) == 8 ){for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("您输入的学号不正确,可能是您输入了字母,您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学号:\n");Num1 = 1;break;}}}if (Num1 == 1 || Num2 == 1){//输入的学号格式不正确,重新输入scanf ("%s", arrStuNum);getchar();}if ( strlen(arrStuNum) != 8 ){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}NumiStuScore = 0;kScore = 1;RealSelectBy = 0;kNum = 1;RealSelectByOneAndTwo = 0;Num1 = 0;Num2 = 0;Num3 = 0;Num4 = 0;AgainCarryOut = 0;pTemp = FindStuByNum(arrStuNum);if (NULL != pTemp)  //200501013  1254{//TODO:插入printf ("请输入新添加学生的8位学号:");scanf ("%s", arrStuNum);getchar();fp = NULL;fp = fopen("dat.dat", "rb+");if (NULL == fp){printf("文件打开失败\n");return 0;}//操作指针,读取函数while( NULL !=  fgets(strBuf, 50, fp) && LogoIfTextHaveReapper == 0 )  //EOF  feof   3部分{i = 0;nCount = 0;j = 0;for (i = 0; strBuf[i] != '\r'; i++){if(0 == nCount) //没到'.'{strStuNum[j] = strBuf[i];j++;if ('.' == strBuf[i]){strStuNum[j-1] = '\0';nCount++;j = 0;}}}if ( strcmp(arrStuNum, strStuNum) == 0 ){printf("您输入的学号和之前系统中保存的学号相同\n请仔细检查您的学号输入是否有误!\n");MarkOrLogo = 1;LogoIfTextHaveReapper = 1;}if ( MarkOrLogo == 1 ){printf ("PS:这次不要再输入重复学号啦!\n请输入8位学号:");scanf ("%s", arrStuNum);getchar();if (strlen(arrStuNum) != 8){printf("由于您学号格式输入有误,系统自动进入以下选择界面:\n键入1:我不想继续输入了,返回至选择命令界面\n键入2:收到系统提示并进行第二次输入\n键入其他,将返回选择命令行\n");scanf("%s",SelectByOneAndTwo);getchar();for ( i = 0; i < strlen(SelectByOneAndTwo); i++ ){InterSelectByOneAndTwo[i] = SelectByOneAndTwo[i]-48;}for ( i = strlen(SelectByOneAndTwo)-1; i >= 0; i-- ){RealSelectByOneAndTwo += InterSelectByOneAndTwo[i] * kNum;kNum *= 10;}printf("RealSelectByOneAndTwo = %d\n",RealSelectByOneAndTwo);switch(RealSelectByOneAndTwo){case 1:printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");AgainCarryOut = 1;break;case 2:printf("您输入的学号不够或超过8位,您还有一次输入机会,如果您再次因粗心输入错误,将回到选择界面!\n请认真核对后重新输入学号:\n");Num2 = 1;break;default:Num2 = 2;printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");break;}//   if ( AgainCarryOut == 1 ){//不行的话把这句话放外面 变成 else if//       break;//  }}if ( AgainCarryOut == 1 ){//不行的话把这句话放外面 变成 else ifbreak;}if ( Num2 == 2 ){break;}if ( strlen(arrStuNum) == 8 ){//else 里面是判断如果输入学号刚好8位,那么是否全是数字for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("您输入的学号不正确,可能是您输入了字母,您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学号:\n");Num1 = 1;break;}}}if (Num1 == 1 || Num2 == 1){//这两种可能都是因为输入的学号格式不正确,重新输入scanf ("%s", arrStuNum);getchar();}if ( strlen(arrStuNum) != 8 ){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}}}fclose(fp);if ( MarkOrLogo == 0 ){if (strlen(arrStuNum) != 8){printf("由于您学号格式输入有误,系统自动进入以下选择界面:\n键入1:我不想继续输入了,返回至选择命令界面\n键入2:收到系统提示并进行第二次输入\n键入其他,将返回选择命令行\n");scanf("%s",SelectByOneAndTwo);getchar();for ( i = 0; i < strlen(SelectByOneAndTwo); i++ ){InterSelectByOneAndTwo[i] = SelectByOneAndTwo[i] - 48;}for ( i = strlen(SelectByOneAndTwo)-1; i >= 0; i-- ){RealSelectByOneAndTwo += InterSelectByOneAndTwo[i] * kNum;kNum *= 10;}printf("RealSelectByOneAndTwo = %d\n",RealSelectByOneAndTwo);switch(RealSelectByOneAndTwo){case 1:printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");AgainCarryOut = 1;break;case 2:printf("您输入的学号不够或超过8位,您还有一次输入机会,如果您再次因粗心输入错误,将回到选择界面!\n请认真核对后重新输入学号:\n");Num2 = 1;break;default:Num2 = 2;printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");break;}}if ( AgainCarryOut == 1 ){//不行的话把这句话放外面 变成 else ifbreak;}if ( Num2 == 2 ){break;}if ( strlen(arrStuNum) == 8 ){for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("您输入的学号不正确,可能是您输入了字母,您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学号:\n");Num1 = 1;break;}}}if (Num1 == 1 || Num2 == 1){//输入的学号格式不正确,重新输入scanf ("%s", arrStuNum);getchar();}if ( strlen(arrStuNum) != 8 ){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}}printf ("请输入新添加的学生的姓名:");scanf ("%s", arrStuName);getchar();for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuName[i] >= 48 && arrStuName[i] <= 57){printf("您输入的姓名格式不正确,可能是您输入了数字。\n因为您已经将新添加的学生学号输入正确,系统默认您要把该生信息全部输入完毕。此时系统只有继续输入的选项。\n您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学生姓名:\n");Num3 = 1;break;}}if (Num3 == 1){//输入的学号格式不正确,重新输入scanf ("%s", arrStuName);getchar();for ( i = 0; i < strlen(arrStuName); i++ ){if (arrStuName[i] >= 48 && arrStuName[i] <= 57){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}}printf ("请输入新添加的学生的分数:");scanf ("%s", iStuScore);getchar();for ( i = 0; i < strlen(iStuScore); i++ ){if ( 48 <=  iStuScore[i] && iStuScore[i] <= 57){InteriStuScore[i] = iStuScore[i] - 48;}else{InteriStuScore[i] = 1000;break;}}for ( i = strlen(iStuScore)-1; i >= 0; i-- ){NumiStuScore += InteriStuScore[i] * kScore;kScore *= 10;}if (NumiStuScore < 0 || NumiStuScore > 650){printf("您输入的分数超过了满分650分,也可能是您输入了负分,还可能是您输入了字母。\n因为您已经将新添加的学生学号和姓名输入正确,系统默认您要把该生信息全部输入完毕。此时系统只有继续输入的选项。\n您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对分数后重新输入学生分数:\n");Num4 = 1;}if (Num4 == 1){scanf ("%s", iStuScore);getchar();for ( i = 0; i < strlen(iStuScore); i++ ){if ( iStuScore[i] < 48 || iStuScore[i] > 57 ){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}}InsertNode(pTemp, arrStuNum, arrStuName, iStuScore);}}printf("该指令已经执行完毕\n下面为您显示选择命令行,方便进行下一个指令的输入\n");ShowOrder();break;case 2: //查找\打印指定学生的信息//输入一个学号NumiStuScore = 0;kScore = 1;RealSelectBy = 0;kNum = 1;RealSelectByOneAndTwo = 0;Num1 = 0;Num2 = 0;Num3 = 0;Num4 = 0;AgainCarryOut = 0;system("cls");if (JudgeIfRFight() == 1)//判断指令是否输入正确,如果 == 1 说明指令输入不正确{printf("指令输入不正确,请重新输入指令\n");//break一般只跳出一层大括号,进入上一层的下一句。}else {printf("想通过什么方式查找信息?\n键入1.通过学号查找 键入2.通过姓名查找");scanf("%s",FindMsg);getchar();for ( i = 0; i < strlen(FindMsg); i++ ){InterSelectByOneAndTwo[i] = FindMsg[i] - 48;}for ( i = strlen(FindMsg)-1; i >= 0; i-- ){RealSelectBy += InterSelectByOneAndTwo[i] * kNum;kNum *= 10;}printf("RealSelectBy = %d\n",RealSelectBy);if ( RealSelectBy == 1 ){//通过学号查找printf ("请输入8位指定学号,以便于查找学生信息:");scanf ("%s", arrStuNum);getchar();//判断kNum = 1;if (strlen(arrStuNum) != 8){printf("由于您学号格式输入有误,系统自动进入以下选择界面:\n键入1:我不想继续输入了,返回至选择命令界面\n键入2:收到系统提示并进行第二次输入\n键入其他,将返回选择命令行\n");scanf("%s",SelectByOneAndTwo);getchar();for ( i = 0; i < strlen(SelectByOneAndTwo); i++ ){InterSelectByOneAndTwo[i] = SelectByOneAndTwo[i]-48;}for ( i = strlen(SelectByOneAndTwo)-1; i >= 0; i-- ){RealSelectByOneAndTwo += InterSelectByOneAndTwo[i] * kNum;kNum *= 10;}printf("RealSelectByOneAndTwo = %d\n",RealSelectByOneAndTwo);switch(RealSelectByOneAndTwo){case 1:printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");AgainCarryOut = 1;break;case 2:printf("您输入的学号不够或超过8位,您还有一次输入机会,如果您再次因粗心输入错误,将回到选择界面!\n请认真核对后重新输入学号:\n");Num2 = 1;break;default:Num2 = 2;printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");break;}}if ( AgainCarryOut == 1 ){//不行的话把这句话放外面 变成 else ifbreak;}if ( Num2 == 2 ){break;}if ( strlen(arrStuNum) == 8 ){//else 里面是判断如果输入学号刚好8位,那么是否全是数字for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("您输入的学号不正确,可能是您输入了字母,您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学号:\n");Num1 = 1;break;}}}if (Num1 == 1 || Num2 == 1){//这两种可能都是因为输入的学号格式不正确,重新输入scanf ("%s", arrStuNum);getchar();}if ( strlen(arrStuNum) != 8 ){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}//查找pTemp = FindStuByNum(arrStuNum);//打印if (NULL != pTemp)  //200501013  1254{printf("以下为该学生信息:\n学号:%-10s, 姓名:%-12s, 分数:%-4d\n", pTemp->arrStuNum, pTemp->arrStuName, pTemp->iStuScore);}else{printf("您输入的学号有误!");}}else if ( RealSelectBy == 2 ){//通过姓名查找NumiStuScore = 0;kScore = 1;RealSelectBy = 0;kNum = 1;RealSelectByOneAndTwo = 0;Num1 = 0;Num2 = 0;Num3 = 0;Num4 = 0;AgainCarryOut = 0;printf("请输入学生姓名,以便于查找学生信息:");scanf("%s", arrStuName);getchar();for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuName[i] >= 48 && arrStuName[i] <= 57){printf("由于您输入的姓名的格式输入有误,可能是您输入了数字。系统自动进入以下选择界面:\n键入1:我不想继续输入了,返回至选择命令界面\n键入2:收到系统提示并进行第二次输入\n键入其他,将返回选择命令行\n");scanf("%s",SelectByOneAndTwo);getchar();for ( i = 0; i < strlen(SelectByOneAndTwo); i++ ){InterSelectByOneAndTwo[i] = SelectByOneAndTwo[i] - 48;}for ( i = strlen(SelectByOneAndTwo)-1; i >= 0; i-- ){RealSelectByOneAndTwo += InterSelectByOneAndTwo[i] * kNum;kNum *= 10;}printf("RealSelectByOneAndTwo = %d\n",RealSelectByOneAndTwo);switch(RealSelectByOneAndTwo){case 1:printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");AgainCarryOut = 1;break;case 2:printf("您输入的姓名的格式输入有误,可能是您输入了数字。\n您还有一次输入机会,如果您再次因粗心输入错误,将回到选择界面!\n请认真核对后重新输入姓名:\n");Num3 = 1;break;default:Num3 = 2;printf("您输入的不符合任何,将重新返回选择命令行\n");printf("为您显示选择命令行:\n");ShowOrder();break;}}break;}if ( AgainCarryOut == 1 ){//不行的话把这句话放外面 变成 else ifbreak;}if ( Num3 == 2 ){break;}if (Num3 == 1){//输入的学号格式不正确,重新输入scanf ("%s", arrStuName);getchar();for ( i = 0; i < strlen(arrStuName); i++ ){if (arrStuName[i] >= 48 && arrStuName[i] <= 57){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}}pTemp = FindMSGByName(arrStuName);if ( pTemp ){printf("以下为该学生信息:\n");printf("学号:%-10s 姓名:%-12s 成绩:%-4d\n",pTemp->arrStuNum,pTemp->arrStuName,pTemp->iStuScore);}else{printf("系统中没有您要查找的学生信息,系统将重新返回选择命令行\n");printf("为您显示选择命令行:\n");ShowOrder();}}else {//NUM不等于1也不等于2时printf("您输入的指令错误,系统重回命令选择界面\n");printf("为您显示选择命令行:\n");ShowOrder();break;}}printf("该指令已经执行完毕\n下面为您显示选择命令行,方便进行下一个指令的输入\n");ShowOrder();break;case 3:  //修改指定学生的信息NumiStuScore = 0;kScore = 1;RealSelectBy = 0;kNum = 1;RealSelectByOneAndTwo = 0;Num1 = 0;Num2 = 0;Num3 = 0;Num4 = 0;AgainCarryOut = 0;system("cls");//判断指令是否输入正确if (JudgeIfRFight() == 1)//判断指令是否输入正确,如果 == 1 说明指令输入不正确{printf("指令输入不正确,请重新输入指令\n");//break一般只跳出一层大括号,进入上一层的下一句。}else{//输入一个学号printf ("以下为已有学生信息:\n");ShowStuData();printf("请输入8位指定学号(已有学生),用于修改已有学生信息:");scanf ("%s", arrStuNum);getchar();if (strlen(arrStuNum) != 8){printf("由于您学号格式输入有误,系统自动进入以下选择界面:\n键入1:我不想继续输入了,返回至选择命令界面\n键入2:收到系统提示并进行第二次输入\n键入其他,将返回选择命令行\n");scanf("%s",SelectByOneAndTwo);getchar();for ( i = 0; i < strlen(SelectByOneAndTwo); i++ ){InterSelectByOneAndTwo[i] = SelectByOneAndTwo[i] - 48;}for ( i = strlen(SelectByOneAndTwo)-1; i >= 0; i-- ){RealSelectByOneAndTwo += InterSelectByOneAndTwo[i] * kNum;kNum *= 10;}printf("RealSelectByOneAndTwo = %d\n",RealSelectByOneAndTwo);switch(RealSelectByOneAndTwo){case 1:printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");AgainCarryOut = 1;break;case 2:printf("您输入的学号不够或超过8位,您还有一次输入机会,如果您再次因粗心输入错误,将回到选择界面!\n请认真核对后重新输入学号:\n");Num2 = 1;break;default:Num2 = 2;printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");break;}}if ( AgainCarryOut == 1 ){//不行的话把这句话放外面 变成 else ifbreak;}if ( Num2 == 2 ){break;}if ( strlen(arrStuNum) == 8 ){//else 里面是判断如果输入学号刚好8位,那么是否全是数字for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("您输入的学号不正确,可能是您输入了字母,您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学号:\n");Num1 = 1;break;}}}if (Num1 == 1 || Num2 == 1){//这两种可能都是因为输入的学号格式不正确,重新输入scanf ("%s", arrStuNum);getchar();if ( strlen(arrStuNum) != 8 ){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}}pTemp = FindStuByNum(arrStuNum);//查找NumiStuScore = 0;kScore = 1;RealSelectBy = 0;kNum = 1;RealSelectByOneAndTwo = 0;Num1 = 0;Num2 = 0;Num3 = 0;Num4 = 0;AgainCarryOut = 0;//打印if (NULL != pTemp)  //200501013  1254{//修改学好printf ("请输入修改后的学号:");scanf("%s", arrStuNum);getchar();if (strlen(arrStuNum) != 8){printf("您输入的学号不够8位。\n因为您已经成功输入了要修改学生的学号,系统默认您要把该生信息全部修改完毕。此时系统只有继续修改的选项。\n您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学生学号:\n");Num2 = 1;}else{for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("您输入的学号不正确,可能是您输入了字母。\n因为您已经成功输入了要修改学生的学号,系统默认您要把该生信息全部修改完毕。此时系统只有继续修改的选项。\n您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学生学号:\n");Num1 = 1;break;}}}if (Num1 == 1 || Num2 == 1){//这两种可能都是因为输入的学号格式不正确,重新输入scanf ("%s", arrStuNum);getchar();}if ( strlen(arrStuNum) != 8 ){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}strcpy(pTemp->arrStuNum, arrStuNum);//修改名字、printf ("请输入修改后的名字:");scanf("%s", arrStuName);getchar();for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuName[i] >= 48 && arrStuName[i] <= 57){printf("您输入的姓名格式不正确,可能是您输入了数字。\n因为您已经成功输入了修改后学生的学号,系统默认您要把该生信息全部修改完毕。此时系统只有继续修改的选项。\n您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学生姓名:\n");Num3 = 1;break;}}if (Num3 == 1){//输入的学号格式不正确,重新输入scanf ("%s", arrStuName);getchar();for ( i = 0; i < strlen(arrStuName); i++ ){if (arrStuName[i] >= 48 && arrStuName[i] <= 57){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}}strcpy(pTemp->arrStuName, arrStuName);//修改分数printf ("请输入修改后的分数:");scanf("%s", iStuScore);getchar();for ( i = 0; i < strlen(iStuScore); i++ ){if ( 48 <=  iStuScore[i] && iStuScore[i] <= 57){InteriStuScore[i] = iStuScore[i] - 48;}else{InteriStuScore[i] = 1000;//分数有两种可能break;}}for ( i = strlen(iStuScore)-1; i >= 0; i-- ){NumiStuScore += InteriStuScore[i] * kScore;kScore *= 10;}if (NumiStuScore < 0 || NumiStuScore > 650){printf("您输入的分数超过了满分650分,也可能是您输入了负分,还可能您输入了字母。\n因为您已经成功输入了修改后学生的学号和姓名,系统默认您要把该生信息全部修改完毕。此时系统只有继续修改的选项。\n您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学生成绩:\n");Num4 = 1;}if (Num4 == 1){scanf ("%s", iStuScore);getchar();for ( i = 0; i < strlen(iStuScore); i++ ){if ( iStuScore[i] < 48 || iStuScore[i] > 57 ){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}}NumiStuScore = 0;kScore = 1;for ( i = 0; i < strlen(iStuScore); i++ ){if ( 48 <=  iStuScore[i] && iStuScore[i] <= 57){InteriStuScore[i] = iStuScore[i] - 48;}}for ( i = strlen(iStuScore)-1; i >= 0; i-- ){NumiStuScore += InteriStuScore[i] * kScore;kScore *= 10;}pTemp->iStuScore = NumiStuScore;}}printf("该指令已经执行完毕\n下面为您显示选择命令行,方便进行下一个指令的输入\n");ShowOrder();break;case 4://保存信息if (JudgeIfRFight() == 1)//判断指令是否输入正确,如果 == 1 说明指令输入不正确{printf("指令输入不正确,请重新输入指令\n");//break一般只跳出一层大括号,进入上一层的下一句。}else {//保存学生信息SaveStuToFile();}printf("该指令已经执行完毕\n下面为您显示选择命令行,方便进行下一个指令的输入\n");ShowOrder();break;
/*        case 5:if (JudgeIfRFight() == 1)//判断指令是否输入正确,如果 == 1 说明指令输入不正确{printf("指令输入不正确,请重新输入指令\n");//break一般只跳出一层大括号,进入上一层的下一句。}else {RankStuByminNum();//升序排序学生}printf("该指令已经执行完毕\n下面为您显示选择命令行,方便进行下一个指令的输入\n");ShowOrder();break;*/case 6://删除学生信息//输入一个学号NumiStuScore = 0;kScore = 1;RealSelectBy = 0;kNum = 1;RealSelectByOneAndTwo = 0;Num1 = 0;Num2 = 0;Num3 = 0;Num4 = 0;AgainCarryOut = 0;system("cls");if (JudgeIfRFight() == 1)//判断指令是否输入正确,如果 == 1 说明指令输入不正确{printf("指令输入不正确,请重新输入指令\n");//break一般只跳出一层大括号,进入上一层的下一句。}else {printf("以下为您显示已有学生信息:\n");ShowStuData();printf ("输入要删除的学生的8位学号:");scanf ("%s", arrStuNum);getchar();if (strlen(arrStuNum) != 8){printf("由于您学号格式输入有误,系统自动进入以下选择界面:\n键入1:我不想继续输入了,返回至选择命令界面\n键入2:收到系统提示并进行第二次输入\n键入其他,将返回选择命令行\n");scanf("%s",SelectByOneAndTwo);getchar();for ( i = 0; i < strlen(SelectByOneAndTwo); i++ ){InterSelectByOneAndTwo[i] = SelectByOneAndTwo[i]-48;}for ( i = strlen(SelectByOneAndTwo)-1; i >= 0; i-- ){RealSelectByOneAndTwo += InterSelectByOneAndTwo[i] * kNum;kNum *= 10;}printf("RealSelectByOneAndTwo = %d\n",RealSelectByOneAndTwo);switch(RealSelectByOneAndTwo){case 1:printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");AgainCarryOut = 1;break;case 2:printf("您输入的学号不够或超过8位,您还有一次输入机会,如果您再次因粗心输入错误,将回到选择界面!\n请认真核对后重新输入学号:\n");Num2 = 1;break;default:Num2 = 2;printf("您输入的不符合任何,将重新返回选择命令行\n");printf("为您显示选择命令行:\n");ShowOrder();break;}//   if ( AgainCarryOut == 1 ){//不行的话把这句话放外面 变成 else if//       break;//  }}if ( AgainCarryOut == 1 ){//不行的话把这句话放外面 变成 else ifbreak;}if ( Num2 == 2 ){break;}if ( strlen(arrStuNum) == 8 ){//else 里面是判断如果输入学号刚好8位,那么是否全是数字for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("您输入的学号不正确,可能是您输入了字母,您还有一次输入机会,如果您再次因粗心输入错误,将结束程序!\n请认真核对后重新输入学号:\n");Num1 = 1;break;}}}if (Num1 == 1 || Num2 == 1){//这两种可能都是因为输入的学号格式不正确,重新输入scanf ("%s", arrStuNum);getchar();}if ( strlen(arrStuNum) != 8 ){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}for ( i = 0; i < strlen(arrStuNum); i++ ){if (arrStuNum[i] < 48 || arrStuNum[i] > 57){printf("粗心使人倒退!希望您早日改掉粗心的坏习惯!\n您太粗心了,系统关闭\n");return 0;}}//查找pTemp = FindStuByNum(arrStuNum);//删除这个节点if (NULL != pTemp)  //200501013  1254{//调用删除学生的函数DeleteStuNode(pTemp);}}printf("该指令已经执行完毕\n下面为您显示选择命令行,方便进行下一个指令的输入\n");ShowOrder();break;case 7://,释放system("cls");if (JudgeIfRFight() == 1)//判断指令是否输入正确,如果 == 1 说明指令输入不正确{printf("指令输入不正确,请重新输入指令\n");//break一般只跳出一层大括号,进入上一层的下一句。}else {FreeLinkData();g_pHead = NULL;g_pEnd = NULL;//回复 添加节点ReadStuFromFile();}printf("该指令已经执行完毕\n下面为您显示选择命令行,方便进行下一个指令的输入\n");ShowOrder();break;/*       case 8://按成绩由高到低对学生进行排序system("cls");if (JudgeIfRFight() == 1)//判断指令是否输入正确,如果 == 1 说明指令输入不正确{printf("指令输入不正确,请重新输入指令\n");//break一般只跳出一层大括号,进入上一层的下一句。}else {RankStuBymaxNum();}printf("该指令已经执行完毕\n下面为您显示选择命令行,方便进行下一个指令的输入\n");ShowOrder();break;*/case 8://显示所有学生信息system("cls");if (JudgeIfRFight() == 1)//判断指令是否输入正确,如果 == 1 说明指令输入不正确{printf("指令输入不正确,请重新输入指令\n");//break一般只跳出一层大括号,进入上一层的下一句。}else {//显示链表内容ShowStuData();}printf("该指令已经执行完毕\n下面为您显示选择命令行,方便进行下一个指令的输入\n");ShowOrder();break;case 10://查看指令system("cls");if (JudgeIfRFight() == 1)//判断指令是否输入正确,如果 == 1 说明指令输入不正确{printf("指令输入不正确,请重新输入指令\n");//break一般只跳出一层大括号,进入上一层的下一句。}else {//查看指令ShowOrder();}printf("该指令已经执行完毕\n下面为您显示选择命令行,方便进行下一个指令的输入\n");ShowOrder();break;/*     case 12://统计成绩高于60分的学生并输出AddUpScoreHigher60();break;case 13://统计成绩低于60分学生的数量AddUpNumOfScoreLower60();break;/*/*case 14://通过姓名查找学生信息printf("请输入学生姓名:");scanf("%s", arrStuName);pTemp = FindMSGByName(arrStuName);if ( pTemp ){printf("以下为该学生信息:\n");printf("学号:%s 姓名:%s 成绩:%d\n",pTemp->arrStuNum,pTemp->arrStuName,pTemp->iStuScore);}break;*/case 13:system("cls");if (JudgeIfRFight() == 1)//判断指令是否输入正确,如果 == 1 说明指令输入不正确{printf("指令输入不正确,请重新输入指令\n");//break一般只跳出一层大括号,进入上一层的下一句。}else {//退出nFlag = 0;}printf("该指令已经执行完毕\n下面为您显示选择命令行,方便进行下一个指令的输入\n");ShowOrder();break;case 14://统计成绩NumiStuScore = 0;kScore = 1;RealSelectBy = 0;kNum = 1;RealSelectByOneAndTwo = 0;Num1 = 0;Num2 = 0;Num3 = 0;Num4 = 0;AgainCarryOut = 0;system("cls");if (JudgeIfRFight() == 1)//判断指令是否输入正确,如果 == 1 说明指令输入不正确{printf("指令输入不正确,请重新输入指令\n");//break一般只跳出一层大括号,进入上一层的下一句。}else {printf("键入1:统计成绩低于60分学生的数量 \n键入2:统计成绩高于60分的学生并输出\n键入其他错误指令,您还有一次输入机会\n");scanf("%s",SelectByOneAndTwo);getchar();for ( i = 0; i < strlen(SelectByOneAndTwo); i++ ){InterSelectByOneAndTwo[i] = SelectByOneAndTwo[i] - 48;}for ( i = strlen(SelectByOneAndTwo)-1; i >= 0; i-- ){RealSelectByOneAndTwo += InterSelectByOneAndTwo[i] * kNum;kNum *= 10;}printf("RealSelectByOneAndTwo = %d\n",RealSelectByOneAndTwo);switch(RealSelectByOneAndTwo){case 1://统计成绩低于60分学生的数量AddUpNumOfScoreLower60();break;case 2://统计成绩高于60分的学生并输出AddUpScoreHigher60();break;default:kNum = 1;Num2 = 2;RealSelectByOneAndTwo = 0;printf("您输入的不符合任何,您还有一次输入机会,如果再次输入错误指令,将返回选择命令行\n请输入指令:\n");printf("键入1:统计成绩低于60分学生的数量 \n键入2:统计成绩高于60分的学生并输出\n键入其他,返回选择命令行\n");scanf("%s",SelectByOneAndTwo);getchar();for ( i = 0; i < strlen(SelectByOneAndTwo); i++ ){InterSelectByOneAndTwo[i] = SelectByOneAndTwo[i] - 48;}for ( i = strlen(SelectByOneAndTwo)-1; i >= 0; i-- ){RealSelectByOneAndTwo += InterSelectByOneAndTwo[i] * kNum;kNum *= 10;}switch(RealSelectByOneAndTwo){case 1://统计成绩低于60分学生的数量AddUpNumOfScoreLower60();break;case 2://统计成绩高于60分的学生并输出AddUpScoreHigher60();break;default:printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");printf("第二次您又输入了错误的指令,请您细心一些,粗心不成事!\n系统将返回选择命令行\n");break;}break;}}printf("该指令已经执行完毕\n下面为您显示选择命令行,方便进行下一个指令的输入\n");ShowOrder();break;case 12://排序集合NumiStuScore = 0;kScore = 1;RealSelectBy = 0;kNum = 1;RealSelectByOneAndTwo = 0;Num1 = 0;Num2 = 0;Num3 = 0;Num4 = 0;AgainCarryOut = 0;if (JudgeIfRFight() == 1)//判断指令是否输入正确,如果 == 1 说明指令输入不正确{printf("指令输入不正确,请重新输入指令\n");//break一般只跳出一层大括号,进入上一层的下一句。}else {printf("键入1:按成绩由低到高对学生进行排序\n键入2:按成绩由高到低对学生进行排序\n键入其他错误指令,您还有一次输入机会\n");scanf("%s",SelectByOneAndTwo);getchar();for ( i = 0; i < strlen(SelectByOneAndTwo); i++ ){InterSelectByOneAndTwo[i] = SelectByOneAndTwo[i] - 48;}for ( i = strlen(SelectByOneAndTwo)-1; i >= 0; i-- ){RealSelectByOneAndTwo += InterSelectByOneAndTwo[i] * kNum;kNum *= 10;}printf("RealSelectByOneAndTwo = %d\n",RealSelectByOneAndTwo);switch(RealSelectByOneAndTwo){case 1:RankStuByminNum();//升序排序学生break;case 2:RankStuBymaxNum();//降序排序学生break;default:kNum = 1;Num2 = 2;RealSelectByOneAndTwo = 0;printf("您输入的不符合任何,您还有一次输入机会,如果再次输入错误指令,将返回选择命令行\n请输入指令:\n");printf("键入1:按成绩由低到高对学生进行排序 \n键入2:按成绩由高到低对学生进行排序\n键入其他,返回选择命令行\n");scanf("%s",SelectByOneAndTwo);getchar();for ( i = 0; i < strlen(SelectByOneAndTwo); i++ ){InterSelectByOneAndTwo[i] = SelectByOneAndTwo[i] - 48;}for ( i = strlen(SelectByOneAndTwo)-1; i >= 0; i-- ){RealSelectByOneAndTwo += InterSelectByOneAndTwo[i] * kNum;kNum *= 10;}switch(RealSelectByOneAndTwo){case 1://统计成绩低于60分学生的数量AddUpNumOfScoreLower60();break;case 2://统计成绩高于60分的学生并输出AddUpScoreHigher60();break;default:printf("为您显示选择命令行:\n");ShowOrder();printf("回到选择命令行,重新输入指令\n");printf("第二次您又输入了错误的指令,请您细心一些,粗心不成事!\n系统将返回选择命令行\n");break;}printf("该指令已经执行完毕\n下面为您显示选择命令行,方便进行下一个指令的输入\n");ShowOrder();break;}}}}}//保存SaveStuToFile();//释放链表FreeLinkData();//system("pause");system("pause");}
//},这是账户信息正确 那里 的 while循环的右括号if (strcmp(useraccount, account) == 0 && strcmp(userpassword, password) == 0){puts("您已作为学生端用户登录学生管理系统,您只能行使查看学生信息的权限。");puts("以下为系统中所有学生的信息:");STUReadStuFromFile();system("pause");}else{puts("您输入的账号或密码不正确");}
}
else{printf("您输入的指令不正确!程序结束\n");
}return 0;
}
int JudgeIfRFight()//判断是否输入错误???
{getchar();int k;char judge[20];printf("是否输入错误?如果输入指令有误,请输入'n'。\n");//如果输入错误,直接break;int num = 0;scanf("%s",judge);if ( strlen(judge) != 1){k = 0;printf("既然指令输入正确,那就请继续执行\n");getchar();return k;//输入指令正确,继续执行}if ( judge[0] == 'n' ){k = 1;//指令输入不正确getchar();return k;}else{//输入指令正确printf("既然指令输入正确,那就请继续执行\n");k = 0;}getchar();return k;
}//添加一个学生的信息
void AddStuMSG(char *arrStuNum, char arrStuName[10], char  iStuScore[100]) //函数定义
{//逻辑//创建一个节点STUNODE* pTemp = (STUNODE *)malloc(sizeof (STUNODE));int ScoreReal[100] = {0};int i;int kScor = 1;int RealSc = 0;//转化成整数for ( i = 0; i < strlen(iStuScore); i++ ){if ( iStuScore[i] >= 48 && iStuScore[i] <= 57 ){ScoreReal[i] = iStuScore[i]-48;}}for ( i = strlen(iStuScore)-1; i >= 0; i-- ){RealSc += ScoreReal[i] * kScor;kScor *= 10;}//第一步,检验参数的合法性if (NULL == arrStuNum || NULL == arrStuName || iStuScore < 0){printf ("学生信息输入错误!\n");return ;}//节点成员符初始值strcpy(pTemp->arrStuNum, arrStuNum);strcpy(pTemp->arrStuName, arrStuName);
//  把 iStuScorechar类型 先转化为 int类型在赋值给 pTemp->iStuScore  因为pTemp->iStuScore 是int类型的pTemp->iStuScore = RealSc;pTemp->pNext = NULL;//接在链表上if (NULL == g_pHead || NULL == g_pEnd){g_pHead = pTemp;//g_pEnd = pTemp;}else{g_pEnd->pNext = pTemp;  //链接//g_pEnd = pTemp;         //向后移动}g_pEnd = pTemp;
}//清空链表
void FreeLinkData()
{STUNODE* pTemp = g_pHead;STUNODE * q = NULL;while (pTemp){//记录节点q = pTemp;//向后移动了一个pTemp = pTemp->pNext;//删除节点free(q);}
}//打印数据
void ShowStuData()
{STUNODE* pTemp = g_pHead;while (pTemp != NULL){printf ("学号:%-10s, 姓名:%-12s, 分数:%-4d\n", pTemp->arrStuNum, pTemp->arrStuName, pTemp->iStuScore);//向下走一步pTemp = pTemp->pNext;}
}//显示指令
void ShowOrder()
{printf("***********您已进入学生信息管理系统——教师端*************\n");printf("**********首先为您显示系统内保存的学生历史信息**********\n");printf("*******************您拥有以下操作权限*******************\n");printf("***             1、 增加一个学生信息(尾添加)         ***\n");
//  printf("***            111、 增加一个学生信息(头添加)         ***\n");printf("***           11、 增加一个学生信息(在指定位置添加)  ***\n");printf("***             2、 查找指定学生的信息(姓名/学号)  ***\n");printf("***             3、 修改指定学生的信息               ***\n");printf("***             4、 保存业主的信息到文件中           ***\n");
//  printf("***             5、 按成绩由低到高对学生进行排序     ***\n");printf("***             6、 删除指定学生的信息               ***\n");printf("***             7、 读取文件中学生信息               ***\n");
//  printf("***             8、 按成绩由高到低对学生进行排序     ***\n");printf("***             8、 显示所有学生的信息               ***\n");
//  printf("***             12、 统计成绩高于60分的学生并输出    ***\n");printf("***             10、 查看指令                        ***\n");
//  printf("***             9、 通过姓名查找指定学生信息        ***\n");printf("***             14、 统计学生信息集合                ***\n");printf("***            12、 对学生进行排序集合               ***\n");printf("***             13、 退出系统                         ***\n");printf("********************************************************\n");
}//链表头添加一个节点
/*void AddStuMSGToLinkHead(char *arrStuNum, char arrStuName[10], int iStuScore)
{//创建一个节点STUNODE* pTemp = (STUNODE *)malloc(sizeof(STUNODE));//检测参数的合法性if (NULL == arrStuName || NULL == arrStuName || iStuScore < 0){printf ("学生信息输入错误!\n");return ;}//c成员赋值//节点成员符初始值strcpy(pTemp->arrStuNum, arrStuNum);strcpy(pTemp->arrStuName, arrStuName);pTemp->iStuScore = iStuScore;pTemp->pNext = NULL;if (NULL == g_pHead || NULL == g_pEnd){//链表为空//g_pHead = pTemp;g_pEnd = pTemp;}else{//新节点的下一个 指向头pTemp->pNext = g_pHead;//头向前挪动一个//g_pHead = pTemp;}g_pHead = pTemp;
}*///查找制定学生
STUNODE* FindStuByNum(char* arrStuNum)  //200501013  1254
{STUNODE* pTemp = g_pHead;//检测参数的合法性if (NULL == arrStuNum){printf ("学号输入错误!\n");return NULL;}//判断链表是否是空if (NULL == g_pHead || NULL == g_pEnd){printf ("链表为NULL!\n");return NULL;}//遍历链表while(pTemp != NULL){if (0 == strcmp(pTemp->arrStuNum, arrStuNum)){return pTemp;}pTemp = pTemp->pNext;}printf ("查无此节点!\n");return NULL;
}//指定位置插入节点
void InsertNode(STUNODE* pTemp, char *arrStuNum, char arrStuName[10], char iStuScore[100])
{int ScoreReal[100] = {0};int i;int kScor = 1;int RealSc = 0;//创建节点STUNODE* pNewTemp = (STUNODE *)malloc(sizeof(STUNODE));//转化成整数for ( i = 0; i < strlen(iStuScore); i++ ){if ( iStuScore[i] >= 48 && iStuScore[i] <= 57 ){ScoreReal[i] = iStuScore[i] - 48;}}for ( i = strlen(iStuScore)-1; i >= 0; i-- ){RealSc += ScoreReal[i] * kScor;kScor *= 10;}//成员赋值strcpy(pNewTemp->arrStuNum, arrStuNum);strcpy(pNewTemp->arrStuName, arrStuName);pNewTemp->iStuScore = RealSc;pNewTemp->pNext = NULL;    /////插入if (pTemp == g_pEnd)  //是尾节点{g_pEnd->pNext = pNewTemp;g_pEnd = pNewTemp;}else{//pNewTemp->pNext = pTemp->pNext;pTemp->pNext = pNewTemp;}
}//删除指定学生
void DeleteStuNode(STUNODE* pNode)
{//只有一个节点if (g_pHead == g_pEnd){free(g_pHead);g_pHead = NULL;g_pEnd = NULL;}//只有两个节点else if (g_pHead->pNext == g_pEnd){if (g_pHead == pNode){free(g_pHead);g_pHead = g_pEnd;}else{free(g_pEnd);g_pEnd = g_pHead;g_pHead->pNext = NULL;}}else // >=3{STUNODE* pTemp = g_pHead;//判断头if(g_pHead == pNode){//记住头pTemp = g_pHead;g_pHead = g_pHead->pNext;free(pTemp);pTemp = NULL;return ;  //结束}while(pTemp){if(pTemp->pNext == pNode){//删除if (pNode == g_pEnd){free(pNode);pNode = NULL;g_pEnd = pTemp;g_pEnd->pNext = NULL;return ;}else{//记住要删除的节点STUNODE* p = pTemp->pNext;//链接pTemp->pNext = pTemp->pNext->pNext;//释放节点free(p);p = NULL;return ;}}pTemp = pTemp->pNext;}}
}//保存信息进文件
void SaveStuToFile()
{//判断链表是否是NULLFILE* pFile = NULL;STUNODE* pTemp = g_pHead;char strBuf[50] = {0};char strScore[20] = {0};if (NULL == g_pHead){printf("没有学生\n");return ;}//打开文件pFile = fopen("dat.dat", "wb+");if (NULL == pFile){printf("文件打开失败\n");return ;}//操作文件指针while(pTemp){//学号赋值进去strcpy(strBuf, pTemp->arrStuNum);strcat(strBuf, ".");//姓名strcat(strBuf, pTemp->arrStuName);strcat(strBuf, ".");//分数itoa(pTemp->iStuScore, strScore, 10);strcat(strBuf, strScore);//  strcat(strBuf, ".");fwrite(strBuf, 1, strlen(strBuf), pFile); //fwrite("\r\n", 1, strlen("\r\n"), pFile);pTemp = pTemp->pNext;}//关闭文件fclose(pFile);
}//读取文件中学生信息
void ReadStuFromFile()
{FILE* pFile = fopen("dat.dat", "rb+"); //char strBuf[50] = {0};//   char strStuNum[10] = {0};
//  char strStuName[10] = {0};
//  char strStuScore[20] = {0};int nCount = 0;int j;if (NULL == pFile){printf("文件打开失败\n");return ;}//操作指针,读取函数while( NULL !=  fgets(strBuf, 50, pFile))  //EOF  feof   3部分{char strStuNum[10] = {0};char strStuName[10] = {0};char strStuScore[20] = {0};int i = 0;nCount = 0;j = 0;for (i = 0; strBuf[i] != '\r'; i++){if(0 == nCount) //没到'.'{strStuNum[j] = strBuf[i];j++;if ('.' == strBuf[i]){strStuNum[j-1] = '\0';nCount++;j = 0;}}else if (1 == nCount) //第一个'.'{strStuName[j] = strBuf[i];j++;//j++不能在这里!!!if ('.' == strBuf[i]){strStuName[j-1] = '\0';nCount++;j = 0;}}else  //第二个'.' 2 == nCount{strStuScore[j] = strBuf[i];j++;}}//插入到链表AddStuMSG(strStuNum, strStuName, strStuScore);printf("学号:%-10s 姓名:%-12s 分数:%-4d\n",strStuNum, strStuName, atoi(strStuScore));}fclose(pFile);
}
//通过学号升序排序学生
void RankStuByminNum()
{STUNODE * pTemp = g_pHead;STUNODE * tail = NULL;//  char temp1[20] = {0};// char temp2[20] = {0};int temp;while ( pTemp != tail ){while ( pTemp->pNext != tail ){if ( pTemp->iStuScore > pTemp->pNext->iStuScore ){char temp1[20] = {0};char temp2[20] = {0};temp = pTemp->pNext->iStuScore;pTemp->pNext->iStuScore = pTemp->iStuScore;pTemp->iStuScore = temp;strcpy(temp2, pTemp->pNext->arrStuNum);strcpy(pTemp->pNext->arrStuNum, pTemp->arrStuNum);strcpy(pTemp->arrStuNum, temp2);strcpy(temp1, pTemp->pNext->arrStuName);strcpy(pTemp->pNext->arrStuName, pTemp->arrStuName);strcpy(pTemp->arrStuName, temp1);}pTemp = pTemp->pNext;}tail = pTemp;pTemp = g_pHead;}ShowStuData();
}
void RankStuBymaxNum()
{STUNODE * pTemp = g_pHead;STUNODE * tail = NULL;//  char temp1[20] = {0};// char temp2[20] = {0};int temp;while ( pTemp != tail ){while ( pTemp->pNext != tail ){if ( pTemp->iStuScore < pTemp->pNext->iStuScore ){char temp1[20] = {0};char temp2[20] = {0};temp = pTemp->pNext->iStuScore;pTemp->pNext->iStuScore = pTemp->iStuScore;pTemp->iStuScore = temp;strcpy(temp2, pTemp->pNext->arrStuNum);strcpy(pTemp->pNext->arrStuNum, pTemp->arrStuNum);strcpy(pTemp->arrStuNum, temp2);strcpy(temp1, pTemp->pNext->arrStuName);strcpy(pTemp->pNext->arrStuName, pTemp->arrStuName);strcpy(pTemp->arrStuName, temp1);}pTemp = pTemp->pNext;}tail = pTemp;pTemp = g_pHead;}ShowStuData();
}
//统计成绩高于60分的学生并输出
void AddUpScoreHigher60()
{STUNODE * pTemp = g_pHead;while (pTemp){if ( pTemp->iStuScore > 60 ){printf("学号:%-10s 姓名:%-12s 成绩:%-4d\n",pTemp->arrStuNum,pTemp->arrStuName,pTemp->iStuScore);}pTemp = pTemp->pNext;}
}
//统计成绩低于60分学生的数量
void AddUpNumOfScoreLower60()
{STUNODE * pTemp = g_pHead;int num = 0;while (pTemp){if ( pTemp->iStuScore < 60 ){num++;}pTemp = pTemp->pNext;}printf("成绩低于60分的学生一共有:%d人\n",num);
}
//通过姓名查找学生信息
STUNODE * FindMSGByName(char* arrStuName)
{STUNODE * pTemp = g_pHead;while (pTemp){if ( strcmp(pTemp->arrStuName, arrStuName) == 0 ){return pTemp;}pTemp = pTemp->pNext;}return NULL;
}
void STUReadStuFromFile()
{FILE* pFile = fopen("dat.dat", "rb+"); //char strBuf[50] = {0};char strStuNum[10] = {0};char strStuName[10] = {0};char strStuScore[20] = {0};int nCount = 0;int j = 0;if (NULL == pFile){printf("文件打开失败\n");return ;}//操作指针,读取函数while( NULL !=  fgets(strBuf, 50, pFile))  //EOF  feof   3部分{char strStuNum[10] = {0};char strStuName[10] = {0};char strStuScore[20] = {0};int i = 0;nCount = 0;j = 0;for (i = 0; strBuf[i] != '\r'; i++){if(0 == nCount) //没到'.'{strStuNum[i] = strBuf[i];if ('.' == strBuf[i]){strStuNum[i] = '\0';nCount++;}}else if (1 == nCount) //第一个'.'{strStuName[j] = strBuf[i];j++;//j++不能在这里!!!if ('.' == strBuf[i]){strStuName[j-1] = '\0';nCount++;j = 0;}}else  //第二个'.' 2 == nCount{strStuScore[j] = strBuf[i];j++;}}//插入到链表printf("学号:%-10s 姓名:%-12s 分数:%-4d\n",strStuNum, strStuName, atoi(strStuScore));}fclose(pFile);
}

第一个小项目:学生成绩管理系统相关推荐

  1. 影碟管理系统c语言小学期,大连东软小学期C语言项目学生成绩管理系统代码.docx...

    大连东软小学期C语言项目学生成绩管理系统代码 /*链表版学生成绩管理系统的main函数与链表构建模块的代码*/#include #include #include struct STUDENT{ ch ...

  2. C小项目 —— 学生信息管理系统

    C小项目 -- 学生信息管理系统 实现功能: 1. 录入学生信息 2. 显示所有学生信息 3. 按学号查询学生信息 4. 按姓名查询学生信息(支持模糊查询) 5. 按年龄查询学生信息 6. 修改学生信 ...

  3. springboot毕设项目学生成绩管理系统o8mkp(java+VUE+Mybatis+Maven+Mysql)

    springboot毕设项目学生成绩管理系统o8mkp(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HB ...

  4. SSM入门小项目----学生信息管理系统

    SSM入门小项目----学生信息管理系统 学习了SSM后,自己想动手写个小项目,巩固一下.选择了比较简单的学生信息管理系统,项目比较简单,包括的功能有:登录.学生信息的增删改查.分页(前端实现). 本 ...

  5. C语言项目—学生成绩管理系统(完结)

    C语言项目 1.学生成绩管理系统 本项目旨在增强,学习C语言的指针和链表部分知识 1.1 功能需求部分介绍 此处首先介绍一下该项目要完成的功能主要包括如下9个功能: 1.录入学生信息:即链表的功能 2 ...

  6. 开源项目-学生成绩管理系统

    哈喽,今天给大家带来一个开源系统-学生成绩管理系统 系统主要包括学生管理,教师管理,课程管理,授课管理,成绩管理模块 系统登录 学生管理 ​​​​​​​ 教师管理 课程管理 授课管理 ​​​​​​​ ...

  7. Python小项目——学生信息管理系统(详细讲解)

    目录 一.需求分析 1.学生管理系统应具备的功能 二.系统设计 1.系统功能结构 2.系统业务流程 三.系统开发必备工具 1.系统开发环境 2.项目目录结构 四.主函数设计 1.系统主界面运行效果图 ...

  8. Web课程设计之学生成绩管理系统

    Web课设之学生成绩管理系统 一.实验题目 二.实验目的 三.总体设计 3.1 实验要求: 3.2 本系统所运用到的技术栈: 3.3 本系统所运用的编程工具 3.4 核心技术介绍 3.5 模块介绍 3 ...

  9. c语言按给定成绩查询,C语言学生成绩管理系统(简易版)

    #include #include #include int readstudents(struct students stu[]); //读取学生信息 int readsexcode(struct ...

最新文章

  1. [转]优秀编程的“艺术”
  2. 五大算法设计思想,你都知道吗?
  3. 虚拟机克隆以后出现“需要整合虚拟机磁盘”的解决方法
  4. query 防止ajax重复提交
  5. 传统公司部署OpenStack(t版)简易介绍(八)——Dashboard模块部署
  6. golang 使用sqlite3编码慢问题
  7. iOS开发笔记--Layer 图层圆角、边框 、底纹其他常用操作
  8. 苏州大学文正学院计算机专业,苏州大学文正学院有哪些专业及什么专业好
  9. Java SE 基础:List 集合列表
  10. Blender使用maya系快捷键
  11. display:HDCP协议简述
  12. 可可私房菜:一个普通中国女孩的移动互联网创业经
  13. 如何快速定位 Redis 热 key
  14. 史上最全,几百本常用书籍等你来取(面试,java,c,大数据,AI,python,数据结构等)
  15. ST-Link设备连接。 Could not verify ST device! Abort connection.
  16. 差分隐私(背景介绍)
  17. 我也来谈谈模型思维(一):同群效应
  18. 大数据时代,隐私不能粗放管理
  19. centos8上安装MP-SPDZ
  20. 计算机与测控技术专业就业方向,测控专业就业方向及前景

热门文章

  1. 什么样的恐怖才是真恐怖?由最近所看的一部电影以及最喜欢的游戏系列想到的。
  2. 老大说不要在项目中使用存储过程
  3. 目前很穷,有什么办法能快速挣钱?
  4. Window XP驱动开发(二) 环境搭建(VS2008+WDK+DDKWzard)及示例源码分析
  5. HTB-Blocky
  6. 如何在 FlowUs、Notion 等笔记软件中使用「番茄工作法」?
  7. androidstudio图片居中_Android imageView图片按比例缩放-Fun言
  8. WPF入门教程系列(4)
  9. win7(主机)+win7虚拟机(vmware,被调试机)+windbg配置内核驱动调试
  10. MySQL数据库实验(四):E-R图实例讲解