PTA计算平均值( 一波三折)

现在为若干组整数分别计算平均值。

已知这些整数的绝对值都小于100,每组整数的数量不少于1个,不大于20个。

输入格式:首先输入K(不小于2,不大于20)。接下来每一行输入一组数据(至少有一组数据),每组至少有一个数据,在有多个数据时,两个数据之间有1到3个空格。最后一行输入100,标志输入的结束。

输出格式:对于每一组数据,输出其前K个数据的均值,如果该组数据个数少于K时,则输出该组所有数据的均值。输出的均值只输出整数部分,直接忽略小数部分。

样例输入:

3

10 30 20 40

-10 17 10

10 9

100

样例输出:

20

5

9

话说这次的题目已经明示考察的是数据的输入以及输出的知识,当然和以往我们所写的代码题没有很大的区别,就是数据的输入最后通过100来判断输入的结束;在一开始看到这题的时候,我觉得是可以不用通过字符串就能够完成,因此就没有考虑用字符串解题,通过一个整形数组的形式尝试了一遍,以平时做的C题目习惯来看输入输出应该是都已经成功了的,可是提交的时候不知道为什么却出现段错误的结果:

听说挺多同学是这里出现了段错误,到现在还是不知道为什么会出现这样的结果,如果哪位大哥看到这问题正好知道是怎么回事的话希望可以教教我哈,跪谢跪谢!

经过多次的尝试之后,我就询问了助教(不知道是为什么助教在聊了几下,了解了我的问题之后就不回我了hhh,尴尬)后面挺多同学在群里讨论这个题目的那些坑点,就再测试了一下我的程序,发现如果输入遗传数据之后最后加一个空格的话,就不会有输出:

这应该是一个bug,但是对于它所提示的段错误我还是不能理解,下面是我最开始的通过整形数组实现的代码。

#include<iostream>

using namespace std;

int main()
{
int number, len,aver,over=0;
int num[999],i,sum,n,j;
cin >> number;
for (i = 0; i < 999; i++)
{
cin >> num[0];
if (num[0] != 100)
{
j = 1;
sum = num[0];
aver = sum;
n = 1;
while (getchar() != '\n')
{
cin >> num[j];
sum += num[j];
n++;
aver = sum / n;
j++;
if (n == number)
{
printf("%d", aver);
}
// else
// over = 0;
}
if (n < number)
printf("%d", aver);
}
else if (num[0] == 100)
{
break;
}
}
return 0;
}

不知道其他人有没有一种这样的感觉就是在一开始如果用一种方法实现了一个问题(但是不知道为什么就是没过),后面再要通过另一种方法重新实现的时候,会感觉特别别扭,并且做的时候思路会受到很大影响,感觉很艰难。但是没办法啊,咱总还是得做吧,无奈之下我只能是重新尝试用字符串的方法实现,最开始我认为通过字符串的方法处理数字之间的空格可以通过判断两个数字之间有几个空格来实现(因为题目说每两个数字之间是1~3个空格),但是想了想,似乎这种方法可行度不是很高,毕竟整形数组那样处理到头来都还没过,于是我就搜了有关于用字符串转换数字其中数字之间的空格的处理方法,十分凑巧,百度的时候居然意外的看到了咱们的许郁杨大哥的博客!!!(尴尬的是最开始我还不知道这是他的博客hhh)

下面是这次意外看到的一种我认为挺好的通过字符串转换数字时处理数字之间的空格的方法:

for(i=0;i<len;i++)
{
if(num[i]=='-')
{
temp=-1;
continue;
}
else if(num[i]>='0'&&num[i]<='9')
{
while(num[i]>='0'&&num[i]<='9')
{
num0=10*num0+(num[i]-'0');
i++;
}
numbers[j]=num0*temp;
j++;
temp=1;
}
num0=0;
}

这是借鉴许郁杨同学的方法之后我写的代码,

这里巧妙的通过一个while()来处理字符串中数字之间的其他字符(包括空格);然后其他后续的我想应该就很简单了。

#include<iostream>
#include<string>
#include<string.h> using namespace std; int main()
{
int number,aver,temp;
int i,sum,k,j,len,num0=0,numbers[100];
char num[1000];
cin >> number;
getchar();
for(k=0;k<999;k++)
{
j=0;
sum=0;
temp=1;
cin.getline(num,1000);
len=strlen(num);
// cout<<len<<endl;
for(i=0;i<len;i++)
{
if(num[i]=='-')
{
temp=-1;
continue;
}
else if(num[i]>='0'&&num[i]<='9')
{
while(num[i]>='0'&&num[i]<='9')
{
num0=10*num0+(num[i]-'0');
i++;
}
numbers[j]=num0*temp;
j++;
temp=1;
}
num0=0;
}
if(j==1&&numbers[0]==100)
break;
if(j==0)
continue;
if(j<number)
{
for(i=0;i<j;i++)
{
// cout<<numbers[i]<<endl;
sum+=numbers[i];
// cout<<sum<<endl;
}
aver=sum/(i);
cout<<aver<<endl;
}
else
{
for(i=0;i<number;i++)
{
// cout<<numbers[i]<<endl;
sum+=numbers[i];
// cout<<sum<<endl;
}
aver=sum/number;
cout<<aver<<endl;
}
}
return 0;
}

