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

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

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

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

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

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

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

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

或写作:

如果满足条件,我们将会有一组共三个数字,如果有多组数字符合条件,将遇到一个棘手问题:如何同时存放相关三几个数字,如何存放多组这类数字。这是各类语言要解决的重要课题。

为了存储各类数据,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注重语法与格式的严谨相关。在学习时,可以多多体会。

相关推荐
小林熬夜学编程4 分钟前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
m0_748236117 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
炫彩@之星8 分钟前
Windows和Linux安全配置和加固
linux·windows·安全·系统安全配置和加固
上海运维Q先生9 分钟前
面试题整理15----K8s常见的网络插件有哪些
运维·网络·kubernetes
倔强的石头10615 分钟前
【C++指南】类和对象(九):内部类
开发语言·c++
老大白菜16 分钟前
Python 爬虫技术指南
python
hhhhhhh_hhhhhh_18 分钟前
ubuntu18.04连接不上网络问题
linux·运维·ubuntu
Watermelo61720 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
冷心笑看丽美人26 分钟前
探秘 DNS 服务器:揭开域名解析的神秘面纱
linux·运维·服务器·dns
wenxiaocsdn31 分钟前
某科技局国产服务器PVE虚拟化技术文档
运维·服务器