Linux编程练习题1:打印图形
1.shell编程:编写一个shell脚本,输入一个奇数,打印对应行数的菱形,如输入5,则打印的图片是:
(1)题目解析:
本题要求用Shell脚本根据输入奇数n打印n行菱形。我认为核心思路是将菱形拆分为上下两个等腰三角形:上半部分行号从1递增至中间行,下半部分从中间行-1递减至1。每行星号数=2×行号-1,空格数=中间行-当前行号。可以通过双重循环分别生成两部分,结合printf和字符串拼接实现格式化输出。
关键点在于输入验证(确保奇数)和对称性控制,涉及Shell算术运算、循环控制及字符串操作等知识点。
(2)程序代码:
#!/bin/bash# 读取输入并验证是否为奇数read -p "您好,请输入一个奇数: " nif ! [[ "$n" =~ ^[0-9]+$ ]] || [ $((n % 2)) -eq 0 ]; thenecho "您的输入有错误:输入必须为正奇数。"exit 1fimid=$(( (n + 1) / 2 )) # 计算中间行# 生成上半部分菱形for ((i=1; i<=mid; i++)); dospaces=$(( mid - i ))stars=$(( 2*i - 1 ))# 生成空格和星号字符串space_str=$(printf "%*s" $spaces)star_str=$(printf "%0.s*" $(seq 1 $stars))echo "${space_str// / }${star_str}"done# 生成下半部分菱形for ((i=mid-1; i>=1; i--)); dospaces=$(( mid - i ))stars=$(( 2*i - 1 ))space_str=$(printf "%*s" $spaces)star_str=$(printf "%0.s*" $(seq 1 $stars))echo "${space_str// / }${star_str}"done
将上述代码保存为Shell的脚本文件diamond.sh。
代码解释:
1)输入验证:使用正则表达式和算术运算确保输入为正奇数。
2)菱形结构分解:
- 中间行号 mid = (n+1)/2。
- 上半部分:从第1行到中间行,每行星号数递增(1,3,5...)。
- 下半部分:从中间行-1到第1行,每行星号数递减。
3)字符串构造:
- 空格数 = 中间行号 - 当前行号。
- 星号数 = 2×当前行号 – 1。
- 使用 printf 生成空格,seq 生成重复星号。
(4)程序分析:
1)开始:程序启动。
2)提示输入:显示提示信息,要求用户输入一个奇数。
3)读取输入:捕获用户输入的值。
4)验证是否为数字:
若输入非数字(如字母、符号),则显示错误信息并结束程序。若输入为数字,则进入下一步验证。
5)验证是否为奇数:
若输入为偶数,则显示错误信息并结束程序。若输入为奇数,则计算菱形的中间行号 mid。
6)生成上半部分菱形:
循环从第1行到中间行号 mid。每行计算空格数(mid - 当前行号)和星号数(2×当前行号 - 1)。生成对应数量的空格和星号,拼接后输出。
7)生成下半部分菱形:
循环从中间行号-1递减到第1行。每行计算空格数(mid - 当前行号)和星号数(2×当前行号 - 1)。生成对应数量的空格和星号,拼接后输出。
8)结束:程序执行完毕。
可制作流程图,如下图所示:
(5)运行结果:
1)测试1:
当输入数字为5时,预计输出为5行的菱形,实际输出如下图所示:
2)测试2:
当输入数字为1时,预计输出为单星号,实际输出如下图所示:
3)测试3
当输入数字为7时,预计输出为7行的菱形,实际输出如下图所示:
4)测试4
当输入数字为4时,预计输出错误提示,实际输出如下图所示:
5)测试5
当输入数字为abc时,预计输出错误提示,实际输出如下图所示:
(6)结果分析:
测试用例 | 输入 | 预期输出 | 实际输出 | 结果 |
正常输入 | 5 | 5行菱形 | √ 匹配 | 通过 |
边界值 | 1 | 单星号 | √ 匹配 | 通过 |
较大奇数 | 7 | 7行菱形 | √ 匹配 | 通过 |
偶数输入 | 4 | 错误提示 | √ 匹配 | 通过 |
非法字符 | abc | 错误提示 | √ 匹配 | 通过 |
由此可知,程序比较好地完成了题目要求。在基于上述测试结果的基础上,对本程序进行总结分析如下:
1)本程序涉及的Linux理论知识点
- Shell脚本基础:变量赋值、算术运算 $(( ))、条件判断 [[ ]]。
- 字符串操作:printf 格式化输出、参数扩展 ${var//pattern/replacement}。
- 循环控制:for 循环语法、C风格循环 ((i=1; i<=n; i++))。
- 输入输出:read 命令交互式输入、echo 输出重定向。
2)实现难点
- 对称性控制:确保上下半部分空格和星号数量严格对称。
- 字符串拼接:Shell中需通过子shell或循环生成重复字符。
- 错误处理:对非数字输入和偶数的健壮性验证。