C语言心型代码解析

方法一 心型极坐标方程

爱心代码你真的理解吗

笛卡尔的心型公式:
在这里插入图片描述

for (y = 1.5; y > -1.5; y -= 0.1) for (x = -1.5; x < 1.5; x += 0.05) 

代码里面用了二个for循环,第一个代表y轴,第二个代表x轴
在这里插入图片描述
在这里插入图片描述
二个增加的单位不同,能使得它不是长方形,正方形。
下面x轴增加的少,能使得打印出来的图像不是很方正。

在这里插入图片描述
看左边公示图。相当于x轴左移,拉宽了心形。

效果如下:
在这里插入图片描述
看左边公示图。相当于x轴左移,拉宽了心形。

带入公式: a = x * x + y * y - 1; 表达式 (a * a * a - x * x * y * y * y);
如果这个值大于0,说明在心形的范围内,打印出来。

代码如下:

if ((a * a * a - x * x * y * y * y) <= 0.0) {// 判断条件,如果表达式 (a * a * a - x * x * y * y * y) 的结果小于等于 0.0。printf("*");// 如果满足条件,打印一个星号,表示该坐标点在爱心图案内。} else {printf(" ");// 如果不满足条件,打印一个空格,表示该坐标点不在爱心图案内。}

注意:每行输出完我们我们要换行,所以for (y = 1.5; y > -1.5; y -= 0.1) {}每行输出完要加一个换行符号:

  printf("\n");// 内层循环结束后,打印一个换行符,开始下一行的输出。

整体代码:

#include <stdio.h>
// 引入标准输入输出头文件,用于使用输入输出函数如 printf。#include <Windows.h>
// 引入 Windows 系统相关的头文件,这里可能是为了使用 system 函数来设置控制台颜色。int main() {system("color 0c");// 调用 system 函数执行命令 "color 0c",设置控制台颜色为背景黑色,前景淡红色。float x, y, a;// 定义三个浮点型变量 x、y、a,用于存储坐标和中间计算结果。for (y = 1.5; y > -1.5; y -= 0.1) {// 外层循环,控制 y 的值从 1.5 逐渐减小到 -1.5,每次减少 0.1。这个循环将遍历爱心图案的纵向范围。for (x = -1.5; x < 1.5; x += 0.05) {// 内层循环,控制 x 的值从 -1.5 逐渐增加到 1.5,每次增加 0.05。这个循环将遍历爱心图案的横向范围。a = x * x + y * y - 1;// 计算变量 a 的值,a 是根据当前坐标 x 和 y 计算得到的中间结果。if ((a * a * a - x * x * y * y * y) <= 0.0) {// 判断条件,如果表达式 (a * a * a - x * x * y * y * y) 的结果小于等于 0.0。printf("*");// 如果满足条件,打印一个星号,表示该坐标点在爱心图案内。} else {printf(" ");// 如果不满足条件,打印一个空格,表示该坐标点不在爱心图案内。}}Sleep(150); //每行输出间隔150毫秒 printf("\n");// 内层循环结束后,打印一个换行符,开始下一行的输出。}return 0;// 主函数返回 0,表示程序正常结束。
}

简单的for循环嵌套 心型代码(for循环嵌套)(手机编译器也能运行)

1.程序分析

在这里插入图片描述

首先我们看这个心型分为二部分,上面前一二行到第三行是逐渐递增的。
在这里插入图片描述
是不是?😃

那么我们这里就可以分为二部分:

上半部分,星号递增和下半部分,星号递减

2. 首先定义个变量,后面会知道它的含义

int i, j; //后面for 计数用的int n = 6; // 可以调整心型的大小

这里定义了两个整型变量i和j,用于在后续的循环中控制迭代次数和作为计数器。

同时,定义了变量n并初始化为 6,这个变量的作用是控制心型图案的大小。可以通过修改n的值来调整心型图案的尺寸,更大的n值会使心型图案更加宽大,而较小的n值则会使心型图案更加紧凑。

3.上半部分星型代码分析

在这里插入图片描述


左边空格打印

在这里插入图片描述

