我一直在努力找到解决一些问题的解决方案,无可否认的是,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;
这是我使用的一个替代版本的主体,可能更多误导使用内存分配到缓冲区。但是,这个版本的段错由于我只能假设我接收和存储输入的原因;问题依然存在。
答案 0 :(得分:0)
您正在以一种难以处理输入文件中的变体的方式解决问题。虽然您可以通过查看scanf
返回来限制此范围,但这不是一个完整的解决方案。而不是使用scanf
读取离散浮点数,而是使用fgets
读取整行。正如您所描述的输入文件,每行有一个浮点值(或者没有或垃圾)。这提供了使用strtof
转换每一行的完美方案。检查strtof
的返回,你要么在线上有浮动,要么你没有,让你轻松处理空白或垃圾线。
此外,要计算least
,greatest
和mean
,没有理由在程序的持续时间内存储每个值。阅读每个value
,将值添加到total
,增加count
,然后测试当前value
是新的least
还是greatest
和继续。无需存储它。
以下是从stdin
读取浮点数并将其处理为所需值的简短示例:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
#define MAXL 200
int main()
{
float value = 0.0;
float least = (float)(INT_MAX);
float greatest = (float)(-INT_MAX - 1);
float mean = 0.0;
float total = 0.0;
size_t count = 0;
char buffer[MAXL] = {0};
while (fgets ( buffer, MAXL - 1, stdin) != NULL)
{
char *ep = buffer;
value = strtof (buffer, &ep);
if (errno == 0 && (ep != buffer && value != 0.0))
{
least = value < least ? value : least;
greatest = value > greatest ? value : greatest;
total += value;
count++;
}
}
mean = total/count;
printf("%.2f ", least);
printf("%.2f ", greatest);
printf("%.2f\n", mean);
return 0;
}
<强>输入强>
$ cat dat/float.dat
100.3
dogfood
300.1
The quick brown fox jumped over the lazy dog.
12.0
400.4
<强>输出强>
$ ./bin/read_float_lines < dat/float.dat
12.00 400.40 203.20