给出n个学生的考试成绩表,每条信息由姓名与分数组成,利用C语言设计一个算法: (1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次。 (2)按名次列出每个学生的姓名与分数。
时间: 2024-02-29 22:51:55 浏览: 110
数据姐公综合课设统计成绩.docx
好的,这是一个比较典型的排序算法问题,我们可以使用冒泡排序或者快速排序来解决。这里我以快速排序为例进行讲解。
首先,我们需要定义一个结构体来存储每个学生的信息,包括姓名和分数。代码如下:
```c
typedef struct {
char name[20];
int score;
} Student;
```
然后,我们需要输入每个学生的信息,并将其存储到一个数组中。这里我使用了动态内存分配来实现,代码如下:
```c
int n; // 学生数目
scanf("%d", &n);
Student *students = (Student *)malloc(n * sizeof(Student)); // 分配内存
for (int i = 0; i < n; i++) {
scanf("%s %d", students[i].name, &students[i].score);
}
```
接下来,我们可以使用快速排序算法来按照分数高低的顺序对学生信息进行排序。代码如下:
```c
void quickSort(Student *students, int left, int right) {
if (left >= right) return;
int i = left, j = right;
int pivot = students[(left + right) / 2].score;
while (i <= j) {
while (students[i].score > pivot) i++;
while (students[j].score < pivot) j--;
if (i <= j) {
Student temp = students[i];
students[i] = students[j];
students[j] = temp;
i++;
j--;
}
}
quickSort(students, left, j);
quickSort(students, i, right);
}
quickSort(students, 0, n - 1);
```
最后,我们可以按照题目要求输出每个学生的名次和姓名以及分数。代码如下:
```c
int rank = 1;
for (int i = 0; i < n; i++) {
if (i > 0 && students[i].score != students[i - 1].score) rank++;
printf("%s %d\n", students[i].name, rank);
}
for (int i = 0; i < n; i++) {
printf("%d %s %d\n", i + 1, students[i].name, students[i].score);
}
```
完整代码如下:
阅读全文