c - 如何使我的代码在一行上输入数字,并在其间用空格分隔,并输出非重复数字的平均值?
问题描述
我的代码:
#include <stdio.h>
int main()
{
int count = 0;
int size = 0;
float num[size];
int i = 0;
float avg = 0;
float sum = 0;
while (scanf("%f",&num) != EOF)
{
if ((num[i] != num[i+1]) && (num[i] != num[i-1]))
{
sum = sum + num[i];
size++;
}
}
avg = sum/size;
printf("%0.2f", avg);
}
我的输入和输出:
//input
2
2
1
^Z
//output
1.67
正确的输入输出:
2 2 1
^Z
1.50
我的问题:
1)如何让我的代码提示在一行上输入数字,每个输入之间用空格隔开?现在,我的代码在输入数字后总是开始一个新行。
2)如何修复我的代码,使其仅计算非重复数字的平均值?(注意:我的代码运行速度必须不低于 O(nlogn)。)所以我不能使用嵌套循环,因为它的运行时间为 O(n^2)。
解决方案
您的代码中有一些问题:
- 的使用
num
- 测试
scanf
- 已使用号码的测试。
的使用num
当你写
int size = 0;
float num[size];
您不分配内存来存储数字。
和
while (scanf("%f",&num) != EOF)
不正确,因为您没有将读取的值存储到浮点数中:gcc
警告:
warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘float (*)[(sizetype)(size)]’ [-Wformat=]
一个更正确的方法是写:
float num;
...
while (scanf("%f",&num) != EOF)
测试scanf
您测试scanf
不返回EOF
,但是如果您不提供数字转换失败怎么办?
测试用户给出的正确方法是检查您是否有想要的转换次数:
while (scanf("%f",&num) == 1)
已使用号码的测试。
写作
if ((num[i] != num[i+1]) && (num[i] != num[i-1]))
您将最后一个数字 ( i
) 与过去和未来的数字 (?!) 进行对比
你有一个更简单的方法:有一个数组来存储已经得到的数字。这意味着已经获得了测试数字的功能。
警告它的当前实现is_number_in_array
非常幼稚,并使您的程序在 O(n) 中运行。您可以轻松地将其替换为 O(log n) 的一些二分搜索
因此,您的代码的更正版本可能是:
#include <stdio.h>
int is_number_in_array(float num, float *array, int size)
{
for (int i =0; i < size; ++i)
{
if (num == array[i])
return 1;
}
return 0;
}
#define MAX_NUMBER 50
int main(void)
{
/* number of number read */
int size = 0;
/* number already read */
float array[MAX_NUMBER] = {};
/* currently read number */
float num = 0;
float avg = 0;
float sum = 0;
/* get next number, stop when a conversion failed */
while (scanf("%f",&num) == 1)
{
/* test if number is already in array */
if (! is_number_in_array(num, array, size )) {
/* not in array: add it */
array[size ++] = num;
sum += num;
}
/* Add some test here to check that size is not as big as MAX_NUMBER */
}
avg = sum/size;
printf("%0.2f", avg);
return 0;
}
推荐阅读
- swift - Swift - stopAnimating() - 只能在主线程中使用
- ios - 如何快速实施实时条纹苹果支付?Stripe 测试密钥工作正常但无法使用,我该如何解决?
- node.js - React js - 反应中的网络套接字链接代理问题
- javascript - 如何使用JavaScript从数组中删除字符后的数字和字母
- c++ - 使用循环展开加速 do-while 循环
- python - 根据规则操作列中的值
- node.js - 无法在 create-react-app 中运行 npm start
- flutter - SqfliteDatabaseException (DatabaseException(unrecognized token: "498a" (code 1): , while compile: DELETE FROM Products WHERE
- asp.net-core - Identity.IsAuthenticated 在 HTTPGET 控制器中的 SignInAsync() 之后返回 false
- powershell - 如何在 Powershell 别名中运行连续命令?