C++输出菱形

一个初学者的日常小收获

这是老师布置的一次课程作业(让我们先做,实验课抽人上台讲),其中有道题,简单地说:比如输入一个值,输出如图
在这里插入图片描述

菱形1.0

这是我最初敲完的代码,但容易发现当输入较大值时输出了非字母,原因在于当输入较大的值时,对a、b超出’Z’的ASCII码值的处理。因为我开始并没有考虑输出较多行的情况,只是先把大体做出来。(多运行了几次才发现自己如此之菜,如此肤浅)

#include<iostream>
using namespace std;
int main() 
{
	int i, j, n;
	cin >> n;
	char a = 'A';//输出的第一行的字母
	char b = a + n;//输出的第n+1行的字母
	for (i = 0; i < n; i++) //上半部分,先输出n行
	{
		for (j = 1; j < n - i; j++)cout << " ";//上半部分输出“n-行数”个空格
		for (j = 0; j < 2 * (i + 1) - 1; j++)cout << a;
		a = a + 1;
		if (a >= 'Z' && a <= 'Z' + n)a = a - 26;
		cout << endl;
	}
	for (i =n-1; i>0; i--)//下半部分,这里我将下半部分从下往上数,依次为第1~n-2行
	{
		for (j = 0; j <n-i; j++)cout << " ";
		for (j = 0; j < 2 * i - 1; j++)cout << b;
		b = b + 1;
		if (b >= 'Z' && b <= 'Z' + n)a = a - 26;
		cout << endl;
	}//当n>13时,输出非字母
}

菱形1.1

这时我想到做数学规律题时经常提到的“周期”,于是就考虑到用取余运算%来处理这个问题。而且后来发现其实b也不用出现的,真的多此一举感觉,可以用“cout<<a”测试一下,确定上半部分有a的那个循环能把a的末值带出来,供下半部分的输出字母的循环使用。(以下代码改了一下,输出每一行的不再是同一个字母,而是递进的)

#include<iostream>
using namespace std;
int main()
{
	int i, j, n;
	cin >> n;
	char a = 'A';
	for (i = 0; i < n; i++) //先输出n行,上半部分
	{
		for (j = 1; j < n - i; j++)cout << " ";//上半部分输出n-行数个空格
		for (j = 0; j < 2 *(i+1) - 1; j++)
		{
			cout << a;
			a++;
			if (a >= 'Z')a = (a - 65) % 26 + 65;
		}
		cout << endl;
	}
	//cout << a;
	for (i = n - 1; i > 0; i--)//下半部分
	{
		for (j = 0; j < n - i; j++)cout << " ";
		for (j = 0; j < 2 * i - 1; j++)
		{
			cout << a;
			a++;
			if (a >= 'Z')a = (a - 65) % 26 + 65;
		}
		cout << endl;
	}
}

菱形2.0

这次是受老师启发的,因为每一行输出的空格数是先递减后递增,而字母个数则先递增后递减,可以考虑用一个数学函数关系式来表示,而这里,一元函数不难想到用“绝对值”

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
	int i, j, m, n;
	char a = 'A';
	cin >> n;
	int b = 2 * n - 1;
	for (i = 1; i <= b; i++)
	{
		for (j = 0; j < fabs(n - i); j++)cout << " ";
		for (m = 0; m < b - fabs(2 * (i - n)); m++)
		{
			cout << a;
			a++;
			if (a >= 'Z')a = (a - 65) % 26 + 65;
		}
		cout << endl;
	}
}

空格数的函数表达式其实很容易推导,而字母个数的相对不容易,我是先取n为定值,描点画图,再平移到y轴,算出此时的函数关系式,可以发现两个式子的线性部分可用绝对值表示,而后面的常数本来就好处理
实践总能发现问题,也能得到成长,编程学习之路漫漫,不能心急。这次我算是体会到,也领悟到:数学是编程的灵魂。把数学和编程结合来解决问题如此重要且漂亮,就像求1~100的类和,对计算机来说用循环能很轻松完成,可是把高斯求和公式放进程序不香吗?这得少多少次运算!
写下这些是用来记录和见证自己的成长,最后给自己加个油,要勇敢要坚定!

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值