话说这次的作业是通过最后输入一个100来判断截止,输入输出问题还有许多和我们平时不太一样的,比如说输入的数据是不定数量的;我推荐一篇有关输入的博客

其实几天前就像写一下这次作业的看法的,拖得有点久似乎。

PTA计算平均值(一波三折)的更多相关文章

  1. PTA 计算平均值

    现在为若干组整数分别计算平均值. 已知这些整数的绝对值都小于100,每组整数的数量不少于1个,不大于20个. 输入格式:首先输入K(不小于2,不大于20).接下来每一行输入一组数据(至少有一组数据), ...

  2. matlab 利用while循环计算平均值和方差

    一.该程序是用来测输入数据的平均值和方差的 公式: 二. 项目流程: 1. State the problem假定所有测量数为正数或者0,计算这一系列测量数的平均值和方差.假定我们预先不知道有多少测量 ...

  3. 为什么在 Java 中用 (low+high)>>>1 代替 (low+high)/2 或 (low+high)>>1 来计算平均值呢?好在哪里?

    >>>与>>是位运算符,只对整型有效(不能用于浮点型).当是整型的时候(low+high)>>1可以代替(low+high)/2.>>>是无 ...

  4. C 语言实例 - 计算平均值

    C 语言实例 - 计算平均值 C 语言实例 C 语言实例 使用数组来计算几个数的平均值. 实例 #include <stdio.h> int main() { int n, i; ], s ...

  5. matlab 利用while循环计算平均值和方差(第二版)

    第一版中因为公式中含有:分母项:n(n-1),而程序并没有对输入数进行判定,如果仅仅输入一个或者一个都不输入,将会出现除0的情况 基于此,进行第二版改进. 代码: % 脚本文件:states.m % ...

  6. Shell 脚本循环遍历日志文件中的值进行求和并计算平均值,最大值和最小值

    本文为博主原创,转载请注明出处: 最近在进行压测,为了观察并定位服务性能的瓶颈,所以在代码中很多地方加了执行耗时的日志,但这种方式只能观察,却在压测的时候,不太能准确的把握代码中某些方法的性能,所以想 ...

  7. C# 基础 计算平均值的方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. OpenCV 自定义任意区域形状及计算平均值 方差

    opencv中有矩形的Rect函数.圆形的circl函数等,那么任意形状怎么取呢?方法1:点乘,将其形状与图像进行点乘,求其形状对应的图像形状:方法2:用findContours函数得对应的形状区域, ...

  9. Hadoop计算平均值【转】

    file1.txt a 1b 2a 3b 3a 5b 7c 3c 5 file2.txt a 1b 7c 5a 1c 3 结果: a 2.2b 4.75c 4.0 代码: package org.ap ...

随机推荐

  1. 第六周课上测试-1-ch02

    第六周课上测试-1-ch02 1. 要求: 1.参考附图代码,编写一个程序 "week0601学号.c",判断一下你的电脑是大端还是小端. 2. 提交运行结果"学号XXX ...

  2. 20155226 2016-2017-2 《Java程序设计》第9周学习总结

    20155226 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商 ...

  3. 20145234黄斐《Java程序设计》课程总结

    每周作业链接汇总 预习作业一:http://www.cnblogs.com/taigenzhenjun/p/6492903.html 对专业的期望 预习作业二:http://www.cnblogs.c ...

  4. bzoj1294 [SCOI2009]围豆豆

    Description Input 第一行两个整数N和M,为矩阵的边长. 第二行一个整数D,为豆子的总个数. 第三行包含D个整数V1到VD,分别为每颗豆子的分值. 接着N行有一个N×M的字符矩阵来描述 ...

  5. 【转载】MFC怎么封装CreateWindow

    原文:http://blog.csdn.net/weiwenhp/article/details/8796337 我们知道Win32中创建一个窗口的流程就是先注册一个WNDCLASSEX(指定了窗口的 ...

  6. Redis 为什么使用单进程单线程方式也这么快

    Redis 采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由 C 语言编写.官方提供的数据是可以达到100000+的 qps.这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 ...

  7. Node JS World

    Node JS World Environment tested on Ubuntu Install nvm/node/npm/yarn nvm : node version manager node ...

  8. Kubernetes 容器平台实战

    一.什么是Kubernetes? Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署,自动扩缩容,维护等功能. 通过Kubernetes可以做到: 快速部署应用 快 ...

  9. Java 集合基础知识 List/Set/Map

    一.List Set 区别 List 有序,可重复: Set 无序,不重复: 二.List Set 实现类间区别及原理 Arraylist 底层实现使用Object[],数组查询效率高 扩容机制    ...

  10. appium 元素定位方法汇总

    以上图为例,要定位到右下角的 我的 ,并点击 # appium的webdriver提供了11种元素定位方法,在selenium的基础上扩展了三个,可以在pycharm里面输入driver.find_e ...