首先假设我们这里初始设置n=6

    // 上半部分 左边空格for (i = n / 2; i <= n; i =i+2) {// 打印左边的空格for (j = 1; j < n - i; j =j+2) {printf(" ");}

我们看下执行过程:

  1. 初始设置 n = 6,外层循环 for (i = n / 2; i <= n; i = i + 2) 从 i = 6/2 = 3 开始,每次循环 i 增加 2,直到 i <= n(即 i <= 6)。

  2. 内层循环 for (j = 1; j < n - i; j = j + 2) 在每次外层循环执行时都会根据当前的 i 值来确定循环次数。

  3. 第一次外层循环(i = 3)
    此时,外层循环中 i = 3。
    进入内层循环,j 的循环条件是 j < n - i,即 j < 6 - 3 = 3。
    内层循环从 j = 1 开始,每次增加 2。所以,内层循环执行一次,打印一个空格。

  4. 第二次外层循环(i = 5)
    外层循环中 i = 5。
    进入内层循环,j 的循环条件变为 j < 6 - 5 = 1。实际上,内层循环不执行。

  5. 第三次外层循环(i = 6)
    外层循环中 i = 6。
    进入内层循环,j 的循环条件变为 j < 6 - 6 = 0。内层循环不执行

综上所述,这个代码片段的作用是在心型图案的上半部分,根据 i 的不同值,在每一行的开头打印特定数量的空格,随着 i 的增加,打印的空格数量逐渐减少,从而构建出心型上半部分的左边部分形状


以下是对这段代码中出现的 “n/2” 和 “j<n-i” 的解释:
一、为什么外层循环起始值是 n/2:
心型图案的结构特性:心型图案上半部分较为尖锐,从中间开始逐渐变宽。如果从 n 或者一个较大的值开始外层循环,会导致上半部分起始太宽,不符合心型的形状特征。而从 n/2 开始,可以让上半部分的循环从一个相对较窄的地方开始,逐渐向中间扩展,更符合心型的形状特点。

控制循环次数和对称性:选择 n/2 作为起始值,可以更好地控制上半部分的循环次数,使得上半部分的形状与下半部分相呼应,保证心型图案的对称性。如果起始值选择不当,可能会导致上半部分形状不自然或者循环次数过多或过少,影响心型图案的美观和准确性。

二、为什么内层循环条件是 j<n-i
构建心型形状:这个条件是为了控制每一行左边空格的数量。随着外层循环变量 i 的增加,心型上半部分逐渐变宽,需要打印的空格数量逐渐减少。通过 j<n-i 这个条件,当 i 增大时,n-i 的值变小,从而使得内层循环执行的次数减少,打印的空格数量也相应减少。

形成渐变效果:这种设计可以让心型上半部分从两边向中间逐渐变窄,形成一种渐变的效果。如果内层循环条件设置不当,可能会导致空格数量的变化不合理,影响心型图案的形状。例如,如果将条件改为 j<n,那么每行打印的空格数量将与 i 无关,无法形成心型上半部分的渐变效果。


左边星号打印

在这里插入图片描述

   // 打印左边的星号for (j = 1; j <= i; j++) {printf("*");}
  1. 循环条件
    循环初始条件为 j = 1,即从第一个位置开始考虑打印星号。
    循环条件为 j <= i,这意味着循环会持续进行直到 j 等于当前外层循环中的 i 值。当外层循环中的 i 增大时,这个循环会打印更多的星号,从而形成心型上半部分逐渐变宽的效果。

  2. 打印操作
    在循环体内,每次执行都会打印一个星号 printf(“*”);。这样,随着循环的进行,会连续打印出多个星号。
    例如,当外层循环中的 i 为 3 时,内层循环会执行 3 次,打印出三个星号。当 i 为 5 时,会打印出五个星号。通过这种方式,逐步构建出心型上半部分左边的星号部分,与前面打印的空格相结合,共同塑造心型的形状


现在完成上半部左边的了

在这里插入图片描述


中间的空格

