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(" ");}
我们看下执行过程:
-
初始设置 n = 6,外层循环 for (i = n / 2; i <= n; i = i + 2) 从 i = 6/2 = 3 开始,每次循环 i 增加 2,直到 i <= n(即 i <= 6)。
-
内层循环 for (j = 1; j < n - i; j = j + 2) 在每次外层循环执行时都会根据当前的 i 值来确定循环次数。
-
第一次外层循环(i = 3)
此时,外层循环中 i = 3。
进入内层循环,j 的循环条件是 j < n - i,即 j < 6 - 3 = 3。
内层循环从 j = 1 开始,每次增加 2。所以,内层循环执行一次,打印一个空格。 -
第二次外层循环(i = 5)
外层循环中 i = 5。
进入内层循环,j 的循环条件变为 j < 6 - 5 = 1。实际上,内层循环不执行。 -
第三次外层循环(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("*");}
-
循环条件
循环初始条件为 j = 1,即从第一个位置开始考虑打印星号。
循环条件为 j <= i,这意味着循环会持续进行直到 j 等于当前外层循环中的 i 值。当外层循环中的 i 增大时,这个循环会打印更多的星号,从而形成心型上半部分逐渐变宽的效果。 -
打印操作
在循环体内,每次执行都会打印一个星号 printf(“*”);。这样,随着循环的进行,会连续打印出多个星号。
例如,当外层循环中的 i 为 3 时,内层循环会执行 3 次,打印出三个星号。当 i 为 5 时,会打印出五个星号。通过这种方式,逐步构建出心型上半部分左边的星号部分,与前面打印的空格相结合,共同塑造心型的形状
现在完成上半部左边的了

中间的空格

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

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

