情人节用C++给女朋友比个心

情人节用C++给女朋友比个心

本来情人节可以回学校陪女朋友的,但因为疫情延迟开学,无奈只能异地。

异地过节不想落入俗套,索性就用C++给女朋友比个心吧,顺便重新理解一下C++的用处(手动狗头:巩固C++不是我的真正目的)

有两种比心方法,下面分别介绍。第一种方法是基础,第二种方法是进阶。

##方法一

这里用到的心形曲线方程如下:
在这里插入图片描述
先回顾一下圆的方程,比如: x^{2} + y^{2} = 1 ,那么对于所有的点 (x, y):
若使得 x^{2} + y^{2} = 1 ,则这个点在圆的边界线上;
若使得 x^{2} + y^{2} < 1 ,则这个点在圆内;
若使得 x^{2} + y^{2} > 1 ,则这个点在圆外。

同理,对于这个方程:
若点 (x, y) 让方程左边等于0,则这个点在这个心形曲线上;
若点 (x, y) 让方程左边小于0,则这个点在这个心形线内;
若点 (x, y) 让方程左边大于0,则这个点在这个心形线外。

那么需要做的就是写一个双重循环,遍历x和y的值,将心形线以内的地方,涂上某一个字符,比如‘*’。

双重循环的边界和步长的确定:
观察一下,可以看到y的上界大概是1.3;下界大概是-1.1;所以,我们可以从1.3逐渐减少到-1.1,我们可以选取步长为0.1。
同理,对于x,可以看出它的左右边界大概为-1.2和+1.2,我们就从-1.2遍历到1.2,步长选择0.05。

代码如下:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
	for (float y = 1.3; y >= -1.1; y -= 0.1)
	{
		for (float x = -1.2; x <= 1.2; x += 0.05)
			if (pow((x*x + y*y - 1.0), 3) - x*x*y*y*y <= 0.0)
				cout << '*';
			else
				cout << ' ';
		cout << endl;
	}
	return 0;
}

输出结果:
在这里插入图片描述

其中改变x和y的步长就可以改变输出心形的高度和宽度。

改变函数即可改变输出心形的形状,如:
在这里插入图片描述

对应代码如下:

#include <iostream>
#include <cmath>
using namespace std;

int main() 
{

	for (float y = 1.3; y >= -1.1; y -= 0.06) 
	{
		for (float x = -1.1; x <= 1.1; x += 0.025)
			if (x*x + pow(5.0*y / 4.0 - sqrt(fabs(x)), 2) - 1 <= 0.0)
				cout << '*';
			else
				cout << ' ';
		cout << endl;
	}
	return 0;
}

这一种方法只能输出单一字符,当然也可以做成镂空效果,只要改变两部分输出的填充物即可。

下面介绍一种可以输出字符串的进阶方法。

##方法二

代码如下:

#include <iostream>
#include <math.h>

using namespace std;

#define X_DIVIDED_BY_Y 0.5
#define MAX_X (35.0 / X_DIVIDED_BY_Y)
#define MAX_Y 35.0
#define THRESHOLD 0.5
#define A 13

char getSentenceChar(const char*sentence, int &index)
{
	while (true)
	{
		if (index >= strlen(sentence))
		{
			index = 0;
		}
		char c = sentence[index++];
		if (' ' == c)
		{
			index++;
		}
		else
		{
			return c;
		}
	}
}

inline float getX(float x)
{
	return (x - MAX_X / 2)* X_DIVIDED_BY_Y;
}

inline float getY(float y)
{
	return MAX_Y / 7.0 -y;
}

bool func(float x, float y)
{
	return (pow(x, 2) + pow(y, 2) +A * x - A * sqrt(pow(x, 2) + pow(y, 2))) < THRESHOLD;
}

void main(int argc, char** argv)
{
	const char *LOVE_SENTENCE ="Write_whatever_you_want.";
	int sentenceIndex = 0;

	for (int y = 0; y <= MAX_Y; y++)
	{
		for (int x = 0; x <= MAX_X; x++)
		{
			cout << (func(getY(y), getX(x)) ? getSentenceChar(LOVE_SENTENCE, sentenceIndex) : ' ');
		}
		cout <<endl;
	}
}

输出结果:
在这里插入图片描述

代码写好之后,还要生成格式后缀为.exe的可执行文件发给女朋友才行。

##Visual Studio上生成可执行文件的方法

1.找到菜单中的配置管理器,从Debug切换至Release,如图所示:
在这里插入图片描述
2.【菜单栏】->【项目】->【(项目名称)属性】->【配置属性】->【C/C++】->【代码生成】->【运行库】,由【多线程DLL(/MD)】改为【多线程(/MT)】,点击确定,如图所示:
在这里插入图片描述

3.【菜单栏】->【生成】->【重新生成解决方案】

4.重新生成解决方案后会在项目文件目录的x64文件夹中多出Release文件夹,里面的exe文件就是可执行文件,如图所示:
在这里插入图片描述

5.打开该可执行文件,发现程序运行后一闪而过,只需在代码最后加上system(“pause”)语句使程序运行后暂停即可

void main(int argc, char** argv)
{
	const char *LOVE_SENTENCE ="Write_whatever_you_want.";
	int sentenceIndex = 0;

	for (int y = 0; y <= MAX_Y; y++)
	{
		for (int x = 0; x <= MAX_X; x++)
		{
			cout << (func(getY(y), getX(x)) ? getSentenceChar(LOVE_SENTENCE, sentenceIndex) : ' ');
		}
		cout <<endl;
	}
	system("pause");
}

6.默认生成的可执行文件名字就是项目的名字,这是由项目属性里配置的

【菜单栏】->【项目】->【(项目名称)属性】->【配置属性】->【常规】->【目标文件名】,默认为$(ProjectName),修改文件名之后重新生成解决方案即可
在这里插入图片描述

All for my beloved

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值