C语言学习-循环嵌套打印字母金字塔
前言
最近博主也是在努力的学习C语言,在学习的过程当中碰到了一个对我来说的“难题”,足足控了我有半小时,不过这个问题也是挺有趣的,我也就借着本道题目来写一篇文章和大家交流交流
准备工作
- vs2022(其他编辑器当然也可以)
- c语言开发环境
- 勤劳的双手
开始
1.题目概览
原题是:
编写一个程序,提示用户输入大写字母,使用嵌套循环以下面金字塔的格式打印字母
打印这样的图形,要根据用户输入的字母来决定。例如,上面的图形是用户输入E后的结果。提示: 用外层循环处理行,每行使用三个内层循环,分别处理空格、以升序、以降序打印字母。
屏幕前的小伙伴们想到怎么做了吗?
ps:博主当时没有看到题目还有提示一直不知道怎么处理所以被硬控了很久,大家一定要仔细看清楚题目才行,不要像我一样
2.分析问题
观察图形发现,其实金字塔由三部分组成,如图所示一个有空格组成的红色三角形还有有一个升序字母组成的蓝色三角形,最后就是一个降序字母组成的绿色三角形(博主绘画水平不太好,见谅见谅)
解决红色三角形部分
首先我们要打印的就是红色三角形部分,首先定义一个外围的循环就是负责用来管理打印多少行的一个循环,那么我们怎么知道需要打印多少行呢?比如上文用户输入了E那么程序需要打印多少行合适?我们怎么去算出这个具体的行数呢?此时就需要借助ASCII码表了
查询ASCII表我们发现大写字母A对应的十进制为65而大写字母E对应的十进制为69,两数相减可得 4 而我们观察上文打印图形行数为5行说明我们要将用户输入的大写字母减去大写字母A的ASCII十进制数值再加上1便得到了我们需要打印的行数,下面是代码实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main()
{int Number = 0; //初始化储存打印行数的变量char Letter = 'A'; //初始化储存用户输入字母的变量printf("请输入一个大写字母:");scanf("%c", &Letter); //获取用户输入的字母Number = Letter - 'A' + 1; //计算打印的行数printf("%d", Number);return 0;
}
如果没有问题的话你将看到如下输出
可以看到我们成功算出总共需要打印多少行了,那么行的问题解决了接下来怎么解决红色三角形的问题呢?其实不难
我们先解决外部大循环,在上文代码基础上我们增加一个外循环和一个内循环,代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main()
{int Number = 0; //初始化储存打印行数的变量char Letter = 'A'; //初始化储存用户输入字母的变量printf("请输入一个大写字母:");scanf("%c", &Letter); //获取用户输入的字母Number = Letter - 'A' + 1; //计算打印的行数for (int i = 1; i < Number + 1; i++){for (int j = 0; j < Number - i; j++){printf("1");}printf("\n");}return 0;
}
这里我使用了1代替空格这样看起来更直观一点,如果没问题的话你将看到如下输出(红色方框是为打印字母预留的位置)
这样其实我们已经完成了红色三角形部分,接下来要进行其他部分了
附:算法部分其实也简单,外循环部分看条件就知道,当用户输入E时Number被赋值5,相信有c语言基础的小伙伴都知道外循环会循环5次,这里也给不理解的小伙伴解释一下循环5次是怎么来的(序号代表循环次数):
- i = 1
- i = 2
- i = 3
- i = 4
- i = 5
注意i = 6时不满足设置的条件i < Number + 1,所以并不会进行第六次循环,但如果是<=的条件的话是会进行第六次循环的,如果实在不理解建议系统的去学习一下for循环的规则还有作用,打印空白部分其实原理也简单就是第一次循环的时候打印Number - i个空格,这里的i代表的是某一行例如打印第二行i就是2
ps: 每次打印完一行之后记得打印换行否则都挤在一行了
解决蓝色三角形部分
实际上这一部分也跟红色部分原理类似,只不过蓝色部分是将红色部分倒置过来的一个三角形,我们在红色部分代码的基础上再增加一个循环用来打印蓝色部分,代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main()
{int Number = 0; //初始化储存打印行数的变量char Letter = 'A'; //初始化储存用户输入字母的变量printf("请输入一个大写字母:");scanf("%c", &Letter); //获取用户输入的字母Number = Letter - 'A' + 1; //计算打印的行数for (int i = 1; i < Number + 1; i++){for (int j = 0; j < Number - i; j++){printf("1");}for (int k = 0; k < i; k++){printf("%c", 'A' + k);}printf("\n");}return 0;
}
如果没有问题你将看到以下输出:
这样我们蓝色部分也完成了,算法其实也是很简单的,只要观察好规律就不难了,观察可知我们每一行需要打印的字母数量都是当前行数,例如第一行就打印一个字母,第二行就打印两个字母以此类推,不过比较不容易实现的就是字母递增,如果不了解ASCII表的同学可能想不出来,其实我们只要定义一个新变量,这里我是k,将变量初始化为0,接着就是写一个for循环了,在代码里我也有体现出来,每次打印的字母为 'A' + k
例如第一行的时候就是打印 'A' + 0
也就是A, 第二行就是 'A' + 1
也就是B,不懂原理的同学去看一下ASCII表字母对应的十进制数值就明白了
那么蓝色部分完成了,接下来就要完成绿色部分了
解决绿色三角形部分
这部分我个人感觉是三部分里面最有挑战性的一部分了,不过理解透了以后其实也不是很难
我们观察图形可知绿色部分比蓝色部分少打印了一行,还有就是顺序是跟蓝色部分刚好反过来的
知道这些信息后我们开始写代码,新建一个for循环用于打印绿色部分,具体代码如下
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main()
{int Number = 0; //初始化储存打印行数的变量char Letter = 'A'; //初始化储存用户输入字母的变量printf("请输入一个大写字母:");scanf("%c", &Letter); //获取用户输入的字母Number = Letter - 'A' + 1; //计算打印的行数for (int i = 1; i < Number + 1; i++){char temp = 'A' + i - 2; //获取当前行打印的ASCII数值最大的字母for (int j = 0; j < Number - i; j++){printf("1");}for (int k = 0; k < i; k++){printf("%c", 'A' + k);}for (int l = 0; l < i - 1; l++){printf("%c", temp - l);}printf("\n");}return 0;
}
这里解释一下temp的用处,temp是用来获取当前行要打印的ASCII数值最大的字母的,比如在第二行,我们这一部分需要打印的最大ASCII数值最大的字母是A,而第三行是B,后续以此类推,那么我们怎么知道该行需要打印的最大ASCII数值的字母是哪个呢,这就需要算法来解决,我这里的算法就是A加上当前行数再减去2就可以获得,具体原理只可意会不可言传:P
还有比较不容易理解的地方就是为什么条件是 i -1
这是因为绿色部分要比蓝色部分少打印一行所以需要条件为 i - 1
例如第一行的时候我们绿色部分就不需要打印,此时 i = 1
那么减去 1 后就是 0 而绿色部分循环变量初始值也是0所以在第一行的时候循环就不会进行,因此也就不会打印字母
最后记得把红色部分打印的1换成空格
结尾
相信看完我的文章你已经学会了如何获取用户输入的字母并根据输入的字母打印一个字母金字塔了,感谢您的阅读,如果我的文章对您有帮助的话不妨点个赞还有收藏,分享给更多需要的人,或者您对本文章有什么看法或者问题欢迎留下评论,我也会积极回复大家的(如果有看到的话)
我的企鹅交流裙:934541995,欢迎大家来学习交流
相关文章:

