关于2维数组脚标的问题 用嵌套循环给2维数组每列赋值时的逻辑问题

关于2维数组脚标的问题 用嵌套循环给2维数组每列赋值时的逻辑问题

i问题描述:mport java.util.Scanner;
public class ArrayTest {
public static void main(String[] args) {
        //定义一个三行两列的整型二维数组intArray
        int[][] intArray=new int[3][2];
        //从键盘输入学生成绩,要求输入顺序与效果图一致
        Scanner sc=new Scanner(System.in);
        for(int i = 0; i<intArray.length; i++){
            System.out.print("请输入第"+(i+1)+"个学生的语文成绩: ");
            intArray[i][0]=sc.nextInt();  
            for(int j = 0; j<intArray[i].length-1; j++){
                System.out.print("请输入第"+(i+1)+"个学生的数学成绩: ");
                intArray[i][1]=sc.nextInt(); // <----为什么intArray[i][j]=sc.nextInt() 不行;
            }
        }
      相关代码://求语文的总成绩和平均分
      //求数学的总成绩和平均分
       int sumL = 0;
       int sumM = 0;
       int AvgL = 1 ;
       int AvgM = 1;
        for(int i = 0; i<intArray.length; i++){
            for(int j = 0; j<intArray[i].length-1; j++){
                sumL = sumL+intArray[i][0]; 
                sumM = sumM+intArray[i][1];
            }
        }
        AvgL = sumL/intArray.length;
        AvgM = sumM/intArray.length;
        System.out.println("语文总成绩为: "+sumL);
        System.out.println("语文平均分为: "+AvgL);
        System.out.println("数学总成绩为: "+sumM);
        System.out.println("数学总成绩为: "+AvgM);
}
}

请问

1. 为何用--->intArrary[i][j]sc.nextInt()导致计算有问题. 用intArray[i][1]=sc.nextInt();却ok

2. 我的给数组循环赋值的时候是否有逻辑漏洞?

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

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

2回答
好帮手慕小尤 2021-01-07 17:13:57

同学你好,1. for(int j = 0; j<intArray[i].length-1; j++) 此循环会进入循环一次,如下:

    intArray[i].length-1等于1,则第一次循环,当j=0时,0<,符合条件,进入循环。为intArray[i][0]赋值。然后进行j++。

    第二次循环,j=1,1<1不符合条件,结束循环,

综上所述,for(int j = 0; j<intArray[i].length-1; j++)只会为intArray[i][0]赋值,从而导致其他数据错误。

2. 根据同学的代码,直接为intArray[i][0]与intArray[i][1]赋值即可,则建议同学优化代码,使用一层循环,实现键盘输入与计算总成绩。修改后代码如下所示:

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

public static void main(String[] args) {
        //定义一个三行两列的整型二维数组intArray
        int[][] intArray=new int[3][2];
        // 定义sumL、sumM变量
        int sumL = 0;
        int sumM = 0;
        //从键盘输入学生成绩,要求输入顺序与效果图一致
        Scanner sc=new Scanner(System.in);
        for(int i = 0; i<intArray.length; i++){
        	System.out.print("请输入第"+(i+1)+"个学生的语文成绩: ");
            intArray[i][0]=sc.nextInt();  
            System.out.print("请输入第"+(i+1)+"个学生的数学成绩: ");
            intArray[i][1]=sc.nextInt(); 
            // 求语文的总成绩
            sumL = sumL+intArray[i][0]; 
            // 求数学的总成绩
            sumM = sumM+intArray[i][1];
        }
      //求语文的平均分
      //求数学的平均分
       int AvgL = 1 ;
       int AvgM = 1;
        AvgL = sumL/intArray.length;
        AvgM = sumM/intArray.length;
        System.out.println("语文总成绩为: "+sumL);
        System.out.println("语文平均分为: "+AvgL);
        System.out.println("数学总成绩为: "+sumM);
        System.out.println("数学总成绩为: "+AvgM);
}

