作业里,变量初始化问题

作业里,变量初始化问题

import java.util.Scanner;
public class HomeWork{
    //显示菜单的方法
    public void menu(){
        System.out.println("*****************************************");
        System.out.println("       1--初始化数学成绩");
        System.out.println("       2--求成绩的平均值");
        System.out.println("       3--统计成绩大于85分的人数");
        System.out.println("       4--修改指定位置处的成绩");
        System.out.println("       5--打印输出所有成绩");
        System.out.println("       0--退出");
        System.out.println("*****************************************");
}
    //初始化数学成绩的方法
    public float[] score() {
        Scanner input=new Scanner(System.in);    
        System.out.println("请输入要存储的数学成绩的数量:");
            int num=0;
            while(true){
            try{num=input.nextInt();
            }catch(java.util.InputMismatchException e){
            System.out.println("输入的格式有误,或有小数或非数字!");
            input.next();
            }
            if(num>0){
                break;
            }
        }
        float[] score=new float[num];
        for(int a=0;a<num;a++){
                System.out.println("请输入第"+(a+1)+"个数据:");    
                try{score[a]=input.nextFloat();
                }catch(java.util.InputMismatchException e){
                    System.out.println("输入的格式有误,或有小数或非数字!");
                    input.next();    
                    a--;
                }
        }
        
        return score;
}
    //求平均值的方法
    public float average(float[] f) {
        float sum=0;
        for(float n: f){
            sum=sum+n;
        }
        float ave=sum/f.length;
        return ave;
    }  

    //求分数大于85分的人数的方法
    public int count(float[] f) {
        int count=0;
        for(float n : f){
            if(n>85){
                count++;
            }
        }
        return count;
}
    //修改指定位置处成绩的方法    
    public void update(float[] f, int index, float newScore) {
        f[index]=newScore;
        System.out.println("修改后:");
        System.out.println("成绩为:");
        for(float n : f){
            System.out.print(n+"\t");
        }
        System.out.println();
}     
    //打印输出所有成绩的方法
    public void displayAllScore(float[] f) {
        System.out.println("成绩为:");
        for(float n : f){
            System.out.print(n+"\t");
        }
        System.out.println();

}
    //主方法,用于完成主要的程序逻辑
    public static void main(String [] args){
        Scanner input=new Scanner(System.in);
        HomeWork sc=new HomeWork();
        int num=0;//Question:在初始化变量这块儿,理解不清楚
        float[] stuScore=null;
        float ave;
        int highScore;
        for(;;){
            sc.menu();
            System.out.println("请输入对应的数字进行操作:");
            try{num=input.nextInt();
            }catch(java.util.InputMismatchException e){
            System.out.println("输入的格式有误,或有小数或非数字!");
            input.next();
            continue;
            }
            if(num<0|num>5){
                System.out.println("输入有误,请输入0到5之间的数字!");
            }
            if(num==0){
                System.out.println("退出程序!");
                break;
            }
            switch(num){
                case 1 : stuScore=sc.score();
                break;
                case 2 : if(stuScore !=null){ave=sc.average(stuScore);
                                                                            System.out.println("数学平均成绩为:"+ave);
                            }else{
                        System.out.println("您还未输入数学成绩!");
                    }
                
                break;
                case 3 :  if(stuScore !=null){highScore=sc.count(stuScore);
                                        System.out.println("成绩大于85分的人数为:"+highScore);
                    }else{
                        System.out.println("您还未输入数学成绩!");
                    }
                break;
                case 4 : if(stuScore !=null){System.out.println("修改前:");
                                                    System.out.println("成绩为:");
                                                    for(float n : stuScore){
                                             System.out.print(n+"\t");
                                                     }
                                                    System.out.println();
                                             
                    System.out.println("请输入要修改数据的位置(从0开始):");
                                                        try{int point=input.nextInt();
                                                        System.out.println("请输入新数据:");
                                                        float newScore=input.nextFloat();
                                                                                sc.update(stuScore,point,newScore);
                                                                                }catch(java.util.InputMismatchException e){
                                                    System.out.println("输入的格式有误,或有小数或非数字!");
                                                    input.next();
                                                   break;
                                                    }
                        }else{
                            System.out.println("您还未输入数学成绩!");
                        }
                    
                                                    break;
                case 5 : if(stuScore !=null){sc.displayAllScore(stuScore);
                    }else{
                        System.out.println("您还未输入数学成绩!");
                    }








}}
}
}
老师好,这是完整代码,主方法里面的变量,在进入for循环前,既有声明初始化的,也有只声明的,还有只是在swich结构中定义声明


