c语言pat基础题改错0814L1005

img

img


#include<stdio.h>
int main(){
    //扫描
    int N;
    scanf("%ld\n",&N);
    int cer[N],testSeat[N],examSeat[N];
    for(int i=0;i<N;i++){
        scanf("%ld %d %d\n",&cer[i],&testSeat[i],&examSeat[i]);
    }
    int M;
    scanf("%d\n",&M);
    int testSeatNum[M];
    for(int i=0;i<N;i++){
        scanf("%d ",testSeatNum[i]);
    }
    for(int i=0;i<M;i++){
        for(int j=0;j<N;j++){
            if(testSeatNum[i]==testSeat[j]){
                printf("%ld %d\n",cer[j],examSeat[j]);
            }
        }
    }
}

我的代码出现问题,本题希望可以得到大家的指导,谢谢你的帮助!

供参考:

#include <stdio.h>
#include <string.h>
char s[1005][18];    // 准考证号
int  a[1005];        // 考试座位号
int main() 
{
    int i, n, ts, es;
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%s%d%d", s[0], &ts, &es);
        strcpy(s[ts], s[0]);
        a[ts] = es;
    }
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d", &ts);
        printf(i ? "\n%s %d" : "%s %d", s[ts], a[ts]);
    }
    return 0;
}


#include<stdio.h>
int main(){
    //扫描
    int N;
    scanf("%d\n",&N);
    long long int cer[N];
    int testSeat[N],examSeat[N];
    for(int i=0;i<N;i++){
        scanf("%lld %d %d\n",&cer[i],&testSeat[i],&examSeat[i]);
    }
    int M;
    scanf("%d\n",&M);
    int testSeatNum[M];
    for(int i=0;i<M;i++){
        scanf("%d ",&testSeatNum[i]);
    }
    for(int i=0;i<M;i++){
        for(int j=0;j<N;j++){
            if(testSeatNum[i]==testSeat[j]){
                printf("%lld %d\n",cer[j],examSeat[j]);
            }
        }
    }
    return 0;
}

img

【以下回答由 GPT 生成】

解决方案:

代码中存在一些问题,让我们来一步步解决它们:

  1. 问题一:数组长度不能是变量。C语言中,数组的长度必须是一个常量。

解决方案:使用动态内存分配来创建数组。

#include <stdio.h>
#include <stdlib.h>

int main(){
    // 扫描
    int N;
    scanf("%ld\n",&N);

    int *cer = (int *)malloc(N * sizeof(int));
    int *testSeat = (int *)malloc(N * sizeof(int));
    int *examSeat = (int *)malloc(N * sizeof(int));

    for(int i=0;i<N;i++){
        scanf("%ld %d %d\n",&cer[i],&testSeat[i],&examSeat[i]);
    }

    // ...

    // 在最后记得释放内存
    free(cer);
    free(testSeat);
    free(examSeat);
    return 0;
}
  1. 问题二:第二个循环中的变量 i 应该从 0 开始而不是从 N 开始。

解决方案:将for(int i=0;i<N;i++)改为for(int i=0;i<M;i++)

#include<stdio.h>
#include<stdlib.h>

int main(){
    // ...

    int M;
    scanf("%d\n",&M);

    int *testSeatNum = (int *)malloc(M * sizeof(int));

    for(int i=0;i<M;i++){
        scanf("%d ",&testSeatNum[i]);
    }

    // ...

    free(testSeatNum);
    return 0;
}
  1. 问题三:在第二个嵌套循环中,应该在找到匹配的 testSeat 后跳出内循环。

解决方案:添加一个标记变量,并在找到匹配的 testSeat 后将标记置为 1,然后使用break语句跳出内循环。

#include<stdio.h>
#include<stdlib.h>

int main(){
    // ...

    for(int i=0;i<M;i++){
        int found = 0;
        for(int j=0;j<N;j++){
            if(testSeatNum[i]==testSeat[j]){
                printf("%ld %d\n",cer[j],examSeat[j]);
                found = 1;
                break;
            }
        }
        if(!found) {
            printf("Not Found\n");
        }
    }

    // ...
    return 0;
}

以上是对你的代码进行改正和优化的解决方案,希望对你有所帮助。如果还有其他问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^