【发布时间】:2019-09-02 20:12:16
【问题描述】:
我正在尝试计算特定区域中数字的频率,例如 0
我尝试在 for 循环中使用 if 块并尝试递增 main(){int sum=0;}
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int a[5]={0};
int i,n,sum=0;
srand(time(NULL));
for(i=1;i<=50;i++)
{
n=1+rand() % 100;
a[n/20]++;
}
for(i=0;i<5;i++)
{
if(0<=a[i]<=16){
sum++;
}
} printf("%d",sum);
}
我应该在输出上得到不同的数字,但输出总是相同的数字“5”
【问题讨论】:
-
当
n==100,a[n/20]++;是UB,因为它试图在其范围之外访问a[]。 -
请注意
1 + rand() % 100永远不会生成 0。我也不确定问题的“like 0n == 100 的情况)。它是在寻找两个特定的范围:0..15 和 87..100,还是在寻找具有 6 组值的模糊相似的范围——0..15、16..31、32..49、50.. 65、66..83、84..100 还是什么? (问题要求 87 而不是 84 左右,我不确定这应该如何工作,特别是因为代码使用 5 个范围,名义上是 0..19、20..39、40..59、60..79, 80..99.) -
是的 100 不算在范围内,它在 0-100 之间,应该是 5 个特定范围,但这些范围不会定期增加。
-
那么你需要扩展你的问题来解释这5个不规则范围是如何定义的。您可能应该从
n的计算中删除1 +。而n/20将不正确。然后不清楚为什么您只想要有 16 个或更少样本的范围的计数 -a[i] >= 0条件将始终为真,因为数组被初始化为零并且元素永远不会递减。以换行符 ("%d\n") 结束printf()格式字符串通常是个好主意;它有助于确保及时生成输出(并且不会搞砸命令行提示)。 -
通常在调试时添加一些额外的打印是个好主意(比如打印数组初始化,打印任何匹配条件的
a[i])。
标签: c