按位输出&成绩排序一&最高分和最低分

这篇博客介绍了如何处理编程竞赛中的成绩排序问题,包括按成绩从高到低排序学生的姓名和分数,以及找出最高分和最低分的学生。博主分享了使用结构体数组实现排序的方法,并展示了遇到的问题及解决方案。此外,还涉及到了按位输出整数的难点,特别是如何处理负数和个位数的英文表示。
摘要由CSDN通过智能技术生成

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;
}

题目链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值