一文教你如何使用 for循环嵌套 ! 并且打印 各种三角形 与 菱形 !


 

        此链接通往 Bash Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:


1、嵌套的 for 循环 打印三角形!

       
本案例来自:https://blog.51cto.com/baidu/1882614

        就是很多大佬之前使用C语言打印 倒三角、正三角之类的… 现在使用 for 循环嵌套来实现 打印倒三角,正三角…

1.1、使用for嵌套循环 打印正三角形!

root@zhengzelin:~# cat d.sh 
#!/bin/bash
for((i=1;i<=5;i++))                                                                                                
do
for((star=1;star<=$i;star++))
do
echo -n  "*"
done
echo 
done

root@zhengzelin:~# ./d.sh 
*
**
***
****
*****


注意: 这里的 expression2 里面的表达式可以使用位置变量,首先先给一个值赋值为位置变量,下面说:
———————————————————————————————————————————————————————————————————————————————

使用位置变量:
root@zhengzelin:~# cat d.sh 
#!/bin/bash
num=$1
for((i=1;i<=$num;i++))                                                                                                
do
for((star=1;star<=$i;star++))
do
echo -n  "*"
done
echo 
done

root@zhengzelin:~# ./d.sh 5
*
**
***
****
*****
  解释:
root@zhengzelin:~# bash -x d.sh   (这里只列举前面两次循环!)
+ (( i=1 ))
+ (( i<=5 ))
+ (( star=1 ))
+ (( star<=1 ))
+ echo -n '*'
*+ (( star++ ))
+ (( star<=1 ))
+ echo
 
# 上面是第一次循环!   可以看出: 先执行的是 echo -n "*" (echo -n 输出 * 不换行),然后执行了一次 echo(输出的是换行)
所以第一次循环结束输出的结果是: *

+ (( i++ ))
+ (( i<=5 ))
+ (( star=1 ))
+ (( star<=2 ))
+ echo -n '*'
*+ (( star++ ))
+ (( star<=2 ))
+ echo -n '*'
*+ (( star++ ))
+ (( star<=2 ))
+ echo

# 上面是第二次循环!   可以看出:先执行一个 echo -n “*” ,然后又执行了一次 echo -n “*”;最好执行了一次 echo(输出的是换行)
所以第二次循环的输出结果就是:  **

两行加起来就是:
*
**

....直到循环结束!!!按照上面 expression 的范围:是执行5次!
所以循环结束的结果就是:
root@zhengzelin:~# ./d.sh 
*                         
**
***
****
*****

1.2、使用for嵌套循环 打印倒三角形!

# 这里使用位置变量;因为是倒三角,所以是从大到小,从多到少:使用递减:

root@zhengzelin:~# vim fortest.sh 
#!/bin/bash   
sum=$1
for((i=$sum;i>=1;i--))
do
 for((star=$i;star>=1;star--))
 do
 echo -n "*"
 done
echo
done

解释: 倒三角,上面为n,下面为1:使用递减,最大是 $sum,最少是1。
root@zhengzelin:~# ./c.sh 5
*****
****
***
**
*
# 当 i = sum = 5 的时候,star = 5,就这样递减下去。直到 i = 1、star = 1 结束循环

1.3、使用 for循环嵌套 打印等腰正三角:

一开始输出的正三角是这样的:
root@zhengzelin:~# ./d.sh 
*                         
**
***
****
*****

这里打印的是 直角三角形,那么换一种输出方式: 输出等腰三角形!

要求输出结果如下所示:
      *              1*
     ***             3
    *****            5
   *******           7 
  *********          9

嘿,这个三角形看着很舒服;当然要实现这种的输出,最起码要三个 for 循环来嵌套实现吧!

  
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

那么现在就该决定 这三个 for 循环是如何嵌套的?

根据上面那个三角形,我们大致可以知道都有哪些步骤!

执行顺序是:首先、执行 for 1 循环(作用:打印n个空格)
           接着、执行 for 2 循环(在for1 输出空格的基础上,输出 * 号)
           最后、执行 for 3 循环 (在 for1 空格 和 for 2 * 号的基础上,for 上实现换行操作!)
           
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

然后,上篇文章讲了 for 循环嵌套的格式;可以得知,三个 for 的格式为:

for 3            (最后执行.. 实现的作用是空行,so 它的cmd 是 echo 命令)
do     
         
    for 1        (第一个执行,作用是 打印 * 前面的空格,就用 ceho -n " " 来实现)
    dofor 1 语句开始...)
    echo -n " "for 1 循环的执行语句,来实现打印空格,具体打印几个空格,还是看 for 1 循环的表达式吧!)
    done        (for 1 语句结束!)
    
    for 2       (第二个执行..在 for1 打印出 空格的基础上,打印 * ,并且使用 echo -n "*" 取消换行功能...dofor 2 语句开始...)
    echo -n "*"for 2 的执行语句,具体输出几个 * ,就看 for 2 的条件表达式了) 
    done        ( for 2 语句结束...)
    