C语言学习-循环嵌套打印字母金字塔
前言 最近博主也是在努力的学习C语言,在学习的过程当中碰到了一个对我来说的“难题”,足足控了我有半小时,不过这个问题也是挺有趣的,我也就借着本道题目来写一篇文章和大家交流交流 准备工作 vs2022(其他编辑器当然也可以)c语…...
探索CI/CD:持续集成与持续部署的基本概念
在现代软件开发中,持续集成(CI)和持续部署(CD)已经成为提高开发效率和产品质量的关键实践。本文将详细介绍CI/CD的基本概念、优势以及如何在实际项目中实施CI/CD。 一、什么是持续集成(CI)&…...
大厂面试真题:说一说CMS和G1
CMS垃圾回收器四个主要步骤 初始标记阶段(Initial Mark Phase) 目的:标记老年代中所有从GC Roots直接可达的对象。特点:此阶段会导致STW(Stop The World),即暂停应用程序的执行,但停…...

使用Qt Creator创建项目
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 使用Qt Creator创建项目 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 温馨提示: 1. 新…...

C++ 与 C 的那些事儿:深度剖析两者区别
在编程的世界里,C 和 C 就像是一对有着紧密血缘关系却又各具特色的兄弟。对于很多初学者或者有一定编程经验的人来说,分清它们之间的差异至关重要。今天,我们就来深入探讨一下 C 和 C 的区别。 <1>、C 是一种静态类型的、编译式的、通…...
学习Redis 高可用性
Redis 高可用性(High Availability)是指在 Redis 系统中实现持续的可用性,即使在发生硬件故障或其他意外情况下,系统仍能保持运行。 Redis 高可用性(High Availability)是指在 Redis 系统中实现持续的可用性…...

