您的位置:首页 > 编程语言 > C语言/C++

下三角形的一些思考

2014-03-07 22:21 183 查看


一、下等腰三角形

问题描述:用双重循环实现以下图形的输出
AA
ABBA
ABCCBA
ABCDDCBA
ABCDEEDCBA
ABCDDCBA
ABCCBA
ABBA
AA


1、思考过程

通过分析,将输出分为两大块。一为上三角,即从第1行到第i行,另外为下三角,即从第i+1行到2*i-1行。开始时,自己又另外将上三角分为三个模块:空格模块、A->最大字母以及最大字母->A。那么这样分析后,就很好办了。

输入:上三角行数a

输出
第1行到第i行:用j控制行数(from 1 to i),则先输出a - i个空格,然后输出A->A+i,最后输出A+i->A。
第i+1行到2i-1行:可以用j控制行数(from 1 to i-1)(又从1计数,这和输出无关)。则先输出i - j个空格,然后输出A->A+i,最后输出A+i->A。

反正这些变量太麻烦了,简直让人讨厌。有没有其他方法呢?头脑里闪过数学中对称思想,利用这种思想,就简单了很多了。

输出中第i+1行到2i-1行类似第1行到第i行的倒置,不过行数反过来而已。而输出A+i->A则可以看作是输出A->A+i对称,直接将循环控制语句稍作修改即可。


2、总结

其实开始时没有很好地利用对称信息,最终浪费了较多时间。如果能发现规律,则能较快地解决问题。

今天纠结的另外一个问题是输出A+i->A。初始代码如下:
for ( k = i; k >= 1; k-- )
{
printf("%c", 'A'+k-1);
}
printf("\n");


这就相当于控制变量从i开始,那么规律则是+k。稍加总结,就可得出'A'+k-1规律。

通过这道题目,加深了循环命令的掌握。


3、附最后程序代码,如下:

/*
* 作    者: 林龙
* 专业班级:计算机学院
* 完成日期:2014 年 3 月7 日
* 版 本 号:v1.0
* 输入描述:上三角行数
* 问题描述:下等腰三角形(不同字母组成)
* 程序输出:
AA
ABBA
ABCCBA
ABCDDCBA
ABCDEEDCBA
ABCDDCBA
ABCCBA
ABBA
AA
* 算法设计:用双重循环进行控制,外循环控制行,内循环控制列(每行输出的字符个数)
*/
#include <stdio.h>
void PriAlpha( int a );
int main()
{
PriAlpha( 5 );
return 0;

}

void PriAlpha( int a )
{
int i, j, k;
for ( i = 1; i <= a ; i ++ )
{
// 输出空格
for (  j = 1; j <= a - i ; j ++ )
{
printf(" ");
}
// 输出A-最大字母
for ( k = 1; k <= i; k ++ )
{
printf("%c", 'A'+k-1);
}
// 输出最大字母-A
for ( k = 1; k <= i; k ++ )
{
printf("%c", 'A'+i-k);
}
printf("\n");
}
// 下三角输出,只是上三角控制语句修改而已
for ( i = a - 1; i >= 1 ; i -- )
{

for (  j = 1; j <= a - i ; j ++ )
{
printf(" ");
}
for ( k = 1; k <= i; k ++ )
{
printf("%c", 'A'+k-1);
}
for ( k = 1; k <= i; k ++ )
{
printf("%c", 'A'+i-k);
}
printf("\n");
}
}


参考

双重循环的应用实例--等腰三角形相关
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息