在这里插入图片描述

   // 打印中间的空格for (j = 1; j <= n - i; j++) {printf(" ");}
  1. 循环条件
    循环初始条件为 j = 1,从第一个位置开始考虑打印空格。
    循环条件为 j <= n - i,这里随着外层循环中 i 的增大,n - i 的值会逐渐减小。这意味着随着心型图案上半部分的行数增加,中间的空格数量会逐渐减少。
  2. 打印操作
    在循环体内,每次执行都会打印一个空格 printf(" ");。这样,随着循环的进行,会连续打印出多个空格。
    例如,当外层循环中的 i 较小时,n - i 的值较大,会打印较多的空格,使得心型图案上半部分的左右两侧星号之间有较大的间隔。随着 i 的增大,中间的空格数量减少,左右两侧的星号逐渐靠近,形成心型上半部分逐渐变窄的效果。
  3. 总的来说,这段代码的作用是在当前行打印出适当数量的空格,作为心型上半部分左右两侧星号之间的间隔,通过控制空格的数量,与前面打印的左边星号和后面打印的右边星号共同构建出心型图案上半部分的形状。

右边的星号

在这里插入图片描述

前面的左边空格, 左边星号,中间空格我们已经打印出来了
所以直接j<=i 行号,打印星号就行了:

在这里插入图片描述

   // 打印右边的星号for (j = 1; j <= i; j++) {printf("*");}
  1. 循环条件分析
    循环初始条件为 j = 1,从第一个位置开始准备打印星号。
    循环条件为 j <= i,这里的 i 是外层循环中的变量,随着外层循环的进行不断变化。当 i 增大时,这个循环会打印更多的星号,与左边星号的数量保持一致。

  2. 打印操作的意义
    在循环体内,每次执行都会打印一个星号 printf(“*”);。这样,随着循环的进行,会连续打印出多个星号,形成心型图案上半部分右边的星号部分。

  3. 通过打印与左边星号数量相同的右边星号,使得心型图案上半部分在视觉上具有对称性。左右两边的星号和中间的空格共同构成了心型上半部分的形状。
    例如,当外层循环中的 i 为 4 时,内层循环会执行 4 次,打印出四个星号作为右边的星号部分。这与左边的四个星号相对应,中间再加上适当数量的空格,就呈现出心型上半部分的一部分形状。


上半部分完成了:
在这里插入图片描述

注意:我们每次一行结束了要换行,所以上半部分for循环最后加一个printf(“\n”)

上半部分循环代码:

 // 上半部分for (i = n / 2; i <= n; i += 2) {// 打印左边的空格for (j = 1; j < n - i; j += 2) {printf(" ");}
//// 打印左边的星号for (j = 1; j <= i; j++) {printf("*");}// 打印中间的空格for (j = 1; j <= n - i; j++) {printf(" ");}// 打印右边的星号for (j = 1; j <= i; j++) {printf("*");}printf("\n");}

4. 下边部分代码分析

在这里插入图片描述

我们是不是从最宽的往下递减了。

 // 下半部分for (i = n; i >= 1; i--) {// 打印左边的空格for (j = i; j < n; j++) {printf(" ");}// 打印星号for (j = 1; j <= (i * 2) - 1; j++) {printf("*");}printf("\n");}
  1. 下半部分整体循环
    外层循环 for (i = n; i >= 1; i–):
    这个循环控制心型图案的下半部分。它从 i = n 开始,逐步递减到 i = 1,这样可以从心型最宽的部分开始,逐渐向底部变窄,构建出心型的下半部分形状。
    随着 i 的减小,每一行的状态都会发生变化,从而实现心型下半部分的逐渐收缩。

  2. 打印左边的空格
    内层循环 for (j = i; j < n; j++):
    这个循环用于打印每一行左边的空格。随着 i 的减小,j 的循环次数逐渐增加,即左边的空格数量逐渐增多。
    这是因为当 i 较大时,代表当前行靠近心型的中部较宽处,此时左边的空格较少;而当 i 减小时,代表当前行靠近心型底部较窄处,左边的空格就需要增多,以形成心型下半部分的形状。

  3. 打印星号
    内层循环 for (j = 1; j <= (i * 2) - 1; j++):
    这个循环用于打印每一行的星号。随着 i 的减小,星号的数量也在逐渐减少。
    (i * 2) - 1 的计算方式确保了星号的数量与当前行的位置 i 相关联。当 i 较大时,星号数量较多;当 i 减小时,星号数量相应减少,符合心型下半部分逐渐变窄的形状要求。

  4. 换行操作
    printf(“\n”);:在每一行的星号打印完成后,进行换行操作,以便打印下一行的心型图案。

