題目描述
用一維數(shù)組存儲(chǔ)學(xué)號(hào)和成績(jī),然后,按成績(jī)排序輸出。
輸入描述:
輸入第一行包括一個(gè)整數(shù)N(1<=N<=100),代表學(xué)生的個(gè)數(shù)。
接下來(lái)的N行每行包括兩個(gè)整數(shù)p和q,分別代表每個(gè)學(xué)生的學(xué)號(hào)和成績(jī)。
輸出描述:
按照學(xué)生的成績(jī)從小到大進(jìn)行排序,并將排序后的學(xué)生信息打印出來(lái)。
如果學(xué)生的成績(jī)相同,則按照學(xué)號(hào)的大小進(jìn)行從小到大排序。
示例1
輸入
3
1 90
2 87
3 92
輸出
2 87
1 90
3 92
解法
#include<stdio.h>
#include<malloc.h>
void swap(int* a, int* b){
int temp = 0;
temp = *a;
*a = *b;
*b = temp;
}
int main(){
int n = 0; //人數(shù)
while(scanf("%d", &n) != EOF){
int *number = (int *) malloc (sizeof(int) * n); //學(xué)號(hào)
int *grade = (int *) malloc (sizeof(int) * n); //成績(jī)
for(int i = 0; i < n; i++){
scanf("%d", &number[i]);
scanf("%d", &grade[i]);
}
for(int i = 0; i < n - 1; i++)
for(int j = 0; j < n - 1 - i; j++){ //冒泡排序
if(grade[j] > grade[j + 1]){
swap(&grade[j], &grade[j + 1]);
swap(&number[j], &number[j + 1]);
}
if(grade[j] == grade[j + 1])
if(number[j] > number[j + 1]){
swap(&grade[j], &grade[j + 1]);
swap(&number[j], &number[j + 1]);
}
}
for(int i = 0; i < n; i++)
printf("%d %d\n", number[i], grade[i]);
free(number);
free(grade);
}
return 0;
}
在之前的代碼里面,我都是這樣動(dòng)態(tài)分配數(shù)組
while(scanf("%d", &n) != EOF){
int number[n]; //學(xué)號(hào)
int grade[n]; //成績(jī)
經(jīng)提醒,C / C++ 語(yǔ)言是不允許這樣操作的,但不知為何無(wú)論是本地編譯器還是OJ都能通過(guò),希望了解的小伙伴們解釋一下,現(xiàn)在的程序我都改用規(guī)范寫(xiě)法了,也就是本題中這樣
while(scanf("%d", &n) != EOF){
int *number = (int *) malloc (sizeof(int) * n); //學(xué)號(hào)
int *grade = (int *) malloc (sizeof(int) * n); //成績(jī)