【含开题报告+文档+PPT+源码】基于springBoot+vue超市仓库管理系统的设计与实现
开题报告 随着电子商务的快速发展和物流行业的日益壮大,超市仓库管理系统的重要性也日益凸显。传统的超市仓库管理方式存在许多问题,比如人工操作繁琐、数据统计不准确、管理效率低下等。因此,需要设计和实现一个高效、智能的超市仓库管理系…...

美发店管理革新:SpringBoot系统的应用
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理美发门店管理系统的相关信息成为必然。开发…...
C++从0到1
左值和右值: 左值左值是可以位于赋值操作左边的表达式。意味着左值代表一个对象的身份内存中的具体位置。可以被取地址,并且可以位于赋值操作的左边或右边右值右值是不能位于赋值操作左边的表达式。右值代表一个对象的值,通常是一个临时对象…...

VMware Tools 安装和配置
1. 使用 ISO 映射文件,并且选择.iso文件 2. 启动虚拟机,如果 VMware Tools 是灰色的,那么卸载 open-vm-tools(不要重装),重新启动虚拟机。卸载可以参考:重装 open-vm-tools-CSDN博客 3. 拷贝挂载…...
云原生化 - 基础镜像(简约版)
根据最佳实践的建议,每个容器只做一件事,并尽可能减少基础镜像的内容,这里列举一些常用的基础镜像,可供选择。(完整版请查阅这里) 基础镜像推荐 1. BusyBox 描述:一个包含了许多常用UNIX工具的…...
云计算相关
文章目录 一、虚拟化1、虚拟化技术概述特点 2、虚拟化与云化3、计算虚拟化分类与作用常见的计算服务架构 4、存储虚拟化5、网络虚拟化 二、行业管理规章制度1、服务器管理制度访问控制变更管理备份与恢复监控与审计 2、操作系统安全管理规范更新与补丁管理用户账号管理防火墙与…...

人机协作:科技与人类智慧的融合
随着科技的飞速发展,越来越多的领域开始借助人工智能(AI)和自动化技术来提升工作效率。人机协作(Human-Machine Collaboration)这一概念逐渐成为现代技术进步的核心。它不仅改变了我们的工作方式,也在重新定…...

keras yolo8目标检测
是从coco数据集提取其中的veh_ids[3,6,8,10] labels[car,bus,truck,traffic light]来做目标检测,分别表示汽车,公交车,卡车,交通灯,用的backbone keras_cv.models.YOLOV8Backbone.from_preset( "yolo_v8_m_backbone_coco" ),不用预训练…...

PowerJob做定时任务调度
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、区别对比二、使用步骤1. 定时任务类型2.PowerJob搭建与部署 前言 提示:这里可以添加本文要记录的大概内容: PowerJob是基于java开…...

前后端分离开发YApid
开头先声明以下,这篇主要用于概念的介绍…… 在当今的互联网应用开发中,前后端分离逐渐成为主流的开发模式。相比于传统的前后端混合开发,这种新模式在灵活性、可维护性和团队协作等方面具有显著优势。 前后端混合开发 在前后端混合开发模式…...
leetcode 22.括号生成
思路:dfs回溯 其实这道题看起来很像栈,但考虑到多种可能方案输出,我们需要用dfs来做。 乍一看好像没啥思路。我们可以从括号的特点入手,括号我们知道都是成对存在的,那么无论多少对括号,其实第一个符号肯…...

如何启动一个OpenSearch
创建两个集群,标注 不含备用节点 选择集群版本和配置集群版本 冷热存储和专用主节点这个按需开启 然后是网络,是否使用自定义域名,集群开在VPC还是公网上。 选择是否开启认证: 访问策略,其实就是资源策略 维护时段…...

自媒体工具箱 v1.0,支持涂抹加水印、无水印下载、加水印、消除原声、视频压缩
自媒体工具箱,打开App,非常干净清爽,只有视频工具板块,总共有11个功能,包括涂抹加水印、无水印下载、加水印、消除原声、视频压缩等功能。...
python 自学总结
# 这是一个代码的注释 注释可以使用# 一般而言#号后面要加空格表示规范,多行注释使用“”“ ”“”符合包裹 # type()这个是判断变量类型# 变量的形式 meny 50 # 自己定义叫标识符 不可以使用关键字 不可以用字母开头 规范性 下划线命名法 英文字母全部小写 …...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...