C語言列印菱形例項詳解

2022-09-25 05:03:11 字數 2147 閱讀 1588

前言

列印菱形這道題對於初學程式設計者來說簡直是噩夢,曾經我就是栽在這上面的,後來程式設計編多了之後對列印菱形也覺得不再那麼難了,去年在***寫了一篇推送是關於列印菱形的,覺得對一些師弟師妹還是有所幫助的,今天就把這道題分享出來。

以下是我遇到的各種各樣的菱形:

普通菱形,輸入n,輸出n行n列的菱形

難度係數:♥

n行空心菱形,輸入n,輸出n行空心菱形

難度係數:♥♥

n行挖空菱形,輸入n,輸出n行n列空格菱形

難度係數:♥♥♥

n行數字菱形,輸入n,輸入n行數字從外到內遞增的數字菱形

難度係數:♥♥♥♥

有邊框空心菱形,輸入n,輸出n行帶有邊框的空心菱形

難度係數:♥♥♥♥♥

首先我們要明確這是乙個隨著n的大小改變的菱形,所以我們肯定要用到迴圈,並且迴圈的次數與n有關。如果題目要求是輸出n行,那我們的迴圈就是0(n-1)或者1n;如果要求是輸出(2n+1)行,那我們的迴圈就0-2n或者1~(2n+1)即可。(後面以輸出n行為例分析)

第乙個是普通的實心菱形,迴圈n行大家都懂,問題就在列要怎樣迴圈。難道是看出來的嗎?不錯,我就是通過看得出來的迴圈次數。具體怎麼看呢?

根據圖直接看有點難度,所以我們根據各行資料來看

我們需要將整個菱形程式設計客棧分成四塊來考慮,從上到下空格的個數先從n/2遞減到0後遞增到n/2,而行迴圈因子i又從0遞增到n,故自然可聯想到用i與n/2來表示空格個數。因為空格個數是非負數,所以我們引進絕對值|n/2-i|表示空格個數。打完空格之後,我們就要正式用 ' * '列印菱形了。通過觀察我們發現 * 號的個數為奇數,並且變化規律跟空格正好相反,所以號個數即是-2*(空格個數)+1+c(常數)=-2*(空格個數)+c(常數),通過觀察我們發現這個常程式設計客棧數c正好是n/2。於是第一種菱形就可以順利完成了!

第二個是空心菱形,與實心菱形相似,可看成在實心菱形上再打了乙個空格菱形。由於每行的號數不多,並且可以看到號正好位於空格菱形的外圍,所以我們可以將列印號放在列印空格菱形前後順便列印,即在列印空格菱形之前打號,列印完空格菱形之後再列印號。同樣,我們將相關資料列出來然後觀察規律。號前空格與實習菱形一致,而我們發現n-2|n/2-i|-2的值除了首尾兩行外,其他都與空格菱形的空格個數一致,而首尾兩行是-1表示在該處不需打空格反而需要退乙個格,但由於我們當前位置為號,而退格後依舊要打號,所以我們可以直接判斷是否為第一行或最後一行,是則少列印乙個號即可。

第三個是挖空菱形,該菱形是上述兩個的合體,我們可以看成把乙個實心菱形的各個字元替換成另一種字元,再插入乙個空心菱形。所以我們把該菱形分成輸出空心菱形前後號和輸出空心菱形兩部分。通過資料對比,我們不難發現,輸出空心菱形前後號的資料與實心菱形輸出號前空格個數一致,然後就是輸出乙個空心菱形,最後要記得在輸出空心菱形之後輸出空心菱形之後的號,根據對稱可知,空心菱形後號個數與空心菱形前號一致。

第四個是數字菱形,該菱形的特點是數字從外到內逐層遞增。我們發現該菱形中軸線數字的變化規律是先從1遞增到(n+1)/2,然後再遞減到1,並且每一行的數字也是從1遞增到中軸線,再遞減到1,因此我們要找到中軸線所在的位置(方便判斷迴圈因子是否到達中軸線)。通過列資料我們發現中軸線所在位置(j從0開始迴圈)為n/2-|n/2-i|,所以在每一行中我們的數字加到「j==n/2-|n/2-i|」處時應該轉成遞減,所以我們引進要填充的數字k,在每一行開始時k為1,在j從0到n/2-|n/2-i|-1中,k逐次遞增,在j從n/2-|n/2-i|到n-2*|n/2-i|-1中k遞減。然後將列印星號改為列印數字即可。

第五個是邊框空心菱形。從名字可知,該菱形由邊框和空心菱形組成,我們可以將邊框和空心菱形分開來考慮。第一行和最後一行為邊框,可直接用從0到n-1列印號實現。左右邊框在每一行的開頭和結尾列印號即可實現。中間即是空心菱形的領域,基本上跟列印空心菱形一樣,只是要注意被邊框覆蓋的地方空格和號要省略。

將列印空格和列印號分開考慮,通過數字之間的關係特點,運用迴圈完成菱形的列印。

由於菱形是對稱的,所以絕對值是最好的資料描述工具,要巧妙地運用絕對值,將對稱部分的迴圈用同乙個帶有絕對值的表示式表示出來。

值得注意的是n/2為整數除,所以不會得到小數,也不是四捨五入。

中軸線所在位置(j從0開始迴圈)為n/2-|n/2-i|。

//挖空菱形

for(i=0;i程式設計客棧*");

printf("\n");

} else{

printf("*");

for(j=0;j

總結

C語言列印菱形

難度係數 n行空心菱形,輸入n,輸出n行空心菱形 難度係數 n行挖空菱形,輸入n,輸出n行n列空格菱形 難度係數 n行數字菱形,輸入n,輸入n行數字從外到內遞增的數字菱形 難度係數 有邊框空心菱形,輸入n,輸出n行帶有邊框的空心菱形 難度係數 首先我們要明確這是乙個隨著n的大小改變的菱形,所以我們肯...

C語言列印菱形

實現思想 先要將菱形分為上下兩個三角形,接下來通過兩個迴圈分別輸出這兩部分。首先設定變數line代表上三角行數,通過鍵盤輸入,接著設定三個變數 i,j,k。i 控制迴圈次數,j 控制空格數,k 控制 的個數。在上三角中,迴圈line次,行數 i 1,空格數 line i 1 的個數 2 i 1 1 ...

C語言之列印菱形

要求 寫乙個程式,根據使用者輸入的總行數,列印出菱形。你可以從第一行開始,遍歷所有的列,也可以從第一列開始,遍歷所有的行。設菱形的總行數為line,總列數為column,當前行為i,當前列為j。上半部分與下半部分的規律不一樣,應該分開討論。1 對於上半部分 包括中間一行 當前行與當前列滿足如下關係輸...