目录
写在前面
程序设计要求
概要设计
主菜单模块
编辑
录入/增加信息模块
查找信息模块
删除基本信息模块
删除学生成绩模块
展示学生信息模块
展示学生成绩模块
学生信息排序模块
源码
实验报告源码流程图下载链接
本文为本人大一程序设计课选题代码,文章开头末尾附带源码和实验报告及流程图下载,欢迎关注评论留言。
链接: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 //输入输出必须头文件
#include //用于计算分配内存的头文件 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