【问题标题】: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;保证填充数组的所有元素,然后您可以按顺序打印出来。整个程序几乎可以用几行代码编写。
  • 这行得通,耶!非常感谢您的帮助。

标签: c logic


【解决方案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;
}

【讨论】:

  • 哦,是的,我现在明白了。非常感谢您的帮助
猜你喜欢
  • 2023-03-03
  • 2021-08-10
  • 2017-10-12
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 2022-10-13
相关资源
最近更新 更多