关于#结构体#的问题,如何解决?(语言-c语言)

利用结构体存储学生的基本信息(学号、姓名、6科成绩、平均分),完成班级30个同学的100以内的成绩随机生成,调用函数按平均分进行由高到低排序,调用函数输出初始学生信息和排序后的信息。

结构体的设计不难,主要解决随机生成和排序的问题就好。
代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define NUMS 30

struct student{
    int num;  // 学号
    char name[20];  // 姓名
    int scores[6];  // 成绩
    double avg;     // 平均分
};

void print_info(struct student stus[]);
void select_sort(struct student stus[]);

int main(void)
{
    struct student stus[NUMS];
    // 生成30名学生随机成绩,平均分
    for (int i = 0; i < NUMS; i++){
        struct student stu;
        stu.num = i + 1; // 学号
        sprintf(stu.name,"学生%d", i + 1); // 姓名
        stu.avg = 0;
        for(int j = 0; j < 6; j++) {
            stu.scores[j] = rand() % 101; // 生成各科成绩
            stu.avg += stu.scores[j];
        }
        stu.avg = stu.avg / 6; // 生成平均分
        stus[i] = stu;
    }
    printf("排序前学生信息:\n");
    print_info(stus);
    select_sort(stus);
    printf("排序后学生信息:\n");
    print_info(stus);
    return 0;
}

void print_info(struct student stus[])
{
    for(int i = 0; i < NUMS; i++)
    {
        printf("学号:%d, 姓名:%s, 各科成绩:%d,%d,%d,%d,%d,%d, 平均分:%lf\n", stus[i].num,stus[i].name,stus[i].scores[0],stus[i].scores[1],stus[i].scores[2],stus[i].scores[3],stus[i].scores[4],stus[i].scores[5],stus[i].avg);
    }
}

void select_sort(struct student stus[])
{
    for(int i=0; i<NUMS-1; i++){
        for(int j=i+1; j<NUMS; j++){
            if(stus[j].avg > stus[i].avg){
                struct student temp = stus[i];
                stus[i] = stus[j];
                stus[j] = temp;
            }
        }
    }
}

运行结果:

