From 671e6985e95d03f7a9b4173ad510113901fa8fe6 Mon Sep 17 00:00:00 2001 From: ljc990211 <2104054783@qq.com> Date: Fri, 11 Jan 2019 21:25:51 +0800 Subject: [PATCH] first commit --- main.c | 735 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ xsxx.txt | 30 +++ 2 files changed, 765 insertions(+) create mode 100644 main.c create mode 100644 xsxx.txt diff --git a/main.c b/main.c new file mode 100644 index 0000000..5641595 --- /dev/null +++ b/main.c @@ -0,0 +1,735 @@ +#include +#include +#include +typedef struct + { + char name[20]; //学生姓名 + char xuehao[20]; //学生学号 + char phone[20]; //学生手机号 + char qq[20]; //学生QQ号 + int score[3]; //学生的三门课成绩 + int sum; //学生三门课成绩的总和 + }STU; +int addstu(); //增添学生信息 +void stupaixu(); //将学生信息按分数由高到低显示 +int xhcz(); //用学号进行查找 +int namecz(); //用姓名查询 +int xxxg(); //搜索学号,并对该生的信息进行修改 +int shanchu(); //搜索学号,删除该生所有信息 +void fsdxs(); //分数段显示 成绩 +int menu(); //菜单函数 +int stdk(); //学生端口界面 +int tedk(); //教师端口界面 + +int main() +{ + system("color f1"); //包含于头文件 两个16进制的数来换颜色,第一个是背景颜色,第二个是字体颜色 + menu(); //调用菜单界面函数 + for(;;) + { + switch(menu()) //将菜单界面 用户输入的需求返回值进行选择 + { + case 1: + printf("\n\t\t正在进入学生界面\n\n\t\t"); + system("cls"); //先清屏 + stdk(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + break; + case 2: + printf("\n\t\t正在进入教师界面\n\n\t\t"); + system("cls"); //先清屏 + tedk(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + break; + case 0: + printf("\n\t\t欢迎再次使用!\n\n\t\t"); + system("pause"); + exit(0); + } + } + return 0; +} + +int menu() //菜单函数 +{ + char xuanze; //定义一个 字符型 的"选择", 用于接收用户的需求 + int xz; //定义一个 整型 的"选择", 作为 字符型选择的 返回值 + do + { + system("cls"); //清屏 + printf("\n\t\t************湖南工业大学信息管理系统************\n"); + printf("\t\t*┌-------------------------------------------┐ *\n"); + printf("\t\t*│ 请问您的身份是: │ *\n"); + printf("\t\t*│ 1.学生 │ *\n"); + printf("\t\t*│ 2.教师 │ *\n"); + printf("\t\t*│ 0.退出 │ *\n"); + printf("\t\t*└-------------------------------------------┘ *\n"); + printf("\t\t************************************************\n"); + printf("\t\t请您选择(0-2):"); + fflush(stdin); //防止用户一次性输入多个字符 + scanf("%c", &xuanze); //查看用户的身份,进入下一界面 + }while(xuanze<'0' || xuanze>'2'); //检查输入是否符合规范 + xz = xuanze-'0'; //将字符型的选择转换成整型 + switch(xz) //将整型返回值进行 "选择" + { + case 1: + printf("\n\t\t正在进入学生界面\n\n\t\t"); + system("cls"); //先清屏 + stdk(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + break; + case 2: + printf("\n\t\t正在进入教师界面\n\n\t\t"); + system("cls"); //先清屏 + tedk(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + break; + case 0: + printf("\n\t\t欢迎再次使用!\n\n\t\t"); + system("pause"); + exit(0); + } +} + +int addstu() //增添学生信息 +{ + FILE *fp1=NULL, *fp=NULL; //定义两个文件指针 + STU st[1000]; //定义一个零时结构体数组,用来存储从文件读入的学生信息 + int n, k=0, q; // n 用来存储需要添加的学生人数 + // k 用来计算原文件中的学生总数 + // q 用来做循环的整型变量 + char names[20]; //定义零时姓名字符串,用于零时存储学生姓名 + char xuehaos[20]; //定义零时学号字符串,用于零时存储学生学号 + if((fp1 = fopen("xsxx.txt","r"))==NULL) + { + printf("\n\t\tError\n\n\t\t"); + exit(0); + } + while(!feof(fp1)) + { + fscanf(fp1,"%s %s %s %s %d %d %d %d",&st[k].name,&st[k].xuehao,&st[k].phone,&st[k].qq,&st[k].score[0], &st[k].score[1],&st[k].score[2],&st[k].sum); + k++; //每读入一个学生信息,学生总数加一 + } + fclose(fp1); + printf("\n\t\t请输入要增添的学生人数:\n\n\t\t"); + scanf("%d",&n); //读入需要添加的学生人数 + system("cls"); + for(int i=0; ik) // i > k 时,即整个文件所有学号都没有匹配的,执行此步骤 + { + printf("\n\t\t查无此人!\n\n\t\t"); + system("pause"); //暂停一下,让用户知道为啥返回主界面 + return main(); //返回主界面 + } + else // i < k 时,说明有匹配的人,他时第 i 个人 + { + printf("\n\t\t********************************学生信息******************************\n"); + printf("\t\t----------------------------------------------------------------------\n"); + printf("\t\t姓名:%-16s\t学号:%-16s\n",st[i].name,st[i].xuehao); + printf("\t\t手机号:%-16s\tQQ号:%-16s\n",st[i].phone,st[i].qq); + for(int s=0; s<3; s++) + { + printf("\t\t"); + printf("第%d科目成绩:%3d",s+1,st[i].score[s]); + } + printf("\n\t\t总分:%d\n",st[i].sum); + printf("\t\t----------------------------------------------------------------------\n"); + printf("\n\t\t"); + system("pause"); //先让用户看够了,然后按任意键返回 + return main(); //返回主界面 + } +} + +int xxxg() //修改信息的函数 == "学号 修改"的拼音 +{ + FILE *fp=NULL, *fp2=NULL; //定义两个文件指针 + STU st[1000], tempa; //定义一个零时结构体数组,一个零时结构体 + int n, i, j, k=0, x; // k用于计数 + int km1, km2, km3, q, r; //科目1,科目2,科目3,两个用于循环的整型变量 + char xuehaos[20], xiugais[20]; //定义一个零时 学号字符串,一个 "修改"字符串 + char xuanze; //字符型 选择 + if((fp = fopen("xsxx.txt","r"))==NULL) + { + printf("Error\n"); + exit(0); + } + while(!feof(fp)) + { + fscanf(fp,"%s %s %s %s %d %d %d %d",&st[k].name,&st[k].xuehao,&st[k].phone,&st[k].qq,&st[k].score[0], &st[k].score[1],&st[k].score[2],&st[k].sum); + k++; //每读入一个学生信息总数加一 + } + fclose(fp); + printf("\n\t\t请输入需要修改信息的学生学号:\n\n\t\t"); + scanf("%s", &xuehaos); //读入用户想要修改人的学号 + for(i=0; i<=k; i++) //循环查找这个人 + { + if(strcmp(xuehaos,st[i].xuehao)==0) + break; + } + if(i>k) + { + printf("\n\t\t查无此人!\n\n\t\t"); + system("pause"); + return main(); + } + else + { + printf("\n\t\t********************************学生信息******************************\n"); + printf("\t\t----------------------------------------------------------------------\n"); + printf("\t\t姓名:%-16s\t学号:%-16s\n",st[i].name,st[i].xuehao); + printf("\t\t手机号:%-16s\tQQ号:%-16s\n",st[i].phone,st[i].qq); + for(int s=0; s<3; s++) + { + printf("\t\t"); + printf("第%d科目成绩:%3d",s+1,st[i].score[s]); + } + printf("\n\t\t总分:%d\n",st[i].sum); + printf("\t\t----------------------------------------------------------------------\n"); + printf("\n\t\t************************************************\n"); + printf("\t\t*┌-------------------------------------------┐ *\n"); + printf("\t\t*│ 请选择您需要的服务: │ *\n"); + printf("\t\t*│ 1.修改姓名: │ *\n"); + printf("\t\t*│ 2.修改学号: │ *\n"); + printf("\t\t*│ 3.修改手机号: │ *\n"); + printf("\t\t*│ 4.修改QQ号: │ *\n"); + printf("\t\t*│ 5.修改成绩: │ *\n"); + printf("\t\t*│ 0.返回上一界面 │ *\n"); + printf("\t\t*└-------------------------------------------┘ *\n"); + printf("\t\t************************************************\n"); + printf("\n\t\t请输入需要修改的信息:\n\t\t"); + fflush(stdin); + scanf("%c", &xuanze); + x = xuanze - '0'; + switch(x) + { + case 1: + printf("\n\t\t请输入新的姓名:\n\n\t\t"); + scanf("%s", &xiugais); + strcpy(st[i].name, xiugais); + printf("\n\t\t修改成功!\n\n\t\t"); + system("pause"); + break; + case 2: + printf("\n\t\t请输入新的学号:\n\n\t\t"); + scanf("%s", &xiugais); + for(q=0; q<=k; q++) + { + if(strcmp(xiugais,st[q].xuehao)==0) //判断是否与文件中的学号冲突 + { //将新学号与文件中所有学号进行比对,如果重复了就不能成功修改 + printf("\n\t\t该学号已存在,无法修改!!!\n\n\t\t"); + printf("\n\t\t将返回上一界面\n\n\t\t"); + system("pause"); + system("cls"); + return main(); //返回主界面 + } + } + strcpy(st[i].xuehao, xiugais); //如果不冲突,就修改 + printf("\n\t\t修改成功!\n\n\t\t"); + system("pause"); + break; + case 3: + printf("\n\t\t请输入新手机号:\n\n\t\t"); + scanf("%s", &xiugais); + strcpy(st[i].phone, xiugais); + printf("\n\t\t修改成功!\n\n\t\t"); + system("pause"); + break; + case 4: + printf("\n\t\t请输入新的QQ号:\n\n\t\t"); + scanf("%s", &xiugais); + strcpy(st[i].qq, xiugais); + printf("\n\t\t修改成功!\n\n\t\t"); + system("pause"); + break; + case 5: + printf("\n\t\t请输入新的三门科目成绩:\n\n\t\t"); + scanf("%d %d %d", &km1, &km2, &km3); //将新的三门科目的成绩赋给第 i 个人的成绩里面 + st[i].score[0] = km1; + st[i].score[1] = km2; + st[i].score[2] = km3; + st[i].sum = km1 + km2 + km3; + printf("\n\t\t修改成功!\n\n\t\t"); + system("pause"); + break; + } + system("cls"); //成功修改了之后,将这个人的信息显示出来 + printf("\n\t\t********************************学生信息******************************\n"); + printf("\t\t----------------------------------------------------------------------\n"); + printf("\t\t姓名:%-16s\t学号:%-16s\n",st[i].name,st[i].xuehao); + printf("\t\t手机号:%-16s\tQQ号:%-16s\n",st[i].phone,st[i].qq); + for(int s=0; s<3; s++) + { + printf("\t\t"); + printf("第%d科目成绩:%3d",s+1,st[i].score[s]); + } + printf("\n\t\t总分:%d\n",st[i].sum); + printf("\t\t----------------------------------------------------------------------\n"); + printf("\n\t\t"); + } + if((fp2 = fopen("xsxx.txt","w"))==NULL) + { + printf("\n\t\tError\n\n\t\t"); + exit(0); + } + for(int o=0; ok) //如果 i > k ,说明整个文件所有的学生信息对比完,都没有一个能匹配,执行此步骤 + { + printf("\n\t\t查无此人!\n\n\t\t"); + system("pause"); //让用户知道为啥不能删除 + return main(); + } + else //此步骤是将删除信息后的零时结构体输入重新全部写入文件 + { + printf("\n\t\t删除成功!\n\n\t\t"); + if((fp = fopen("xsxx.txt","w"))==NULL) //以 "w" 的方式打开,完全覆盖原文件 + { + printf("\n\t\tError\n\n\t\t"); + exit(0); + } + for(int o=0; o=90) + { + printf("\t\t姓名:%-16s\t平均分:%5.2f\n", st[i].name, st[i].sum/3.0); + s = 1; //如果执行此步骤,就打开开关,就不会输出 "此分数段无人"的语句了 + } + ave = 0; + } + if(s==0) //判断开关是否打开,如果未打开,就执行此步骤 + printf("\t\t此分数段没有人!\n"); + s = 0; //每一次都要重置开关 + printf("\t\t----------------------------------------------------------------------\n"); + printf("\t\t平均分80~90的人是:\n"); + for(i=0; i=80 && ave<90) + { + printf("\t\t姓名:%-16s\t平均分:%5.2f\n", st[i].name, st[i].sum/3.0); + s = 1; //如果执行此步骤,就打开开关,就不会输出 "此分数段无人"的语句了 + } + ave = 0; + } + if(s==0) //判断开关是否打开,如果未打开,就执行此步骤 + printf("\t\t此分数段没有人!\n"); + s = 0; //每一次都要重置开关 + printf("\t\t----------------------------------------------------------------------\n"); + printf("\t\t平均分70~80的人是:\n"); + for(i=0; i=70 && ave<80) + { + printf("\t\t姓名:%-16s\t平均分:%5.2f\n", st[i].name, st[i].sum/3.0); + s = 1; //如果执行此步骤,就打开开关,就不会输出 "此分数段无人"的语句了 + } + ave = 0; + } + if(s==0) //判断开关是否打开,如果未打开,就执行此步骤 + printf("\t\t此分数段没有人!\n"); + s = 0; //每一次都要重置开关 + printf("\t\t----------------------------------------------------------------------\n"); + printf("\t\t平均分60~70的人是:\n"); + for(i=0; i=60 && ave<70) + { + printf("\t\t姓名:%-16s\t平均分:%5.2f\n", st[i].name, st[i].sum/3.0); + s = 1; //如果执行此步骤,就打开开关,就不会输出 "此分数段无人"的语句了 + } + ave = 0; + } + if(s==0) //判断开关是否打开,如果未打开,就执行此步骤 + printf("\t\t此分数段没有人!\n"); + s = 0; //每一次都要重置开关 + printf("\t\t----------------------------------------------------------------------\n"); + printf("\t\t平均分低于60的人是:\n"); + for(i=0; i=0 && ave<60) + { + printf("\t\t姓名:%-16s\t平均分:%5.2f\n", st[i].name, st[i].sum/3.0); + s = 1; //如果执行此步骤,就打开开关,就不会输出 "此分数段无人"的语句了 + } + ave = 0; + } + if(s==0) //判断开关是否打开,如果未打开,就执行此步骤 + printf("\t\t此分数段没有人!\n\n\t\t"); + printf("\n\t\t"); +} + +int stdk() //学生端口 "st == 学生, dk == 端口" +{ + char xuanze; //"选择" + int xz; //"选择的整型返回值" + do + { + system("cls"); //清屏 + printf("\n\t\t************湖南工业大学信息管理系统************\n"); + printf("\t\t*┌-------------------------------------------┐ *\n"); + printf("\t\t*│ 请选择您需要的服务: │ *\n"); + printf("\t\t*│ 1.显示所有学生的成绩信息 │ *\n"); + printf("\t\t*│ 2.按分数段显示成绩信息 │ *\n"); + printf("\t\t*│ 3.按学号查询成绩信息 │ *\n"); + printf("\t\t*│ 4.按姓名查询成绩信息 │ *\n"); + printf("\t\t*│ 0.返回上一界面 │ *\n"); + printf("\t\t*└-------------------------------------------┘ *\n"); + printf("\t\t************************************************\n"); + printf("\t\t请您选择(0-4):"); + fflush(stdin); //防止用户一次性输入多个字符 + scanf("%c", &xuanze); //查看用户的身份,进入下一界面 + }while(xuanze<'0' || xuanze>'4'); //检查输入是否符合规范 + xz = xuanze-'0'; //将字符型"选择"变成它的整型返回值 + switch(xz) //将整型返回值进行 "选择" + { + case 1: + printf("\n\t\t正在进入 显示所有成绩信息界面\n\n\t\t"); + system("cls"); //先清屏 + stupaixu(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + break; + case 2: + printf("\n\t\t正在进入 按分数段显示成绩信息界面\n\n\t\t"); + system("cls"); //先清屏 + fsdxs(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + break; + case 3: + printf("\n\t\t正在进入 按学号查询成绩信息界面\n\n\t\t"); + system("cls"); //先清屏 + xhcz(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + case 4: + printf("\n\t\t正在进入 按姓名查询成绩信息界面\n\n\t\t"); + system("cls"); //先清屏 + namecz(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + break; + case 0: + printf("\n\t\t正在为您返回上一界面\n\n\t\t"); + system("cls"); + return main(); //返回主界面 + } + return stdk(); //返回学生端口 +} + +int tedk() //教师端口 "te == 老师, dk == 端口" +{ + char xuanze; //"选择" + int xz; //"选择"的整型返回值 + do + { + system("cls"); //清屏 + printf("\n\t\t************湖南工业大学信息管理系统************\n"); + printf("\t\t*┌-------------------------------------------┐ *\n"); + printf("\t\t*│ 请选择您需要的服务: │ *\n"); + printf("\t\t*│ 1.显示所有学生的成绩信息 │ *\n"); + printf("\t\t*│ 2.按分数段显示成绩信息 │ *\n"); + printf("\t\t*│ 3.按学号查询成绩信息 │ *\n"); + printf("\t\t*│ 4.按姓名查询成绩信息 │ *\n"); + printf("\t\t*│ 5.增添学生信息 │ *\n"); + printf("\t\t*│ 6.修改学生信息 │ *\n"); + printf("\t\t*│ 7.删除学生信息 │ *\n"); + printf("\t\t*│ 0.返回上一界面 │ *\n"); + printf("\t\t*└-------------------------------------------┘ *\n"); + printf("\t\t************************************************\n"); + printf("\t\t请您选择(0-7):"); + fflush(stdin); //防止用户一次性输入多个字符 + scanf("%c", &xuanze); //查看用户的身份,进入下一界面 + }while(xuanze<'0' || xuanze>'7'); //检查输入是否符合规范 + xz = xuanze-'0'; //将字符型"选择"变成它的整型返回值 + switch(xz) //将整型返回值进行 "选择" + { + case 1: + printf("\n\t\t正在进入 显示所有成绩信息界面\n\n\t\t"); + system("cls"); //先清屏 + stupaixu(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + break; + case 2: + printf("\n\t\t正在进入 按分数段显示成绩信息界面\n\n\t\t"); + system("cls"); //先清屏 + fsdxs(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + break; + case 3: + printf("\n\t\t正在进入 按学号查询成绩信息界面\n\n\t\t"); + system("cls"); //先清屏 + xhcz(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + case 4: + printf("\n\t\t正在进入 按姓名查询成绩信息界面\n\n\t\t"); + system("cls"); //先清屏 + namecz(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + break; + case 5: + printf("\n\t\t正在进入 增添学生信息界面\n\n\t\t"); + system("cls"); //先清屏 + addstu(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + break; + case 6: + printf("\n\t\t正在进入 按学号查询,修改信息界面\n\n\t\t"); + system("cls"); //先清屏 + xxxg(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + break; + case 7: + printf("\n\t\t正在进入 按学号查询,删除信息界面\n\n\t\t"); + system("cls"); //先清屏 + shanchu(); //再调用函数,显示界面 + system("pause"); //将显示的界面固定住 + break; + case 0: + printf("\n\t\t正在为您返回上一界面\n\n\t\t"); + system("cls"); + return main(); //返回主函数 + } + return tedk(); //返回教师端口 +} + +int namecz() //"cz == 查找",用"姓名"进行查找的函数 +{ + FILE *fp=NULL; //定义文件指针 + STU st[1000]; //零时储存数据的结构体数组 + int i, k=0; //k 用于计算学生人数 + char names[20]; //定义用户输入需查找的学生姓名,方便进行比对 + if((fp = fopen("xsxx.txt","r"))==NULL) //从文件读出所有学生信息,存入零时结构体,进行比对 + { + printf("\n\t\tError\n\n\t\t"); + exit(0); + } + while(!feof(fp)) + { + fscanf(fp,"%s %s %s %s %d %d %d %d",&st[k].name,&st[k].xuehao,&st[k].phone,&st[k].qq,&st[k].score[0], &st[k].score[1],&st[k].score[2],&st[k].sum); + k++; //每读入一个学生的信息,记录学生的总数 + } + fclose(fp); + printf("\n\t\t请输入学生姓名:\n\n\t\t"); + scanf("%s", &names); + for(i=0; i<=k; i++) + { + if(strcmp(names,st[i].name)==0) + break; + } + if(i>k) //如果判断完所有人的姓名都对不上,执行此步骤 + { + system("cls"); + printf("\n\t\t查无此人!\n\n\t\t"); + system("pause"); + return main(); + } + else //如果 i < k 成立,就说明有匹配的,执行此步骤 + { + system("cls"); //先清屏,再显示信息,就不乱了 + printf("\n\t\t********************************学生信息******************************\n"); + printf("\t\t----------------------------------------------------------------------\n"); + printf("\t\t姓名:%-16s\t学号:%-16s\n",st[i].name,st[i].xuehao); + printf("\t\t手机号:%-16s\tQQ号:%-16s\n",st[i].phone,st[i].qq); + for(int s=0; s<3; s++) + { + printf("\t\t"); + printf("第%d科目成绩:%3d",s+1,st[i].score[s]); + } + printf("\n\t\t总分:%d\n",st[i].sum); + printf("\t\t----------------------------------------------------------------------\n"); + printf("\n\t\t"); + system("pause"); //先让用户看够了 , 然后按任意键返回 + return main(); //输出结束后就返回主界面 + } +} diff --git a/xsxx.txt b/xsxx.txt new file mode 100644 index 0000000..1e3b427 --- /dev/null +++ b/xsxx.txt @@ -0,0 +1,30 @@ +stu29 029 029 029 88 97 90 275 +stu15 015 015 015 88 89 89 266 +stu11 011 011 011 77 86 98 261 +stu1 001 001 001 97 83 77 257 +stu6 006 006 006 80 67 93 240 +stu10 010 010 010 67 88 84 239 +stu4 004 004 004 91 85 59 235 +stu7 007 007 007 77 76 82 235 +stu2 002 002 002 88 74 69 231 +stu19 019 019 019 77 98 56 231 +stu3 003 003 003 71 68 88 227 +stu5 005 005 005 67 79 81 227 +stu28 028 028 028 61 89 77 227 +stu9 009 009 009 61 97 68 226 +stu25 025 025 025 57 88 75 220 +stu18 018 018 018 69 88 60 217 +stu26 026 026 026 77 47 88 212 +stu30 030 030 49 77 91 40 208 +stu8 008 008 008 65 69 72 206 +stu12 012 012 012 64 77 63 204 +stu14 014 014 014 63 64 72 199 +stu22 022 022 022 66 66 66 198 +stu23 023 023 023 56 69 66 191 +stu24 024 024 024 49 66 73 188 +stu17 017 017 017 59 59 66 184 +stu13 013 013 013 47 62 71 180 +stu21 021 021 021 34 55 71 160 +stu16 016 016 016 22 63 71 156 +stu20 020 020 020 20 57 77 154 +stu27 027 027 027 33 43 63 139