老师,我在存储成绩个数哪里不太会,可以请教一下么

老师,我在存储成绩个数哪里不太会,可以请教一下么

卡在菜单那里动不了了,问题应该在键入方法那里,如果不用键入n,直接给定长度6就一切正常


package com.imooc.DataManage;


import java.util.Scanner;


/**

 * 从键盘接收整型数据存放到数组中,并对数组中的数据进行管理

 * 

 * @author Administrator

 *

 */

public class Data {

/**

 * 显示菜单

 */

public void displayMenu() {

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("**********************");

}

/**

* 从键盘接收数据

* @return 接收数据的数组

*/

public float[] initScore() {

int n=0;

float[] f = new float[n];

Scanner sc = new Scanner(System.in);

// 少接收一个数据,为在指定位置处插入数据做准备

for (int i = 0; i < f.length - 1; i++) {

System.out.println("请输入需要存储的数学成绩的个数:");

n=sc.nextInt();

System.out.println("请输入第" + (i + 1) + "个数据:");

try {

f[i] = sc.nextFloat();

} catch (java.util.InputMismatchException e) {

System.out.println("输入的数据格式有误,不能有非数字!");

sc.hasNext();

i--;

}

}

return f;

}


/**

* 显示成绩 的平均值

* @param f 接收数组的数据

* @return 接收平均值的数据

*/

public float average(float[] f) {

float sum = 0;

float ave;

for (int i = 0; i < f.length; i++) {

sum = sum + f[i];

}

ave = sum / f.length;

return ave;

}

/**

 * 统计成绩大于85的人数

 * @param f

 * @return

 */

public int count(float[] f) {

int sum=0;

for (float n : f) {

if (n > 85) {

sum++;

}

}

if (sum == 0) {

System.out.println("没有人成绩大于85!");

} else {

            System.out.println("成绩大于85的人数为:"+sum);

}

return sum;

}

/**

 * 从键盘接收一个数据,插入到数组的指定位置处    

 * @param f 要插入数据的数组

 * @param index 要插入的位置,从0开始

 * @param newScore 要插入的数据

 */

public void update(float[] f,int index,float newScore) {

    for(int i=f.length-1;i>index;i--) {

    f[i]=f[i-1];

    }

    f[index]=newScore;

    for(float n:f) {

    System.out.println(" "+n+" ");

    }

    }

/**

* 打印输出所有成绩

* @param f

*/

public void displayAllScore(float[] f) {

for(float n:f) {

System.out.print("  "+n+"  ");

}

}

public static void main(String[] args) {

Data D=new Data();

Scanner sc=new Scanner(System.in);

int input=0;

float[] f=null;

float newScore=0;

int index=0;

//newScore表示要插入的数据,index表示要插入的位置

while(true) {

D.displayMenu();

System.out.println("请输入对应的数字进行操作!");

try {

input=sc.nextInt();

}catch(java.util.InputMismatchException e){

    System.out.println("输入格式有误,不能有非数字!");

    sc.next();

    continue;

}

if(input==0) {

System.out.println("退出程序!");

break;

}

switch (input) {

case 1:

//插入数据

f=D.initScore();

break;

case 2:

//平均成绩

float f1=D.average(f);

System.out.println(f1);

break;

case 3:

//统计成绩大于85的人数

D.count(f);

case 4:

//修改指定位置处的成绩

if(f!=null) {

System.out.println("请输入要插入的数据:");

newScore=sc.nextFloat();

System.out.println("请输入要插入的位置:");

index=sc.nextInt();

break;

}

case 5:

//打印输出所有成绩

D.displayAllScore(f);

}

if(input<0||input>5) {

System.out.println("输入数据超出范围,请重新输入");

}

}

}


}


正在回答 回答被采纳积分+1

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

3回答
好帮手慕小尤 2020-02-25 19:11:50

同学你好,当输入成绩时输入非数字会出现死循环。如下图所示:

http://img1.sycdn.imooc.com//climg/5e55001a09f0471203670151.jpg

建议将catch中的hasNext()方法修改为next()方法,并添加continue,跳过此次循环,进入下次循环。修改后代码如下:

http://img1.sycdn.imooc.com//climg/5e5500b109cbb54a07250270.jpg

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

好帮手慕小尤 2020-02-25 17:06:53