综上所述,这段代码通过两个内层循环和外层循环的配合,精确地控制了每一行左边空格和星号的数量,从而成功地构建出心型图案的下半部分。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/465253.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云原生开发】如何通过client-go来操作K8S集群

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

开源协议类型及长安链开源协议介绍

截至目前&#xff0c;我国参与国际开源社区协作的开发者数量排名全球第二并推出了众多社区活跃度较高的高质量开源项目&#xff0c;是全球开源生态的重要贡献力量&#xff0c;但在开源治理方面我国还处于发展初期&#xff0c;大部分开发者对开源的印象还限于开放代码、免费使用…

计算机网络:网络层 —— 边界网关协议 BGP

文章目录 路由选择协议动态路由协议边界网关协议 BGPBGP 的基本概念BGP-4 的四种报文 路由选择协议 因特网是全球最大的互联网&#xff0c;它所采取的路由选择协议具有以下三个主要特点&#xff1a; 自适应&#xff1a;因特网采用动态路由选择&#xff0c;能较好地适应网络状态…

Kubernetes——part9-2 kubernetes集群java项目上云部署

一、部署前准备工作 1.1 部署项目情况 1.1.1 业务部署架构 单体服务架构分布式服务架构微服务架构超微服务架构 1.1.2 项目涉及第三方服务 关系型数据库系统 MySQL缓存服务 Redis memcache协调服务 zookeeper消息中间件服务 kafka rabbitmq服务注册 服务发现 nacos 1.1.3…

基于SpringBoot的免税商品优选购物商城的设计与实现

一、项目背景 从古至今&#xff0c;通过书本获取知识信息的方式完全被互联网络信息化&#xff0c;但是免税商品优选购物商城&#xff0c;对于购物商城工作来说&#xff0c;仍然是一项非常重要的工作。尤其是免税商品优选购物商城&#xff0c;传统人工记录模式已不符合当前社会…

光伏无人机踏勘,照亮光伏未来!

光伏电站选址地分散在各地&#xff0c;想要精准获取该地的地形特点与屋顶面积等信息&#xff0c;传统的人工踏勘耗时耗力且精度无法保证&#xff0c;难以满足现代光伏项目的规模快发发展需求。光伏无人机踏勘&#xff0c;照亮光伏未来&#xff01; 在光伏无人机智能踏勘设计系统…

Angular引用控件类

说明&#xff1a; angular 在一个控件类里面&#xff0c;引入另外一个控件类&#xff0c;这样做的好处&#xff0c;就是代码分离&#xff0c;当你一个页面存在多少类似于独立的界面时&#xff0c;可以使用这种方式&#xff0c;分离代码 更好维护程序 效果图&#xff1a; step…

Android 面试题汇总

Android 面试题汇总 文章目录 Android 面试题汇总快手一面同程旅行一面快手二面虎牙二面蚂蚁一面 很多八股文的差不多&#xff0c;这里只汇总一些我不会的知识点 快手一面 tcp三次握手&#xff0c;最后一次失败&#xff0c;网络会怎么样&#xff1f; 如果第三次握手失败的时候…

SQL常见语法

select * from student; select&#xff1a;选取 from&#xff1a;来源 *&#xff1a;所有栏位 select 姓名&#xff0c;班级&#xff0c;成绩 from students; 选取特定栏位 select 姓名&#xff0c;班级&#xff0c;成绩 from students limit 5;--限制显示拦数 select 姓…

用ChatGPT提高工作效率,轻松搞定每天任务!

ChatGPT 在现代工作环境中的关键作用 随着数字化时代的到来&#xff0c;商业环境也进入了一个迅速发展的新时代&#xff0c;技术进步成为推动这一变革的核心力量。自动化和效率已不再是理想&#xff0c;而是企业保持竞争力的必备条件。在这一变化的过程中&#xff0c;人工智能…

