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

C语言学习-循环嵌套打印字母金字塔

前言

最近博主也是在努力的学习C语言,在学习的过程当中碰到了一个对我来说的“难题”,足足控了我有半小时,不过这个问题也是挺有趣的,我也就借着本道题目来写一篇文章和大家交流交流

准备工作

  1. vs2022(其他编辑器当然也可以)
  2. c语言开发环境
  3. 勤劳的双手

开始

1.题目概览

原题是:

编写一个程序,提示用户输入大写字母,使用嵌套循环以下面金字塔的格式打印字母

打印这样的图形,要根据用户输入的字母来决定。例如,上面的图形是用户输入E后的结果。提示: 用外层循环处理行,每行使用三个内层循环,分别处理空格、以升序、以降序打印字母。

屏幕前的小伙伴们想到怎么做了吗?

ps:博主当时没有看到题目还有提示一直不知道怎么处理所以被硬控了很久,大家一定要仔细看清楚题目才行,不要像我一样

2.分析问题

观察图形发现,其实金字塔由三部分组成,如图所示一个有空格组成的红色三角形还有有一个升序字母组成的蓝色三角形,最后就是一个降序字母组成的绿色三角形(博主绘画水平不太好,见谅见谅)

解决红色三角形部分

首先我们要打印的就是红色三角形部分,首先定义一个外围的循环就是负责用来管理打印多少行的一个循环,那么我们怎么知道需要打印多少行呢?比如上文用户输入了E那么程序需要打印多少行合适?我们怎么去算出这个具体的行数呢?此时就需要借助ASCII码表了

img

查询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次是怎么来的(序号代表循环次数):

  1. i = 1
  2. i = 2
  3. i = 3
  4. i = 4
  5. 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语言&#xff0c;在学习的过程当中碰到了一个对我来说的“难题”&#xff0c;足足控了我有半小时&#xff0c;不过这个问题也是挺有趣的&#xff0c;我也就借着本道题目来写一篇文章和大家交流交流 准备工作 vs2022(其他编辑器当然也可以)c语…...

探索CI/CD:持续集成与持续部署的基本概念

在现代软件开发中&#xff0c;持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;已经成为提高开发效率和产品质量的关键实践。本文将详细介绍CI/CD的基本概念、优势以及如何在实际项目中实施CI/CD。 一、什么是持续集成&#xff08;CI&#xff09;&…...

大厂面试真题:说一说CMS和G1

CMS垃圾回收器四个主要步骤 初始标记阶段&#xff08;Initial Mark Phase&#xff09; 目的&#xff1a;标记老年代中所有从GC Roots直接可达的对象。特点&#xff1a;此阶段会导致STW&#xff08;Stop The World&#xff09;&#xff0c;即暂停应用程序的执行&#xff0c;但停…...

使用Qt Creator创建项目

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

C++ 与 C 的那些事儿:深度剖析两者区别

在编程的世界里&#xff0c;C 和 C 就像是一对有着紧密血缘关系却又各具特色的兄弟。对于很多初学者或者有一定编程经验的人来说&#xff0c;分清它们之间的差异至关重要。今天&#xff0c;我们就来深入探讨一下 C 和 C 的区别。 <1>、C 是一种静态类型的、编译式的、通…...

学习​Redis 高可用性​

Redis 高可用性&#xff08;High Availability&#xff09;是指在 Redis 系统中实现持续的可用性&#xff0c;即使在发生硬件故障或其他意外情况下&#xff0c;系统仍能保持运行。 Redis 高可用性&#xff08;High Availability&#xff09;是指在 Redis 系统中实现持续的可用性…...

【含开题报告+文档+PPT+源码】基于springBoot+vue超市仓库管理系统的设计与实现

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

美发店管理革新:SpringBoot系统的应用

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理美发门店管理系统的相关信息成为必然。开发…...

C++从0到1

左值和右值&#xff1a; 左值左值是可以位于赋值操作左边的表达式。意味着左值代表一个对象的身份内存中的具体位置。可以被取地址&#xff0c;并且可以位于赋值操作的左边或右边右值右值是不能位于赋值操作左边的表达式。右值代表一个对象的值&#xff0c;通常是一个临时对象…...

VMware Tools 安装和配置

1. 使用 ISO 映射文件&#xff0c;并且选择.iso文件 2. 启动虚拟机&#xff0c;如果 VMware Tools 是灰色的&#xff0c;那么卸载 open-vm-tools&#xff08;不要重装&#xff09;&#xff0c;重新启动虚拟机。卸载可以参考&#xff1a;重装 open-vm-tools-CSDN博客 3. 拷贝挂载…...

云原生化 - 基础镜像(简约版)

根据最佳实践的建议&#xff0c;每个容器只做一件事&#xff0c;并尽可能减少基础镜像的内容&#xff0c;这里列举一些常用的基础镜像&#xff0c;可供选择。&#xff08;完整版请查阅这里&#xff09; 基础镜像推荐 1. BusyBox 描述&#xff1a;一个包含了许多常用UNIX工具的…...

云计算相关

文章目录 一、虚拟化1、虚拟化技术概述特点 2、虚拟化与云化3、计算虚拟化分类与作用常见的计算服务架构 4、存储虚拟化5、网络虚拟化 二、行业管理规章制度1、服务器管理制度访问控制变更管理备份与恢复监控与审计 2、操作系统安全管理规范更新与补丁管理用户账号管理防火墙与…...

人机协作:科技与人类智慧的融合

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

keras yolo8目标检测

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

PowerJob做定时任务调度

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

前后端分离开发YApid

开头先声明以下&#xff0c;这篇主要用于概念的介绍…… 在当今的互联网应用开发中&#xff0c;前后端分离逐渐成为主流的开发模式。相比于传统的前后端混合开发&#xff0c;这种新模式在灵活性、可维护性和团队协作等方面具有显著优势。 前后端混合开发 在前后端混合开发模式…...

leetcode 22.括号生成

思路&#xff1a;dfs回溯 其实这道题看起来很像栈&#xff0c;但考虑到多种可能方案输出&#xff0c;我们需要用dfs来做。 乍一看好像没啥思路。我们可以从括号的特点入手&#xff0c;括号我们知道都是成对存在的&#xff0c;那么无论多少对括号&#xff0c;其实第一个符号肯…...

如何启动一个OpenSearch

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

自媒体工具箱 v1.0,支持涂抹加水印、无水印下载、加水印、消除原声、视频压缩

自媒体工具箱&#xff0c;打开App&#xff0c;非常干净清爽&#xff0c;只有视频工具板块&#xff0c;总共有11个功能&#xff0c;包括涂抹加水印、无水印下载、加水印、消除原声、视频压缩等功能。...

python 自学总结

# 这是一个代码的注释 注释可以使用# 一般而言#号后面要加空格表示规范&#xff0c;多行注释使用“”“ ”“”符合包裹 # type()这个是判断变量类型# 变量的形式 meny 50 # 自己定义叫标识符 不可以使用关键字 不可以用字母开头 规范性 下划线命名法 英文字母全部小写 …...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...