#include <stdio.h> #define N 40 int Average(int score[], int n); int ReadScore(int score[]); int GetAboveAver(int score[], int n); int main(void) { int score[N],m,n; n = ReadScore(score); printf("Total students are %d\n", n); m = GetAboveAver(score, n); if (m != -1) printf("Students of above average is %d\n", m); return 0; } int Average(int score[], int n) { int i, sum = 0; for (i=0; i<n; i++) { sum += score[i]; } return n>0 ? sum/n:-1; } int ReadScore(int score[]) { int i=-1; do{ i++; printf("Input score:"); scanf("%d", &score[i]); }while (score[i] >= 0); return i; } int GetAboveAver(int score[], int n) { int i, count = 0, aver; aver = Average(score, n); if (aver == -1) return -1; printf("Average score is %d\n", aver); for (i=0; i<n; i++) { if (score[i] >= aver) count++; } return count; }
时间: 2024-04-29 09:19:07 浏览: 60
这段代码是一个 C 语言程序,主要实现了读取学生成绩,计算平均分数,以及统计高于平均分的学生人数。函数包括:
- `int Average(int score[], int n)`:计算学生的平均分数,其中 `score[]` 表示学生成绩数组,`n` 表示学生人数;
- `int ReadScore(int score[])`:读取学生成绩,将其存储到 `score[]` 数组中;
- `int GetAboveAver(int score[], int n)`:统计高于平均分的学生人数,其中 `score[]` 表示学生成绩数组,`n` 表示学生人数。
在 `main()` 函数中,首先调用 `ReadScore()` 函数读取学生成绩,并将其存储到 `score[]` 数组中。然后调用 `GetAboveAver()` 函数统计高于平均分的学生人数,并输出结果。
需要注意的是,在 `ReadScore()` 函数中,输入的学生成绩必须为非负数,否则会结束输入。如果输入了负数,函数会返回当前已经输入的学生人数。在 `Average()` 函数中,如果学生人数为 0,函数会返回 -1,表示无法计算平均分数。在 `GetAboveAver()` 函数中,如果无法计算平均分数,函数也会返回 -1。
相关问题
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STUDENTS 100 // 最多支持100个学生 struct date{ int year; int month; int day; }; typedef struct { int num; // 学号 char name[20]; // 姓名 char sex[5]; // 性别 struct date birthday; // 出生日期 int score[3]; // 三门功课成绩 int total; // 总分 double average; // 平均分 } student; student students[MAX_STUDENTS]; // 学生数组 int num_students = 0; // 学生数量
这段代码定义了一个名为student的结构体,其中包含了学生的学号、姓名、性别、出生日期、三门功课成绩、总分和平均分等信息。同时还定义了一个名为date的结构体,用来表示学生的出生日期。
另外还定义了一个名为students的数组来存储学生信息,数组的长度为MAX_STUDENTS,即最多支持100个学生。还定义了一个变量num_students用来记录当前学生数量。
这段代码的作用是定义了一些数据结构和变量,用来存储和处理学生信息。具体的操作需要在其他代码中实现。
#include <stdio.h> #include <stdlib.h> /*其它说明*/ #include <string.h> /*字符串函数*/ #include <time.h> #define LEN sizeof(STUDENT) typedef struct stu /*定义结构体数组用于缓存数据*/ { char num[6]; //学号 char name[5]; //姓名 int score[3]; //三科成绩 int sum; //总成绩 float average; //平均成绩 int order; //排序 int order1; //排名 struct stu *next; } STUDENT; STUDENT *Init();/*初始化函数*/ int Menu_Select();/*菜单选择函数*/ STUDENT *Create(); /*输入函数*/ void Print(STUDENT *head); /* 显示全部记录函数*/ void Search(STUDENT *head);/*查找记录函数*/ STUDENT *Modify(STUDENT *head);/*修改记录函数*/ STUDENT *Delete(STUDENT *head);/*删除记录函数*/ STUDENT *Sort(STUDENT *head);/*排序函数*/ STUDENT *Insert(STUDENT *head, STUDENT *New); /*插入记录函数*//*TODO: 排序排名 功能描述: 按照降序给链表排序,排序存在order,排名存在order1 参数说明:head-STUDENT型指针 返回值说明:STUDENT型指针 */ STUDENT *Sort(STUDENT *head) { return (head); }补全函数
这个函数似乎没有实现排序排名的功能,我来帮你补充一下:
```
STUDENT *Sort(STUDENT *head)
{
STUDENT *p, *q, *tail;
int len = 0, i, j;
// 获取链表长度
for (p = head; p != NULL; p = p->next) {
len++;
}
// 外层循环控制比较轮数
for (i = 0; i < len - 1; i++) {
tail = head;
p = head->next;
q = p;
// 内层循环进行两两比较
for (j = 0; j < len - i - 1; j++) {
if (p->sum > q->sum) {
// 交换节点数据
if (p == head->next) {
head->next = q;
p->next = q->next;
q->next = p;
tail = q;
q = p->next;
} else {
tail->next = q;
p->next = q->next;
q->next = p;
tail = q;
q = p->next;
}
} else {
tail = p;
p = q;
q = p->next;
}
}
}
// 排名
p = head;
for (i = 1; i <= len; i++) {
p->order = i;
p = p->next;
}
// 排序完成,返回头节点
return head;
}
```
这个函数的实现思路是使用冒泡排序对链表进行排序,同时进行排名。排序的依据是每个节点的 `sum` 字段,也就是总成绩。排完序之后,遍历链表,给每个节点的 `order1` 字段赋上相应的排名即可。
阅读全文