目录
写在前面
本文为本人大一程序设计课选题代码,文章开头末尾附带源码和实验报告及流程图下载,欢迎关注评论留言。
链接:https://pan.baidu.com/s/1CyxfN4hxRw6KDftwmeXO8w?pwd=1234
提取码:1234
程序设计要求
1、需求分析
学生基本信息、学生成绩基本信息要存入文件当中,因而要提供文件的输入输出操作;查询功能要求提供查找和显示操作;删除功能要求实现删除操作;排序功能要求实现排序操作;另外还应该提供键盘式选择菜单以实现功能选择。
2、总体设计
整个系统可以设计为数据录入模块、数据查询模块、数据删除模块和数据排序模块。
3、详细设计
(1)数据录入模块
学生基本信息文件可以在磁盘建立,采用写文件方式录入学生成绩基本信息。综合成绩和实得学分通过计算得到。
(2)查询模块
通过菜单选择查询功能,再选择学生基本情况查询和成绩查询
若选择前者,再通过菜单选择学号、姓名或宿舍号码,按照基本查找算法查找A.TXT,然后把查找结果输出
若选择后者,则先在A.TXT中查找学号对应的姓名,再在B.TXT中查找该学生的课程情况,并统计科目和实得总学分,输出结果。(fread和查找算法的应用)
(3)删除模块
通过菜单选择删除学生的功能,输入要删除学生的学号,则分别在A.TXT和B.TXT中查找该生信息,删除之;或者输入学生的姓名,先在A.TXT中得到该生的学号,删除该生信息,再在B.TXT中删除该学号对应的信息。注意:C语言中没有直接删除信息的函数,需要自己实现,可以采取读出数据,判断数据(如果不删除,则进入缓冲区,否则删除),写入数据(把缓冲区中的数据写入文件)的步骤进行。
(4)排序模块
通过菜单选择排序依据,采用排序算法(冒泡、插入、选择等)对数据进行排序并输出结果。首先要读文件(fread)。
struct { char stuNo[15]; //学号 char name[20]; //姓名 char sex[3]; //性别 char domNum[10]; //宿舍号 char tel[12]; //电话号码 }StuInfo[N]; //学生基本信息结构体 struct { char stuNo[15]; //学号 char courseNo[10]; //课程编号 char courseName[20]; //课程名称 int creditHour; //学分 int triGrade; //平时成绩 int experiGrade; //实验成绩 int examGrade; //卷面成绩 float totalGrade; //综合成绩 float finalCreHour; //实得学分 }StuGraInfo[N]; //学生成绩基本信息结构体
以上为题目要求,下面是具体代码实现,分为各个模块实现,最后附有全部代码。
概要设计
编辑
主菜单模块
编辑
enum option { exit, //退出 add, //增加 search, //搜索 delInfo, //删除基本信息 delGrade, //删除成绩信息 showinfor, //展示基本信息 showgrade, //展示成绩信息 order, //排序 }; int main() { int input =1; menu(); do { printf("请选择:-->"); scanf("%d", &input); switch (input) //初始界面进行选择 { case add: Add();break; case search: Search();break; case delInfo: DelInfo();break; case delGrade: DelGrade();break; case showinfor: showInfor();break; case showgrade: showGrade();break; case order: Order();break; case exit:break; default:printf("输入格式错误"); } } while (input); return 0; }
录入/增加信息模块
首先创建或打开文件,若失败则返回错误提示信息,再提示用户输入Y/N进行是否输入用户基本信息和用户成绩信息,如此做可使得用户自主选择输入所需的信息进行存储,每次结束输入时再提示用户是否继续输入,可提供多次输入。
编辑
void Add() { int i, m = 0,n=0; char ch[2]={'\0'}; printf("进行学生基本信息录入:\n"); FILE* fp1; FILE* fp2; if ((fp1 = fopen("A.txt", "wb")) == NULL) { printf("无法打开学生基本信息\n"); } for (i = 0; i < m; i++) { fwrite(&stu[i], LEN, 1, fp1); } printf("请进行选择-->(y/n):"); scanf("%s", ch); while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("学号:"); scanf("%s", &stu[m].stuNo); printf("姓名:"); scanf("%s", stu[m].name); printf("性别:"); scanf("%s", &stu[m].sex); printf("宿舍号:"); scanf("%s", &stu[m].domNum); printf("电话号码:"); scanf("%s", &stu[m].tel); if (fwrite(&stu[m], LEN, 1, fp1) != 1) { printf("无法保存!"); } else { printf("%s 保存成功!\n", stu[m].name); m++; } printf("是否继续存储?(y/n):"); scanf("%s", ch); } fclose(fp1); printf("进行学生成绩基本信息录入:\n"); if ((fp2 = fopen("B.txt", "wb")) == NULL) { printf("无法打开学生成绩基本信息\n"); } for (i = 0; i < n; i++) { fwrite(&stu2[i], LEN2, 1, fp2); } printf("是否进行信息录入(y/n):"); scanf("%s", ch); while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("学号:"); scanf("%s", &stu2[n].stuNo); printf("课程编号:"); scanf("%s", stu2[n].courseNo); printf("课程名称:"); scanf("%s", &stu2[n].courseName); printf("学分:"); scanf("%d", &stu2[n].creditHour); printf("平时成绩:"); scanf("%d", &stu2[n].triGrade); printf("实验成绩:"); scanf("%d", &stu2[n].experiGrade); printf("卷面成绩:"); scanf("%d", &stu2[n].examGrade); printf("综合成绩:"); scanf("%f", &stu2[n].totalGrade); printf("实得学分:"); scanf("%f", &stu2[n].finalCreHour); if (fwrite(&stu2[n], LEN2, 1, fp2) != 1) { printf("保存失败!"); } else { printf("%s 成绩保存成功!\n", stu[n].name); n++; } printf("是否继续录入?(y/n):"); scanf("%s", ch); } fclose(fp2); printf("录入完毕!\n"); }
查找信息模块
实现查找模块代码首先要确认查找哪部分信息,其次要确认查找的依据是什么,则首先打开对应的文件,首先判断是否有信息和打开情况,无误后进行查找,再将查找的结果显示到显示屏上,提示用户找到与否和是否输出,即可完成该模块的代码实现。
编辑
void Search() { char str[20] = { '\0' }; int num = 0; printf("1.学生信息查询 2.学生成绩查询"); printf("请选择你的查询方式:-->"); scanf("%d",&num); FILE* fp; int snum, i, m = 0; char ch[2]; if ((fp = fopen("A.txt", "rb")) == NULL) { printf("无法打开\n"); return; } while (!feof(fp)) if (fread(&stu[m], LEN, 1, fp) == 1) m++; fclose(fp); if (m == 0) { printf("无信息记录!\n"); return; } if (num == 1) { int op = 0; printf("1.学号 2.姓名 3.宿舍号码"); printf("请选择你的查询方式-->"); scanf("%d", &op); switch (op) { case 1: printf("请输入要查找的学号:"); scanf("%s", &str); for (i = 0; i < m; i++) if (strcmp(stu[i].stuNo, str) == 0) { printf("找到了,是否显示?(y/n)"); scanf("%s", ch); if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("%-8s%-8s%-8s%-8s%-8s%\n", stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel); break; } } if (i == m) printf("未找到该学生信息!\n"); break; case 2: printf("请输入要查找的姓名:"); scanf("%s", &str); for (i = 0; i < m; i++) if (strcmp(stu[i].name, str) == 0) { printf("找到了,是否显示?(y/n)"); scanf("%s", ch); if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("%-8s%-8s%-8s%-8s%-8s%\n", stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel); break; } } if (i == m) printf("未找到该学生信息!\n"); break; case 3: printf("请输入要查找的宿舍号:"); scanf("%s", &str); for (i = 0; i < m; i++) if (strcmp(stu[i].domNum, str) == 0) { printf("找到了,是否显示?(y/n)"); scanf("%s", ch); if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("%-8s%-8s%-8s%-8s%-8s%\n", stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel); break; } } if (i == m) printf("未找到该学生信息!\n"); break; } } else if (num == 2) { char stunum[20]; printf("请输入要查找的学号:"); scanf("%s", &str); for (i = 0; i < m; i++) if (strcmp(stu[i].stuNo, str) == 0) { strcpy(stunum, stu[i].stuNo); } if (i == m) printf("未找到该学生信息!\n"); FILE* fp2; int snum2, i2, m2 = 0; char ch2[2]; if ((fp2 = fopen("B.txt", "rb")) == NULL) { printf("无法打开\n"); return; } while (!feof(fp)) if (fread(&stu2[m2], LEN2, 1, fp2) == 1) m2++; fclose(fp); if (m2 == 0) { printf("无信息记录!\n"); return; } for (i = 0; i < m; i++) if (strcmp(stunum,stu2[i].stuNo)==0) { printf("找到了,是否显示?(y/n)"); scanf("%s", ch); if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("课程名称\t实得学分\t\n"); printf("%-8s-8f%",stu2[i].courseName, stu2[i].finalCreHour); break; } } if (i == m) printf("无法找到该学生!\n"); } else printf("输入格式错误,请重新输入\n"); }
删除基本信息模块
基本思路为让用户输入一个学号,再到信息库中寻找,找到了把它删除,找不到反馈用户,则首先要打开文件,然后提示用户输出一个学号,再将学号与信息库中的所有项目进行比较,如果找到了询问用户是否删除,删除后提示用户删除成功,若失败则反馈失败原因。
编辑
void DelInfo() { FILE* fp1; FILE* fp2; char snum[20]; int i, j, m = 0; char ch[2]; if ((fp1 = fopen("A.txt", "r+")) == NULL) { printf("无法打开\n"); return; } while (!feof(fp1)) if (fread(&stu[m], LEN, 1, fp1) == 1) m++; fclose(fp1); if (m == 0) { printf("无内容,请先添加!\n"); return; } printf("请输入要删除的学号:"); scanf("%s", &snum); for (i = 0; i < m; i++) if (strcmp(snum,stu[i].stuNo)==0) break; printf("找到了,是否删除?(y/n)"); scanf("%s", ch); if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) for (j = i; j < m; j++) stu[j] = stu[j + 1]; m--; if ((fp1 = fopen("A.txt", "wb")) == NULL) { printf("无法打开文件\n"); return; } for (j = 0; j < m; j++) if (fwrite(&stu[j], LEN, 1, fp1) != 1) printf("无法存储!\n"); fclose(fp1); printf("删除成功!\n"); }
删除学生成绩模块
基本思路为让用户输入一个学号,再到信息库中寻找,找到了把它删除,找不到反馈用户,则首先要打开文件,然后提示用户输出一个学号,再将学号与信息库中的所有项目进行比较,如果找到了询问用户是否删除,删除后提示用户删除成功,若失败则反馈失败原因。
编辑
void DelGrade() //删除成绩信息 和学生信息模块相似 { FILE* fp2; int i, j, n = 0; char snum[20]; char ch[2]; if ((fp2 = fopen("B.txt", "r+")) == NULL) { printf("无法打开\n"); return; } while (!feof(fp2)) if (fread(&stu2[n], LEN2, 1, fp2) == 1) n++; fclose(fp2); if (n == 0) { printf("找不到记录!\n"); return; } printf("请输入要删除的学号:"); scanf("%s", snum); for (i = 0; i < n; i++) if (strcmp(snum,stu2[i].stuNo)==0) break; printf("找到了,是否删除?(y/n)"); scanf("%s", ch); if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) for (j = i; j < n; j++) stu[j] = stu[j + 1]; n--; if ((fp2 = fopen("data.txt", "wb")) == NULL) { printf("无法打开文件\n"); return; } for (j = 0; j < n; j++) if (fwrite(&stu2[j], LEN2, 1, fp2) != 1) { printf("无法存储!\n"); } fclose(fp2); printf("删除成功!\n"); }
展示学生信息模块
只需要利用一个循环结构将文件中的数据都读取出来然后输出即可,则只需要先读取文件然后按格式输出信息即可。
编辑
void showInfor() { FILE* fp1; int i, m = 0; fp1 = fopen("A.txt", "rb"); while (!feof(fp1)) { if (fread(&stu[m], LEN, 1, fp1) == 1) m++; } fclose(fp1); printf("学号\t姓名\t性别\t宿舍号\t电话号\t\n"); for (i = 0; i < m; i++) { printf("%-8s%-8s%-8s%-8s%-8s\n", stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].domNum,stu[i].tel); } }
展示学生成绩模块
只需要利用一个循环结构将文件中的数据都读取出来然后输出即可,则只需要先读取文件然后按格式输出信息即可。
编辑
void showGrade() { FILE* fp2; int i, m = 0; fp2 = fopen("B.txt", "rb"); while (!feof(fp2)) { if (fread(&stu2[m], LEN2, 1, fp2) == 1) m++; } fclose(fp2); printf("学号\t课程编号\t课程名称\t学分\t平时成绩\t实验成绩\t卷面成绩\t综合成绩\t实得学分\t\n"); for (i = 0; i < m; i++) { printf("%-8s%-8s%-8s%-8d%-8d%-8d%-8d%-8f%-8f\n", stu2[i].stuNo,stu2[i].courseNo,stu2[i].courseName,stu2[i].creditHour, stu2[i].triGrade,stu2[i].experiGrade,stu2[i].examGrade,stu2[i].totalGrade,stu2[i].finalCreHour); } }
学生信息排序模块
首先进行选择,选择需要的排序方式,接着读取文件中的信息,引入一个冒泡排序进行排序,最后提示用户排序完成,用户可选择展示功能查看排序完成后的结果。
编辑
void Order() { int option = 0; printf("1.平时成绩 2.实验成绩\n"); printf("3.卷面成绩 4.综合成绩\n"); printf("请选择排序依据:-->"); scanf("%d", &option); FILE* fp2; struct stu_grade t; int i = 0, j = 0, m = 0; if ((fp2 = fopen("B.txt", "r+")) == NULL) { printf("无法打开!\n"); return; } while (!feof(fp2)) if (fread(&stu2[m], LEN2, 1, fp2) == 1) m++; fclose(fp2); if (m == 0) { printf("无输入记录!\n"); return; } if ((fp2 = fopen("B.txt", "wb")) == NULL) { printf("无法打开\n"); return; } switch (option) { case 1: for (i = 0; i < m - 1; i++) for (j = i + 1; j < m; j++) if (stu2[j].triGrade > stu2[j+1].triGrade) { t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t; } break; case 2: for (i = 0; i < m - 1; i++) for (j = i + 1; j < m; j++) if (stu2[i].experiGrade <= stu2[j].experiGrade) { t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t; } break; case 3: for (i = 0; i < m - 1; i++) for (j = i + 1; j < m; j++) if (stu2[i].examGrade<= stu2[j].examGrade) { t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t; } break; case 4: for (i = 0; i < m - 1; i++) for (j = i + 1; j < m; j++) if (stu2[i].totalGrade <= stu2[j].totalGrade) { t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t; } break; default: printf("输入格式错误,请重新输入"); } if ((fp2 = fopen("B.txt", "wb")) == NULL) { printf("无法打开\n"); return; } for (i = 0; i < m; i++) if (fwrite(&stu2[i], LEN2, 1, fp2) != 1) { printf("%s 无法存储!\n"); } fclose(fp2); printf("存储成功\n"); }
源码
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> //输入输出必须头文件 #include <string.h> //用于计算分配内存的头文件 strlen函数 struct stu_info { char stuNo[15]; //学号 char name[20]; //姓名 char sex[3]; //性别 char domNum[10]; //宿舍号 char tel[12]; //电话号码 }; //学生基本信息结构体 struct stu_grade { char stuNo[15]; //学号 char courseNo[10]; //课程编号 char courseName[20]; //课程名称 int creditHour; //学分 int triGrade; //平时成绩 int experiGrade; //实验成绩 int examGrade; //卷面成绩 float totalGrade; //综合成绩 float finalCreHour; //实得学分 }; //学生成绩基本信息结构体 struct stu_info stu[80]; int LEN = sizeof(struct stu_info); struct stu_grade stu2[80]; int LEN2 = sizeof(struct stu_grade); void menu() //主菜单函数 { printf("***********************************************\n"); printf("*** 1.录入学生信息 2.搜索学生信息 ***\n"); printf("*** 3.删除基本信息 4.删除成绩信息 ***\n"); printf("****5.展示基本信息 6.展示成绩信息 ***\n"); printf("****7.学生信息排序 0.退出管理系统 ***\n"); printf("***********************************************\n"); //打印菜单的模式图 } void showInfor() //展示学生信息模块 { FILE* fp1; int i, m = 0; fp1 = fopen("A.txt", "rb"); //打开已经创建好的存储学生信息的文件 while (!feof(fp1)) { if (fread(&stu[m], LEN, 1, fp1) == 1) //读取文件函数信息 m++; } fclose(fp1); printf("学号\t姓名\t性别\t宿舍号\t电话号\t\n"); for (i = 0; i < m; i++) { printf("%-8s%-8s%-8s%-8s%-8s\n", //循环结构打印学生信息 stu[i].stuNo,stu[i].name,stu[i].sex,stu[i].domNum,stu[i].tel); } } void showGrade() //展示学生成绩信息 { FILE* fp2; int i, m = 0; fp2 = fopen("B.txt", "rb"); //打开已经存储好的成绩文件 while (!feof(fp2)) { if (fread(&stu2[m], LEN2, 1, fp2) == 1) //读取文件 m++; //m为存储信息的条数 } fclose(fp2); //关闭文件 printf("学号\t课程编号\t课程名称\t学分\t平时成绩\t实验成绩\t卷面成绩\t综合成绩\t实得学分\t\n"); for (i = 0; i < m; i++) { printf("%-8s%-16s%-16s%-8d%-16d%-16d%-16d%-16.2f%-16.2f\n", //循环打印成绩信息 stu2[i].stuNo,stu2[i].courseNo,stu2[i].courseName,stu2[i].creditHour, stu2[i].triGrade,stu2[i].experiGrade,stu2[i].examGrade,stu2[i].totalGrade,stu2[i].finalCreHour); } } void Add() //增加学生信息的模块 { int i, m = 0,n=0; char ch[2]={'\0'}; printf("进行学生基本信息录入:\n"); FILE* fp1; //学生成绩和学生信息两个模块 FILE* fp2; if ((fp1 = fopen("A.txt", "wb")) == NULL) //如果打不开则返回错误 { printf("无法打开学生基本信息\n"); } for (i = 0; i < m; i++) { fwrite(&stu[i], LEN, 1, fp1); //写入学生信息 LEN为大小 } printf("请进行选择-->(y/n):"); scanf("%s", ch); //给用户一定的选择权 while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) //防止出现大小写问题 { printf("学号:"); //依次提示用户输入相关的信息 scanf("%s", &stu[m].stuNo); printf("姓名:"); scanf("%s", stu[m].name); printf("性别:"); scanf("%s", &stu[m].sex); printf("宿舍号:"); scanf("%s", &stu[m].domNum); printf("电话号码:"); scanf("%s", &stu[m].tel); if (fwrite(&stu[m], LEN, 1, fp1) != 1) { printf("无法保存!"); } else { printf("%s 保存成功!\n", stu[m].name); m++; } printf("是否继续存储?(y/n):"); //给予用户选择的权力 scanf("%s", ch); } fclose(fp1); printf("进行学生成绩基本信息录入:\n"); if ((fp2 = fopen("B.txt", "wb")) == NULL) //打开文件失败返回错误信息 { printf("无法打开学生成绩基本信息\n"); } for (i = 0; i < n; i++) { fwrite(&stu2[i], LEN2, 1, fp2); //写入一个LEN2的大小文件 } printf("是否进行信息录入(y/n):"); scanf("%s", ch); while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("学号:"); //依次写入用户信息 存储 scanf("%s", &stu2[n].stuNo); printf("课程编号:"); scanf("%s", stu2[n].courseNo); printf("课程名称:"); scanf("%s", &stu2[n].courseName); printf("学分:"); scanf("%d", &stu2[n].creditHour); printf("平时成绩:"); scanf("%d", &stu2[n].triGrade); printf("实验成绩:"); scanf("%d", &stu2[n].experiGrade); printf("卷面成绩:"); scanf("%d", &stu2[n].examGrade); printf("综合成绩:"); scanf("%f", &stu2[n].totalGrade); printf("实得学分:"); scanf("%f", &stu2[n].finalCreHour); if (fwrite(&stu2[n], LEN2, 1, fp2) != 1) //用户信息存储失败返回错误 { printf("保存失败!"); } else { printf("%s 成绩保存成功!\n", stu[n].name); n++; } printf("是否继续录入?(y/n):"); scanf("%s", ch); } fclose(fp2); printf("录入完毕!\n"); } void DelInfo() //删除学生信息模块 { FILE* fp1; FILE* fp2; char snum[20]; int i, j, m = 0; char ch[2]; if ((fp1 = fopen("A.txt", "r+")) == NULL) //打开失败返回错误信息 { printf("无法打开\n"); return; } while (!feof(fp1)) if (fread(&stu[m], LEN, 1, fp1) == 1) //读取学生文件错误信息 m++; fclose(fp1); if (m == 0) { printf("无内容,请先添加!\n"); //没有信息则返回错误信息 return; } printf("请输入要删除的学号:"); //提示用户输入要删除的字符串 scanf("%s", &snum); for (i = 0; i < m; i++) if (strcmp(snum,stu[i].stuNo)==0) break; printf("找到了,是否删除?(y/n)"); scanf("%s", ch); if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) for (j = i; j < m; j++) stu[j] = stu[j + 1]; m--; if ((fp1 = fopen("A.txt", "wb")) == NULL) //在对应文件中找寻信息 { printf("无法打开文件\n"); return; } for (j = 0; j < m; j++) if (fwrite(&stu[j], LEN, 1, fp1) != 1) { printf("无法存储!\n"); } fclose(fp1); printf("删除成功!\n"); //提示删除成功 } void DelGrade() //删除成绩信息 和学生信息模块相似 { FILE* fp2; int i, j, n = 0; char snum[20]; char ch[2]; if ((fp2 = fopen("B.txt", "r+")) == NULL) { printf("无法打开\n"); return; } while (!feof(fp2)) if (fread(&stu2[n], LEN2, 1, fp2) == 1) n++; fclose(fp2); if (n == 0) { printf("找不到记录!\n"); return; } printf("请输入要删除的学号:"); scanf("%s", snum); for (i = 0; i < n; i++) if (strcmp(snum,stu2[i].stuNo)==0) break; printf("找到了,是否删除?(y/n)"); scanf("%s", ch); if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) for (j = i; j < n; j++) stu[j] = stu[j + 1]; n--; if ((fp2 = fopen("data.txt", "wb")) == NULL) { printf("无法打开文件\n"); return; } for (j = 0; j < n; j++) if (fwrite(&stu2[j], LEN2, 1, fp2) != 1) { printf("无法存储!\n"); } fclose(fp2); printf("删除成功!\n"); } void Order() //学生排序模块信息 { int option = 0; printf("1.平时成绩 2.实验成绩\n"); printf("3.卷面成绩 4.综合成绩\n"); printf("请选择排序依据:-->"); scanf("%d", &option); //选择进入循环选择 FILE* fp2; struct stu_grade t; int i = 0, j = 0, m = 0; if ((fp2 = fopen("B.txt", "r+")) == NULL) { printf("无法打开!\n"); //错误则返回错误信息 return; } while (!feof(fp2)) if (fread(&stu2[m], LEN2, 1, fp2) == 1) m++; fclose(fp2); if (m == 0) { printf("无输入记录!\n"); return; } if ((fp2 = fopen("B.txt", "wb")) == NULL) { printf("无法打开\n"); return; } switch (option) //选择对应的根据进行冒泡排序 { case 1: for (i = 0; i < m - 1; i++) //经典的冒泡排序结构进行排序 for (j = i + 1; j < m; j++) if (stu2[j].triGrade > stu2[j+1].triGrade) { t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t; } break; //结束则跳出循环 case 2: for (i = 0; i < m - 1; i++) for (j = i + 1; j < m; j++) if (stu2[i].experiGrade <= stu2[j].experiGrade) { t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t; } break; case 3: for (i = 0; i < m - 1; i++) for (j = i + 1; j < m; j++) if (stu2[i].examGrade<= stu2[j].examGrade) { t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t; } break; case 4: for (i = 0; i < m - 1; i++) for (j = i + 1; j < m; j++) if (stu2[i].totalGrade <= stu2[j].totalGrade) { t = stu2[i]; stu2[i] = stu2[j]; stu2[j] = t; } break; default: printf("输入格式错误,请重新输入"); } if ((fp2 = fopen("B.txt", "wb")) == NULL) { printf("无法打开\n"); return; } for (i = 0; i < m; i++) if (fwrite(&stu2[i], LEN2, 1, fp2) != 1) { printf("%s 无法存储!\n"); //存储失败返回错误信息 } fclose(fp2); printf("存储成功\n"); } void Search() //查找功能模块 { char str[20] = { '\0' }; int num = 0; printf("1.学生信息查询 2.学生成绩查询\n"); printf("请选择你的查询方式:-->"); scanf("%d",&num); FILE* fp; int i, m = 0; char ch[2]; if ((fp = fopen("A.txt", "rb")) == NULL) { printf("无法打开\n"); return; } while (!feof(fp)) if (fread(&stu[m], LEN, 1, fp) == 1) //读取文件信息 m++; fclose(fp); if (m == 0) { printf("无信息记录!\n"); return; } if (num == 1) { int op = 0; printf("1.学号 2.姓名 3.宿舍号码\n"); printf("请选择你的查询方式-->"); scanf("%d", &op); switch (op) { case 1: printf("请输入要查找的学号:"); scanf("%s", &str); for (i = 0; i < m; i++) if (strcmp(stu[i].stuNo, str) == 0) { printf("找到了,是否显示?(y/n)"); scanf("%s", ch); if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("学号\t姓名\t性别\t宿舍号\t电话号\t\n"); printf("%-8s%-8s%-8s%-8s%-8s%\n", stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel); break; } } if (i == m) printf("未找到该学生信息!\n"); break; case 2: printf("请输入要查找的姓名:"); scanf("%s", &str); for (i = 0; i < m; i++) if (strcmp(stu[i].name, str) == 0) { printf("找到了,是否显示?(y/n)"); scanf("%s", ch); if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("学号\t课程编号\t课程名称\t学分\t平时成绩\t实验成绩\t卷面成绩\t综合成绩\t实得学分\t\n"); printf("%-8s%-8s%-8s%-8s%-8s%\n", stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel); break; } } if (i == m) printf("未找到该学生信息!\n"); break; case 3: printf("请输入要查找的宿舍号:"); scanf("%s", &str); for (i = 0; i < m; i++) if (strcmp(stu[i].domNum, str) == 0) { printf("找到了,是否显示?(y/n)"); scanf("%s", ch); if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("%-8s%-8s%-8s%-8s%-8s%\n", stu[i].stuNo, stu[i].name, stu[i].sex, stu[i].domNum, stu[i].tel); break; } } if (i == m) printf("未找到该学生信息!\n"); break; } } else if (num == 2) { char stunum[20]; printf("请输入要查找的学号:"); scanf("%s", &str); for (i = 0; i < m; i++) if (strcmp(stu[i].stuNo, str) == 0) { strcpy(stunum, stu[i].stuNo); } if (i == m) printf("未找到该学生信息!\n"); FILE* fp2; int m2 = 0; if ((fp2 = fopen("B.txt", "rb")) == NULL) { printf("无法打开\n"); return; } while (!feof(fp)) if (fread(&stu2[m2], LEN2, 1, fp2) == 1) m2++; fclose(fp); if (m2 == 0) { printf("无信息记录!\n"); return; } for (i = 0; i < m; i++) if (strcmp(stunum,stu2[i].stuNo)==0) { printf("找到了,是否显示?(y/n)"); scanf("%s", ch); if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) { printf("课程名称\t实得学分\t\n"); printf("%-8s-8f%",stu2[i].courseName, stu2[i].finalCreHour); break; } } if (i == m) printf("无法找到该学生!\n"); } else printf("输入格式错误,请重新输入\n"); } enum option //枚举结构 增加代码可读性 { exit, add, search, delInfo, delGrade, showinfor, showgrade, order, }; int main() { int input =1; //模块选择变量 menu(); do { printf("请选择:-->"); scanf("%d", &input); switch (input) { case add: Add(); break; case search: Search(); break; case delInfo: DelInfo(); break; case delGrade: DelGrade(); break; case showinfor: showInfor(); break; case showgrade: showGrade(); break; case order: Order(); break; case exit: break; default: printf("输入格式错误"); } } while (input); return 0; }
实验报告源码流程图下载链接
链接:https://pan.baidu.com/s/1CyxfN4hxRw6KDftwmeXO8w?pwd=1234
提取码:1234