【发布时间】:2015-04-22 02:03:35
【问题描述】:
我一直在努力寻找一些问题的解决方案,这些问题无疑是 C 编程课程的基本作业。其中最简单的我会在这里寻求帮助;我与它斗争的时间之长表明我不理解某些概念。
任务让我读取浮点值直到 EOF,用换行符分隔;我的程序是获取这些值并记录最大值和最小值,然后计算平均值并以特定格式打印出来。
#include <stdio.h>
#include <math.h>
#include <ctype.h>
int main()
{
float buffer[200];
float least, greatest = 0, mean = 0;
float total = 0, count = 0;
int x=0, y = 0;
while (buffer[x] != EOF)
{
y = scanf("%f\n", &buffer[x]);
if (y == 1)
{
if (isspace(buffer[x])==0)
{
if (x == 0) {least = buffer[x];}
if(buffer[x]>greatest) {greatest = buffer[x];}
if(buffer[x]<least) {least = buffer[x];}
total += buffer[x];
count++;
x++;
}
}
}
mean = total/count;
printf("%.2f ", least);
printf("%.2f ", greatest);
printf("%.2f\n", mean);
return 0;
}
我的代码能够处理格式正确的输入,但有一个转折点:标记方案将测试我的程序对空白行的反应,这些空白行将被忽略。仅当每个输入都遵循指定的 %f\n 格式时,我的代码才能正常工作,并且如果有空行(或者我可能完全错了,而其他地方根本有问题),则打印不正确的输出。
我尝试了一些适用于其他分配的解决方案,例如字符串输入中的分隔符。这是我能想到的最好的方法,它确实有效;同样,只有在有空行时才会失败,并且我不知道有空行时到底出了什么问题。
感谢您阅读这些文字墙!这是我的第一篇文章,我不确定我是否粗鲁、过于自私或没有提供足够的关于我的案件的信息。
float* buffer;
float least, greatest = 0, mean = 0;
float total = 0, count = 0;
int x=0, y = 0;
buffer = (float*)malloc(200 * sizeof(float));
y = scanf("%f\n", &buffer[x]);
if (y == 0)
{
return 1;
}
while (buffer[x] != EOF)
{
y = scanf("%f\n", buffer[x]);
if (y == 0)
{
x++;
continue;
}
if (isspace(buffer[x])==0)
{
if (x == 0) {least = buffer[x];}
if(buffer[x]>greatest) {greatest = buffer[x];}
if(buffer[x]<least) {least = buffer[x];}
total += buffer[x];
count++;
}
x++;
}
mean = total/count;
printf("%.2f ", least);
printf("%.2f ", greatest);
printf("%.2f\n", mean);
return 0;
这是一个替代版本的主体,我已经使用了更多可能更误导的使用内存分配给缓冲区。然而,这个版本的段错误我只能假设是我如何接收和存储输入;问题仍然存在。
【问题讨论】:
-
while (buffer[x] != EOF)。对于初学者来说,这看起来是错误的。buffer在您第一次点击 while 循环时被统一化(甚至对于一些后续迭代)。不知道你想在那里做什么。 -
你说得对,这是我最接近成功的代码版本;我想我已经修复了那个,但我确保至少将某些东西扫描到缓冲区中,以便循环运行。我已确保将 x++ 改进移出,因此如果出现问题,它不会在该 while 条件下无限循环。感谢您的额外关注!
-
请发布一个包含所有内容的版本。谈论当前发布的版本并不好,因为它没有超过一垒。