排序前学生信息:
学号:1, 姓名:学生1, 各科成绩:32,32,54,12,52,56, 平均分:39.666667
学号:2, 姓名:学生2, 各科成绩:8,30,44,94,44,39, 平均分:43.166667
学号:3, 姓名:学生3, 各科成绩:65,19,51,91,1,5, 平均分:38.666667
学号:4, 姓名:学生4, 各科成绩:89,34,25,58,20,51, 平均分:46.166667
学号:5, 姓名:学生5, 各科成绩:38,65,30,7,20,10, 平均分:28.333333
学号:6, 姓名:学生6, 各科成绩:51,18,43,71,97,61, 平均分:56.833333
学号:7, 姓名:学生7, 各科成绩:26,5,57,70,65,0, 平均分:37.166667
学号:8, 姓名:学生8, 各科成绩:75,29,86,93,87,87, 平均分:76.166667
学号:9, 姓名:学生9, 各科成绩:64,75,88,89,100,7, 平均分:70.500000
学号:10, 姓名:学生10, 各科成绩:40,37,38,36,44,24, 平均分:36.500000
学号:11, 姓名:学生11, 各科成绩:46,95,43,89,32,5, 平均分:51.666667
学号:12, 姓名:学生12, 各科成绩:15,58,77,72,95,8, 平均分:54.166667
学号:13, 姓名:学生13, 各科成绩:38,69,37,24,27,90, 平均分:47.500000
学号:14, 姓名:学生14, 各科成绩:77,92,31,30,80,30, 平均分:56.666667
学号:15, 姓名:学生15, 各科成绩:37,86,33,76,21,77, 平均分:55.000000
学号:16, 姓名:学生16, 各科成绩:100,68,37,8,22,69, 平均分:50.666667
学号:17, 姓名:学生17, 各科成绩:81,38,94,57,76,54, 平均分:66.666667
学号:18, 姓名:学生18, 各科成绩:65,14,89,69,4,16, 平均分:42.833333
学号:19, 姓名:学生19, 各科成绩:24,47,7,21,78,53, 平均分:38.333333
学号:20, 姓名:学生20, 各科成绩:17,81,39,50,22,60, 平均分:44.833333
学号:21, 姓名:学生21, 各科成绩:93,89,94,30,97,16, 平均分:69.833333
学号:22, 姓名:学生22, 各科成绩:65,43,20,24,67,62, 平均分:46.833333
学号:23, 姓名:学生23, 各科成绩:78,98,42,67,32,46, 平均分:60.500000
学号:24, 姓名:学生24, 各科成绩:49,57,60,56,44,37, 平均分:50.500000
学号:25, 姓名:学生25, 各科成绩:75,62,17,13,11,40, 平均分:36.333333
学号:26, 姓名:学生26, 各科成绩:40,4,95,100,0,57, 平均分:49.333333
学号:27, 姓名:学生27, 各科成绩:82,31,0,1,56,67, 平均分:39.500000
学号:28, 姓名:学生28, 各科成绩:30,100,64,72,66,63, 平均分:65.833333
学号:29, 姓名:学生29, 各科成绩:18,81,19,44,2,63, 平均分:37.833333
学号:30, 姓名:学生30, 各科成绩:81,78,91,64,91,2, 平均分:67.833333
排序后学生信息:
学号:8, 姓名:学生8, 各科成绩:75,29,86,93,87,87, 平均分:76.166667
学号:9, 姓名:学生9, 各科成绩:64,75,88,89,100,7, 平均分:70.500000
学号:21, 姓名:学生21, 各科成绩:93,89,94,30,97,16, 平均分:69.833333
学号:30, 姓名:学生30, 各科成绩:81,78,91,64,91,2, 平均分:67.833333
学号:17, 姓名:学生17, 各科成绩:81,38,94,57,76,54, 平均分:66.666667
学号:28, 姓名:学生28, 各科成绩:30,100,64,72,66,63, 平均分:65.833333
学号:23, 姓名:学生23, 各科成绩:78,98,42,67,32,46, 平均分:60.500000
学号:6, 姓名:学生6, 各科成绩:51,18,43,71,97,61, 平均分:56.833333
学号:14, 姓名:学生14, 各科成绩:77,92,31,30,80,30, 平均分:56.666667
学号:15, 姓名:学生15, 各科成绩:37,86,33,76,21,77, 平均分:55.000000
学号:12, 姓名:学生12, 各科成绩:15,58,77,72,95,8, 平均分:54.166667
学号:11, 姓名:学生11, 各科成绩:46,95,43,89,32,5, 平均分:51.666667
学号:16, 姓名:学生16, 各科成绩:100,68,37,8,22,69, 平均分:50.666667
学号:24, 姓名:学生24, 各科成绩:49,57,60,56,44,37, 平均分:50.500000
学号:26, 姓名:学生26, 各科成绩:40,4,95,100,0,57, 平均分:49.333333
学号:13, 姓名:学生13, 各科成绩:38,69,37,24,27,90, 平均分:47.500000
学号:22, 姓名:学生22, 各科成绩:65,43,20,24,67,62, 平均分:46.833333
学号:4, 姓名:学生4, 各科成绩:89,34,25,58,20,51, 平均分:46.166667
学号:20, 姓名:学生20, 各科成绩:17,81,39,50,22,60, 平均分:44.833333
学号:2, 姓名:学生2, 各科成绩:8,30,44,94,44,39, 平均分:43.166667
学号:18, 姓名:学生18, 各科成绩:65,14,89,69,4,16, 平均分:42.833333
学号:1, 姓名:学生1, 各科成绩:32,32,54,12,52,56, 平均分:39.666667
学号:27, 姓名:学生27, 各科成绩:82,31,0,1,56,67, 平均分:39.500000
学号:3, 姓名:学生3, 各科成绩:65,19,51,91,1,5, 平均分:38.666667
学号:19, 姓名:学生19, 各科成绩:24,47,7,21,78,53, 平均分:38.333333
学号:29, 姓名:学生29, 各科成绩:18,81,19,44,2,63, 平均分:37.833333
学号:7, 姓名:学生7, 各科成绩:26,5,57,70,65,0, 平均分:37.166667
学号:10, 姓名:学生10, 各科成绩:40,37,38,36,44,24, 平均分:36.500000
学号:25, 姓名:学生25, 各科成绩:75,62,17,13,11,40, 平均分:36.333333
学号:5, 姓名:学生5, 各科成绩:38,65,30,7,20,10, 平均分:28.333333

#include<stdio.h>//头文件 
struct student //学生结构体 
{
  int num; //学号 
  char name[20]; //姓名 
  float score; //成绩 
} ;
int main()//主函数 
{
  //定义结构体变量且赋值 
  struct student stu[5]={{10010,"Tom",78},{10011,"Jon",98.5},{10012,"Lisi",100},{10013,"zhangsan",99},{10014,"wangwu",10}}; 
  struct student t;
  int i,j,k;//定义整型变量 
  printf("成绩由大到小排序:n");//提示语句 
  for(i=0;i<4;i++)//外层for循环 
  {
    k=i;//把i的值赋给k 
    for(j=i+1;j<5;j++)//内层for循环 
    {
      if(stu[j].score>stu[k].score)//挑出分数高的 
      {
        k=j;//把相应的j赋值给k 
      } 
    } 
    t=stu[k]; //把成绩高的放到前面 
    stu[k]=stu[i];
    stu[i]=t;
  }
  for(i=0;i<5;i++)//循环输出5个人的成绩 
  {
    printf("%d,%10s,%6.2f分n",stu[i].num,stu[i].name,stu[i].score);//输出结果 
  } 
  return 0;//主函数返回值为0 
}

