对一个班级同学的形成性成绩进行排序输出,具体要求:
定义一个结构体类型存储学生学号和所有的测试成绩及平均分,通过文件操作读取相关数据,计算每位同学的平均成绩,并按平均成绩排序,将排序后的结果输出到文件中保存起来,其中数据读取、计算平均分、排序和输出分别采用函数实现。
三、实验要求
计算方法:平均分=所有37次测试成绩的平均值。
排序方法:要求使用冒泡排序算法,按加权均分由大到小排序。
计算输出:除学号外,所有成绩均采用单精度(float)浮点数进行定义和计算;输出仅输出到屏幕,无需输出至文件。输出格式同输入的文件数据格式类似,无需输出第一行人数,37次成绩仅输出整数部分,每行的最后增加一列为“平均分”列(平均分列保留2位小数)。
不知道你采纳了楼上的答案没有,没有满意的话,下班之后可以给你撸一个能用的代码。
好的更新一下相关内容,你可以根据我的这些代码进行修改完善,实验结果如下
代码:
#include <stdio.h>
#include <stdlib.h>
#define N 37 //定义常量N为37为测试成绩
//定义一个结构体类型,名为student
struct student
{
int id; //学号,整数类型
float scores[N]; //37次测试成绩,单精度浮点数类型的数组
float average; //平均分,单精度浮点数类型
};
//定义一个函数,计算一个student类型的变量的平均分
void calculate_average(struct student *s)
{
int i; //定义循环变量i
float sum = 0; //定义和变量sum,并初始化为0
for (i = 0; i < N; i++) //循环37次
{
sum += s->scores[i]; //累加s的每一次测试成绩到sum中
}
s->average = sum / N; //计算s的平均分,并赋值给s->average
}
//定义一个函数,打印一个student类型的变量的所有信息
void print_student(struct student *s)
{
int i; //定义循环变量i
printf("学号:%d\n", s->id); //打印s的学号
printf("测试成绩:\n"); //打印提示信息
for (i = 0; i < N; i++) //循环37次
{
printf("%.0f,", s->scores[i]); //打印s的每一次测试成绩,并保留两位小数
if ((i + 1) % 9 == 0) //如果是每9次一行,就打印一个换行符
{
printf("\n");
}
}
printf("平均分:%.2f\n", s->average); //打印s的平均分,并保留两位小数
}
//定义一个函数,从文件中读取数据,并存储到一个student类型的数组中,返回数组的长度
int read_data_from_file(const char *filename, struct student **array)
{
FILE *fp; //定义文件指针fp
int n; //定义班级人数n
int i, j; //定义循环变量i和j
fp = fopen(filename, "r"); //以只读模式打开文件filename,并赋值给fp
if (fp == NULL) //如果fp为空,说明打开文件失败
{
printf("无法打开文件%s\n", filename); //打印错误信息
return -1; //返回-1,表示出错
}
fscanf(fp, "%d", &n); //从文件中读取班级人数n
*array = (struct student *)malloc(n * sizeof(struct student)); //动态分配内存空间给array指向的指针,大小为n个student类型的大小
for (i = 0; i < n; i++) //循环n次,读取每个学生的数据
{
fscanf(fp, "%d,", &(*array)[i].id); //从文件中读取学号,并赋值给(*array)[i].id,注意后面有一个逗号,表示跳过逗号
for (j = 0; j < N; j++) //循环37次,读取每次测试成绩
{
fscanf(fp, "%f,", &(*array)[i].scores[j]); //从文件中读取测试成绩,并赋值给(*array)[i].scores[j],注意后面有一个逗号,表示跳过逗号
}
calculate_average(&(*array)[i]); //调用calculate_average函数,计算平均分,并赋值给(*array)[i].average
}
fclose(fp); //关闭文件
return n; //返回数组的长度n
}
//定义一个函数,对一个student类型的数组按照平均分进行排序,使用冒泡排序算法
void sort_by_average(struct student *array, int n)
{
int i, j; //定义循环变量i和j
struct student temp; //定义一个临时变量temp,用来交换元素
for (i = 0; i < n - 1; i++) //循环n-1次
{
for (j = 0; j < n - 1 - i; j++) //循环n-1-i次
{
if (array[j].average < array[j + 1].average) //如果array[j]的平均分小于array[j+1]的平均分,说明顺序不对
{
temp = array[j]; //把array[j]赋值给temp
array[j] = array[j + 1]; //把array[j+1]赋值给array[j]
array[j + 1] = temp; //把temp赋值给array[j+1]
}
}
}
}
//定义主函数
int main()
{
struct student *array; //定义一个student类型的指针,用来指向数组
int n; //定义数组的长度n
int i;
n = read_data_from_file("studen_score.txt", &array); //调用read_data_from_file函数,从"studen_score.txt"文件中读取数据,并存储到array指向的数组中,返回数组的长度n
if (n > 0) //如果n大于0,说明读取成功
{
printf("读取成功,共%d个学生的数据。\n", n); //打印成功信息
sort_by_average(array, n); //调用sort_by_average函数,对array指向的数组按照平均分进行排序
printf("排序成功,按照平均分由大到小排序。\n"); //打印成功信息
for (i = 0; i < n; i++) //循环n次,打印每个学生的数据
{
print_student(&array[i]); //调用print_student函数,打印array[i]指向的学生的所有信息
}
free(array); //释放动态分配的内存空间
}
return 0; //返回0,表示程序正常结束
}
资料链接:
https://download.csdn.net/download/weixin_44317448/87758143
下面是用C语言实现一个班级同学形成性成绩排名的程序,包括读取数据、计算平均分、排序和输出结果:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE_SIZE 1024
#define NUM_TESTS 37
#define WEIGHT 1.0/NUM_TESTS
typedef struct {
int id;
float tests[NUM_TESTS];
float avg;
} Student;
int read_students(Student students[]) {
char line[MAX_LINE_SIZE];
int i = 0;
FILE* file = fopen("scores.txt", "r");
if(file == NULL) {
fprintf(stderr, "Error opening file.\n");
exit(EXIT_FAILURE);
}
fgets(line, MAX_LINE_SIZE, file); // Read first line (number of students)
while(fgets(line, MAX_LINE_SIZE, file) != NULL) {
int j = 0;
char* token = strtok(line, ",");
students[i].id = atoi(token);
token = strtok(NULL, ",");
while(token != NULL) {
students[i].tests[j++] = atof(token);
token = strtok(NULL, ",");
}
i++;
}
fclose(file);
return i;
}
void calculate_averages(Student students[], int num_students) {
int i, j;
for(i = 0; i < num_students; i++) {
float total = 0;
for(j = 0; j < NUM_TESTS; j++) {
total += students[i].tests[j];
}
students[i].avg = total * WEIGHT;
}
}
void sort_students(Student students[], int num_students) {
int i, j;
for(i = 0; i < num_students; i++) {
for(j = 0; j < num_students-i-1; j++) {
if(students[j].avg < students[j+1].avg) {
Student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
}
void print_students(Student students[], int num_students) {
int i, j;
printf("学号,");
for(j = 1; j <= NUM_TESTS; j++) {
printf("第%d次测试,", j);
}
printf("平均分\n");
for(i = 0; i < num_students; i++) {
printf("%d,", students[i].id);
for(j = 0; j < NUM_TESTS; j++) {
printf("%.0f,", students[i].tests[j]);
}
printf("%.2f\n", students[i].avg);
}
}
int main() {
Student students[100];
int num_students = read_students(students);
calculate_averages(students, num_students);
sort_students(students, num_students);
print_students(students, num_students);
return 0;
}
该程序使用结构体类型存储学生的学号、测试成绩和平均分。程序读取数据文件,计算每个学生的平均分,然后根据平均分排序,最后输出结果到屏幕。计算平均分和排序均使用循环遍历数组和结构体的方式实现,以保证代码的简洁性和可读性。
可以借鉴下
#include<stdio.h>
#define N 3 //定义有3个学生
//定义学生结构体
struct student
{
int n;
float c, m, e, p,aver;
};
void paixu(struct student x[N])
{
printf("-----------------------------------成绩单-------------------------------------\n");
printf("名次 学号 英语 语文 数学 物理 平均分\n");
int i, j, k, temp;
for (i = 0; i < N - 1; i++)
{
k = i;
for (j = i + 1; j < N; j++)
{
if (x[i].aver > x[j].aver)//如果 后面比前面小
k = j;
if (k != j)//如果前面比后面小
{
temp = x[j].aver;
x[j].aver = x[i].aver;
x[i].aver = temp;
temp = x[j].n;
x[j].n = x[i].n;
x[i].n = temp;
temp = x[j].c;
x[j].c = x[i].c;
x[i].c = temp;
temp = x[j].m;
x[j].m = x[i].m;
x[i].m = temp;
temp = x[j].e;
x[j].e = x[i].e;
x[i].e = temp;
temp = x[j].p;
x[j].p = x[i].p;
x[i].p = temp;
//将两个结构组交换
}
}
}
int a;
for (a=0; a < N; a++)
{
printf("%d %d %f %f %f %f %f\n", a + 1, x[a].n, x[a].e, x[a].c, x[a].m, x[a].p, x[a].aver);
}
}
//计算模块
float jisuan(float c, float m, float e, float p)
{
float aver, sum;
sum = c + m + e + p;
aver = sum / 4;
printf("总分是:%f,平均值是:%f\n", sum,aver);
return aver;
}
//输入模块
void fun1()
{
int a;
struct student x[N];
for (a = 0; a < N; a++)
{
printf("请输入学号:");
scanf("%d", &x[a].n);
printf("英语:");
scanf("%f", &x[a].e);
printf("语文:");
scanf("%f", &x[a].c);
printf("数学:");
scanf("%f", &x[a].m);
printf("物理:");
scanf("%f", &x[a].p);
x[a].aver= jisuan(x[a].c, x[a].m, x[a].e, x[a].p);
}
paixu(x);
return;
}
//排序模块,排 x[a].aver
int main()
{
fun1();//完成输入后,由结构体数组储存学生的信息
}
不知道你这个问题是否已经解决, 如果还没有解决的话: