0.复习差不多的基础知识
- typedef 定义结构体。本题需使用结构体数组。
- 冒泡排序。本题需要进行两次冒泡在,score为主要排序关键字,no为次要关键字。
- if-if、if-else if的执行顺序理解与选择。本题为嵌套的主次判断,故选择if-if。
- ==是判断是否相等,容易出错。
1.正文
1.0题干分析
这题拿起来简单,但是做起来却发现有很多出错点。
Stage 1:
确定使用(1)结构体数组(2)BubbleSort
写完查看测试实例,发现原来score前的no也得一起交换,只是输出按照分数升序排列。
故Stage 2:
key:怎么解决排序后no变换的问题->直接整个数组单元交换
这就是本题使用结构体数组的意义:(1)方便输出 (2)保证按照score排序,但是no不变。
Stage 3:
给出的测试有类似于:
3
8 30
4 40
2 40
希望输出的是:
2 40
4 40
8 30
明白了题目要求的是主要排序为score、次要排序为no。很自然会联想到应该使用两次冒泡排序,且二者的关系是先后次序,所以用嵌套判断的if- if语句,不是if else if的分支判断语句。
完整代码
#include <stdio.h>
#define Nmax 100
typedef struct{
int no;
int score;
}Stu;
//1.结构体数组
//2.BubbleSort
//3.发现no也要一起换,只是输出按照分数升序排列
//key:怎么解决排序后no变换的问题->直接整个数组单元交换
//这就是使用数组的意义(1)方便输出 (2)保证按照score排序,但是no不变
//题目要求主要排序为score、次要排序为no
//是先后次序,所以用if if语句,不是if else if
void Bubblesort(Stu pstu[],int N){
int i,j;
Stu tmp;
//进行N-1次冒泡
for(i=0;i<N-1;i++){
//进行N-1-i次交换
//题目要求升序
for(j=1;j<=N-1-i;j++){
if(pstu[j-1].score>=pstu[j].score){
//先主要排序
tmp=pstu[j];
pstu[j]=pstu[j-1];
pstu[j-1]=tmp;
//再次要排序,注意==才是相等
if(pstu[j-1].score==pstu[j].score&&pstu[j-1].no>pstu[j].no){
tmp=pstu[j];
pstu[j]=pstu[j-1];
pstu[j-1]=tmp;
}
}
}
}
}
int main() {
int N,i;
Stu students[Nmax];
//1. input
scanf("%d",&N);
for(i=0;i<N;i++){
scanf("%d %d",&students[i].no,&students[i].score);
}
//2.Bubblesort
Bubblesort(students,N);
//3.printf
for(i=0;i<N;i++){
printf("%d %d\n",students[i].no,students[i].score);
}
return 0;
}