祝学习愉快!


  • 提问者 David_Cici #1

    感谢优化, 理解您的意思. 我的本意是, 如果写一个程序用户可以自定一二维数组的行和列, 并用循环为每一数组元素赋值,那么该如何实现呢. 大概意思如下:

    ​        int x, y;
    Scanner sx=new Scanner(System.in);
    Scanner sy=new Scanner(System.in);
    x=sx.nextInt();
    y=sy.nextInt();
    int[][] intArray=new int[x][y]; //用户预定义数组会有x行,y列
    Scanner sc=new Scanner(System.in);
    for(){
    //这里要如何实现呢, 原谅我自己没写出来哈哈哈...:P
    //还是说我不该用嵌套for循环...? 如不该用, why? 该用什么?
    for(){
    }
    }
    ...
    ...
    ...

    感谢解答

    2021-01-07 22:13:13
  • 好帮手慕小尤 回复 提问者 David_Cici #2

    同学你好,使用嵌套循环也是可以实现的,如下所示:

    1. 需要将intArray[i].length-1修改为intArray[i].length,使其进入循环两次。

    2. 在内循环中添加一个if判断,判断j是否等于0,等于0为[i][0]赋值,否则为[i][1]赋值。代码如下所示:

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

    ​public class ArrayTest {
    public static void main(String[] args) {
    //定义一个三行两列的整型二维数组intArray
    int[][] intArray=new int[3][2];
    // 定义sumL、sumM变量
    int sumL = 0;
    int sumM = 0;
    //从键盘输入学生成绩,要求输入顺序与效果图一致
    Scanner sc=new Scanner(System.in);
    for(int i = 0; i<intArray.length; i++){
    // intArray[i].length-1修改为intArray[i].length
    for(int j = 0; j<intArray[i].length; j++){
    // 判断j是否等于0,等于0为[i][0]赋值,否则为[i][1]赋值
    if (j==0) {
    System.out.print("请输入第"+(i+1)+"个学生的语文成绩: ");
    intArray[i][j]=sc.nextInt();
    // 求语文的总成绩
    sumL = sumL+intArray[i][0];
    } else {
    System.out.print("请输入第"+(i+1)+"个学生的数学成绩: ");
    intArray[i][1]=sc.nextInt();
    // 求数学的总成绩
    sumM = sumM+intArray[i][1];
    }
    }
    }
    //求语文的总成绩和平均分
    //求数学的总成绩和平均分
    int AvgL = 1 ;
    int AvgM = 1;

    //求语文的平均分
    //求数学的平均分
    AvgL = sumL/intArray.length;
    AvgM = sumM/intArray.length;
    System.out.println("语文总成绩为: "+sumL);
    System.out.println("语文平均分为: "+AvgL);
    System.out.println("数学总成绩为: "+sumM);
    System.out.println("数学总成绩为: "+AvgM);
    }
    }

    祝学习愉快!

    2021-01-08 09:42:35
  • 提问者 David_Cici 回复 好帮手慕小尤 #3

    那么如果是一个i行n列(n>2), 我们还要写更多的else/else if

    我是想用scanner直接给i行其他列的数组直接赋值, how??

    2021-01-11 20:51:06
fever腾腾 2021-01-07 16:37:30
j<intArray[i].length-1

这里应该不用-1吧

直接j<intArray[i].length就可以了

你可以验证一下 假设长度是2,-1了就会变成 j<1的时候才循环,那你的 j  就永远不可能等于1,所以[i][1]这个值你没办法输入


  • 提问者 David_Cici #1

    不是的, 如果不-1那么j会有 0, 1, 2 三次变化, 计算结果会有三列.

    2021-01-07 21:57:46
  • 提问者 David_Cici #2

    忘记道谢~~ 哈哈 anyway 感谢回答我菜菜的问题

    2021-01-07 22:14:08
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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