本来已经写了一个其他版本的小程序了,后来收到了同学的私信让帮忙写一个很像的程序。
原文链接: https://blog.csdn.net/qq_43617268/article/details/90695212
题目:
#include<stdio.h>
#include<string.h>
struct grade_list{ //定义结构体
char name[10]; //姓名
int id; //学号
float c_len; //C语言成绩
float math; //微积分
float phy; //哲学
float all; //总分
int num; //名次
};
void in_put(struct grade_list grades[], int n); //声明输入函数
void sum(struct grade_list grades[], int n); //求和函数
void out_put(struct grade_list grades[], int n); //输出函数
void sort(struct grade_list grades[], int n); //排序函数
void find(struct grade_list grades[], float all, int n, int index); //成绩匹配函数,用于将排序的成绩和结构体匹配
int main()
{
struct grade_list grades[50];
int choices,i,n;
printf("成绩统计系统正在启动...\n");
printf("程序正在运行...\n");
do{
rerun:
printf("\n");
printf("\t************************************\n");
printf("\t* =========================== *\n");
printf("\t* 学生成绩统计系统 *\n");
printf("\t* =========================== *\n");
printf("\t* *\n");
printf("\t* 输入学生成绩-------------1 *\n");
printf("\t* 求学生总分并输出---------2 *\n");
printf("\t* 将学生总成绩排序并输出---3 *\n");
printf("\t* 退出系统-----------------0 *\n");
printf("\t* *\n");
printf("\t************************************\n");
printf("\t请选择功能:");
scanf("%d", &choices);
switch(choices)
{
case 1:
printf("执行成绩输入程序...\n\n");
printf("\t请输入学生人数(N):");
scanf("%d",&n);
in_put(grades,n);
break;
case 2:
printf("执行学生成绩求和并输出...\n\n");
sum(grades,n);
out_put(grades, n);
break;
case 3:
printf("执行学生成绩排名并输出...\n\n");
sort(grades,n);
out_put(grades, n);
break;
case 0:
printf("\t||系统已关闭,感谢您的使用!||");
break;
default :
printf("\t非法输入!!!");
goto rerun;
}
}while(choices>0&&choices<6);
return 0;
}
void in_put(struct grade_list grades[], int n) //定义输入函数
{
int i;
for(i=0;i<n;i++)
{
printf("\t请输入第%d名同学的姓名:", i+1);
scanf("%s", grades[i].name);
printf("\t请输入第%d名同学的学号:", i+1);
scanf("%d", &grades[i].id);
printf("\t请输入第%d名同学的C语言成绩:", i+1);
scanf("%f", &grades[i].c_len);
printf("\t请输入第%d名同学的微积分成绩:", i+1);
scanf("%f", &grades[i].math);
printf("\t请输入第%d名同学的哲学成绩:", i+1);
scanf("%f", &grades[i].phy);
grades[i].num = 0; //在排名之前先赋值为0
}
printf("\t*成绩录入成功*\n");
}
void find(struct grade_list grades[], float all, int n, int index)
{
int i;
for(i = 0; i < n; i++)
{
if(all == grades[i].all)
{
grades[i].num = index; //当找到排好序的总成绩对应的学生后,将排名index赋值给num
}
}
}
void sort(struct grade_list grades[], int n)
{
int a[50] ;
int k;
int N = n;
for(k=0; k < n; k++)
{
a[k] = grades[k].all; //将各个学生的总成绩提取到一个数组中,用于冒泡排序
}
//冒泡排序
int i, j, temp;
for (j = 0; j < N - 1; j++)
{
for (i = 0; i < N - 1 - j; i++)
if (a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
for (i = 0; i < N; i++)
{
find(grades, a[i], N, N-i); //这里因为冒泡排序写成了从小到大,所以传入匹配函数要用n减,让排名倒过来
}
}
void sum(struct grade_list grades[], int n) //定义计算学生总分
{
int i;
float result;
for(i=0;i<n;i++)
{
result=grades[i].c_len+grades[i].math+grades[i].phy;
grades[i].all = result; //赋值
}
}
void out_put(struct grade_list grades[], int n) //输出
{
int i;
printf("成绩单:\n学号\t\t姓名\t\t哲学\t微积分\tC语言\t总分\t排名\n");
for(i=0;i<n;i++)
{
printf("%d\t\t%s\t\t%.2f\t%.2f\t%.2f\t%.2f\t%d\n", grades[i].id,grades[i].name,grades[i].phy,grades[i].math,grades[i].c_len,grades[i].all,grades[i].num);
}
printf("成绩输出完毕");
}