我必须编写一个C程序来读取整数序列(正、负或零),并计算正整数的平均值(仅为)。如果没有正数,则应显示以下语句,后面是新行无正数!
这是我的代码,我只需要帮助如何忽略输入序列中的负数。
#include<stdio.h>
int main(){
int num; //number of elements
int i;
int sequence[100]; //numeber if sequence
int sum = 0.0; //sum if the sequence
float avg; // the average
printf("Enter the number of number in the sequence:\n");
scanf("%d", &num);
while (num < 0 || sequence[num] < 0) {
printf("No positine numbers!\n");
}
printf("Enter the sequence:\n");
for (i=0; i < num; i++) {
scanf("%d", &sequence[i]);
sum += sequence[i];
}
avg = (float) sum / num;
printf("Average is %.2f\n", avg);
return(0);
}发布于 2018-11-13 23:16:05
在此:
while (num < 0 || sequence[num] < 0) {在向数组写入任何值之前,您正在测试sequence[num],而且对num的测试应该是num <= 0,因为如果有零值,也没有正值。您只能在输入所有值后才能确定是否存在正值。
数组sequence是不必要的-您可以简单地将正值累加到sum并丢弃它们,同时保持有效值的计数。这也避免了任何缓冲区溢出问题。
sum是一个int,但是您已经不必要地用double初始化了它。
你的平均计算:
avg = (float) sum / num ;这是不正确的,因为num包含负值--您需要对贡献平均值的有效值进行单独计数(除非意图将所有负值视为零)。
另一个问题是,您尚未验证与格式说明符匹配的输入。
int main()
{
printf("Enter the number of number in the sequence:\n");
int num = 0 ;
int check = scanf( "%d", &num ) ;
int positive_count = 0 ;
int sum = 0 ;
if( check != 0 && num >= 0 )
{
printf( "Enter the sequence:\n" ) ;
int i = 0 ;
while( i < num )
{
int value = 0 ;
check = scanf( "%d", &value ) ;
if( check != 0 )
{
i++ ;
if( value >= 0 )
{
positive_count++ ;
sum += value ;
}
}
}
}
if( positive_count != 0 )
{
float avg = (float) sum / positive_count ;
printf( "Average is %.2f\n", avg ) ;
}
else
{
printf( "No positive numbers!\n" ) ;
}
return 0 ;
}发布于 2018-11-13 22:53:28
如果您想要正数的平均值,您应该使用一个不同于num的变量来进行最终的avg计算。
我会这样做:
int PositiveNumCount = 0;
float avg;
for (i=0; i < num; i++) {
scanf("%d", &sequence[i]);
if(sequence[i] > 0){ sum += sequence[i]; PositiveNumCount++;}
}
avg = (float) sum / PositiveNumCount;发布于 2018-11-13 22:58:52
代码中存在多个问题:
sequence[num]可能指数组结束后的具有未定义行为的条目,或者从未定义的数组中读取,后者也具有未定义的行为。只需完全删除这个测试,因为它是无用的。scanf的返回值,以避免对无效输入进行未定义的行为。以下是一个经过修正和简化的版本:
#include <stdio.h>
int main() {
int num; // max number of values to read
int count = 0; // number of positive values
double sum = 0.0; // sum if the sequence
double avg; // the average
printf("Enter the number of number in the sequence:\n");
if (scanf("%d", &num) == 1 && num > 0) {
printf("Enter the sequence:\n");
while (num-- > 0) {
int temp;
if (scanf("%d", &temp) != 1)
break;
if (temp >= 0) {
sum += temp;
count++;
}
}
avg = sum / count;
printf("Average is %.2f\n", avg);
}
return 0;
}https://stackoverflow.com/questions/53290617
复制相似问题