我必须编写一个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);
}
答案 0 :(得分:1)
如果您想获得正数的平均值,则应使用不同于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;
答案 1 :(得分:1)
您的代码中存在多个问题:
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;
}
答案 2 :(得分:1)
这里:
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 ;
}
答案 3 :(得分:-1)
printf("Enter the sequence:\n");
for (i=0; i < num; i++) {
scanf("%d", &sequence[i]);
if(sequeunce[i] > 0){ //This if statement is what your looking for, but there are several other problems in your code. GL!
sum += sequence[i];
}
}
OP要求上面的if语句:“这是我的代码,我只需要帮助即可忽略输入序列中的负数。”
他发布的代码有很多问题,包括在初始化变量之前使用变量以及无限循环路径。这是对他的问题的最短答案。