为什么逻辑没错但没输出啊,应该怎么改呢

#include <stdio.h>void line(int* a,int n) //编写排序函数按照降序排列 { for(int k=0;k+1<n;k++) { for(int i=0;i<n-1;i++) { if(*(a+i)<*(a+i+1)) { int temp=*(a+i); *(a+i)=*(a+i+1); *(a+i+1)=temp; } } }}int main(){ int apple,tao; scanf("%d %d",&apple,&tao); int num1[apple],num2[tao]; for(int i=0;i<apple;i++) { scanf("%d",&num1[i]); //赋值 }; for(int k=0;k<tao;k++) //赋值 { scanf("%d",&num2[k]); }; int* head1,*head2; head1=&num1[0]; head2=&num2[0]; line(head1,apple); //排序 line(head2,tao); int i=0; int k=0; int volatile result; result=0; for(i=0;i<apple&&k<tao;i++) //比较 { if(num1[i]>num2[k]&&num2[k]!=0) { result++; k++; printf("%d\n",result); } else { k++; } } return 0;}

不是没有输出,而是你输入的数据没有满足输出的条件。
num1的apple和num2的tao中数据都从大到小排序后,如果从索引0开始比较num1和num2中的值,前者大于后者时就会有数据输出。
程序重新编辑为:

#include <stdio.h>
void line(int* a,int n) //编写排序函数按照降序排列
{
    for(int k=0;k+1<n;k++) {
        for(int i=0;i<n-1;i++) {
            if(*(a+i)<*(a+i+1)) {
                int temp=*(a+i);
                *(a+i)=*(a+i+1);
                *(a+i+1)=temp;
            }
        }
    }
}
int main(){
    int apple,tao;
    scanf("%d %d",&apple,&tao);
    int num1[apple],num2[tao];
    for(int i=0;i<apple;i++) {
        scanf("%d",&num1[i]); //赋值
    };
    for(int k=0;k<tao;k++) //赋值
    {
        scanf("%d",&num2[k]);
    };
    int* head1,*head2;
    head1=&num1[0];
    head2=&num2[0];
    line(head1,apple); //排序
    line(head2,tao);
    int i=0;
    int k=0;
    int volatile result;
    result=0;
    for(i=0;i<apple&&k<tao;i++,k++)//比较
    {
        if(num1[i]>num2[k]&&num2[k]!=0) {
            result++;
            printf("%d\n",result);
        }            
    }
    return 0;
}

输出结果为

img

多敲几下输入,应该是输入写错了吧

引用chatgpt内容作答:
你的代码逻辑基本上是正确的,但是你在比较部分的循环中有一个小问题,导致输出不符合预期。问题出在了你每次比较后都会立即输出 result,而实际上你应该在所有的比较都完成后再输出最终的 result 值。

下面是修改后的代码:

#include <stdio.h>

void line(int* a, int n) {
    for (int k = 0; k + 1 < n; k++) {
        for (int i = 0; i < n - 1; i++) {
            if (*(a + i) < *(a + i + 1)) {
                int temp = *(a + i);
                *(a + i) = *(a + i + 1);
                *(a + i + 1) = temp;
            }
        }
    }
}

int main() {
    int apple, tao;
    scanf("%d %d", &apple, &tao);

    int num1[apple], num2[tao];

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

    for (int k = 0; k < tao; k++) {
        scanf("%d", &num2[k]);
    }

    int* head1 = &num1[0];
    int* head2 = &num2[0];

    line(head1, apple);
    line(head2, tao);

    int i = 0;
    int k = 0;
    int result = 0;

    while (i < apple && k < tao) {
        if (num1[i] > num2[k] && num2[k] != 0) {
            result++;
            i++; // Move to the next apple
        }
        k++; // Move to the next tao regardless of the comparison result
    }

    printf("%d\n", result);

    return 0;
}

我做了以下几个更改:

1、将输出 result 的位置从比较循环内移动到了比较循环外,确保所有的比较都完成后再输出结果。
2、在比较循环中,我只在满足条件时才将 i 增加,这样能确保每个 num1 中的元素只和 num2 中的一个元素进行一次比较。
3、在比较循环中,无论是否满足条件,都将 k 增加,以确保 num2 中的元素被逐个遍历。
这样修改后,你应该能够得到正确的输出结果。