程序员开发速查表

作为一名苦逼的程序员&#xff0c;在开发的过程中&#xff0c;我们总是在各种编程语言中来回穿梭&#xff0c;忙完后端整前端&#xff0c;还得做一部分的运维工作&#xff0c;忙的我们有时候忘记语法&#xff0c;忘记编写规则&#xff0c;甚至混淆。这时候我们就希望有一个综合…

【大数据学习 | kafka高级部分】kafka的快速读写

1. 追加写 根据以上的部分我们发现存储的方式比较有规划是对于后续查询非常便捷的&#xff0c;但是这样存储是不是会更加消耗存储性能呢&#xff1f; 其实kafka的数据存储是追加形式的&#xff0c;也就是数据在存储到文件中的时候是以追加方式拼接到文件末尾的&#xff0c;这…

Embedding模型部署及效果评测

最近大模型发展迅速&#xff0c;与之对应的向量化需求也被带动起来了&#xff0c;由此社区也衍生出很多模型&#xff0c;本文选几款&#xff0c;简单做下评测。 前置概念 为方便读者&#xff0c;先简单介绍几个概念。 概念1&#xff1a;Vector Embedding 也即向量化嵌入&am…

RDMA驱动学习(二)- command queue

为了实现用户对网卡硬件的配置&#xff0c;查询&#xff0c;或者执行比如create_cq等命令&#xff0c;mellanox网卡提供了command queue mailbox的机制&#xff0c;本节将以create_cq为例看下这个过程。 command queue&#xff08;后续简称cmdq&#xff09;是一个4K对齐的长度…

在docker里创建 bridge 网络联通不同容器

1.网络创建&#xff1a; docker network create --subnet192.168.1.0/24 --gateway192.168.1.1 uav_management 2.查看网络&#xff1a; docker network ls 3.给已经创建的容器分配ip: docker network connect --ip 192.168.1.10 uav_management 容器名/容器id 示例&#xf…

影响神经网络速度的因素- FLOPs、MAC、并行度以及计算平台

影响神经网络速度的四个主要因素分别是 FLOPs&#xff08;浮点操作数&#xff09;、MAC&#xff08;内存访问成本&#xff09;、并行度以及计算平台。这些因素共同作用&#xff0c;直接影响到神经网络的计算速度和资源需求。 1. FLOPs&#xff08;Floating Point Operations&a…

基于STM32单片机太阳能充电循迹避障小车

本设计基于STM32单片机太阳能充电循迹避障小车&#xff0c;以STM32单片机为微控制器核心&#xff0c;在太阳能板对车载电池充电情况下配合传感器能够实现循迹避障行驶的小车的设计过程。小车采用3.7V锂电池作为电源&#xff0c;太阳能板接入TP4056充电模块&#xff0c;使用MT36…

高效集成金蝶云星空销售出库单的解决方案

审核销售出库单(金蝶->金蝶)集成方案 在企业日常运营中&#xff0c;销售出库单的审核是一个关键环节。为了确保数据的准确性和及时性&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将金蝶云星空系统中的销售出库单数据无缝集成到另一个金蝶云星空系统中。本次案例将…

SpringBoot中使用RESTful风格

文章目录 SpringBoot中使用RESTful风格一、引言二、SpringBoot与RESTful风格1、RESTful风格简介2、SpringBoot中的RESTful注解2.1、代码示例 三、SpringBoot核心配置四、总结 SpringBoot中使用RESTful风格 一、引言 在现代Web开发中&#xff0c;RESTful架构风格因其简洁性和易…

DAY21|二叉树Part08|LeetCode: 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录 LeetCode: 669. 修剪二叉搜索树 基本思路 C代码 LeetCode: 108.将有序数组转换为二叉搜索树 基本思路 C代码 LeetCode: 538.把二叉搜索树转换为累加树 基本思路 C代码 LeetCode: 669. 修剪二叉搜索树 力扣代码链接 文字讲解&#xff1a;LeetCode: 669. 修剪二叉搜…