这道题不用结构体可以用指针完成吗

P5740 【深基7.例9】最厉害的学生

a13901280570 @ 2023-12-06 23:22:35

目前还不会结构体,又不想按题解里面直接开数组做,想用一个自定义函数,然后不停套用这个函数,但是能找到最大的,没办法保留数据。初学C语言,还很混乱,有大佬能解答一下吗


by a13901280570 @ 2023-12-06 23:56:02

#include<stdio.h>
//输入函数
void f(char ch[9],int *a,int *b,int *c){
    int l;
    for(int i=0;i<8;i++){
       ch[i]=getchar();
        if (ch[i] == ' '){
            l=i;
            break;
        }
    }
    ch[l]='\0';
    scanf("%d %d %d",a,b,c);
}
int main(){
    int a,b,c;
    char ch[9];
    int n;
    int max=0;
    int a1,a2,a3;
    char ch1[9];
    scanf("%d",&n);
    //计算最大
    for (int i=0;i<n;i++){
        f(ch,&a,&b,&c);
        int score=a+b+c;
        if(score>max){
            max=score;
            a1=a;
            a2=b;
            a3=c;
            for (int j=0;j<9;j++){
                ch1[j]=ch[j];
                if(ch[j]=='\0')
                break;
            }
        }
    }
    //输出
    for(int i=1;i<9&&ch1[i]!='\0';i++){
        printf("%c",ch1[i]);
    }
    printf(" ");
    printf("%d %d %d",a1,a2,a3);
    return 0;
}

样例对,自己试了几个也对,但是提交都错了


by immortal_water @ 2023-12-07 06:59:58

边输入边处理即可数组函数指针都不需要


by immortal_water @ 2023-12-07 07:04:06

定义几个记录最大学生数据的变量,然后一边读入一边判断新读入的学生是否比当前记录的最大学生更大,是就更换,否或者一样大都不变


by Bingxiu @ 2023-12-07 07:08:51

@a13901280570 有可能换行符又出锅了

  1. 建议在 ch[i]=getchar(); 后面加上 if(!i) while(ch[i]=='\r'||ch[i]=='\n'||ch[i]==' ') ch[i]=getchar(); 避免换行符
  2. 字符串可以用 scanf("%s",ch);printf("%s ",ch);

by Bingxiu @ 2023-12-07 07:10:20

@immortal_water 他就是这么做的,不过自定义函数用来读入了而已

然鹅读入写错了(


by immortal_water @ 2023-12-07 08:47:51

@Bingxiu 啊我以为他用的递归没细看(


by a13901280570 @ 2023-12-12 18:23:27

@Bingxiu 用scanf函数就好了,但是getchar这个函数输入,用您说的改完以后,输入就有错误了,不太清楚哪里错了。 (除了第一个九百多个全零分的测试过不去,用scanf输入可以过后面九个测试点)


by a13901280570 @ 2023-12-12 19:36:57

@a13901280570 把max=0改成max=-1就可以避免都是0这个问题了


|