一、下等腰三角形
問題描述:用雙重循環實現以下圖形的輸出
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");
}
}