echo    (for 3 的语句,作用是 在 for 2 输出的* 号的后面实现换行功能...)
done    (for 3 语句执行结束!)

上面也说了,每个for循环的执行语句都已经知道了,现在就差定义 for循环的表达式了!

首先找一下这个的规律:

    *                当 i = 1 时,*1;空字符为 4***               当 i = 2 时,*3;空字符为 3*****              当 i = 3 时,*5;空字符为 2*******             当 i = 4 时,*7;空字符为 1*********            当 i = 5 时,*9;空字符为 0就像小学时候学的找规律一样:可以得出:
(" *的个数= i * 2 - 1 , 每行 * 前面空的字符个数 = i的最大值 - i)"

来实现一下:
1、首先实现打印 5 个空行;
root@zhengzelin:~# for((i=1;i<=5;i++));do echo ;done





2、实现一下 第一行 打印1* ,第二行 打印 3*...第五行 打印 9* ....
root@zhengzelin:~# for((i=1;i<=5;i++));do for((star=1;star<=$(( $i * 2 - 1 ));star++));do echo -n "*";done;echo ;done
*
***
*****
*******
*********

解释一下第二个for循环:for((star=1;star<=$(( $i * 2 - 1 ));star++));do echo -n "*";done;

首先 star=1,代表在第一行开始;与第一个for循环中的 i=1相互照应;
然后 表达式2 star<= $(( $i * 2 - 1 )) 这个是上面得到的规律,就是每行执行几次这个命令; 当i=1时,执行一次命令。当 i=2时,执行三次命令!

———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

那么就该最后一个步骤了;让他们都每行空开特定的字符!

咱们上面得知了 空字符 = i的取值范围最大值 - $i!
so ;继续套入进去:

root@zhengzelin:~# for((i=1;i<=5;i++));do for((blank=1;blank<=$((5-$i));blank++));do echo -n " ";done ;for((star=1;star<=$(( $i * 2 - 1 ));star++));do echo -n "*";done; echo ;done
    *
   ***
  *****
 *******
*********

 
 


 

2、使用 for 循环嵌套打印菱形:

输出要求如下:
root@zhengzelin:~# ./g.sh 5
    *
   ***
  *****
 *******
*********
 *******   1 0
  *****    2 1
   ***     3 2
    *       


这不就是一个 正的等腰三角形 + 倒等腰三角形 吗?

2.1、先输出一个正的等腰三角形:

#!/bin/bash                                                                                                              
sum=$1
for((i=1;i<=$sum;i++))
do
   for((blank=1;blank<=$(($sum - $i ));blank++))
   do
     echo -n " "
   done
   for((star=1;star<=$(( $i * 2 - 1 ));star++))
   do
     echo -n "*"
   done
echo
done

root@zhengzelin:~# ./e.sh 5
    *
   ***
  *****
 *******
*********

2.2、输出 倒等腰三角形

root@zhengzelin:~# cat h.sh 
#!/bin/bash
sum2=$2
for((a=$(( $sum2 - 1 ));a>=1;a--))
do
  for((b=1;b<=$(( $sum2 - $a));b++))
  do 
  echo -n " "
  done
  for((c=1;c<=$(( $a * 2 -1 ));c++))
  do
  echo -n "*"
  done
echo
done

root@zhengzelin:~# ./h.sh 5 
 *******
  *****
   ***
    *

2.3、将 两个三角形 合并成一个 菱形:

将两个脚本合并在一起即可!
root@zhengzelin:~# cat e.sh 
#!/bin/bash
sum=$1
for((i=1;i<=$sum;i++))
do 
   for((blank=1;blank<=$(($sum - $i ));blank++))
   do
     echo -n " "
   done
   for((star=1;star<=$(( $i * 2 - 1 ));star++))
   do
     echo -n "*"
   done
echo
done
sum2=$1
for((a=$(( $sum2 - 1 ));a>=1;a--))
do
  for((b=1;b<=$(( $sum2 - $a));b++))
    do 
    echo -n " "
    done
	  for((c=1;c<=$(( $a * 2 -1 ));c++))
	    do
	    echo -n "*"
	    done
echo
done


root@zhengzelin:~# ./e.sh 5 
    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *


 

for 循环的基础知识:

for 循环 嵌套的基础知识:

发布了99 篇原创文章 · 获赞 72 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ljlfather/article/details/105279073