作品评分(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=Double.parseDouble(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);
	}

}

 

  • 3
    点赞
  • 2
    评论
  • 5
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Mr_Kingk

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值