提问人:John 提问时间:12/21/2012 最后编辑:CommunityJohn 更新时间:12/27/2012 访问量:119
仅使用 stdio 库时,简单的“for”命令不起作用
A simple "for" command doesnt work using only the stdio library
问:
使用与我的另一个问题中提到的相同的机器和 IDE(代码问题或我的 IDE/comp 被窃听的第三段?)
我尝试运行以下代码:
#include <stdio.h>
#define n 3
int main()
{
int i;
float values[n],sumval,svmean,tmp;
for(i=0;i<n;++i)
{
scanf("%f",&tmp);
values[i]=tmp;
sumval = sumval + values[i];
}
svmean = sumval/n;
printf("%f \n",svmean);
return(0);
}
上面的代码应该运行这个公式
这意味着它必须添加一些值并将结果除以它们的总数。
正如你在上面看到的,我制作了一个具有随机位置的数组,我要求用户为每个位置填写一个值,然后将它们全部相加并除以。n
问题是它不起作用。无论 iput 是什么,它都只输出结果 7。
但是,如果我将 stdlib.h 包含在代码中,它可以正常工作。
所以
- 问题 A:为什么代码不能正常工作,只使用 stdio.h 库?代码的哪个元素需要 stdlib.h 图书馆?
如您所见,该数组似乎具有随机数量的单元格,但实际上我已经将此数字设置为等于 3(使用values[n]
n
#define
)
- 问题 B:有没有办法运行具有相同孔的代码,但让用户定义数组的大小,或者换句话说,让用户输入一个设置 in 值的整数?
values[n]
n
values[n]
答:
首先,你忘了初始化。你希望它出现在开头。sumval
0
如果您希望在运行时决定数组的大小,则必须使用 动态分配它,例如,如下所示:malloc
int n;
float *values,sumval=0,svmean,tmp;
scanf("%d", &n);
values = (float *) malloc (n * sizeof(float));
稍后,您应该通过调用以下命令来释放分配的内存:free
free(values);
评论
sumval
将 sumVal 初始化为 o。因为在第一次迭代中,它会将 garbage+values[i] 添加到 sumValue 中。
#include <stdio.h>
#define n 3
int main()
{
int i;
float values[n],sumval=0,svmean,tmp;
for(i=0;i<n;++i){
scanf("%f",&tmp);
values[i]=tmp;
sumval = sumval + values[i];
}
sumean = sumval/n;
printf("%f \n",svmean);
return(0);
}
问题是你没有初始化。您应该将其设置为 before you loop。sumval
0.0
for
包含/不包含时发生的更改可能是由于某些初始化函数使用堆栈,并在输入函数之前更改了内存中的值,并且碰巧此内存用于变量。stdio.h
sumval
但你不应该依赖这个。
您可以在程序堆中分配一个大小可变的数组,如下所示:
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
//Get the size of the array from input parameter
int n = atoi(argv[1]);
float sumval,svmean,tmp;
//Allocate the array of values
float *values = malloc(sizeof(float)*n);
// Initialize sumval
for(sumval=0,i=0;i<n;++i){
scanf("%f",&tmp);
values[i]=tmp;
sumval = sumval + values[i];
}
svmean = sumval/n;
printf("%f \n",svmean);
//Free it
free( values );
return(0);
}
您还需要将 sumval 初始化为 0。数组大小的参数在启动程序时传递(如果您使用 IDE,则应检查它是如何执行的)
评论
问题 A 答案在您发布的代码中,不需要 stdlib.h。如果您使用动态分配内存的函数(例如 malloc(),则需要此库。
问题B答案:这是一种做你想做的事的方法:
#include <stdio.h>
int main()
{
int i, choice;
float *values,sumval,svmean,tmp;
printf("Please enter the size of the array: ");
scanf("%d", &choice);
values = (float*) malloc(choice*sizeof(float));
for(i=0;i<n;i++){
scanf("%f",&tmp);
values[i]=tmp;
sumval = sumval + values[i];
}
svmean = sumval/n;
printf("%f \n",svmean);
free(values);
return 0;
}
此外,我修改了 for 语句中 i 的增量,使其在运行循环后增加。
评论
试试这个..
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
float sumval = 0;
float svmean = 0;
float tmp = 0;
printf("Enter count : ");
scanf("%d", &n);
for (i = 0; i < n; ++i) {
scanf("%f", &tmp);
sumval = sumval + tmp;
}
svmean = sumval/n;
printf("%f \n",svmean);
return(0);
}
在代码中,values[] 数组不是计算输出所必需的。您是否出于任何原因存储这些值??..
评论