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

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

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

请问

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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

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

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

    感谢解答

    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

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

    祝学习愉快!

    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
1
j<intArray[i].length-1<br>

这里应该不用-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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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