为啥我的作业有逻辑错误? [关闭]
Posted
技术标签:
【中文标题】为啥我的作业有逻辑错误? [关闭]【英文标题】:Why am I having a logical error with my homework? [closed]为什么我的作业有逻辑错误? [关闭] 【发布时间】:2010-09-30 19:45:11 【问题描述】:我是 IT 专业的大三学生。我正面临程序输出的问题。 该程序的想法是我应该使用函数来读取 10 个元素的数组,然后获取元素的平均值,然后获取最大值和最小值。我有正确的最大值和最小值,但平均值显示奇怪的东西。请检查代码并告诉我应该做什么或以某种方式帮助我。
输出是(请注意,它请求的是 11 个数字而不是 10,如果我更改循环参数让它只需要 10 个,那么它会显示奇怪的东西
enter the group of integers numbers
1
2
3
4
5
6
7
8
9
0
9
1 2 3 4 5 6 7 8 9 0the avg is 3.500000
9
1Press any key to continue . . .
// func-sortarray.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define size 10
void readarray(int []);
void average(int []);
void printArray(int []);
void max(int []);
void min(int []);
int _tmain(int argc, _TCHAR* argv[])
int sarray[size];
readarray(sarray);
printArray(sarray);
average(sarray);
max(sarray);
min(sarray);
return 0;
void readarray(int a[])
printf("enter the group of integers numbers\n");
for (int i=0; i<=size-1 ;i++)
scanf("%d\n",&a[i]);
void average(int a[])
int i;
double avg;
double total = 0;
for (i=0; i <= size-1; i++)
total = total + a[i];
avg = total /size-1;
printf("the avg is %f\n",avg);
void printArray(int a[])
int j;
for (j = 0; j <= size - 1; j++)
printf( "%2d", a[ j ]);
void max(int a[])
int ma =a[0];
for (int j=0;j<size-1;j++)
if (ma<a[j])
ma=a[j];
printf("%d",ma);
void min(int a[])
int mi =a[0];
for (int j=0;j<size-1;j++)
if (mi>a[j])
mi=a[j];
printf("\n%d",mi);
提前感谢
【问题讨论】:
请注意,不要在任何地方都执行 另外,不要害怕在不同的函数中重复使用像 i 这样的变量——在函数内部声明的变量只对该函数“有效”。这使您不必考虑一堆不同的变量名称:) 【参考方案1】:由于 scanf() 字符串中的“\n”,它正在跳过第一个输入数字。要修复它,请从 scanf 字符串中删除 '\n',如下所示:
scanf("%d", &a[i]);
【讨论】:
非常感谢这是第一次做这个但我学到了很多【参考方案2】:从零开始计数和加法前乘法规则存在一些问题。好吧,让我们开始吧。最常见的是,当您从零开始计数时,您会这样做:
for(i=0; i < count; i++)
/* ... */;
如果你从 1 开始数,你可以这样做:
for(i=1; i <= count; i++)
/* ... */
如果你把它们混合起来,你会得到相同的结果,但它会让你自己和其他阅读代码的人感到困惑:
for(i=0; i <= count-1; i++) /* same, but better don't do this */
/* ... */;
在计算平均值的代码中,您有两个错误。首先,由于数学原因,您应该使用括号:
avg = total / (size-1); /* there is still one bug */
第二,你有 size
元素。所以你必须除以size
,而不是size-1
:
avg = total / size; /* right ! */
【讨论】:
我使用您的代码仍然采用 11 个数字而不是 10,当我在 (int i=1; i这行可能是问题所在:
avg = total /size-1;
您可能想改为:
avg = total / size;
另外,您的 max()
和 min()
函数有一个这样的循环:
for (int j=0;j<size-1;j++)
这可能比你想要的少一个数字。
上述类型的错误通常称为“栅栏错误”。该名称与以下问题有关:如果您要建造一个 100 m 长的栅栏,并且您希望每 1 m 有一个栅栏,您需要多少栅栏?答案不是 100,而是 101。这类错误的另一个名称是“off by one error”。
【讨论】:
它仍然占用了 11 个数字,我如何让它只占用 10 个数字我试图更改读取功能,但后来我得到 -8003030303 somthin,如果你可以的话,请帮忙尝试一下以上是关于为啥我的作业有逻辑错误? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
为啥在尝试控制台记录我的 $.each 时出现错误 [关闭]
为啥我从未关闭过任何 ResultSet is closed 错误
为啥我的 axios 删除函数会出现 CORS 错误? [关闭]