IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 用C语言到底怎么写出一个心形 -> 正文阅读

[C++知识库]用C语言到底怎么写出一个心形

先上代码:

#include<stdio.h>
#include<Windows.h>
int main()
{
	float y, x, a;
	for(y=1.5f;y>-1.5f;y-=.1f){
		for(x=-1.5f;x<1.5f;x+=.05f){
			a=x*x+y*y-1;
			putchar(a*a*a-x*x*y*y*y<0.0f?'x':' ');
			//Sleep(50);
		}
		putchar('\n');
	}
	getchar();
	return 0;
} 

分享一下对这个可以输出心形的程序的理解。

首先我们看到,在for循环的小括号中有两个变量x,y,这两个变量一个变小、一个变大。

这难免让我们想到二维坐标系!

?这里的y值减小,x值增大,也就是说,程序从左上角开始绘制,一直绘制到右下角,程序结束。

我们看这段代码:

a=x*x+y*y-1;
putchar(a*a*a-x*x*y*y*y<0.0f?'x':' ');

既然是a*a*a-x*x*y*y*y<0.0f,我们不妨让其等于0,得到方程:

(x^(2)+y^(2)-1)^(3)-x^(2)y^(3)=0

这个方程我试着在画图软件上画了一下,没想到真的是心形:

?

?现在,还有几个问题需要说一下:

第一、a*a*a-x*x*y*y*y<0.0f,为什么是小于号

比如圆方程:x*x+y*y=1

只有(x,y)使x*x+y*y<1的时候,(x,y)才会在圆内

第二、y=1.5f;y>-1.5f;y-=.1f,这里为什么是”.1f“而不是0.1f

”.1f“就是'0.1f',这是事实,有图为证

第三、a*a*a-x*x*y*y*y<0.0f?'x':' '

如果a*a*a-x*x*y*y*y<0.0f为true那么就输出x,否则输出空格

第四、for循环中的表达式是凭空捏造的吗

很显然不是。我们需要在找到一个表达式之后,先在画图软件上确定边界值(如果能看出来当然不用画),在此之后确定一个合适的步长(很重要)即可

第五、后面为什么有一个getchar()

使程序不马上退出

那么现在就真相大白了,只要找到一个合适的心形函数就可以写出一个可以输出心形的程序!

现在来练习一下!

方程:c:?(x^(2)+y^(2))^(2)+4y?(x^(2)+y^(2))-4x^(2)=0

#include<stdio.h>
#include<Windows.h>
int main()
{
	float y, x, a;
	for(y = 1.0f;y > -4.0f;y -= .1f){
		for(x = -2.5f;x < 2.5f;x += .06f){
			a=x*x+y*y;
			putchar(a*a + 4*y*a - 4*x*x < 0.0f ? 'x' : ' ');
			//Sleep(10);
		}
		putchar('\n');
	}
	getchar();
	return 0;
} 

虽然有点丑……

总结下来就是步长的问题,比如说如果跑出来的图形偏瘦了,那么就减少步长。

原因是什么呢?

就是既然图形瘦,那么就说明容纳的可以进行运算的x值偏大了,将x值以0.1为单位改小就可以了。(0.1是我感觉比较合适的单位);y的步长同理。

【其实我最开始找的方程不是这个,后来发现输出成了一种奇怪的图形才又找了一个】

昨天最开始找的用于练习的方程是这个:

x^(2)-abs(x)y+y^(2)=4

?然后开始的代码是这样的

#include<stdio.h>
#include<Windows.h>
#include<math.h>
//x^(2)-abs(x)y+y^(2)=4
int main()
{
	double y, x, a;
	for(y = 2.5;y > -2.5;y -= 0.1){
		for(x = -2.5;x < 2.5;x += 0.05){
			putchar(x*x - abs(x)*y + y*y - 4 < 0.0 ? 'x' : ' ');
			//Sleep(10);
		}
		putchar('\n');
	}
	getchar();
	return 0;
}

输出成了这样,我当时都惊呆了

?其实最开始的那个思想并没有问题,只是我的代码可能存在一些错误。至于我怎么发现的这个bug呢?我在翻之前写的一个求三角形面积代码时,发现了一句很显眼的注释

//这里没必要取绝对值,但是因此发现:abs()中的值只能是整数,此处写成fabs()才可以,不然值是0

double GetArea(double a,double b,double c){
	double cosC,sinC;
	cosC = (a*a + b*b - c*c) / (2.0*a*b);
	sinC = fabs(sqrt(1.0 - cosC*cosC));
	//这里没必要取绝对值,但是因此发现:abs()中的值只能是整数,此处写成fabs()才可以,不然值是0 
	return a*b*sinC/2;
}

我瞬间明白了!看来把求绝对值函数改一下就行了,注意头文件。

#include<stdio.h>
#include<Windows.h>
#include<math.h>
//x^(2)-abs(x)y+y^(2)=4
int main()
{
	double y, x, a;
	for(y = 2.5;y > -2.5;y -= 0.1){
		for(x = -2.5;x < 2.5;x += 0.05){
			putchar(x*x - fabs(x)*y + y*y - 4 < 0.0 ? 'x' : ' ');
			//Sleep(10);
		}
		putchar('\n');
	}
	getchar();
	return 0;
}

输出的还是挺好看的:

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 18:45:50  更:2022-08-19 18:48:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 4:55:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码