// 打印右边的星号for (j = 1; j <= i; j++) {printf("*");}
-
循环条件分析
循环初始条件为 j = 1,从第一个位置开始准备打印星号。
循环条件为 j <= i,这里的 i 是外层循环中的变量,随着外层循环的进行不断变化。当 i 增大时,这个循环会打印更多的星号,与左边星号的数量保持一致。 -
打印操作的意义
在循环体内,每次执行都会打印一个星号 printf(“*”);。这样,随着循环的进行,会连续打印出多个星号,形成心型图案上半部分右边的星号部分。 -
通过打印与左边星号数量相同的右边星号,使得心型图案上半部分在视觉上具有对称性。左右两边的星号和中间的空格共同构成了心型上半部分的形状。
例如,当外层循环中的 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");}
-
下半部分整体循环
外层循环 for (i = n; i >= 1; i–):
这个循环控制心型图案的下半部分。它从 i = n 开始,逐步递减到 i = 1,这样可以从心型最宽的部分开始,逐渐向底部变窄,构建出心型的下半部分形状。
随着 i 的减小,每一行的状态都会发生变化,从而实现心型下半部分的逐渐收缩。 -
打印左边的空格
内层循环 for (j = i; j < n; j++):
这个循环用于打印每一行左边的空格。随着 i 的减小,j 的循环次数逐渐增加,即左边的空格数量逐渐增多。
这是因为当 i 较大时,代表当前行靠近心型的中部较宽处,此时左边的空格较少;而当 i 减小时,代表当前行靠近心型底部较窄处,左边的空格就需要增多,以形成心型下半部分的形状。 -
打印星号
内层循环 for (j = 1; j <= (i * 2) - 1; j++):
这个循环用于打印每一行的星号。随着 i 的减小,星号的数量也在逐渐减少。
(i * 2) - 1 的计算方式确保了星号的数量与当前行的位置 i 相关联。当 i 较大时,星号数量较多;当 i 减小时,星号数量相应减少,符合心型下半部分逐渐变窄的形状要求。 -
换行操作
printf(“\n”);:在每一行的星号打印完成后,进行换行操作,以便打印下一行的心型图案。
综上所述,这段代码通过两个内层循环和外层循环的配合,精确地控制了每一行左边空格和星号的数量,从而成功地构建出心型图案的下半部分。
相关文章:
C语言心型代码解析
方法一 心型极坐标方程 爱心代码你真的理解吗 笛卡尔的心型公式: for (y 1.5; y > -1.5; y - 0.1) for (x -1.5; x < 1.5; x 0.05) 代码里面用了二个for循环,第一个代表y轴,第二个代表x轴 二个增加的单位不同,能使得…...
【LeetCode】【算法】647. 回文子串
LeetCode 647.回文子串 题目描述 给你一个字符串s,请你统计并返回这个字符串中回文子串的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串是字符串中的由连续字符组成的一个序列。 思路 思路:中心拓展法 中心拓展法的意思是说…...
介绍6种常见的基于知识图谱推荐算法的类型和各自的优缺点
基于知识图谱的推荐算法有多种,每种算法各有其优点和缺点。下面是一些常见的基于知识图谱的推荐算法及其分析: 基于邻域的协同过滤(Collaborative Filtering) 描述:通过分析用户之间的相似性或项目之间的相似性来进行…...
使用python拟合二元曲线系数
python import numpy as np import pandas as pd注: xlsx 表格中 有 压力P,流量值Q,温度值 K; df pd.read_excel("./i100-10000slm.xlsx",usecols[p1,molboxQm,Dek]) #print(df.head())#column_data df[p1] # 获取行数…...
go 集成viper 配置管理
安装viper go get github.com/spf13/viper 配置文件 读取配置文件 package confimport ("fmt""github.com/spf13/viper" )func Properties() {viper.SetConfigName("application")viper.SetConfigType("yml")viper.AddConfigPath(&q…...
Java:数据结构-再谈String类
字符串常量池 首先我们来思考这段代码,为什么运行结果一个是true,一个是false呢? public class Test {public static void main(String[] args) {String s1"123";String s2"123";String s3new String("555")…...
斗破QT编程入门系列之二:GUI应用程序设计基础:UI文件(四星斗师)
斗破Qt目录: 斗破Qt编程入门系列之前言:认识Qt:Qt的获取与安装(四星斗师) 斗破QT编程入门系列之一:认识Qt:初步使用(四星斗师) 斗破QT编程入门系列之二:认识…...
微服务实战系列之玩转Docker(十八)
导览 前言Q:如何保障容器云环境下etcd集群的数据安全一、安全机制身份认证必学必看1. 启动参数2. 授权命令3. 开启认证 二、应用实践1. 访问容器2. 查看认证是否开启3. 查看是否已创建用户4. 创建用户5. 开启认证6. 验证是否开启7. 验证数据 结语系列回顾 前言 etc…...
Javascript 获取设备信息 工具
JS获取设备信息(操作系统信息、地理位置、UUID、横竖屏状态、设备类型、网络状态、浏览器信息、生成浏览器指纹、日期、生肖、周几等) Get Device Info Online GitHub - skillnull/DeviceJs: JS获取设备信息(操作系统信息、地理位置、UUID、横竖屏状态、设备类型、网络状态、浏…...
基于开源 AI 智能名片、S2B2C 商城小程序的用户获取成本优化分析
摘要:本文围绕用户获取成本(CAC)这一关键指标展开深入剖析,详细阐述其计算方式,并紧密结合开源 AI 智能名片与 S2B2C 商城小程序的独特性质,从多个维度探讨如何通过挖掘新的获客渠道、巧妙运用私域流量池等…...
仿真APP助力汽车零部件厂商打造核心竞争力
汽车零部件是汽车工业的基石,是构成车辆的基础元素。一辆汽车通常由上万件零部件组成,包括发动机系统、传动系统、制动系统、电子控制系统等,它们共同确保了汽车的安全、可靠性及高效运行。 在汽车产业快速发展的今天,汽车零部件…...
vue实现websocket实时短消息通知
1、原理 websocket就是通过服务器向客户端推送消息,客户端也可以主动向服务器发送消息,是真正的双向平等对话,是一种长连接,只需要通过一次请求进行初始化。 2、事件 onopen: 客户端和服务器建立连接后触发,被称为客…...
tinymce扩展功能:1、行高、段落间距、格式刷;2、视频上传进度条;3、对复制的图片设置尺寸
tinymce扩展功能:1、行高、段落间距、格式刷;2、视频上传进度条;3、对复制的图片设置尺寸 一、需求描述二、行高、段落间距、格式刷插件三、实现视频上传的进度条、对复制的图片设置尺寸 一、需求描述 使用技术: vue2 tinymce5.…...
计算机毕业设计Python+图神经网络手机推荐系统 手机价格预测 手机可视化 手机数据分析 手机爬虫 Django Flask Spark 知识图谱
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
WPF的<ContentControl>控件
在WPF(Windows Presentation Foundation)中,<ContentControl>是一个非常有用的控件,它允许你将内容放入一个控件中,这个内容可以是任何对象。ContentControl的主要特点是它有一个Content属性,你可以将…...
Python并发编程——multiprocessing
目录 1. 引言1.1 并发与并行的区别 2. 多进程开发2.1 Process 类的常用方法2.2 进程的生命周期与同步 3. 进程之间的数据共享3.1 使用 Value 和 Array3.2 使用 Manager 实现高级数据共享 4. 进程锁4.1 更复杂的锁应用4.2 锁的死锁与避免4.3 信号量与条件变量 5. 进程池5.1 imap…...
智能家居的未来:AI让生活更智能还是更复杂?
内容概要 智能家居的概念源于将各种家居设备连接到互联网,并通过智能技术进行控制和管理。随着人工智能的迅速发展,这一领域也迎来了前所未有的机遇。从早期简单的遥控器到如今可以通过手机应用、语音助手甚至是环境感应进行操作的设备,智能…...
【物联网技术】ESP8266 WIFI模块在AP模式下作为TCP服务器与多个电脑/手机网络助手(TCP客户端)通信——TCP数据透传
前言:完成ESP8266 WIFI模块在AP模式下作为TCP服务器与多个电脑/手机网络助手(TCP客户端)通信——实现TCP数据透传 AP模式,通俗来说模块可以发出一个WIFI热点提供给电脑/手机连接。 TCP服务端,通俗来说就是模块/单片机作为服务器,可以接收多个客户通道的连接。 本…...
十五:java web(7)-- Spring Boot
目录 1. Spring Boot 简介 1.1 简介 1.2 Spring Boot 的特点 1.3 Spring Boot 和 Spring 的关系 2. Spring Boot 快速入门 2.1 创建第一个 Spring Boot 项目 3. Spring Boot 配置管理 3.1 application.properties 和 application.yml 配置 这两种都可以 好像现在更推荐…...
洛谷每日一题——P1036 [NOIP2002 普及组] 选数、P1045 [NOIP2003 普及组] 麦森数(高精度快速幂)
P1036 [NOIP2002 普及组] 选数 题目描述 [NOIP2002 普及组] 选数 - 洛谷 运行代码 #include <stdio.h> int n, k, a[25], t; int ss(int b) {int i;if (b < 2)return 0;for (i 2; i * i < b; i)if (b % i 0)return 0;return 1; } void dfs(int num, int sum, …...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
