定义结构体struct stu,编写成绩排名函数:void sort(struct stu *ps,int n),对结构体数组按成绩排名。 程序功能为读入整数n(n<100),再读入n个学生的学号(整型)和成绩(实数)。按样例输出排名。
时间: 2023-05-31 15:19:28 浏览: 555
### 回答1:
定义结构体struct stu,包含学号和成绩两个成员变量。编写成绩排名函数void sort(struct stu *ps,int n),对结构体数组按成绩从高到低排名。程序功能为读入整数n(n<100),再读入n个学生的学号(整型)和成绩(实数),并按照成绩从高到低的顺序输出学生的学号和成绩。
### 回答2:
题目要求我们定义结构体struct stu,在该结构体中记录学生的学号和成绩,并编写一个成绩排名函数void sort(struct stu *ps,int n),实现对结构体数组按成绩进行排名。本题是一个比较典型的结构体数组的应用题。
struct stu结构体的定义如下:
```c++
struct stu
{
int sno; // 学号
double score; // 成绩
};
```
可以看出,该结构体记录了学生的学号和成绩。
成绩排名函数主要实现的功能是对结构体数组按成绩进行排名。这里我们采用冒泡排序的方式。大家都知道,冒泡排序的原理是,比较数组中相邻的元素,如果它们的顺序错误就交换它们的位置。通过一次遍历,可以将最大的元素移到数组的末尾。然后再重复上述操作,直到整个数组都有序为止。
按照冒泡排序的原理,我们可以编写出如下的成绩排名函数:
```c++
void sort(struct stu *ps, int n)
{
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n - i - 1; ++j)
{
if(ps[j].score < ps[j+1].score)
{
// 交换两个元素的位置
struct stu temp = ps[j];
ps[j] = ps[j+1];
ps[j+1] = temp;
}
}
}
}
```
我们从头到尾遍历数组,对于数组中的每一个元素和它后面的每一个元素进行比较,如果前一个元素的成绩小于后一个元素的成绩,就将这两个元素的位置进行交换。经过一轮遍历后,可以将数组中最大的元素移到数组的末尾。然后再重复上述操作,直到整个数组都有序为止。
由于函数中使用了指针,因此在调用sort函数的时候,需要将结构体数组的地址作为参数传递进去。例如,如果我们定义了一个结构体数组stus,那么我们的调用函数的代码可以是这样的:
```c++
sort(stus, n);
```
这样就可以对数组stus中的所有元素按成绩进行排名了。
最后,根据题意,我们需要按照一定的格式输出排名结果。具体代码实现如下:
```c++
#include <iostream>
using namespace std;
struct stu
{
int sno; // 学号
double score; // 成绩
};
void sort(struct stu *ps, int n)
{
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < n - i - 1; ++j)
{
if(ps[j].score < ps[j+1].score)
{
// 交换两个元素的位置
struct stu temp = ps[j];
ps[j] = ps[j+1];
ps[j+1] = temp;
}
}
}
}
int main()
{
int n;
cin >> n; // 读入整数n
struct stu stus[100]; // 定义结构体数组
for(int i = 0; i < n; ++i)
{
cin >> stus[i].sno >> stus[i].score; // 读入学号和成绩
}
sort(stus, n); // 排序
int i = 1;
for(struct stu *p = stus; i <= n; ++i, ++p)
{
cout << p->sno << " " << p->score << " " << i << endl; // 输出排名结果
}
return 0;
}
```
在主函数中,我们先读入整数n,再根据n的大小定义一个结构体数组stus来存储学号和成绩。然后,我们依次读入这些元素,最后调用sort函数按成绩进行排名。接着,我们依次输出排名结果,输出格式要求每个元素占据一行,格式为:学号 成绩 排名。
本题重点在于结构体的定义以及成绩排名函数的编写。只要理解了这两个点,做出来还是比较简单的。
### 回答3:
题目要求定义结构体struct stu,并编写成绩排名函数void sort(struct stu *ps,int n),对结构体数组按成绩排名。程序功能为读入整数n(n<100),再读入n个学生的学号(整型)和成绩(实数),最后输出按成绩排名的结果。
首先,需要定义struct stu结构体,表示学生的信息,包括学号和成绩。定义方法如下:
struct stu{
int id; //学号,整型
float score; //成绩,实数
};
接下来,需要编写成绩排名函数void sort(struct stu *ps,int n),对结构体数组按成绩排名。排名的方法可以使用冒泡排序或选择排序,以下是使用冒泡排序的实现方法:
void sort(struct stu *ps, int n){
struct stu temp; //定义临时变量,用于交换结构体元素
int i, j;
for(i = 0; i < n; i++){
for(j = 0; j < n-i-1; j++){
if(ps[j].score < ps[j+1].score){ //如果前一个元素的成绩小于后一个元素的成绩,交换两个元素
temp = ps[j];
ps[j] = ps[j+1];
ps[j+1] = temp;
}
}
}
}
最后,需要读入整数n,再读入n个学生的学号和成绩,调用排序函数sort(struct stu *ps,int n)对学生信息按成绩排名后,按样例输出排名结果。以下是完整程序:
#include <stdio.h>
struct stu{
int id; //学号,整型
float score; //成绩,实数
};
void sort(struct stu *ps, int n){
struct stu temp; //定义临时变量,用于交换结构体元素
int i, j;
for(i = 0; i < n; i++){
for(j = 0; j < n-i-1; j++){
if(ps[j].score < ps[j+1].score){ //如果前一个元素的成绩小于后一个元素的成绩,交换两个元素
temp = ps[j];
ps[j] = ps[j+1];
ps[j+1] = temp;
}
}
}
}
int main(){
int n, i;
struct stu s[100];
scanf("%d", &n);
for(i=0; i<n; i++){
scanf("%d%f", &s[i].id, &s[i].score);
}
sort(s, n);
printf("学号\t成绩\t排名\n");
for(i=0; i<n; i++){
printf("%d\t%.2f\t%d\n", s[i].id, s[i].score, i+1);
}
return 0;
}
输入样例:
5
101 90.5
102 75.5
103 80.0
104 85.0
105 95.5
输出样例:
学号 成绩 排名
105 95.50 1
101 90.50 2
104 85.00 3
103 80.00 4
102 75.50 5
本程序使用冒泡排序进行排名,时间复杂度为O(n^2),如果使用其他排序算法,如快速排序,则时间复杂度可以优化到O(nlogn)。
阅读全文