首页 > 技术文章 > PTA计算平均值(一波三折)

heihuifei 2017-03-28 18:07 原文

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来判断截止,输入输出问题还有许多和我们平时不太一样的,比如说输入的数据是不定数量的;我推荐一篇有关输入的博客

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

推荐阅读