需求如下:
1.按各门课成绩排序
2.计算每个人的平均成绩
3.统计各科的平均分,最高分,最低分,不及格人数,各分段人数
4.五分制,添加一个平均绩点
5.根据学生姓名查询各科成绩,重名则全部输出
6.根据学生的学号查询
7.添加一个新的学生
8.删除一个学生
准备文件:
需要将此文件和源.cpp文件放到一个文件夹里,写路径时方便。
源代码在下面,篇幅有点长,望读者耐心浏览。
测试结果:
代码:
#define EXAMPLE_MACRO_NAME//此代码运行在vs2019中 为防止scanf()等函数出错
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int count = 0;//学生序号
//定义结构体数据
struct student {
int s_id;//学号
char s_name[10];//姓名
int s_math;//高数
int s_C;//C语言
int s_DateStructure;//数据结构
int s_English;//英语
int s_avg;//每个学生平均分
}S[10];
int j;//学生个数
void open_file()
{
FILE* fp;
int i;
if ((fp = fopen("input.txt", "r")) == NULL)
{
printf("file open failed.");
exit(0);//退出程序(结束程序)
}
j = 0;
while (!feof(fp))
{
fscanf(fp, "%d,%d,%d,%d,%d,%s", &S[j].s_id,&S[j].s_math, &S[j].s_C, &S[j].s_DateStructure, &S[j].s_English, S[j].s_name);
j++;
}
j--;
fclose(fp);//关闭文件
}
//按照各科成绩排序
void s_sort()
{
open_file();
printf("按照高数进行排序:\n");
for (int i = 0; i < j; i++)
{
for (int k = 0; k < j - 1 - i; k++)
{
if (S[k].s_math > S[k + 1].s_math)
{
struct student t = S[k];
S[k] = S[k + 1];
S[k + 1] = t;
}
}
}
count = 0;
printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\n");
for (int i = 0; i < j; i++) //依次打印每一行学生数据,共j条,存在S[0...j-1]中
{
if (S[i].s_id == 0)
{
continue;
}
printf("%d\t%d\t%s\t%d\t%d\t\t%d\t%d\n", count + 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English);
count++;
}
printf("按照C语言进行排序:\n");
for (int i = 0; i < j; i++)
{
for (int k = 0; k < j - 1 - i; k++)
{
if (S[k].s_C > S[k + 1].s_C)
{
struct student t = S[k];
S[k] = S[k + 1];
S[k + 1] = t;
}
}
}
count = 0;
printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\n");
for (int i = 0; i < j; i++) //依次打印每一行学生数据,共j条,存在S[0...j-1]中
{
if (S[i].s_id == 0)
{
continue;
}
printf("%d\t%d\t%s\t%d\t%d\t\t%d\t%d\n", count + 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English);
count++;
}
printf("按照数据结构进行排序:\n");
for (int i = 0; i < j; i++)
{
for (int k = 0; k < j - 1 - i; k++)
{
if (S[k].s_DateStructure > S[k + 1].s_DateStructure)
{
struct student t = S[k];
S[k] = S[k + 1];
S[k + 1] = t;
}
}
}
count = 0;
printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\n");
for (int i = 0; i < j; i++) //依次打印每一行学生数据,共j条,存在S[0...j-1]中
{
if (S[i].s_id == 0)
{
continue;
}
printf("%d\t%d\t%s\t%d\t%d\t\t%d\t%d\n", count + 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English);
count++;
}
printf("按照英语进行排序:\n");
for (int i = 0; i < j; i++)
{
for (int k = 0; k < j - 1 - i; k++)
{
if (S[k].s_English > S[k + 1].s_English)
{
struct student t = S[k];
S[k] = S[k + 1];
S[k + 1] = t;
}
}
}
count = 0;
printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\n");
for (int i = 0; i < j; i++) //依次打印每一行学生数据,共j条,存在S[0...j-1]中
{
if (S[i].s_id == 0)
{
continue;
}
printf("%d\t%d\t%s\t%d\t%d\t\t%d\t%d\n", count + 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English);
count++;
}
}
//按照平均成绩排序
void s_sort_avg()
{
open_file();
printf("按照平均成绩进行排序:\n");
for (int i = 0; i < j; i++)
{
S[i].s_avg = (S[i].s_math + S[i].s_C + S[i].s_DateStructure + S[i].s_English) / 4;
}
for (int i = 0; i < j; i++)
{
for (int k = 0; k < j - 1 - i; k++)
{
if (S[k].s_avg > S[k + 1].s_avg)
{
struct student t = S[k];
S[k] = S[k + 1];
S[k + 1] = t;
}
}
}
count = 0;
printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\t平均分\n");
for (int i = 0; i < j; i++) //依次打印每一行学生数据,共j条,存在S[0...j-1]中
{
if (S[i].s_id == 0)
{
continue;
}
printf("%d\t%d\t%s\t%d\t%d\t%d\t\t%d\t%d\n", count + 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English,S[i].s_avg);
count++;
}
}
//统计各科的平均分,最高分,最低分,不及格人数,各分段人数
void s_statistics()
{
open_file();
int s_max, s_min, s_flunk = 0, s_60_69 = 0, s_70_79 = 0, s_80_89 = 0, s_90_100 = 0;
int avg;
s_max = S[0].s_math, s_min = S[0].s_math, avg = 0;
for (int i = 0; i < j; i++)
{
if (S[i].s_id == 0)
{
continue;
}
if (s_max < S[i].s_math)
{
s_max = S[i].s_math;
}
if (s_min > S[i].s_math)
{
s_min = S[i].s_math;
}
if (S[i].s_math < 60)
{
s_flunk++;
}
if (S[i].s_math >= 60 && S[i].s_math <= 69)
{
s_60_69++;
}
if (S[i].s_math >= 70 && S[i].s_math <= 79)
{
s_70_79++;
}
if (S[i].s_math >= 80 && S[i].s_math <= 89)
{
s_80_89++;
}
if (S[i].s_math >= 90 && S[i].s_math <= 100)
{
s_90_100++;
}
avg += S[i].s_math;
}
avg /= j;
printf("高数平均分:%d\t 最高分:%d\t最低分:%d\t不及格人数:%d\t60-69的人数有:%d\t70-79的人数有:%d\t80-89的人数有:%d\t90-100的人数有:%d\n", avg, s_max, s_min, s_flunk, s_60_69, s_70_79, s_80_89, s_90_100);
s_flunk = 0, s_60_69 = 0, s_70_79 = 0, s_80_89 = 0, s_90_100 = 0;
s_max = S[0].s_C, s_min = S[0].s_C, avg = 0;
for (int i = 0; i < j; i++)
{
if (S[i].s_id == 0)
{
continue;
}
if (s_max < S[i].s_C)
{
s_max = S[i].s_C;
}
if (s_min > S[i].s_C)
{
s_min = S[i].s_C;
}
if (S[i].s_C < 60)
{
s_flunk++;
}
if (S[i].s_C >= 60 && S[i].s_C <= 69)
{
s_60_69++;
}
if (S[i].s_C >= 70 && S[i].s_C <= 79)
{
s_70_79++;
}
if (S[i].s_C >= 80 && S[i].s_C <= 89)
{
s_80_89++;
}
if (S[i].s_C >= 90 && S[i].s_C <= 100)
{
s_90_100++;
}
avg += S[i].s_C;
}
avg /= j;
printf("C语言平均分:%d\t 最高分:%d\t最低分:%d\t不及格人数:%d\t60-69的人数有:%d\t70-79的人数有:%d\t80-89的人数有:%d\t90-100的人数有:%d\n", avg, s_max, s_min, s_flunk, s_60_69, s_70_79, s_80_89, s_90_100);
s_flunk = 0, s_60_69 = 0, s_70_79 = 0, s_80_89 = 0, s_90_100 = 0;
s_max = S[0].s_DateStructure, s_min = S[0].s_DateStructure, avg = 0;
for (int i = 0; i < j; i++)
{
if (S[i].s_id == 0)
{
continue;
}
if (s_max < S[i].s_DateStructure)
{
s_max = S[i].s_DateStructure;
}
if (s_min > S[i].s_DateStructure)
{
s_min = S[i].s_DateStructure;
}
if (S[i].s_DateStructure < 60)
{
s_flunk++;
}
if (S[i].s_DateStructure >= 60 && S[i].s_DateStructure <= 69)
{
s_60_69++;
}
if (S[i].s_DateStructure >= 70 && S[i].s_DateStructure <= 79)
{
s_70_79++;
}
if (S[i].s_DateStructure >= 80 && S[i].s_DateStructure <= 89)
{
s_80_89++;
}
if (S[i].s_DateStructure >= 90 && S[i].s_DateStructure <= 100)
{
s_90_100++;
}
avg += S[i].s_DateStructure;
}
avg /= j;
printf("数据结构平均分:%d 最高分:%d\t最低分:%d\t不及格人数:%d\t60-69的人数有:%d\t70-79的人数有:%d\t80-89的人数有:%d\t90-100的人数有:%d\n", avg, s_max, s_min, s_flunk, s_60_69, s_70_79, s_80_89, s_90_100);
s_flunk = 0, s_60_69 = 0, s_70_79 = 0, s_80_89 = 0, s_90_100 = 0;
s_max = S[0].s_English, s_min = S[0].s_English, avg = 0;
for (int i = 0; i < j; i++)
{
if (S[i].s_id == 0)
{
continue;
}
if (s_max < S[i].s_English)
{
s_max = S[i].s_English;
}
if (s_min > S[i].s_English)
{
s_min = S[i].s_English;
}
if (S[i].s_English < 60)
{
s_flunk++;
}
if (S[i].s_English >= 60 && S[i].s_English <= 69)
{
s_60_69++;
}
if (S[i].s_English >= 70 && S[i].s_English <= 79)
{
s_70_79++;
}
if (S[i].s_English >= 80 && S[i].s_English <= 89)
{
s_80_89++;
}
if (S[i].s_English >= 90 && S[i].s_English <= 100)
{
s_90_100++;
}
avg += S[i].s_English;
}
avg /= j;
printf("英语平均分:%d\t 最高分:%d\t最低分:%d\t不及格人数:%d\t60-69的人数有:%d\t70-79的人数有:%d\t80-89的人数有:%d\t90-100的人数有:%d\n", avg, s_max, s_min, s_flunk, s_60_69, s_70_79, s_80_89, s_90_100);
}
//将每个人的百分制换出五分制,并在学生数组中添加一个平均绩点,记录五分制的平均绩点信息保留2位小数
void s_five()
{
open_file();
for (int i = 0; i < j; i++)
{
S[i].s_avg = (S[i].s_math + S[i].s_C + S[i].s_DateStructure + S[i].s_English) / 4;
}
for (int i = 0; i < j; i++)
{
for (int k = 0; k < j - 1 - i; k++)
{
if (S[k].s_avg > S[k + 1].s_avg)
{
struct student t = S[k];
S[k] = S[k + 1];
S[k + 1] = t;
}
}
}
count = 0;
printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\t平均分\n");
for (int i = 0; i < j; i++) //依次打印每一行学生数据,共j条,存在S[0...j-1]中
{
if (S[i].s_id == 0)
{
continue;
}
double s = S[i].s_math *= 100;;
double c = S[i].s_C *= 100;
double d = S[i].s_DateStructure *= 100;
double e = S[i].s_English *= 100;
double a = S[i].s_avg *= 100;
printf("%d\t%d\t%s\t%.2lf\t%.2lf\t\t%.2lf\t%.2lf\t%.2lf\n", count + 1, S[i].s_id, S[i].s_name, s/2000,c/2000,d/2000,e/2000,a/2000);
count++;
}
}
//根据学生姓名查询各科成绩,重名则全部输出
void enquire_name()
{
open_file();
char name[10];
printf("输入需要查询的学生姓名\n");
scanf("%s", name);
int num = 0;
for (int i = 0; i < j; i++)
{
if (S[i].s_id == 0)
{
continue;
}
if (strcmp(name,S[i].s_name)==0)
{
printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\n");
printf("%d\t%d\t%s\t%d\t%d\t\t%d\t%d\n", num + 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English);
num++;
}
}
if (num == 0)
{
printf("该学生不存在\n");
}
}
//根据学生的学号查询各科成绩
void enquire_id()
{
open_file();
int id=0;
count = 0;
printf("输入需要查询的学生学号\n");
scanf("%d", &id);
if (id == 0)
{
printf("该学号不存在或已被删除\n");
}
for (int i = 0; i < j; i++)
{
if (id==S[i].s_id)
{
printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\n");
printf("%d\t%d\t%s\t%d\t%d\t\t%d\t%d\n", count + 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English);
count++;
}
}
if (count == 0)
{
printf("该学生不存在!\n");
}
}
//添加一个新的学生到数组里
void add_s()
{
open_file();
FILE* fp;
if ((fp = fopen("input.txt", "a")) == NULL)
{
printf("file open failed.");
exit(0);//退出程序(结束程序)
}
int i;
int num = 0;
printf("需要录入几个学生的信息?\n");
scanf("%d", &num);
for (i = 0; i < num; i++) //往文件中写入3个学生信息 //输入成绩时切换至英文输入 ','
{
int flag = 0;//记录录入的学号是否存在
int id = 0;
printf("正在录入第%d个学生信息\n", i + 1);
printf("请输入学号\n");
scanf("%d", &id);
if (id == 0)
{
printf("错误学号请重新输入\n");
i -= 1;
continue;
}
for (int a = 0; a < j; a++)
{
if (id == S[a].s_id)
{
printf("该学生已存在,请重新输入\n");
printf("-----------------------\n");
i -= 1;
flag = 1;
break;
}
}
if (flag == 1)
{
continue;
}
S[i].s_id = id;
printf("请输入姓名\n");
scanf("%s", S[i].s_name);
printf("请输入高数,C语言,数据结构,英语\n");
scanf("%d,%d,%d,%d", &S[i].s_math, &S[i].s_C, &S[i].s_DateStructure, &S[i].s_English);// 从键盘输入数据,存入内存中的数组
fprintf(fp, "%d,%d,%d,%d,%d,%s\n", S[i].s_id, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English, S[i].s_name);//把内存中数组的数据,写入文件中
printf("本次录入的信息:\n");
printf("序号\t学号\t姓名\t高数\tC语言\t数据结构\t英语\n");
printf("%d\t%d\t%s\t%d\t%d\t\t%d\t%d\n", 1, S[i].s_id, S[i].s_name, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English);
}
fclose(fp);
}
//删除一个学生
void delete_s()
{
open_file();
FILE* fp;
if ((fp = fopen("input.txt", "r+")) == NULL)
{
printf("file open failed.");
exit(0);//退出程序(结束程序)
}
int id = 0;
int flag = 0;
printf("请输入要删除学生的学号:\n");
scanf("%d", &id);
if (id == 0)
{
printf("错误学号请重新输入\n");
}
for (int i = 0; i < j ; i++)
{
if (id == S[i].s_id)
{
S[i].s_id = 0;
fprintf(fp, "%d,%d,%d,%d,%d,%s\n", S[i].s_id, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English, S[i].s_name);
flag = 1;
}
else
{
fprintf(fp, "%d,%d,%d,%d,%d,%s\n", S[i].s_id, S[i].s_math, S[i].s_C, S[i].s_DateStructure, S[i].s_English, S[i].s_name);
}
}
if(flag==0)
{
printf("该学号不存在\n");
}
else
{
printf("删除成功!\n");
}
fclose(fp);
}
//菜单
void s_menu()
{
printf("·········学生成绩分析系统········\n");
printf("\t0.退出\n");
printf("\t1.按各门课成绩排序并显示\n");
printf("\t2.计算每个人的平均成绩,按平均成绩(百分制)排序并显示\n");
printf("\t3.统计各科的平均分,最高分,最低分,不及格人数,各分段人数\n");
printf("\t4.将每个人的百分制换出五分制,并在学生数组中添加一个平均绩点,记录五分制的平均绩点信息保留2位小数\n");
printf("\t5.根据学生姓名查询各科成绩,重名则全部输出\n");
printf("\t6.根据学生的学号查询各科成绩\n");
printf("\t7.添加一个新的学生到数组里\n");
printf("\t8.删除一个学生\n\n");
printf("输入您需要实现的功能的序号:\n");
}
int main()
{
while (true)
{
s_menu();
int select = 0;
scanf("%d", &select);
switch (select)
{
case 0:
exit(0);
break;
case 1:
s_sort();
break;
case 2:
s_sort_avg();
break;
case 3:
s_statistics();
break;
case 4:
s_five();
break;
case 5:
enquire_name();
break;
case 6:
enquire_id();
break;
case 7:
add_s();
break;
case 8:
delete_s();
break;
default:
break;
}
}
return 0;
}
总结:
变量名的命名比较乱,代码冗余,未考虑时间,空间复杂度。
希望能够帮助到读者。
读者可以尝试将其完善,减少代码行数,使用模板,链表来存储数据等等。
本文含有隐藏内容,请 开通VIP 后查看