java初学者,求教!!!!!!!11

题目描述

每门课的成绩分为A、B、C、D、F五个等级,为了计算平均绩点,规定A、B、C、D、F分别代表4分、3分、2分、1分、0分。

输入格式

有多组测试样例。每组输入数据占一行,由一个或多个大写字母组成,字母之间由空格分隔。

输出

每组输出结果占一行。如果输入的大写字母都在集合{A,B,C,D,F}中,则输出对应的平均绩点,结果保留两位小数。否则,输出“Unknown”。

样例输入

A B C D F
B F F C C A
D C E F

样例输出

2.00
1.83
Unknown

import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input=new Scanner(System.in);

     double sum=0;
     int count=0;
     boolean n;
     while(input.hasNext()){
       String str=input.nextLine();
       char ch=str.charAt(0);
        n = true;
       if(ch == 'A'||ch == 'B'||ch == 'C'||ch == 'D'||ch == 'F'){
         n = false; 
         switch(ch){
            case 'A':sum+=4;
                      break;
            case 'B':sum+=3;
                      break;
            case 'C':sum+=2;
                      break;
            case 'D':sum+=1;
                      break;
            default :sum=+0;
                      break;
           }
              count++;
         }
       else{
            break;
      }
   System.out.printf(n?"Unknown\n":"%.2f\n",sum/count); 
    }
}

}

6个回答

用正则表达式来实现最方便,不用循环

但计算平均值需要进行循环

@Test
public void test(){
    //使用HashMap保存成绩对应的分数
    Map<String,Integer> scoreMap = 
            new HashMap<String,Integer>();
    scoreMap.put("A", 4);
    scoreMap.put("B", 3);
    scoreMap.put("C", 2);
    scoreMap.put("D", 1);
    scoreMap.put("F", 0);
    Scanner scan = new Scanner(System.in);
    System.out.print("请输入成绩:");
    label1:
    while(scan.hasNext()){
        String inputStr = scan.nextLine();
        String reg = "[A-F| ]+";

        if(inputStr == null || !inputStr.matches(reg)){
            System.out.println("Unknown");
            System.out.print("请输入成绩:");
            continue;
        }
        String[] inputStrArray = inputStr.split(" ");
        if(inputStrArray.length <= 0){
            System.out.println("Unknown");
            System.out.print("请输入成绩:");
            continue;
        }
        double sum = 0;
        for(String str : inputStrArray){
            if(!scoreMap.containsKey(str)){
                System.out.println("Unknown");
                System.out.print("请输入成绩:");
                //继续label1对应的循环
                continue label1;
            }
            sum += scoreMap.get(str);
        }
        BigDecimal avg = new BigDecimal(sum/inputStrArray.length);
        System.out.println(String.format("%.2f", avg));
        System.out.print("请输入成绩:");
    }

}
楼主看看这样实现怎么样,可以自己再简化一下

嗯。推荐用正则表达式来对输入做一个检测;然后再做后续计算;

说实在,我并不同意这里说用正则表达式的做法,因为你是初学者,正则表达式的使用不复杂,你很容易就可以学习到。
其实,对于你的题目,理论上用一个数组最简单,你的检查还是必要的
int[] values = new int[]{4, 3, 2, 1, 0, 0},要计算的话可以使用
values[(int)(ch - 'A')]去避免switch语句,这个在Code Complete这本书里提到,叫search table

zhangshunjie
zhangshunjie 回复eagleyan: 好的,谢谢
接近 6 年之前 回复
eagleyan
Coursera 这本书给出了很多小的技巧和对代码标准化的方法,以c++为代表,但是很有代表意义
接近 6 年之前 回复
zhangshunjie
zhangshunjie 还有个问题想请教一下,Code Complete好像非常有名,想看一看,这本书怎么样,能给一些评价吗?
接近 6 年之前 回复
zhangshunjie
zhangshunjie 这个算法不错,效率会提高好多,只是会不会照成代码难以理解和维护?
接近 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问