方法一 心型极坐标方程
爱心代码你真的理解吗
笛卡尔的心型公式:
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”);:在每一行的星号打印完成后,进行换行操作,以便打印下一行的心型图案。
综上所述,这段代码通过两个内层循环和外层循环的配合,精确地控制了每一行左边空格和星号的数量,从而成功地构建出心型图案的下半部分。