题目:OK歌手打分程序
设计一接口,为卡拉ok歌手打分。设计两种实现,实现两种打分方法:
(1) 九个评委,以百分制打分,去掉一个最高分与一个最低分。计算出的平均分保留一位小数。
(2) 九个评委,以百分制打分,计算出的平均分保留一位小数。
(3) 九个评委,分段打分,级别为A+, A,B+,B,C+,C,D+,D去掉一个最高分与一个最低分。折算出的平均分为上述8个级别。
分析:java的接口问题。本质就是一个接口实现三个不同打分实例。
按照题目的要求设置对应的打分即可。前两种较为简单,第三种就通过字符和数字的转换就可以解决。
接口类
public interface Grade{
public abstract void getScore();//得到分数
public abstract double Score();//计算分数,double类型
}
第一种打分类
import java.util.*;
import java.util.Arrays;
import java.util.Scanner;
public class Judge_01 implements Grade{
int[] scores=new int[10];
int score;
public void getScore(){//得到分数
Scanner reader=new Scanner(System.in);
System.out.println("请输入第一种评分评委的分数:");
for(int i=0;i<9;i++){
scores[i]=reader.nextInt();
}
}
public double Score(){//计算分数
Arrays.sort(scores,0,8);//排序
for(int i=1;i<8;i++){//去掉首尾,算总分数
score+=scores[i];
}
double t=(double)score/7;
//System.out.println("---分数的多位数"+t);
return t;
}
}
第二种打分类
import java.util.Scanner;
public class Judge_02 implements Grade{
int[] scores=new int[10];//储存分数
int score;//总分数
public void getScore(){//输入分数
Scanner reader=new Scanner(System.in);
System.out.println("请输入第二种评分评委的分数");
for(int i=0;i<9;i++){
scores[i]=reader.nextInt();
}
}
public double Score(){//计算得分,返回double类型
for(int i=0;i<9;i++){
score+=scores[i];
}
double t=(double)score/9;
//System.out.println("---分数的多位数"+t);
return t;
}
}
第三种打分类
import java.util.Scanner;
public class Judge_03 implements Grade{
int[] scores=new int[10];//储存分数
String str;//储存字母
double score;//总分数
public void getScore(){//输入分数
Scanner reader=new Scanner(System.in);
System.out.println("请输入第三种评分评委的分数");
for(int i=0;i<9;i++){
str=reader.next();//以一个整数作为分段的数值,进行转换。
if(str.compareTo("A+")==0){//因为switch不能使String类型,所以只能用ifelse
scores[i]=7;
}else if(str.compareTo("A-")==0){
scores[i]=6;
}else if(str.compareTo("B+")==0){
scores[i]=5;
}else if(str.compareTo("B-")==0){
scores[i]=4;
}else if(str.compareTo("C+")==0){
scores[i]=3;
}else if(str.compareTo("C-")==0){
scores[i]=2;
}else if(str.compareTo("D+")==0){
scores[i]=1;
}
}
/*System.out.println("验证对应的数值:");//检验对应的字符串的数值是否正确
for(int i=0;i<9;i++){
System.out.println(scores[i]);
}*/
}
public double Score(){//计算得分,返回double类型
for(int i=0;i<9;i++){
score+=scores[i];
}
score/=9;
//System.out.println("数值得分为:"+score);
return score;
}
public String charScore(double score){
switch((int)score){//double转换成int类型,直接把小数位丢掉,因为只有满足对应整数才算是这一阶段。
case 1:str="D+";break;
case 2:str="C-";break;
case 3:str="C+";break;
case 4:str="B-";break;
case 5:str="B+";break;
case 6:str="A-";break;
case 7:str="A+";break;
}
return str;
}
}
main类
import java.util.Scanner;
import java.util.*;
public class Sing{
public static void main(String args[]){
Judge_01 s1=new Judge_01();//定义相应的对象
Judge_02 s2=new Judge_02();
Judge_03 s3=new Judge_03();
s1.getScore();//输入相应的分数
s2.getScore();
s3.getScore();
System.out.println("第一种评分所得的分数为:");
System.out.println(String.format("%.1f",s1.Score()-0.05));//四舍五入输出一位小数
System.out.println("第二种评分所得的分数为:");
System.out.println(String.format("%.1f",s2.Score()-0.05));
System.out.println("第三种评分所得的分数:");
double t=s3.Score();
String t1=s3.charScore(t);
System.out.println(s3.charScore(s3.Score()));
}
}
还可以进一步修改,看如何实现只要输入一次打分就可以。
应该将输入分数的方法设置在mian类,然后接口类只包含计算分数的方法即可。