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.mzph.cn/news/885230.shtml

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

相关文章

JVM 由多个模块组成,每个模块负责特定的功能

Java虚拟机&#xff08;JVM, Java Virtual Machine&#xff09;是一个抽象的计算机&#xff0c;它提供了一个运行环境&#xff0c;使得Java字节码可以在不同的平台上执行。JVM 由多个模块组成&#xff0c;每个模块负责特定的功能。以下是 JVM 的主要模块及其功能&#xff1a; …

Java 中基于优先级执行任务的线程池实现

在日常开发中&#xff0c;我们经常遇到这样一种需求&#xff1a;需要按照任务的优先级顺序来执行&#xff0c;而不是简单的先进先出&#xff08;FIFO&#xff09;。Java 提供了 PriorityBlockingQueue&#xff0c;这是一个基于优先级排序的线程安全队列&#xff0c;可以用于实现…

CES2025展会媒体发布现场邀约采访计划来啦!海外科技电子媒体报纸新闻宣传方案

【本篇由 言同数字全球媒体投放 原创】一、CES 2025 展会概述 CES&#xff08;国际消费电子展&#xff09; 是全球规模最大、最具影响力的消费电子展会之一&#xff0c;由美国消费技术协会&#xff08;CTA&#xff09;主办。每年1月&#xff0c;CES吸引来自全球各地的行业领袖…

Axure设计之三级联动选择器教程(中继器)

使用Axure设计三级联动选择器&#xff08;如省市区选择器&#xff09;时&#xff0c;可以利用中继器的数据存储和动态交互功能来实现。下面介绍中继器三级联动选择器设计的教程&#xff1a; 一、效果展示&#xff1a; 1、在三级联动选择器中&#xff0c;首先选择省份&#xff…

【1】 Kafka快速入门-从原理到实践

