6.7
成绩排序
题目描述
已知某个班有n(1<=n<=100)个学生,输入每行为学生姓名(最多20个字符)和其c语言成绩(0~100),请按照成绩从高到低排序后输出。若有相同的,不能改变其顺序。
Input
Output
Sample Input
Zhangsan 80
Lisi 95
Zhouyi 69
Wangwu 73
Zhaoliu 69
Sample Output
Lisi 95
Zhangsan 80
Wangwu 73
Zhouyi 69
Zhaoliu 69
该题主要运用了结构体数组来做,结构体可以直接赋值,所以可以不用像我写的那样一个一个交换,直接赋值就好了(俺事后才知道)
第一次知道还可以这样写:while(scanf("%s%d",stu[i++].name,&stu[i].score)!=EOF);
@#@
!注意第一个输入写了i++,后面就不能再写i++了,否则结果是输入一次,i加了2
中间的排序也改了很久,老是会有一些小问题#…#
#include<stdio.h>
#include<string.h>
int main()
{
struct student{
char name[20];
int score;
}stu[105];
int i=0,j;
while(scanf("%s%d",stu[i++].name,&stu[i].score)!=EOF);
int t;
t=i;
for(i=0;i<t-1;i++){
for(j=0;j<t-1-i;j++){
if(j+1>=t-1) continue;
if(stu[j].score<stu[j+1].score){
char str[20];
strcpy(str,stu[j+1].name);
strcpy(stu[j+1].name,stu[j].name);
strcpy(stu[j].name,str);
int temp = stu[j+1].score;
stu[j+1].score=stu[j].score;
stu[j].score=temp;
}
}
}
for(i=0;i<t-1;i++){
printf("%s %d\n",stu[i].name,stu[i].score);
}
// for(i=0;i<t-1;i++){
//printf("%-20s %3d\n",stu[i].name,stu[i].score);
// }
//较规范地输出,负数为左对齐,正数为右对齐!
return 0;
}
6.8
最高分和最低分
题目描述
已知某个班有n(1<=n<=100)个学生,输入每行为学生姓名(最多20个字符)和其c语言成绩(0~100),请找出最高分和最低分输出,若最高分或最低分多于1个的,按先后顺序输出。
input
Output
Sample Input
Zhangsan 80
Lisi 95
Zhouyi 69
Wangwu 73
Zhaoliu 69
Sample Output
Max is 95,name have Lisi
Min is 69,name have Zhouyi,Zhaoliu
核心思路和成绩排序,就是后面还要找出最大和最小成绩。
#include<stdio.h>
#include<string.h>
int main()
{
struct student{
char name[20];
int score;
}stu[105];
int i=0,j;
while(scanf("%s%d",stu[i++].name,&stu[i].score)!=EOF);
int t;
t=i;
for(i=0;i<t-1;i++){
for(j=0;j<t-1-i;j++){
if(j+1>=t-1) continue;
if(stu[j].score<stu[j+1].score){
char str[20];
strcpy(str,stu[j+1].name);
strcpy(stu[j+1].name,stu[j].name);
strcpy(stu[j].name,str);
int temp = stu[j+1].score;
stu[j+1].score=stu[j].score;
stu[j].score=temp;
}
}
}
// for(i=0;i<t-1;i++){
// printf("%-20s%3d\n",stu[i].name,stu[i].score);
// }
int cnt1=0,cnt2=0;
int max=stu[0].score,min=stu[t-2].score;
for(i=0;i<t-1;i++){
if(max==stu[i].score) cnt1++;
if(min==stu[i].score) cnt2++;
}
if(cnt1==1)
printf("Max is %d,name have %s\n",max,stu[0].name);
else{
printf("Max is %d,name have ",max);
for(i=0;cnt1>0;cnt1--,i++){
printf("%s,",stu[i].name);
}
printf("\n");
}
if(cnt2==1)
printf("Min is %d,name have %s\n",min,stu[t-2].name);
else{
printf("Min is %d,name have ",min);
for(i=t-1-cnt2;cnt2>0;cnt2--,i++){
if(cnt2==1){
printf("%s",stu[i].name);
break;
}
printf("%s,",stu[i].name);
}
printf("\n");
}
return 0;
}
按位输出
题目描述
输入文件中每行是一个整数,要求按位输出。
Input
Output
Sample Input
-13
0
12345
Sample Output
-13 have two numbers,are 3,1
0 has one number,is 0
12345 have five numbers,are 5,4,3,2,1
这道题最麻烦的是输出,number的个数全是英文,所以我直接将对应的数字的英文用数组存了起来,还要注意是 number 是is还是are
这道题存到32位,就可以解决了#.#
#include<stdio.h>
#include<string.h>
char *letter[]={"zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty","twenty-one","twenty-two",
"twenty-three","twenty-four","twenty-five","twenty-six","twenty-seven","twenty-eight","twenty-nine","thirty","thirty","thirty-one","thirty-two"};
void change(char str[],int a[]){
int i;
a[0]=strlen(str);
for(i=1;i<=a[0];i++){
a[i]=str[a[0]-i]-'0';
}
if(str[0]=='-') a[0]--;
}
int main()
{
int num[100];
char str[100];
while(scanf("%s",str)!=EOF){
change(str,num);
int i;
if(num[0]==1)
printf("%s has %s number,is ",str,letter[num[0]]);
else
printf("%s have %s numbers,are ",str,letter[num[0]]);
for(i=1;i<=num[0];i++){
if(i==num[0]){
printf("%d\n",num[i]);
}
else
printf("%d,",num[i]);
}
}
return 0;
}