用C語言寫個程式畫菱形吧!

如圖所示
星號菱形1
今天我們要來做一個菱形,先來想想看怎麼該做。
我們先把空白處填上「-」以便觀察
1—-*—-
2—***—
3–*****–
4-*******-
5*********
6-*******-
7–*****–
8—***—
9—-*—-
事實上我們可以把它簡化成
1—-*
2—***
3–*****
4-*******
5*********
6-*******
7–*****
8—***
9—-*
因為右邊的空白有沒有畫出來看起來都一樣,所以可以省略掉。
再來我們將菱形切成兩部分,這樣做起來會比較容易。
上1—-*
上2—***
上3–*****
上4-*******
上5*********
—————
下4-*******
下3–*****
下2—***
下1—-*
這是一個對角線長度為9的菱形,我把最寬得那排(第5行)分在上半部。
為什麼下半部行數要倒數?因為等等使用較方便。
另外因為菱形有左右對稱,所以我們先畫出一條中線,
並且把這中線的值 設為兩測到中線的距離,
此例的中線值為5,也剛好等於 (對角線長度+1/2),
(為什麼是這樣呢?因為這是觀察的結果XD)
等等可以用到。
如下圖
星號菱形2
由於電腦只能一行一行的輸出,所以我們也只能一行一行的分析。
◎空白數
首先我們先來觀察空白數的關係,由上到下每行左邊的空白數分別為─
4.3.2.1.0.1.2.3.4
上半部:
1.第1行空白數為中線減1
2.第2行空白數為中線減2
3.第3行空白數為中線減3
4.第4行空白數為中線減4
5.第5行空白數為中線減5
有沒有發現,空白數等於 (中線減行數)
下半部:
6.第4行空白數為中線減4
7.第3行空白數為中線減3
8.第2行空白數為中線減2
9.第1行空白數為中線減1
有沒有發現,空白數等於 (中線減行數)
(或許你會問既然上下部的空白數皆等於中線減行數,
為什麼還要分上下部呢?別忘了我們下半部行數是倒數的喔~)
◎星號數
接著我們來觀察星號的關係,由上到下每行的星號數分別為─
1.3.5.7.9.7.5.3.1
上半部:
1.第1行星號數為(2*1)-1
2.第2行星號數為(2*2)-1
3.第3行星號數為(2*3)-1
4.第4行星號數為(2*4)-1
5.第5行星號數為(2*5)-1
我們可以觀察出,星號數等於 (2*行數)-1
下半部:
6.第4行空白數為(4*1)-1
7.第3行空白數為(3*1)-1
8.第2行空白數為(2*1)-1
9.第1行空白數為(1*1)-1
我們可以觀察出,星號數等於 (2*行數)-1
差不多都構想完成了,
我們就直接看程式碼吧!

#include<stdio.h>
#include<stdlib.h>
 
int main()
{
	int a,b,c,d,e,f;//對角線長度,上行數,空白數,星號數,中線
	printf("請勿輸入非數字。n");
	A:printf("請輸入菱形對角線長度(必須是奇數),離開請輸入0:");
	scanf("%d",&a);
	if(a==0)//輸入0即結束程式
	{
		return 0;
	}
	if(a%2==0)//確認是奇數才繼續執行
	{
		goto A;
	}
	f=(a+1)/2;//中線值等於對角線長度+1除以2
	for(b=1;b<=f;b++)//畫出菱形上半部(含最中間那行)
	{
		for(d=f-b;d>0;d--)//畫空白
		{
		printf(" ");
		}
		for(e=1;e<=2*b-1;e++)//畫星號
		{
			printf("*");
		}
		printf("n");//換行
	}
	for(b=f-1;b>0;b--)
	{
		for(d=f-b;d>0;d--)//畫空白
		{
			printf(" ");
		}
		for(e=1;e<=2*b-1;e++)//畫星號
		{
			printf("*");
		}
		printf("n");//換行
	}
	goto A;//繼續畫下一個菱形
}

嘿嘿,這樣大家都懂了吧!
你們可以動腦想想看,
如何確保對角線長度輸入的一定是數字,
並且數字不會太大,因為太大的話,
電腦會自動換行,疊起來就不像是菱形了。
(根據測試數字不能大於79)

延伸閱讀:

VB顯示星號(*)菱形

(上述這篇,大致與此篇概念相同,只是上述是使用VB,
此篇是使用C語言。另外做法上也有些些的不同,大家可以比較看看。)

文章分類:C & C++|標籤:,

迴響已關閉