确保您输入的 apple 和 tao 的值是正确的,不会导致数组越界或其他问题

效果如图 , 如有帮助给个采纳谢谢

img

修改后代码

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

void line(int* a, int n) // 编写排序函数按照降序排列
{
    for (int k = 0; k < n-1; k++) {
        for (int i = 0; i < n-1; i++) {
            if (*(a + i) < *(a + i + 1)) {
                int temp = *(a + i);
                *(a + i) = *(a + i + 1);
                *(a + i + 1) = temp;
            }
        }
    }
}

int main() {
    int apple, tao;
    scanf("%d %d", &apple, &tao);
    getchar(); // 消耗输入缓冲区的回车符

    int *num1 = (int*)malloc(apple * sizeof(int));
    int *num2 = (int*)malloc(tao * sizeof(int));

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

    for (int k = 0; k < tao; k++) {
        scanf("%d", &num2[k]);
    }

    int* head1 = &num1[0];
    int* head2 = &num2[0];

    line(head1, apple); // 排序
    line(head2, tao);

    int i = 0;
    int k = 0;
    int result = 0;

    for (i = 0; i < apple && k < tao; i++) {
        if (num1[i] > num2[k] && num2[k] != 0) {
            result++;
            k++;
            printf("%d\n", result);
        } else {
            k++;
        }
    }

    free(num1);
    free(num2);

    return 0;
}

参考gpt:
结合自己分析给你如下建议:
您的scanf函数没有加换行符\n,导致输入不完整。您可以在每个scanf函数的格式字符串中加上\n,以便在输入每个数据后按回车键结束输入。
您的printf函数没有加换行符\n,导致输出不换行。您可以在每个printf函数的格式字符串中加上\n,以便在输出每个数据后换行显示。
您的程序逻辑有误,导致输出结果为0或者没有进入循环。您可以检查您的比较条件是否正确,以及您的循环变量是否递增或递减。
为了帮助您改进您的程序,我为您提供了一个修改后的代码,如下:




#include <stdio.h> void line(int* a,int n) //编写排序函数按照降序排列 { for(int k=0;k+1<n;k++) { for(int i=0;i<n-1;i++) { if((a+i)<(a+i+1)) { int temp=*(a+i); (a+i)=(a+i+1); (a+i+1)=temp; } } } } int main(){ int apple,tao; scanf(“%d %d\n”,&apple,&tao); //加入换行符 int num1[apple],num2[tao]; for(int i=0;i<apple;i++) { scanf(“%d\n”,&num1[i]); //加入换行符 }; for(int k=0;k<tao;k++) //赋值 { scanf(“%d\n”,&num2[k]); //加入换行符 }; int head1,*head2; head1=&num1[0]; head2=&num2[0]; line(head1,apple); //排序 line(head2,tao); int i=0; int k=0; int volatile result; result=0; while(i<apple&&k<tao) //改为while循环 { if(num1[i]>num2[k]&&num2[k]!=0) { result++; k++; printf(“%d\n”,result); //加入换行符 } else { k++; } i++; //增加i的递增 } return 0; }

img


代码

#include <stdio.h>

void line(int* a, int n) {
  
  for (int k = 0; k + 1 < n; k++) {
    
    for (int i = 0; i < n - 1; i++) {
      
      if (*(a + i) < *(a + i + 1)) {
        
        int temp = *(a + i);
        *(a + i) = *(a + i + 1);
        *(a + i + 1) = temp;
        
      }
      
    }
    
  }
  
}

int main() {

  int apple, tao;
  
  scanf("%d %d", &apple, &tao);
  
  int num1[apple], num2[tao];
  
  for (int i = 0; i < apple; i++) {
  
    scanf("%d", &num1[i]);
    
  }

  for (int k = 0; k < tao; k++) {
  
    scanf("%d", &num2[k]);
    
  }

  int* head1, *head2;
  
  head1 = &num1[0];
  
  head2 = &num2[0];
  
  line(head1, apple);
  
  line(head2, tao);

  int i = 0;
  
  int k = 0;
  
  int result;
  
  result = 0;

  for (i = 0; i < apple && k < tao; i++) {
  
    if (num1[i] > num2[k] && num2[k] != 0) {
    
      result++;
      
      k++;
      
    } else {
    
      k++;
      
    }

  }

  printf("%d\n", result);
  
  return 0;

}