同学你好,初始化根据输入的数组长度进行循环即可。如果输入的数组长度是2,f.length-1则为1,只能为数组添加一个成绩,与输入的长度不符,所以不需要空出一个位置。

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

  • 提问者 慕函数4736799 #1
    package com.imooc.DataManage; import java.util.Scanner; /** * 从键盘接收整型数据存放到数组中,并对数组中的数据进行管理 * * @author Administrator * */ public class Data { /** * 显示菜单 */ public void displayMenu() { 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("**********************"); } /** * 从键盘接收数据 * * @return 接收数据的数组 */ public float[] initScore() { int n = 0; Scanner sc = new Scanner(System.in); try { System.out.println("请输入需要存储的数学成绩的个数:"); n = sc.nextInt(); } catch (java.util.InputMismatchException e) { System.out.println("输入的数据格式有误,不能有非数字!"); sc.next(); } float[] f = new float[n]; // 少接收一个数据,为在指定位置处插入数据做准备 for (int i = 0; i < f.length; i++) { System.out.println("请输入第" + (i + 1) + "个数据:"); try { f[i] = sc.nextFloat(); } catch (java.util.InputMismatchException e) { System.out.println("输入的数据格式有误,不能有非数字!"); sc.hasNext(); i--; } } return f; } /** * 显示成绩 的平均值 * * @param f 接收数组的数据 * @return 接收平均值的数据 */ public float average(float[] f) { float sum = 0; float ave; for (int i = 0; i < f.length; i++) { sum = sum + f[i]; } ave = sum / f.length; return ave; } /** * 统计成绩大于85的人数 * * @param f * @return
    2020-02-25 17:33:09
  • 提问者 慕函数4736799 #2
    改好了,还有需要改进的么
    2020-02-25 17:33:19
好帮手慕小尤 2020-02-25 16:18:48

同学你好,【菜单】

问题:尚未输入成绩之前,求成绩平均值,修改成绩,统计大于85分人数,打印输出成绩时,会报空指针异常运行效果如下:

http://img1.sycdn.imooc.com//climg/5e54d37c094a0d4e07560152.jpg


修改建议:建议同学在调用方法前,先判断一下要操作的数组是否为null,如果不 为null再进行下一步的操作,如果为null,可以提示用户请先插入数据。修改后代码如下:

http://img1.sycdn.imooc.com//climg/5e54d4ab09ea2e8308380490.jpghttp://img1.sycdn.imooc.com//climg/5e54d4c6093e864f10030429.jpg

【初始化】

问题:建议在循环外为变量赋值,并使用try{} 对键盘输入的代码进行捕获异常。修改后代码如下:

http://img1.sycdn.imooc.com//climg/5e54d61f097664dc08860776.jpg【修改成绩】

问题1:建议同学在修改前展示一下修改前的数据。在修改后,再展示一下修改后的 数据。同学的代码运行效果如下:

http://img1.sycdn.imooc.com//climg/5e54d6790993a3f103110211.jpg

 修改建议:建议同学在修改前调用一下打印输出所有成绩的方法。修改后代码如下:

http://img1.sycdn.imooc.com//climg/5e54d76009eff35d06470212.jpg

问题2:未成功修改成绩,建议同学在case4中调用update()方法,修改后代码如下:

http://img1.sycdn.imooc.com//climg/5e54d7a30996a05e06720314.jpg

问题3:建议同学可以对插入数组的位置的数字进行判断一下,避免出现数组索引越界异常。同学的代码执行效果如下:

http://img1.sycdn.imooc.com//climg/5e54d8020930b7fb09780280.jpg

修改建议:建议同学可以判断一下用户输入的要修改的位置。使其在0到(数组长度-1)的范围内。避免出现数组索引越界异常。

【输出成绩】

问题:同学的代码输出的时候,会把菜单第一行拼接到一起,同学的运行效果如下:

http://img1.sycdn.imooc.com//climg/5e54d83809839ddd05240063.jpg

修改建议:建议同学循环输出后,在循环的外边添加一个输出语句,用来换行。修改后代码如下:

http://img1.sycdn.imooc.com//climg/5e54d85f093dbe0706100185.jpg

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


  • 提问者 慕函数4736799 #1
    不是要空出一个位置接收数据么,为什么是f.length而不是f.length-1
    2020-02-25 16:32:41
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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