当前位置: 首页 > news >正文

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. 代码解释:

1)输入验证:使用正则表达式和算术运算确保输入为正奇数。

2)菱形结构分解:

  1. 中间行号 mid = (n+1)/2。
  2. 上半部分:从第1行到中间行,每行星号数递增(1,3,5...)。
  3. 下半部分:从中间行-1到第1行,每行星号数递减。

3)字符串构造:

  1. 空格数 = 中间行号 - 当前行号。
  2. 星号数 = 2×当前行号 – 1。
  3. 使用 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理论知识点

  1. Shell脚本基础:变量赋值、算术运算 $(( ))、条件判断 [[ ]]。
  2. 字符串操作:printf 格式化输出、参数扩展 ${var//pattern/replacement}。
  3. 循环控制:for 循环语法、C风格循环 ((i=1; i<=n; i++))。
  4. 输入输出:read 命令交互式输入、echo 输出重定向。

2)实现难点

  1. 对称性控制:确保上下半部分空格和星号数量严格对称。
  2. 字符串拼接:Shell中需通过子shell或循环生成重复字符。
  3. 错误处理:对非数字输入和偶数的健壮性验证。
http://www.dtcms.com/a/274324.html

相关文章:

  • python学习DataFrame数据结构
  • 制作一款打飞机游戏79:道具拾取系统
  • c++设计模式:简单工厂模式
  • C++STL-list
  • 游戏的程序员会不会偷偷改自己账号的数据?
  • 线性回归的从零开始实现(详解部分疑问)
  • 【三】ObservableCollection 与 List 的区别
  • RK3566/RK3568 Android11 CAN开发(内核配置+测试验证+安卓app开发)
  • 2025 年第十五届 APMCM 亚太地区大学生数学建模竞赛C题 基于Quantum Boosting的二分类模型问题
  • 5G标准学习笔记15 --CSI-RS测量
  • 【龙泽科技】新能源汽车维护与动力蓄电池检测仿真教学软件【吉利几何G6】
  • 深入理解C语言内存空间、函数指针(三)(重点是函数指针)
  • Redis 主从复制及哨兵模式模拟部署
  • 3.检查函数 if (!CheckStart()) return 的妙用 C#例子
  • PBR渲染
  • 【网络安全】理解安全事件的“三分法”流程:应对警报的第一道防线
  • leaflet【十二】自定义图层——海量数据加载
  • 安全监测预警平台的应用场景
  • 机器学习数据集加载全攻略:从本地到网络
  • Git Submodule 介绍和使用指南
  • FS820R08A6P2LB——英飞凌高性能IGBT模块,驱动高效能源未来!
  • Vscode 下载远程服务器失败解决方法
  • Jenkins 版本升级与插件问题深度复盘:从 2.443 到 2.504.3 及功能恢复全解析
  • 和鲸社区深度学习基础训练营2025年关卡2(3)pytorch
  • 限流算法
  • GT IP核仿真测试
  • 关于大模型引用特定网页或文章的思考
  • 稳石氢能受邀参加亚洲氢能与燃料电池技术应用论坛,荣获2025中国制氢装备技术创新企业。
  • P1484 种树,特殊情形下的 WQS 二分转化。
  • 【leetcode】1486. 数组异或操作