比着葫芦画个瓢

ok

可以实现用户自定义输入学号和姓名


#include <stdio.h>
#include <stdlib.h>//随机生成成绩所需要的头文件
#include <time.h> 
#define Max 30
// 定义结构体表示学生信息
typedef struct student
{
    int id;
    char name[32];
    int scores[6];
    float avg;
}student;
// 生成随机成绩函数
void get_scores(student *s)
{
    // 初始化随机数种子
    srand(time(0));
    int i;
    for (i = 0; i < 6; i++)
    {
        s->scores[i] = rand() % 101;
    }
}
// 计算平均分函数
void avg(student *s)
{
    float sum = 0;
    int i;
    for (i = 0; i < 6; i++)
    {
        sum += s->scores[i];
    }
    s->avg = sum / 6;
}
// 按平均分排序函数
void sort_by_avg(student *students)
{
    // 冒泡排序
    int i,j;
    for (i = 0; i < Max - 1; i++)
    {
        for (j = 0; j < Max - 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 i,j;
    for (i = 0; i < Max; i++)
    {
        
        printf("学号:%d 姓名:%s 六科成绩:", students[i].id, students[i].name);
        for(j=0;j<6;j++)
        {
            printf("%d ",students[i].scores[i]);
        }
        printf("平均分:%.2f\n",students[i].avg);
    }
}
int main()
{
    int i,id;
    // 初始化随机数种子
    srand(time(0));
    // 创建学生数组
    struct student students[Max];
    // 初始化学生信息
    for (i = 0; i < Max; i++)
    {
        // 初始化学号和姓名
        printf("请输入第%d位学生的学号:\n",i+1);
        scanf("%d",&students[i].id);
        printf("请输入第%d位学生的姓名:\n",i+1);
        scanf("%s",students[i].name);
        // 随机生成成绩
        get_scores(&students[i]);
        // 计算平均分
        avg(&students[i]);
    }
    // 输出初始学生信息
    printf("初始学生信息:\n");
    print_students(students);
    // 按平均分排序
    sort_by_avg(students);
    // 输出排序后的学生信息
    printf("排序后的学生信息:\n");
    print_students(students);
    return 0;
}

我怀疑你是八一农大的

参考代码
#include <stdio.h>   //标准输出头文件
#include <stdlib.h>//标准库头文件
#include <time.h>//标准时间库函数头文件
#define STU_NUM 30 //最多的学生人数 
// 定义结构体表示学生信息
struct  student  //定义学生结构体
{
    int id;     //学号
    char name[32];  //姓名
    int scores[6];    //6颗成绩
    float avg;      //平均分
};
// 生成随机成绩函数
void generate_scores(struct student *s)
{
    for (int i = 0; i < 6; i++)
    {
        s->scores[i] = rand() % 100;
    }
}
// 计算平均分函数
void calculate_avg(struct student *s)
{
    float sum = 0;
    for (int i = 0; i < 6; i++)
    {
        sum += s->scores[i];
    }
    s->avg = sum / 6;
}
// 按平均分排序函数
void sort_by_avg(struct student *students)
{
    // 冒泡排序
    for (int i = 0; i < STU_NUM - 1; i++)
    {
        for (int j = 0; j < STU_NUM - i - 1; j++)
        {
            if (students[j].avg < students[j + 1].avg)
            {
                struct student temp = students[j];
                students[j] = students[j + 1];
                students[j + 1] = temp;
            }
        }
    }
}
// 输出学生信息函数
void print_students(struct student *students)
{
    for (int i = 0; i < STU_NUM; i++)
    {
        printf("学号:%d 姓名:%s 平均分:%.2f\n", students[i].id, students[i].name, students[i].avg);
    }
}
int main()
{
    // 初始化随机数种子
    srand(time(0));
    // 创建学生数组
    struct student students[STU_NUM];
    // 初始化学生信息
    for (int i = 0; i <STU_NUM; i++)
    {
        // 初始化学号和姓名
        students[i].id = i + 1;
        sprintf(students[i].name, "学生%d", i + 1);
        // 随机生成成绩
        generate_scores(&students[i]);
        // 计算平均分
        calculate_avg(&students[i]);
    }
    // 输出初始学生信息
    printf("初始学生信息:\n");
    print_students(students);
    // 按平均分排序
    sort_by_avg(students);
    // 输出排序后的学生信息
    printf("排序后的学生信息:\n");
    print_students(students);
    return 0;
}

前面的做的不错