我是不是使用数组作为输入?我犯了啥逻辑错误?
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 在创建表中不支持关键字“外键引用”还是我犯了错误?