C語(yǔ)言打印菱形實(shí)例詳解
前言
打印菱形這道題對(duì)于初學(xué)編程者來(lái)說(shuō)簡(jiǎn)直是噩夢(mèng),曾經(jīng)我就是栽在這上面的,后來(lái)編程編多了之后對(duì)打印菱形也覺(jué)得不再那么難了,去年在公眾號(hào)寫(xiě)了一篇推送是關(guān)于打印菱形的,覺(jué)得對(duì)一些師弟師妹還是有所幫助的,今天就把這道題分享出來(lái)。
以下是我遇到的各種各樣的菱形:
普通菱形,輸入n,輸出n行n列的菱形
難度系數(shù):♥
n行空心菱形,輸入n,輸出n行空心菱形
難度系數(shù):♥♥
n行挖空菱形,輸入n,輸出n行n列空格菱形
難度系數(shù):♥♥♥
n行數(shù)字菱形,輸入n,輸入n行數(shù)字從外到內(nèi)遞增的數(shù)字菱形
難度系數(shù):♥♥♥♥
有邊框空心菱形,輸入n,輸出n行帶有邊框的空心菱形
難度系數(shù):♥♥♥♥♥
首先我們要明確這是一個(gè)隨著n的大小改變的菱形,所以我們肯定要用到循環(huán),并且循環(huán)的次數(shù)與n有關(guān)。如果題目要求是輸出n行,那我們的循環(huán)就是0(n-1)或者1n;如果要求是輸出(2n+1)行,那我們的循環(huán)就0-2n或者1~(2n+1)即可。(后面以輸出n行為例分析)
第一個(gè)是普通的實(shí)心菱形,循環(huán)n行大家都懂,問(wèn)題就在列要怎樣循環(huán)。難道是看出來(lái)的嗎?不錯(cuò),我就是通過(guò)看得出來(lái)的循環(huán)次數(shù)。具體怎么看呢?
根據(jù)圖直接看有點(diǎn)難度,所以我們根據(jù)各行數(shù)據(jù)來(lái)看
我們需要將整個(gè)菱形分成四塊來(lái)考慮,從上到下空格的個(gè)數(shù)先從n/2遞減到0后遞增到n/2,而行循環(huán)因子i又從0遞增到n,故自然可聯(lián)想到用i與n/2來(lái)表示空格個(gè)數(shù)。因?yàn)榭崭駛€(gè)數(shù)是非負(fù)數(shù),所以我們引進(jìn)絕對(duì)值|n/2-i|表示空格個(gè)數(shù)。打完空格之后,我們就要正式用 ' * '打印菱形了。通過(guò)觀察我們發(fā)現(xiàn) * 號(hào)的個(gè)數(shù)為奇數(shù),并且變化規(guī)律跟空格正好相反,所以號(hào)個(gè)數(shù)即是-2*(空格個(gè)數(shù))+1+C(常數(shù))=-2*(空格個(gè)數(shù))+C(常數(shù)),通過(guò)觀察我們發(fā)現(xiàn)這個(gè)常數(shù)C正好是n/2。于是第一種菱形就可以順利完成了!
第二個(gè)是空心菱形,與實(shí)心菱形相似,可看成在實(shí)心菱形上再打了一個(gè)空格菱形。由于每行的號(hào)數(shù)不多,并且可以看到號(hào)正好位于空格菱形的外圍,所以我們可以將打印號(hào)放在打印空格菱形前后順便打印,即在打印空格菱形之前打號(hào),打印完空格菱形之后再打印號(hào)。同樣,我們將相關(guān)數(shù)據(jù)列出來(lái)然后觀察規(guī)律。號(hào)前空格與實(shí)習(xí)菱形一致,而我們發(fā)現(xiàn)n-2|n/2-i|-2的值除了首尾兩行外,其他都與空格菱形的空格個(gè)數(shù)一致,而首尾兩行是-1表示在該處不需打空格反而需要退一個(gè)格,但由于我們當(dāng)前位置為號(hào),而退格后依舊要打號(hào),所以我們可以直接判斷是否為第一行或最后一行,是則少打印一個(gè)號(hào)即可。
第三個(gè)是挖空菱形,該菱形是上述兩個(gè)的合體,我們可以看成把一個(gè)實(shí)心菱形的各個(gè)字符替換成另一種字符,再插入一個(gè)空心菱形。所以我們把該菱形分成輸出空心菱形前后號(hào)和輸出空心菱形兩部分。通過(guò)數(shù)據(jù)對(duì)比,我們不難發(fā)現(xiàn),輸出空心菱形前后號(hào)的數(shù)據(jù)與實(shí)心菱形輸出號(hào)前空格個(gè)數(shù)一致,然后就是輸出一個(gè)空心菱形,最后要記得在輸出空心菱形之后輸出空心菱形之后的號(hào),根據(jù)對(duì)稱(chēng)可知,空心菱形后號(hào)個(gè)數(shù)與空心菱形前號(hào)一致。
第四個(gè)是數(shù)字菱形,該菱形的特點(diǎn)是數(shù)字從外到內(nèi)逐層遞增。我們發(fā)現(xiàn)該菱形中軸線數(shù)字的變化規(guī)律是先從1遞增到(n+1)/2,然后再遞減到1,并且每一行的數(shù)字也是從1遞增到中軸線,再遞減到1,因此我們要找到中軸線所在的位置(方便判斷循環(huán)因子是否到達(dá)中軸線)。通過(guò)列數(shù)據(jù)我們發(fā)現(xiàn)中軸線所在位置(j從0開(kāi)始循環(huán))為n/2-|n/2-i|,所以在每一行中我們的數(shù)字加到“j==n/2-|n/2-i|”處時(shí)應(yīng)該轉(zhuǎn)成遞減,所以我們引進(jìn)要填充的數(shù)字k,在每一行開(kāi)始時(shí)k為1,在j從0到n/2-|n/2-i|-1中,k逐次遞增,在j從n/2-|n/2-i|到n-2*|n/2-i|-1中k遞減。然后將打印星號(hào)改為打印數(shù)字即可。
第五個(gè)是邊框空心菱形。從名字可知,該菱形由邊框和空心菱形組成,我們可以將邊框和空心菱形分開(kāi)來(lái)考慮。第一行和最后一行為邊框,可直接用從0到n-1打印號(hào)實(shí)現(xiàn)。左右邊框在每一行的開(kāi)頭和結(jié)尾打印號(hào)即可實(shí)現(xiàn)。中間即是空心菱形的領(lǐng)域,基本上跟打印空心菱形一樣,只是要注意被邊框覆蓋的地方空格和號(hào)要省略。
將打印空格和打印號(hào)分開(kāi)考慮,通過(guò)數(shù)字之間的關(guān)系特點(diǎn),運(yùn)用循環(huán)完成菱形的打印。
由于菱形是對(duì)稱(chēng)的,所以絕對(duì)值是最好的數(shù)據(jù)描述工具,要巧妙地運(yùn)用絕對(duì)值,將對(duì)稱(chēng)部分的循環(huán)用同一個(gè)帶有絕對(duì)值的表達(dá)式表示出來(lái)。
值得注意的是n/2為整數(shù)除,所以不會(huì)得到小數(shù),也不是四舍五入。
中軸線所在位置(j從0開(kāi)始循環(huán))為n/2-|n/2-i|。
//挖空菱形 for(i=0;i<n;i++){ for(j=0;j<abs(n/2-i);j++) printf("*"); printf("*"); for(j=0;j<n-2*abs(n/2-i)-2;j++) printf(" "); if(j!=0) printf("*"); for(j=0;j<abs(n/2-i);j++) printf("*"); printf("\n"); } printf("\n"); //邊框菱形 for(i=0;i<n;i++){ if(i==0||i==n-1){ for(j=0;j<n;j++) printf("*"); printf("\n"); } else{ printf("*"); for(j=0;j<abs(n/2-i)-1;j++) printf(" "); if(j!=0) printf("*"); for(j=0;j<n-2*abs(n/2-i)-1;j++) printf(" "); if(j!=0) printf("*"); for(j=0;j<abs(n/2-i)-1;j++) printf(" "); if(j!=0) printf("*"); printf("\n"); } } //數(shù)字菱形 for(i=0;i<n;i++){ int k=1; for(j=0;j<abs(n/2-i);j++) printf(" "); for(j=0;j<n-2*abs(n/2-i);j++){ printf("%d",k); if(j<n/2-abs(n/2-i)) k++; else k--; } printf("\n"); } //實(shí)心菱形 for(i=0;i<n;i++){ for(j=0;j<abs(n/2-i);j++) printf(" "); for(j=0;j<n-2*abs(n/2-i);j++) printf("*"); printf("\n"); } printf("\n"); //空心菱形 for(i=0;i<n;i++){ for(j=0;j<abs(n/2-i);j++) printf(" "); printf("*"); for(j=0;j<n-2*abs(n/2-i)-2;j++) printf(" "); if(j!=0) printf("*"); printf("\n"); }
總結(jié)
到此這篇關(guān)于利用C語(yǔ)言打印菱形的文章就介紹到這了,更多相關(guān)C語(yǔ)言打印菱形內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言利用鏈表與文件實(shí)現(xiàn)登錄注冊(cè)功能
這篇文章主要介紹了C語(yǔ)言利用鏈表與文件實(shí)現(xiàn)登錄注冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12浮點(diǎn)數(shù)在計(jì)算機(jī)中存儲(chǔ)方式是怎樣的
這篇文章介紹了浮點(diǎn)數(shù)在計(jì)算機(jī)中是如何存儲(chǔ)的,講解的比較詳細(xì),有需要的朋友可以參考一下。2016-06-06C++使用gtest框架編寫(xiě)單元測(cè)試的教程詳解
gtest 是 Google 開(kāi)發(fā)的一個(gè)用于 C++ 的測(cè)試框架,廣泛應(yīng)用于編寫(xiě)和運(yùn)行單元測(cè)試,并且支持任何類(lèi)型的測(cè)試,而不僅僅是單元測(cè)試,本文本文給大家介紹了C++使用gtest框架編寫(xiě)單元測(cè)試的教程,需要的朋友可以參考下2024-08-08C++之string類(lèi)對(duì)象的容量操作詳解
通過(guò)在網(wǎng)站上的資料搜集,得到了很多關(guān)于string類(lèi)對(duì)象的容量操作,通過(guò)對(duì)這些資料的整理和加入一些自己的代碼,希望能夠給你帶來(lái)幫助2021-08-08C++?Boost?ProgramOptions超詳細(xì)講解
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱(chēng)2022-11-11C++實(shí)現(xiàn)String與UF8互轉(zhuǎn)
這篇文章介紹了C++實(shí)現(xiàn)String與UF8互轉(zhuǎn)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05C語(yǔ)言編程時(shí)常犯十八個(gè)錯(cuò)誤小結(jié)
C語(yǔ)言的最大特點(diǎn)是:功能強(qiáng)、使用方便靈活。C編譯的程序?qū)φZ(yǔ)法檢查并不象其它高級(jí)語(yǔ)言那么嚴(yán)格,這就給編程人員留下“靈活的余地”,但還是由于這個(gè)靈活給程序的調(diào)試帶來(lái)了許多不便,尤其對(duì)初學(xué)C語(yǔ)言的人來(lái)說(shuō),經(jīng)常會(huì)出一些連自己都不知道錯(cuò)在哪里的錯(cuò)誤2013-07-07C++強(qiáng)制轉(zhuǎn)換與智能指針示例詳解
這篇文章主要介紹了C++強(qiáng)制轉(zhuǎn)換與智能指針示例,智能指針(Smart Pointer)是一種抽象的數(shù)據(jù)類(lèi)型。在程序設(shè)計(jì)中,它通常是經(jīng)由類(lèi)模板來(lái)實(shí)現(xiàn),借由模板來(lái)達(dá)成泛型,借由類(lèi)別的析構(gòu)函數(shù)來(lái)達(dá)成自動(dòng)釋放指針?biāo)赶虻拇鎯?chǔ)器或?qū)ο?/div> 2022-11-11最新評(píng)論