作品评分(Java用substring和Double.parseDouble处理一行夹杂空格和数字的字符串)

7-6 作品评分 (10 分)

全国中小学生Scratch作品大赛拉开了序幕。每个参赛选手可以通过网络直接上传作品。本次比赛人人可做评委。每个网络评委可以通过网络对每一件作品进行打分。评分系统也是请程序高手设计的,能自动去掉一个最高分和一个最低分,求出平均分。

输入格式:

输入数据包括两行: 第一行为n,表示n个评委,n>2。 第二行是n个评委的打分,分数之间有一个空格。打分是可以带有小数部分的。

输出格式:

输出平均分,结果保留两位小数。

输入样例:

6
10 9 8 7.9 9 9.5

输出样例:

8.88

这个题一开始用输入一个n,然后输入n的数(一个一个地输入)结果超时了,后来发现直接用字符串读一行,注意这里第一行就一个数n也要用字符串读这一行为了读掉末尾的换行符,因为下一行用字符串读一行时,如果上一行末尾有换行符也会读进去,就会导致少一个有效字符),然后处理一下字符串(提取有效数据)就行了。~~~可能本题还有更简单的做法,但由于本蒟蒻作为Java初学者,当前能力和见识有限,就先这么做了~~~

这里主要用到了以下三种语句:

1、用Scanner类读一行字符串(包含空格、回车等):

String s=scan.nextLine();

2、将字符串强制转化成int/double型:

String n=scan.nextLine();
int x=Integer.parseInt(n);//将字符串n强制转化成int型赋给x
int y=Integer.parseInt(n);//将字符串n强制转化成double型赋给y

3、截取字符串中的一段:

String ss=s.substring(cnt,i);//截取字符串s中从编号为cnt的位置到编号为i的位置(前闭后开)的字符串,然后赋给ss

完整代码:

package test01;
import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		String n=scan.nextLine();//注意这里就一个数n也要用字符串读一行(为了读掉末尾的换行符,因为下一行用字符串读一行时如果上一行末尾有换行符也会读进去,就会导致少一个有效字符)
		String s=scan.nextLine();
		int len=s.length();
		double sum=0,aver=0,maxn=-1,minn=0x3f3f3f3f;
		int cnt=0;
		int x=Integer.parseInt(n);
		while(cnt<len) {
			int flag=0;//用flag来判断当前字符串后面有无空格,以区分最后一个子串(最后一个子串后面无空格)
			for(int i=cnt;i<len;i++) {
				if(s.charAt(i)==' ') {
					flag=1;
					String ss=s.substring(cnt,i);
					double q=Double.parseDouble(ss);
					if(q>maxn)
						maxn=q;
					if(q<minn)
						minn=q;
					sum+=q;
					cnt=i+1;
					break;
				}
			}
			if(flag==0) {//flag=0说明已经到了最后一个有效数据
				String ss=s.substring(cnt,len);
				Double q=Double.parseDouble(ss);
				if(q>maxn)
					maxn=q;
				if(q<minn)
					minn=q;
				sum+=q;
				break;
			}
		}
		aver=(sum-minn-maxn)/(x-2); 
		System.out.printf("%.2f\n",aver);
	}

}
扫描二维码关注公众号,回复: 8735596 查看本文章
发布了89 篇原创文章 · 获赞 5 · 访问量 6716

猜你喜欢

转载自blog.csdn.net/Mr_Kingk/article/details/101540728
今日推荐