【问题标题】:Looping array using a counter使用计数器循环数组
【发布时间】:2015-05-05 00:29:07
【问题描述】:

我正在开发这个应该输出 10 个素数的程序。所以我的问题是,一旦数组中存储了 10 个素数,我不知道如何告诉程序停止。我试图做 sizeof(primes)/siseof(int) == 10 ,但它不起作用。 请帮帮我。在此先感谢

 int ar[100],primes[10],j,n,i,var;

 printf("Enter a prime ,\n");

 for(i=0;i<n;i++)
 {
       scanf("%d",&ar[i]);
       if (IsPrime(ar[i])) {
        primes[i] = ar[i];
        if( sizeof(primes) / sizeof(int) == 10) break;

      } else {
        printf("%d is not a prime number\n", ar[i]);
      }
 }
 printf("\narray :\n");

【问题讨论】:

  • 增加一个计数器,并测试它是否达到了10。
  • 我试过 if( sizeof(primes) / sizeof(int) == 10) break;但它不起作用
  • sizeof(primes) / sizeof(int) 是整个primes 数组的大小,而不是您目前填写的数字。
  • primes[i] = ar[i]; 显然这是不对的。考虑i 是否为80。另外,sizeof 是容器的大小,而不是其内容。当内容改变时它不会改变。所以检查sizeof 也是错误的。
  • 为什么你的程序最后打印的是ar[]的内容,而不是primes[]的内容?

标签: c


【解决方案1】:

我将根据您的意图提出一些更符合您的意图的内容:

#define MAX_PRIMES 10
int main(int argc, char * argv[])
{
    int inval;
    int primes[MAX_PRIMES];
    int count = 0;

    printf("Enter a prime number,\n");

    while (count < MAX_PRIMES)
    {
        scanf("%d", &inval);
        if (IsPrime(inval))
        {
            primes[count] = inval;
            count++;
        }
        else
        {
            printf("%d is not a prime number\n", inval);
        }
    }
    printf("\nThe elements of the array are:\n");

    for (int i = 0; i < MAX_PRIMES; i++)
    {
        printf(" %d", primes[i]);
    }
}

int ar[100] 被替换为 int inval,因为似乎不需要存储输入值。

for(i=0;i&lt;n;i++) 替换为 while (count &lt; MAX_PRIMES),因为无论是否找到 10 个素数,之前的版本都会停在 n 处。

printf(" %d",ar[i]) 被替换为 printf(" %d", primes[i]),因为声明的期望输出是 10 个素数,而不是输入数组。

可能是一两个愚蠢的错误,因为我没有运行它。

【讨论】:

    【解决方案2】:

    使用计数器变量。使用它作为primes 数组的索引,否则如果用户输入超过 10 个数字来尝试,您将在数组边界之外写入。

    int ar[100],primes[10],j,n,i,var;
    int primesFound = 0;
    printf("Enter a prime number,\n");
    
    for(i=0;i<n;i++)
        {
            scanf("%d",&ar[i]);
            if (IsPrime(ar[i])) {
                primes[primesFound] = ar[i];
                primesFound++;
                if( primesFound == 10) break;
    
            } else {
                printf("%d is not a prime number\n", ar[i]);
            }
        }
    printf("\nThe elements of the array are:\n");
    
    for(i=0;i<n;i++)
        {
    
            printf(" %d",ar[i]);
    
        }
    

    【讨论】:

    • 这行得通,让我可以存储 10 个素数 :),但在获得 10 个素数后,程序就会崩溃:(
    • 你需要使用primes[primesFound],而不是primes[i],因为i可以比9更高。
    • 请注意,您的程序会打印用户输入的所有数字,而不仅仅是质数,因为您打印的是ar,而不是primes
    • 此外,您将打印 arn 条目,即使填充数组的循环在您达到 10 个素数时停止。所以剩下的都是随机垃圾。
    • 即使我将其更改为启动程序,该程序仍然很糟糕。我现在上传我的整个代码,所以你可以运行它,我的朋友,你会看到它崩溃了。请帮我找出造成压碎的原因
    【解决方案3】:

    只需添加一个计数器

    int ar[100],primes[10],j,n,i,var;
    
    printf("Enter a prime number,\n");
    
    int counter = 0; // here you declare a counter
    for(i=0;i<n;i++)
    {
        scanf("%d",&ar[i]);
        if (IsPrime(ar[i])) {
            counter++ // here you increase your counter
            primes[i] = ar[i];
            if (counter == 10) break;
    
        } else {
            printf("%d is not a prime number\n", ar[i]);
        }
    }
    printf("\nThe elements of the array are:\n");
    
    for(i=0;i<n;i++)
    {
    
        printf(" %d",ar[i]);
    
    }
    

    现在,为什么 if( sizeof(primes) / sizeof(int) == 10) break; 不起作用?因为你的primes 是一个数组,它是静态声明的,所以它的大小总是一个常数,等于10 * sizeof(int)

    【讨论】:

    • 这行得通,让我可以存储 10 个素数 :),但在获得 10 个素数后,程序就会崩溃:(
    • 程序崩溃,因为当 i 大于 9 时您不能使用 primes[i] ...阅读我和 Barmar cmets 的问题!
    • “primes”的计数器应该不同于“ar”的计数器
    猜你喜欢
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2019-06-06
    • 1970-01-01
    相关资源
    最近更新 更多