的。就是因为这三种情况,导致我很混乱。希望老师能帮我解答,谢谢您那!

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好,老师已经在另一个问答下回答了,为老师能够跟踪同学的问题,高效的回复同学的问题,建议同学不要同一个问题创建两个问答。如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 鱼儿0001 提问者 #1
    好的,以后不会了,谢谢你。
    2019-04-13 17:56:24
吃吃吃鱼的猫 2019-04-13 14:59:06

同学你好,局部变量是在方法或者代码块中定义的变量,可以以一对大括号来判断,在一个大括号中定义的变量,只能在该大括号之内使用,同学要先理解这个概念。1.首先在循环之前定义的num如果赋值为0,在循环中num=input.nextInt();属于重新赋值,当然不会报错。其次在循环之前不为num赋值,只在循环内进行赋值,也不会报错。同学可以试验一下。http://img1.sycdn.imooc.com//climg/5cb17ffd000132cd07840378.jpg2.首先stuScore赋值为空时,数组为null,数组元素不存在,所以此时数组元素还不是0。其次,当stuScore先不赋值时,如图所示:http://img1.sycdn.imooc.com//climg/5cb1886d0001d26610840885.jpg3.同学可以参考1和2的解释。4.在try块中声明的变量只在try块中使用,没有在try块(可以看下try的大括号)之外的地方使用,所以不会报错。http://img1.sycdn.imooc.com//climg/5cb1857f000145d707850246.jpg【注:1.int a;表示定义了一个变量a;2.只有“=”才是赋值符号】建议同学再重新观看一遍关于变量的视频:https://class.imooc.com/course/976,如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 鱼儿0001 #1
    谢谢老师,写的这么详细,比之前清楚了,你看一下我这里的代码,因为被try包裹,所以出了许多问题,如果能解决这个问题,关于变量声明这块大概就没有问题了。 public static void main(String[] args){ Example sc=new Example(); Scanner input=new Scanner(System.in); for(;;){ sc.menu();//这里是调用方法,用于显示菜单 System.out.println("请输入对应的数字进行操作:"); try{int menuNum=input.nextInt(); }catch(java.util.InputMismatchException e){ System.out.println("输入的格式有误,或有小数或非数字!"); input.next(); } if(menuNum==0){ System.out.println("退出程序!"); break; } switch(menuNum){//这里是程序逻辑 case 1 : System.out.println("输入数据"); break; } 报错信息是:Example.java:77: 错误: 找不到符号 if(menuNum==0){ ^ 符号: 变量 menuNum 位置: 类 Example Example.java:81: 错误: 找不到符号 switch(menuNum){ ^ 符号: 变量 menuNum 位置: 类 Example Example.java:81: 错误: 非法的类型开始 switch(menuNum){ ^ 3 个错误 我直接在for循环里声明并使用input.nextInt为menuNum赋值,不被try包裹时运行不报错,一旦被try-catch结构包裹,就是上述错误。其实,我一直就被卡在这里,为什么try包裹之后,错误连连,我应该如何应对,谢谢老师的回复
    2019-04-13 16:24:47
  • 提问者 鱼儿0001 #2
    这怎么成一坨了* *,好可怕。我重发。 老师,对变量初始化的问题越来越清楚了,你再帮我看看这个问题, 这个问题弄完应该对变量初始化没有问题了,万分感谢您!!! https://class.imooc.com/course/qadetail/107698
    2019-04-13 16:35:55
  • 提问者 鱼儿0001 #3
    第一个问题里,我试了老师说的在for循环外面声明num。在for循环里,当被try包裹时,为num赋值还是报错: Example.java:77: 错误: 可能尚未初始化变量num if(num==0){
    2019-04-13 16:48:19
吃吃吃鱼的猫 2019-04-12 18:24:59

同学你好,可以参照如下标注:http://img1.sycdn.imooc.com//climg/5cb0675c00011cf509610763.jpg

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 鱼儿0001 #1
    你还是没有回答清楚我的问题。 1、首先,int num在for循环里也是得到赋值的:num=input.nextInt。但是我还是得在主方法里赋值为0.不然程序报错。你怎么解释? 2、我为了不让程序报错,为数组stuScore赋值为null,使得数组元素都默认是0。 3、以上的num和stuscore都是进行赋值才能操作,尽管这些初始化是为了程序运行不得已做的。而ave和highScore只是先声明,后面赋值,没有报错。这就是我困惑的地方。 4、老师你还错过了一部分代码: try{int point=input.nextInt(); System.out.println("请输入新数据:"); float newScore=input.nextFloat(); ,这是在switch里声明并且初始化,没有报错。 写到这里,我困惑的是,有的变量必须在主方法开头就得声明并初始化,有的变量只需要声明,有的变量根本不用声明也不用初始化,在哪里用就在哪里声明初始化
    2019-04-13 13:42:10
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师