黑马程序员技术交流社区

标题: 这个问题绕不过弯,求教。 [打印本页]

作者: (_演绎、青春    时间: 2014-5-23 23:33
标题: 这个问题绕不过弯,求教。
/*
练习:做如下图形。
----*
---* *
--* * *
-* * * *
* * * * *

思路:
外循环控制行数,5行。int x=0;x<5;x++;
内循环控制列数
用嵌套循环。
*/

class SanJiaoXing
{
        public static void main(String[] args)
        {
                for (int x=0; x<5; x++)
                {
                        for (int y=x+1;y<5; y++)
                        /*int y=x;y<5;y++;的话做出来不贴边如下图:
-----*
----* *
---* * *
--* * * *
-* * * * *

                搞不懂的是为什么y=x+1;就能消掉贴边的那一列呢?我是初学者,就在这转不过弯来,
                                x<5,x控制行,y=x+1,那么最大时是y=4+1=5,然后y<5,然后就迷糊了 (┬_┬)

                        */
                        {
                                System.out.print("-");
                        }
                        for (int z=0;z<=x ;z++ )
                        {
                                System.out.print("* ");
                        }
                        System.out.println();
                }
        }
}

作者: 十年等待VS祥    时间: 2014-5-23 23:37
额,正在学习中。。。。
作者: (_演绎、青春    时间: 2014-5-23 23:39
十年等待VS祥 发表于 2014-5-23 23:37
额,正在学习中。。。。

呵呵,我也刚开始。你看到哪儿了?
作者: java木    时间: 2014-5-23 23:51
我给你分析下过程。当外循环中的x=4时,y=x+1; 也就是y=5;因为y<5这时候for循环就会退出,不会打印_了,所以贴边的那列就没有了。
作者: 十年等待VS祥    时间: 2014-5-23 23:58
我看了有一个礼拜了,才在看到c#基础switch-case语句,看样子你好像比我学的快。。。
作者: 寻找人生目标    时间: 2014-5-23 23:59
这些题主要是锻炼逻辑思维能力的   其他的没啥     不要一直纠结一个点   要往后看  这个不影响以后的学习    如果实在段时间弄不明白  还是记住规律吧      
作者: (_演绎、青春    时间: 2014-5-24 00:48
java木 发表于 2014-5-23 23:51
我给你分析下过程。当外循环中的x=4时,y=x+1; 也就是y=5;因为y

谢谢哥们儿!
作者: (_演绎、青春    时间: 2014-5-24 00:50
寻找人生目标 发表于 2014-5-23 23:59
这些题主要是锻炼逻辑思维能力的   其他的没啥     不要一直纠结一个点   要往后看  这个不影响以后的学习  ...

哦哦,好的 谢谢
作者: (_演绎、青春    时间: 2014-5-24 00:55
十年等待VS祥 发表于 2014-5-23 23:58
我看了有一个礼拜了,才在看到c#基础switch-case语句,看样子你好像比我学的快。。。 ...

嗯,快一点点 你一周就学这么快啊 我看了好长时间才看到数组。现在又返回去多看几遍基础
作者: (_演绎、青春    时间: 2014-5-25 12:25
:victory: 我会的 呵呵
作者: 路漫漫_求索    时间: 2014-5-25 23:37


                for(int x=0;x<5;x++)//1. 此循环控制行数
                {
                        for(int y=x+1;y<5;y++)//2. 此循环控制-号数
                        {
                                System.out.print(" ");
                        }
                        for(int z=0;z<=x;z++)//3. 此循环控制*号数量
                        {
                                System.out.print("* ");
                        }
                        System.out.println();
                }

作者: 西门吹风    时间: 2014-5-25 23:45
本帖最后由 西门吹风 于 2014-5-25 23:54 编辑

x+1 表得第几行,z表示该行要打多少个下画线
x=0,第一行,需要打4个_
x=1,第二行,需要打3个_
x=2,第三行,需要打2个_
x=3,第四行,需要打1个_
x=4,第五行,需要打0个_
可以总结出x与z关系:z=4-x,也就是第x+1行需要打印4-x次下画线,而你把打下画线循环的最大设为 y<5,那么第x+1行的初始值y=5-z=5-(4-x)=x+1,而如果初始值y=x,那么打印的次数z=5-y=5-x,当x=0,就是第一行就打5次下画线,自然是多了一次,其他行也一样

我觉用下面的方法写更好解理:
x 表得第几行,y表示该行要打多少个下画线
x=1,第一行,需要打4个_
x=2,第二行,需要打3个_
x=3,第三行,需要打2个_
x=4,第四行,需要打1个_
x=5,第五行,需要打0个_
可以总结出x与y关系:y=5-x,也就是第x行需要打印5-x次下画线
那么行循环可以这样写 for(int x=1;x<=5;x++)
打下画线的循环就可写成 for(int y=5-x;y>0;y--)

以上是自已的理解,希望对楼主有所帮助








作者: 张辉玉    时间: 2014-5-26 00:04
楼主我们一起加油
作者: yinxjfly    时间: 2014-5-26 01:04
class ShowTriangle
{
        public static void main(String[] args)
        {
                showTriangle(5);
        }
        public static void showTriangle(int linenum)
        {
                for(int x=0; x<linenum; x++)
                {
                        for(int y=x+1; y<linenum; y++)
                        {
                                System.out.print("-");
                        }
                        for(int z=0; z<=x; z++)
                        {
                                System.out.print("* ");
                        }
                        System.out.println("");
                }

        }
}

分析:
x控制行号,同时,每一行输出的图形个数也是又x控制,假定要输入5行(也就是每行输入的“图形”是五个),当y=x+1(y<行数),
就保证了没行输出的“-”正好比所在行数少一个,假定输出到了最后一行(此时行号为四),所以输出的“-”为0,
这就保证了控制台输出的图形正好贴边,没有多出的第一个“-”。
其实很简单,找张纸,自己代入一个数字,在纸上按程序流程画一遍就ok了!


作者: (_演绎、青春    时间: 2014-5-26 06:45
yinxjfly 发表于 2014-5-26 01:04
class ShowTriangle
{
        public static void main(String[] args)

嗯,好的,谢谢。
作者: (_演绎、青春    时间: 2014-5-26 07:05
西门吹风 发表于 2014-5-25 23:45
x+1 表得第几行,z表示该行要打多少个下画线
x=0,第一行,需要打4个_
x=1,第二行,需要打3个_

谢谢:handshake
作者: EDDY_Liang    时间: 2014-5-26 09:48
(_演绎、青春 发表于 2014-5-24 00:55
嗯,快一点点 你一周就学这么快啊 我看了好长时间才看到数组。现在又返回去多看几遍基础 ...

楼主。。我看了8天,学习到了面向对象里的this的应用了。。。。
我是零基础的:),你学了多久了啊??要加油啊

作者: (_演绎、青春    时间: 2014-5-26 10:11
EDDY_Liang 发表于 2014-5-26 09:48
楼主。。我看了8天,学习到了面向对象里的this的应用了。。。。
我是零基础的,你学了多久了啊??要加 ...

亲,你好厉害 我学了2个多星期了,才到数组那儿...  总是走着走着前面的就有点没印象了。然后折回去在看看。有啥好的方法啊,请教一下。你QQ多少 我加你好友
作者: EDDY_Liang    时间: 2014-5-26 11:00
(_演绎、青春 发表于 2014-5-26 10:11
亲,你好厉害 我学了2个多星期了,才到数组那儿...  总是走着走着前面的就有点没印象了。然后折回去在看 ...

382306167
你可以加我,我们以后有学习上的问题可以交流一下
作者: (_演绎、青春    时间: 2014-5-26 11:58
EDDY_Liang 发表于 2014-5-26 11:00
382306167
你可以加我,我们以后有学习上的问题可以交流一下

好的,我加你好友了。
作者: 格子、    时间: 2014-5-26 16:53
楼主,这个其实不用很纠结的,这个图形其实分为了两个部分,一个倒三角的空格,一个正三形,之所以贴边,是因为倒三角形最后一个没打印的缘故,你加了1就打印了,就自然不贴边了啊。
建议楼主多几遍视频,尝试这理解着去看代码,不是跟着视频敲一边就会了,理解很重要!
我也算是零基础学的,有一个月了,现在集合框架要学完了,可以一起交流学习哦。
作者: 为了明天    时间: 2014-5-26 21:09
楼主加油啊,我也是好多看不懂的
作者: (_演绎、青春    时间: 2014-5-27 19:39
格子、 发表于 2014-5-26 16:53
楼主,这个其实不用很纠结的,这个图形其实分为了两个部分,一个倒三角的空格,一个正三形,之所以贴边,是 ...

好的 谢谢你 没事的时候交流交流:handshake
作者: (_演绎、青春    时间: 2014-5-27 19:40
为了明天 发表于 2014-5-26 21:09
楼主加油啊,我也是好多看不懂的

亲,一起加油  你的技术分咋这么高哇 咋整的?
作者: ★魔_➩τ咒    时间: 2014-5-28 07:48
我也是刚开到这,觉得有点复杂!
作者: jiang_ming    时间: 2014-5-28 08:33
x控制*的个数,y循环控制-的个数,当x=4时,也就是第五行的时候,有5个*,而因为y=x+1,此时y=5,又因为y<5,所以此时y的循环不成立,也就不会打印“-”
作者: 为了明天    时间: 2014-5-28 09:09
(_演绎、青春 发表于 2014-5-27 19:40
亲,一起加油  你的技术分咋这么高哇 咋整的?

黑马币可以兑换技术分的,你这些够换10多分了
作者: 吴华清    时间: 2014-5-28 10:09
y=x+1后,y就为1了,而又令y<5,此时循环的次数只有四次。for语句里:判断的时候是先第一条语句,然后第二条语句,执行循环体再执行第三条语句,如此重复执行的。
作者: (_演绎、青春    时间: 2014-5-28 16:28
吴华清 发表于 2014-5-28 10:09
y=x+1后,y就为1了,而又令y

:handshake 谢谢朋友!
作者: Alan_Kwan    时间: 2014-5-28 18:30
遇到这种问题可以多在代码里面尝试,把循环的条件改小一点自己去走一下计算机的流程,就会明白了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2