• Linux centos7 bash编程(循环与条件判断)


    在编程训练中,循环结构与条件判断十分重要。

    根据条件为真、为假,确定是否执行循环。

    有时,根据条件的真假结果,决定执行哪些语句,这就是分支语句

    为了训练分支语句与循环语句,我们设计一个案例:

    求一组数字:两数平方和为另一数平方

    符合条件时,有三个数:i和j,其平方和与k的平方相等。

            i*i+j*j==k*k

    或写作:

           i^{2}+j^2= k^2

    如果满足条件,我们将会有一组,共三个数字。

    如果有多组数字符合条件,将遇到一个棘手问题:如何同时存放相关几个数字,或更进一步,如何存放多组这类数字。这是各类高级编程语言要解决的基础操作。

    为了存储各类数据,python中设置了基本数据类型及组合数据类型。对于相关的多数据存储问题,首先要考虑的是列表(list)、元组(tuple)、集合(set)和字典(dict)。

    对于我们要解决的问题,可以考虑用元组(i,j,k),也可以用列表[k,(i,j)],更可以用字典{k:(i,j)}。

    而对于bash中解决这类问题,就不方便了。只能启用数组。为了训练,定义数组、运用数组、输出数组,如a((i0,j0,k0),(i1,j1,k1),…)

    下面结合代码,具体讨论数据的存储、使用等操作。

    一、python循环与条件判断

    由于符合条件的三个数比较多,我们仅求一定数据范围内的符合条件的一组数字。

    1.列表存储结果

    ls=[]

    for i in range(50,100):

        for j in range(50,100):

                for k in range(50,100):

                     if i**2 + j**2 == k**2:

                         ls.append((k,j,i))

    for i in range(len(ls)):

        print(ls[i])

    2.嵌套列表存储结果

    ls=[]

    for i in range(50,100):

        for j in range(50,100):

                for k in range(50,100):

                     if i**2 + j**2 == k**2:

                         ls.append((k,(j,i)))

    for i in range(len(ls)):

        print(ls[i])

    3.字典存储结果

    dict={}

    for i in range(40,99):

            for j in range(40,99):

                    for k in range(40,99):

                            if i**2+j**2 == k**2:

                                    dict[k]=(i,j)

    for key,value in dict.items():

            print(key,value)

    打印输出时,按k值输出,不存在重复问题。

     二、bash循环与条件判断

    求一组数,这是一个循环问题:

    用什么循环结构,for?while?

    循环初始条件、结束条件及循环方式

    具备什么条件,完成什么事情;具体什么条件,不做什么事情。

    循环离不开条件判断

    不同的条件,将产生不同的处理结果,这就是分支语句。

    具体什么条件,不做什么事情。可用continue语句,这是一类中断处理方式。

    下面的分析,以for循环为主。

    1.选择循环结构

    设计i,j,k为循环变量,取值范围1-50,用for循环表示,可以这样写(以i为例):

            for i in $(seq 50)

    也可以:

            for i in {1..50}

    或用C语言风格这样写:

            for((i=1;i<=50;i++)

    下面是循环执行的代码,用do标记开始,用done标记结束。最好各自占用一行,其内的代码要缩进,或按一次Tab键,或按4次空格键

    PS:同一脚本文件中,要统一使用缩进格式:用Tab,就一直用;用4个空格,就一直用。不能混用两种格式。有缩进的地方一定要缩进,否则会报错。

    2.条件判断与循环

    主要代码是

            k*k == i*i+j*j

    bash支持**和但不支持^。可用i*i或i**

    从表达式可以看到:

    如果表达式成立,交换一下i j也成立。

    如何保证仅有一个K值,而不是两个K值呢?

    两种手段:

    a.在代码中处理,第一组K值打印输出,第二组相同K值的不输出

    b.全部结果打印输出后,去掉重复的K值

    为了训练代码处理问题的手段,我们重点讨论输出后处理。

    a.输出时处理

    不输出第二次出现的K值,就需要对K值计数:

    第一次,打印输出;

    第二次,不输出

    设置计数可用变量count,也可以简写为cnt

    如何设计不打印输出呢?

    用echo,会多出空行。

    用echo打印输出其他内容,又显多余。

    如何处理?

    这就用到continue语句!

    当第二次出现k值时,什么都不做,continue继续下一次循环!

    b.输出后处理

    用sort进行排序,加-u去掉重复的K值

    3.输出格式

    在表达式成立时,如何输出ijk值,以什么格式输出?

    单独输出i j k,不合适,结果变成一系列数字

    把三个数字同时输出在一行?可以,但仍感觉有什么不妥。

    比较合适的格式是:

    K: (i,j)

    k后加不加:都可以;i j谁在前在后,都可以

    分析完毕,写一份代码,供参考。

    源代码

    输出后处理重复K

    for((i=1;i<=50;i++))

    do

        for((j=1;j<=50;j++))

        do

            for((k=1;k<=50;k++))

            do

                if [ $((i*i+j*j)) == $((k*k)) ]

                then

                   echo "$k: ($i $j)" >>k.txt

               fi

           done

        done

    done

    不去重效果

    与python去重一样,可用sort -u -t: -k1,1.2nr

    cat k.txt |sort -u -t: -k1,1.2nr

    小结

    对于多数据的存储,python方法较多,这与现代高级语言更注重数据处理有关。而bash注重语法与格式的严谨相关。在学习时,可以多多体会。

  • 相关阅读:
    电磁场知识回顾——重要方程,定理
    制药厂洁净室(区)环境监测各类问题汇总解答
    【MATLAB】 02 结构化程序与自定义函数
    Qt多线程的多种方法之一 QThread
    Rebex Total Pack 6.0 for .Net Crack
    RabbitMQ
    CSS总结
    MATLAB GUI录音信号的时域和频域分析
    电脑突然提示mfc140u.dll丢失,缺失mfc140u.dll无法运行程序的解决方法
    光线追踪7 - 抗锯齿(Antialiasing)
  • 原文地址:https://blog.csdn.net/qq_36142959/article/details/132638831