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”);:在每一行的星号打印完成后,进行换行操作,以便打印下一行的心型图案。

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


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言网络编程 -- TCP/iP协议

一、Socket简介 1.1 什么是socket socket通常也称作"套接字"&#xff0c;⽤于描述IP地址和端⼝&#xff0c;是⼀个通信链的句柄&#xff0c;应⽤ 程序通常通过"套接字"向⽹络发出请求或者应答⽹络请求。⽹络通信就是两个进程 间的通信&#xff0c;这两个进…

字符串接龙 /单词接龙 (BFs C#

卡码网 110和 力扣127 和LCq 108题都是一个解法 这两道题乍一看在结果处可能不一样 力扣要求 字符串里边必须包含对应的最后一个字符 而110不需要最后一个字符 但是在实验逻辑上是一致的 只是110需要把如果在set中找不到最后一个字符就直接返回0的逻辑删去 就可以了 这就是…

Transformer和BERT的区别

Transformer和BERT的区别比较表&#xff1a; 两者的位置编码&#xff1a; 为什么要对位置进行编码&#xff1f; Attention提取特征的时候&#xff0c;可以获取全局每个词对之间的关系&#xff0c;但是并没有显式保留时序信息&#xff0c;或者说位置信息。就算打乱序列中token…

python操作MySQL以及SQL综合案例

1.基础使用 学习目标&#xff1a;掌握python执行SQL语句操作MySQL数据库软件 打开cmd下载安装 安装成功 connection就是一个类&#xff0c;conn类对象。 因为位置不知道&#xff0c;所以使用关键字传参。 表明我们可以正常连接到MySQL 演示、执行非查询性质的SQL语句 pytho…

【报告PDF附下载】2024人工智能大模型技术财务应用蓝皮书

《人工智能大模型技术财务应用蓝皮书》 是一本探讨AI大模型技术在财务管理领域应用的权威指南。书中不仅概述了人工智能大模型技术的发展历程、典型特征和未来趋势&#xff0c;还详细介绍了它的体系架构和在财务领域的应用情况。 书中通过家用电器制造、银行、汽车企业、基础设…

快速上手vue3+js+Node.js

安装Navicat Premium Navicat Premium 创建一个空的文件夹&#xff08;用于配置node&#xff09; 生成pakeage.json文件 npm init -y 操作mysql npm i mysql2.18.1 安装express搭建web服务器 npm i express4.17.1安装cors解决跨域问题 npm i cors2.8.5创建app.js con…

【Python爬虫实战】DrissionPage 与 ChromiumPage:高效网页自动化与数据抓取的双利器

&#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、DrissionPage简介 &#xff08;一&#xff09;特点 &#xff08;二&#xff09;安装 &#xff08;三…

【JAVA】java 企业微信信息推送

前言 JAVA中 将信息 推送到企业微信 // 企微消息推送messageprivate String getMessage(String name, String problemType, String pushResults, Long orderId,java.util.Date submitTime, java.util.Date payTime) {String message "对接方&#xff1a;<font color\…

前端md5加密

npm下载 npm install --save ts-md5页面引入 import { Md5 } from ts-md5使用 const md5PwdMd5.hashStr("123456")md5Pwd&#xff08;加密后的数据&#xff09; .toUpperCase()方法转大写

DDRSYS,不同频点的时序参数配置说明,DBI/DM功能说明

文章目录 不同频点的时序参数配置说明LPDDR4 时序参数DFI 参数对应配置DDR3/4DBI功能说明&#xff0c;MC控制DBI情况 不同频点的时序参数配置说明 LPDDR4 时序参数 LP4的时序参数从JEDEC颗粒文档可以检索到读写的时序参数如下&#xff1a; 此图主要关注不同频点对应的RL和WL…

如何自学机器学习?

自学机器学习可以按照以下步骤进行&#xff1a; 一、基础知识准备 数学基础&#xff1a; 高等数学&#xff1a;学习微积分&#xff08;包括导数、微分、积分等&#xff09;、极限、级数等基本概念。这些知识是后续学习算法和优化方法的基础。 线性代数&#xff1a;掌握矩阵…

工程巡查应该怎么做?如何利用巡查管理软件?

工程行业&#xff0c;无论是建设单位&#xff0c;监理单位&#xff0c;还是施工单位&#xff0c;工程巡查几乎是每日必做的工作。然而&#xff0c;巡查过程中&#xff0c;传统的做法通常依赖手动记录、拍照上传、在微信群中进行汇报。这种方式需要建大量的微信群&#xff0c;不…

Scala入门基础(16)scala的包

Scala的包定义包定义包对象Scala的包的导入导入重命名 一.Scala的包 package&#xff08;包&#xff1a;一个容器。可以把类&#xff0c;对象&#xff0c;包&#xff0c;装入。 好处&#xff1a; 区分同名的类&#xff1b;类很多时&#xff0c;更好地管理类&#xff1b;控制…

协程6 --- HOOK

文章目录 HOOK 概述链接运行时动态链接 linux上的常见HOOK方式修改函数指针用户态动态库拦截getpidmalloc 第一版malloc 第二版malloc/free通过指针获取到空间大小malloc 第三版strncmp 内核态系统调用拦截堆栈式文件系统 协程的HOOK HOOK 概述 原理&#xff1a;修改符号指向 …

MySQL中,GROUP BY 分组函数

文章目录 示例查询&#xff1a;按性别分组统计每组信息示例查询&#xff1a;按性别分组显示详细信息示例查询&#xff1a;按性别分组并计算平均年龄,如果你还想统计每个性别的平均年龄&#xff0c;可以结合AVG()函数&#xff1a;说明 示例查询&#xff1a;按性别分组统计每组信…

免费数据集网站

1、DataSearch https://datasetsearch.research.google.comhttp://DataSearch 2、FindData findata-科学数据搜索引擎https://www.findata.cn/ 3、Kaggle Kaggle: Your Machine Learning and Data Science CommunityKaggle is the world’s largest data science community …

十二:java web(4)-- Spring核心基础

目录 创建项目 Spring 核心基础 Spring 容器 Spring 容器的作用 Spring 容器的工作流程 Bean Bean 的生命周期 IOC&#xff08;控制反转&#xff09;与依赖注入&#xff08;DI&#xff09; 控制反转的概念 依赖注入的几种方式&#xff08;构造器注入、Setter 注入、接…

MybatisPlus入门(八)MybatisPlus-DQL编程控制

一、字段映射与表名映射 数据库表和实体类名称一样自动关联&#xff0c;数据库表和实体类有部分情况不一样。 问题一&#xff1a;表名与编码开发设计不同步&#xff0c;表名和实体类名称不一致。 解决办法&#xff1a; 在模型类上方&#xff0c;使用TableName注解&#xf…

亚信安全新一代WAF:抵御勒索攻击的坚固防线

近年来&#xff0c;勒索攻击已成为黑客的主要攻击手段。新型勒索攻击事件层出不穷&#xff0c;勒索攻击形势愈发严峻&#xff0c;已经对全球制造、金融、能源、医疗、政府组织等关键领域造成严重危害。如今&#xff0c;勒索攻击手段日趋成熟、攻击目标愈发明确&#xff0c;模式…

代谢组数据分析(二十一):通过MetaboAnalystR标准化构建sPLSDA预测模型

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍MetaboAnalystR标准化sPLSDA分析安装需要的R包加载R包导入数据MetaboAnalystR标准化数据初始化数据清洗数据补足数据过滤数据标准化导出结果sPLSDA分析导入数据数据预处理PCA分析PL…