#include<vector>
#include <stdio.h>
void line(int* a, int n) //编写排序函数按照降序排列 
{
    for (int k = 0; k + 1 < n; k++)
    {
        for (int i = 0; i < n - 1; i++)
        {
            if (*(a + i) < *(a + i + 1))
            {
                int temp = *(a + i); 
                *(a + i) = *(a + i + 1); 
                *(a + i + 1) = temp;
            }
        }
    }
}

int main()
{
    int apple, tao; 
    scanf("%d %d", &apple, &tao);
    //int num1[apple], num2[tao];
    vector<int>num1(apple);
    vector<int>num2(tao);
    for (int i = 0; i < apple; i++) {
        scanf("%d", &num1[i]); //赋值 
    }
    for (int k = 0; k < tao; k++) //赋值 
    {
        scanf("%d", &num2[k]);
    }
    int* head1, * head2;
    head1 = &num1[0];
    head2 = &num2[0];
    line(head1, apple); //排序 
    line(head2, tao);
    int i = 0;
    int k = 0;
    int result = 0;
    for (i = 0; i < apple && k < tao; i++) //比较 
    {
        if (num1[i] > num2[k] && num2[k] != 0)
        {
            result++; 
            k++; 
            printf("%d\n", result);
        }
        else 
        { 
            k++; 
        }
    }
    return 0;
}

ChatGPT: 您的代码逻辑基本上是正确的,但是在循环中输出的地方可能存在问题。目前您的代码在每次比较时就会输出一次 result 的值,这可能不是您期望的输出方式。

如果您希望在所有比较结束后才输出 result 的值,您可以将 printf 语句放在循环之外,如下所示:

int main() {
    // ...(省略部分代码)

    for (i = 0; i < apple && k < tao; i++) {
        if (num1[i] > num2[k] && num2[k] != 0) {
            result++;
            k++;
        } else {
            k++;
        }
    }

    printf("%d\n", result); // 在循环结束后输出 result 的值
    return 0;
}

这样,当所有比较完成后,才会输出 result 的最终值。如果您希望在每次比较时都输出当前的 result 值,那么您的 printf 语句放在 if 条件语句内部也是可以的。

另外,我注意到您在 line 函数中使用了冒泡排序算法来进行排序,这是一个有效但不太高效的排序算法。如果您对排序算法有兴趣,可以学习其他更快速的排序算法,如快速排序或归并排序。

需求代码部分最好用代码块发,清晰方便

【以下回答由 GPT 生成】

对于这个问题,我注意到程序中有几个问题需要修复:

  1. 数组的大小应该在编译时确定,不能使用变量来定义数组的大小。所以,我们需要将数组num1和num2的大小改为常量。

  2. 在排序函数line()中,外层的for循环条件k+1<n应该改为k<n-1,否则会执行多余的比较和交换。

  3. 在主函数main()中,比较两个数组元素的代码应该改为单个循环而不是嵌套的两个循环。同时,变量k应该在num2数组中自增,而不是条件判断语句中自增。

下面是修改后的代码:

#include <stdio.h>

void line(int* a, int n) {
    for(int k=0; k<n-1; k++) {
        for(int i=0; i<n-1; i++) {
            if(*(a+i) < *(a+i+1)) {
                int temp = *(a+i);
                *(a+i) = *(a+i+1);
                *(a+i+1) = temp;
            }
        }
    }
}

int main(){
    const int apple = 10;
    const int tao = 10;
    int num1[apple], num2[tao];
    for(int i=0; i<apple; i++) {
        scanf("%d", &num1[i]);
    }
    for(int k=0; k<tao; k++) {
        scanf("%d", &num2[k]);
    }
    int* head1 = &num1[0];
    int* head2 = &num2[0];
    line(head1, apple);
    line(head2, tao);
    int i=0;
    int k=0;
    int volatile result;
    result = 0;
    while(i < apple && k < tao) {
        if(num1[i] > num2[k]) {
            result++;
            k++;
            printf("%d\n", result);
        }
        else {
            i++;
        }
    }
    return 0;
}


【相关推荐】



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