我是不是使用数组作为输入?我犯了啥逻辑错误?

Posted

技术标签:

【中文标题】我是不是使用数组作为输入?我犯了啥逻辑错误?【英文标题】:Do I use an array for the inputs? What logical mistake am I making?我是否使用数组作为输入?我犯了什么逻辑错误? 【发布时间】:2022-01-16 15:48:57 【问题描述】:

编写一个程序,一个一个地从用户那里获取 10 个输入,并将该输入传递给一个名为 IsPrime() 的函数,然后该函数检查该数字是否为素数,并返回 1(表示素数)或 0(表示合成的)。在main() 中,基于返回值,输入值存储在一个大小为 10 个元素的数组中,从开始到结束(对于素数)和从结束到开始(对于 合成的)。该程序应如下运行:

Enter Value: 19
Enter Value: 22
Enter Value: 51
Enter Value: 11
Enter Value: 28
Enter Value: 36
Enter Value: 29
Enter Value: 16
Enter Value: 23
Enter Value: 12

按某种顺序排列的元素……。 19 51 11 29 23 12 16 36 28 22

#include<stdio.h>
void IsPrime(int x,int *flag);
int main()

    int x1, x2, x3, x4, x5, x6, x7, x8, x9, x10;
    int p[10];
    int flag=1;
    int prime[10];
    int i;
    printf("Enter Value: ");
    scanf("%d",&x1);
    IsPrime(x1,&flag);
    p[0]=flag;
    prime[0]=x1;
    printf("Enter Value: ");
    scanf("%d",&x2);
    IsPrime(x2,&flag);
    p[1]=flag;
    prime[1]=x2;
    printf("Enter Value: ");
    scanf("%d",&x3);
    IsPrime(x3,&flag);
    p[2]=flag;
    prime[2]=x3;
    printf("Enter Value: ");
    scanf("%d",&x4);
    IsPrime(x4,&flag);
    p[3]=flag;
    prime[3]=x4;
    printf("Enter Value: ");
    scanf("%d",&x5);
    IsPrime(x5,&flag);
    p[4]=flag;
    prime[4]=x5;
    printf("Enter Value: ");
    scanf("%d",&x6);
    IsPrime(x6,&flag);
    p[5]=flag;
    prime[5]=x6;
    printf("Enter Value: ");
    scanf("%d",&x7);
    IsPrime(x7,&flag);
    p[6]=flag;
    prime[6]=x7;
    printf("Enter Value: ");
    scanf("%d",&x8);
    IsPrime(x8,&flag);
    p[7]=flag;
    prime[7]=x8;
    printf("Enter Value: ");
    scanf("%d",&x9);
    IsPrime(x9,&flag);
    p[8]=flag;
    prime[8]=x9;
    printf("Enter Value: ");
    scanf("%d",&x10);
    IsPrime(x10,&flag);
    p[9]=flag;
    prime[9]=x10;
    for(i=0;i<10;i++)
    
        if(p[i]==1)
        
            prime[i]=prime[i];
        
        else if(p[i]==0)
        
            prime[9-i]=prime[i];
        
    
    printf("Elements in some order:\n");
    for(i=0;i<10;i++)
    
        printf("%d  ",prime[i]);
    
    return 0;


void IsPrime(int x, int *flag)

    int i;
    for(i=2;i<x;i++)
    
        if(x%i==0)
        
            *flag=0;
            break;
        
        else
            *flag=1;
    

【问题讨论】:

建议您先返回并更改代码以使用循环,而不是将本质上相同的代码重复 10 次。 为了帮助您解决上述问题:如果您仅将它们用作传递存储,那么定义 10 个版本的“x”是没有意义的。您可以重复使用单个 x 就可以了。 好的,我试试,谢谢。对于问题的从头到尾(素数)和从头到尾(复合)部分,我该怎么做?我很确定我在这里做错了 只存储两个索引:int next_prime = 0, next_composite = 9; -- 然后,当您读取一个值时,调用 IsPrime 或者:p[next_prime++] = x;p[next_composite--] = x;保证填充数组的所有元素,然后您可以按顺序打印出来。整个程序几乎可以用几行代码编写。 这行得通,耶!非常感谢您的帮助。 【参考方案1】:

有几种方法可以改进您的代码。例如,1) 在读取用户输入并检查素数时使用循环;2) 将数字放在结果数组中的最终位置,而不是之后对数组进行排序。

但你问:

我犯了什么逻辑错误?

问题在于你的排序,即这段代码

for(i=0;i<10;i++)

    if(p[i]==1)
    
        prime[i]=prime[i];
    
    else if(p[i]==0)
    
        prime[9-i]=prime[i];
    

假设你有这些价值:

p[] = 0, 1, ..., 0
prime[] = 4, 3, ..., 8

在第一个循环中(即i等于0),你执行:

prime[9-i]=prime[i]; or prime[9]=prime[0];

这部分正确,但您也覆盖了索引 9 处的值,即您的数组现在看起来像:

prime[] = 4, 3, ..., 4
                      ^
                      4 is correct but you have lost the value 8

在第二个循环中(即i等于1),你执行:

prime[i]=prime[i]; or prime[1]=prime[1];

因为 3 是第一个素数,所以你真的想要prime[0]=prime[1];

不要将结果以连续的方式放入数组中(然后进行排序),您应该使用两个额外的索引变量将它们直接放在它们的最终位置。喜欢:

int prime_index = 0;
int composite_index = 9;

printf("Enter Value: ");
scanf("%d",&x1);
IsPrime(x1,&flag);
if (flag)

    // prime
    prime[prime_index]=x1;
    ++prime_index;

else

    // composite
    prime[composite_index]=x1;
    --composite_index;

【讨论】:

哦,是的,我现在明白了。非常感谢您的帮助

以上是关于我是不是使用数组作为输入?我犯了啥逻辑错误?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server Compact 在创建表中不支持关键字“外键引用”还是我犯了错误?

无法在Codeigniter页面上显示Morris.JS图表,使用JSON数据作为图表的输入

Java 绘图框架:令人耳目一新?

使用字符串时的c ++初学者分段错误

Laravel 页面显示“此页面不工作”而不是错误

如何撤消 phpmyadmin 中的查询? [复制]