1108. Finding Average (20)段错误
2016-03-25 15:54
330 查看
The basic task is simple: given N real numbers, you are supposed to calculate their average. But what makes it complicated is that some of the input numbers might not be legal. A “legal” input is a real number in [-1000, 1000] and is accurate up to no more than 2 decimal places. When you calculate the average, those illegal numbers must not be counted in.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (<=100). Then N numbers are given in the next line, separated by one space.
Output Specification:
For each illegal input number, print in a line “ERROR: X is not a legal number” where X is the input. Then finally print in a line the result: “The average of K numbers is Y” where K is the number of legal inputs and Y is their average, accurate to 2 decimal places. In case the average cannot be calculated, output “Undefined” instead of Y. In case K is only 1, output “The average of 1 number is Y” instead.
Sample Input 1:
7
5 -3.2 aaa 9999 2.3.4 7.123 2.35
Sample Output 1:
ERROR: aaa is not a legal number
ERROR: 9999 is not a legal number
ERROR: 2.3.4 is not a legal number
ERROR: 7.123 is not a legal number
The average of 3 numbers is 1.38
Sample Input 2:
2
aaa -9999
Sample Output 2:
ERROR: aaa is not a legal number
ERROR: -9999 is not a legal number
The average of 0 numbers is Undefined
后记
这次为了找到段错误的位置,提交 了很多次,最后找到在while(n–)这个块中,通过减少n的大小,来测试,发现又有案例出现段错误,所以重新查看了所有与n相关的地方,终于找到错误,原来是数组大小设置成n了,这是第二次这样的错误了,谨记谨记谨记。另外这道题做的时间很长,缺少系统的规划,应该养成习惯,提前设计好算法。
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (<=100). Then N numbers are given in the next line, separated by one space.
Output Specification:
For each illegal input number, print in a line “ERROR: X is not a legal number” where X is the input. Then finally print in a line the result: “The average of K numbers is Y” where K is the number of legal inputs and Y is their average, accurate to 2 decimal places. In case the average cannot be calculated, output “Undefined” instead of Y. In case K is only 1, output “The average of 1 number is Y” instead.
Sample Input 1:
7
5 -3.2 aaa 9999 2.3.4 7.123 2.35
Sample Output 1:
ERROR: aaa is not a legal number
ERROR: 9999 is not a legal number
ERROR: 2.3.4 is not a legal number
ERROR: 7.123 is not a legal number
The average of 3 numbers is 1.38
Sample Input 2:
2
aaa -9999
Sample Output 2:
ERROR: aaa is not a legal number
ERROR: -9999 is not a legal number
The average of 0 numbers is Undefined
#include <iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; void printError(char temp[]) { printf("ERROR: %s is not a legal number\n",temp); } void printOne(int x,float y) { printf("The average of %d number is %0.2f\n",x,y); } void printMore(int x,float y) { printf("The average of %d numbers is %0.2f\n",x,y); } void printZero() { printf("The average of 0 numbers is Undefined\n"); } int main() { int n; while(scanf("%d",&n)!=EOF) { //是不是合法的 // 小数点后两位 char temp[100];// 原来是n,改成100后结果正确。 float sum=0; float num=0; int ct=0; int dot=0; bool legal=true; int length=0; int dotlocation=0; bool p=true; while(n--) { num=0; memset(temp,0,sizeof(temp)); scanf("%s",temp); dot=0; legal=true; length=strlen(temp); dotlocation=strlen(temp); p=true;//正负 for(int i=0;i<strlen(temp);i++) { if(temp[i]>='0'&&temp[i]<='9'||temp[i]=='.') { if(temp[i]=='.') { dot++; dotlocation=i; if(dot>1) { legal=false; break; } if(i+3<strlen(temp)) { legal=false; break; } } } else if(temp[i]=='-') { if(i!=0) legal=false; } else { legal=false; break; } } if(legal) { for(int i=0;i<strlen(temp);i++) { if(temp[i]=='-') { p=false; continue; } if(temp[i]!='.') { int j=(temp[i]-'0'); float jj=j*pow(10,dotlocation-i-1); num+=jj; } else dotlocation++; } if(!p) { num=-num; } if(num>1000||num<-1000) printError(temp); else { sum+=num; ct++; } } else printError(temp); //超时 } //段错误 float i=sum/ct; if(ct==1) printOne(ct,i); else if(ct==0) printZero(); else printMore(ct,i); } return 0; }
后记
这次为了找到段错误的位置,提交 了很多次,最后找到在while(n–)这个块中,通过减少n的大小,来测试,发现又有案例出现段错误,所以重新查看了所有与n相关的地方,终于找到错误,原来是数组大小设置成n了,这是第二次这样的错误了,谨记谨记谨记。另外这道题做的时间很长,缺少系统的规划,应该养成习惯,提前设计好算法。
相关文章推荐
- 1.3.2(extra)
- 1.3.3
- 思维导图软件Freemind简介
- Could not open INSTALL.LOG file
- JMeter学习(十一)属性和变量
- MojoliciousLite: 实时的web框架 概述
- MojoliciousLite: 实时的web框架 概述
- 彻底理解字符编码
- c++ 类的使用 友元函数 重载运算符
- 解决oracle高版本的向低版本拷贝数据的方法
- C++的引用的一个测试例子
- 【涨知识】你家用的是A级锁还是B级锁,什么锁最安全?
- 虚拟现实竞争企业分析
- 智能电网学习1---基本术语与概念
- AsyncSocket库使用方法
- tar解压tar.bz2\tar.gz\tgz\;bzip2解压bz2;gzip解压gz
- 每个Android开发者都应该了解的资源列表
- tar.gz 是什么
- HDOJ 2114 Calculate S(n)(找周期)
- 1.3.1