当前位置: 首页 > 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 # 自己定义叫标识符 不可以使用关键字 不可以用字母开头 规范性 下划线命名法 英文字母全部小写 …...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...