文章目录 🔍 一、引言📜 二、Kafka 的历史🏗️ 三、Kafka 的核心结构🖥️ (一)Broker📋 (二)Topic📄 (三)Partition📤 (四)Producer📥 (五)Consumer🐒 (六)Zookeeper💡 四、Kafka 的重点概念📨 (一)消息📏 (二)偏移量(Offset)🔄 (…

使用Docker-Compose安装redis,rabbitmq,nacos,mysql,nginx,tomcat,portainer组件教程

因为开发经常会用到一些组件&#xff0c;又不想在本地启动&#xff0c;所以买了个服务器&#xff0c;然后将这些组件都安装到服务器上以便开发使用。下面就记录下使用docker-compose安装组件的教程以及一些需要注意的地方。 关于docker和docker-compose的安装在另一篇博客中有…

安装PyG

PyG安装 官方链接 Installation — pytorch_geometric documentation (pytorch-geometric.readthedocs.io) 安装步骤&#xff1a; 步骤一&#xff1a;安装Anaconda和CUDA 安装Anaconda-CSDN博客安装CUDA-CSDN博客 步骤二&#xff1a;查看支持的Python版本 步骤三&#xf…

如何在Linux中使用Cron定时执行SQL任务

文章目录 前言一、方案分析二、使用步骤1.准备脚本2.crontab脚本执行 踩坑 前言 演示数据需要每天更新监控数据&#xff0c;不想手动执行&#xff0c;想到以下解决方案 navicat 创建定时任务java服务定时执行linux crontab 定时执行sql脚本 一、方案分析 我选择了第三个方案…

夜天之书 #103 开源嘉年华纪实

上周在北京参与了开源社主办的 2024 中国开源年会。其实相比于有点明显班味的“年会”&#xff0c;我的参会体验更像是经历了一场中国开源的年度嘉年华。这也是在会场和其他参会朋友交流时共同的体验&#xff1a;在开源社的 COSCon 活动上&#xff0c;能够最大限度地一次性见到…

鸿蒙开启无线调试

DevEco Studio没找到通过WI-FI连接手机的可视化操作按钮&#xff0c;就去官网看了下hdc - TCP连接场景 操作也比较简单&#xff1a; 第1步&#xff1a;PC通过USB连接手机/平板&#xff1b; 第2步&#xff1a;在手机/平板的“开发者选项”中打开“无线调试”并记录下IP和端口…

Android Handler

Handler用于多线程消息分发和处理。与handler相关的几个对象&#xff1a;Message, Looper&#xff0c;MessageQueue, ThreadLocal. Handler是Message的消费者。 MessageQueue是容器。 Looper是整个Message分发的驱动。 Handler中有多种发送消息的方法&#xff0c;其中postxx…

C语言操作符详解(下)

⽬录 1. 单⽬操作符 2. 逗号表达式 3. 下标访问[]、函数调⽤() 4. 结构成员访问操作符 5. 操作符的属性&#xff1a;优先级、结合性 6. 表达式求值 一 单⽬操作符 1 分类 &#xff01;、 、 -- 、 & 、 * 、 、 - 、 ~ 、 sizeof 、 ( 类型 ) 1.1 "&q…

【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!

数据集介绍 【数据集】道路事故识别数据集 8939 张&#xff0c;目标检测&#xff0c;包含YOLO/VOC格式标注。数据集中包含2种分类&#xff1a;{0: accident, 1: non-accident}。数据集来自国内外图片网站和视频截图。检测范围道路事故检测、监控视角检测、无人机视角检测、等&…

跑批为什么这么难

业务系统产生的明细数据通常要经过加工处理&#xff0c;按照一定逻辑计算成需要的结果&#xff0c;用以支持企业的经营活动。这类数据加工任务一般会有很多个&#xff0c;需要批量完成计算&#xff0c;在银行和保险行业常常被称为跑批&#xff0c;其它像石油、电力等行业也经常…

C++类型推导decltype和auto

auto用于变量声明时根据表达式自动推导其类型 int x 10; auto y x; // y 的类型是 int double a 5.5; auto b a * 2; // b 的类型是double decltype 是 C11 引入的一个关键字&#xff0c;用于查询表达式的类型。它允许编译器在编译时推断出一个表达式的类型&#xff0c;…

Flutter 鸿蒙next 中使用 MobX 进行状态管理

Flutter & 鸿蒙next 中使用 MobX 进行状态管理 在应用开发中&#xff0c;状态管理是一个至关重要的环节&#xff0c;特别是在复杂的Flutter或鸿蒙next项目中。状态的变化往往会影响UI的更新&#xff0c;因此&#xff0c;选择一种高效、灵活的状态管理工具显得尤为重要。Mo…

A012-基于Spring Boot的私房菜定制上门服务系统的设计与实现

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统私房菜定制上门服务系统信息管理难度大&#xff0c;容错率…

配有生物振膜的FPS电竞耳机,血手幽灵M760,精准定位每一声脚步

在PC上玩游戏的时候&#xff0c;一款高性能的游戏耳机是提升游戏体验的关键&#xff0c;特别是在吃鸡等FPS类游戏中&#xff0c;耳机不仅是听觉享受的工具&#xff0c;更是决定胜负的关键装备。如果耳机的环绕立体声效果能够及时准确的做出反应&#xff0c;我在游戏中就能清晰地…

状态模式(State Pattern)详解

1. 引言 在很多软件系统中&#xff0c;对象的行为往往依赖于其内部状态&#xff0c;而状态的变化又会影响对象的行为。状态模式&#xff08;State Pattern&#xff09;为解决这一问题提供了一种优雅的方法。通过将状态的行为封装到独立的状态对象中&#xff0c;可以使得对象在…

OceanBase详解及如何通过MySQL的lib库进行连接

OceanBase详解及如何通过MySQL的lib库进行连接 一、引言二、OceanBase概述1. 起源与发展2. 核心技术特点3. 应用场景三、OceanBase架构解析1. 系统架构2. 存储引擎3. 分布式架构四、如何使用MySQL的lib库连接OceanBase1. 前提条件2. 安装MySQL Connector/C3. 编写连接代码4. 编…