網(wǎng)站首頁 編程語言 正文
? ? ? ? 經(jīng)過一段時(shí)間的學(xué)習(xí)后,想必大家都已經(jīng)開始摩拳擦掌,迫不及待地想用C語言寫一些程序了。
? ? ? ? 那么今天,我們就來學(xué)習(xí)C語言中常見的例子——輸出任意邊長(zhǎng)的菱形
????????適用范圍:學(xué)習(xí)并掌握了C語言循環(huán)以及之前的內(nèi)容
? ? ? ??
? ? ? ? 上面圖片中用黃色a標(biāo)示出來的便是菱形的邊長(zhǎng),圖片中為3,當(dāng)然,也可以理解為(星號(hào)的行數(shù)+1)/2
????????那么,廢話不多說,上教程
? ? ?1.簡(jiǎn)單理解星號(hào)輸出原理,將輸出星號(hào)代碼分為上方和下方兩部分
? ? ? ? 首先,我們可以觀察到如果邊長(zhǎng)為a的話,那么最長(zhǎng)的一行的長(zhǎng)度就為2*a-1,同時(shí),每列星號(hào)都是對(duì)齊的,這說明我們?nèi)绻胍敵鲂翘?hào),是有規(guī)律可循的,沒星號(hào)的地方我們可以用空格來代替,這樣一想,發(fā)現(xiàn),我們好像可以使用x軸區(qū)間來控制空格和星號(hào)的輸出
? ? ? ? 例如,第三行,如果我們?cè)O(shè)第一個(gè)星號(hào)的x坐標(biāo)為1的話,并在此基礎(chǔ)上輸出5個(gè)星號(hào),那我們只需要寫一串代碼去控制在x屬于[1,5]的區(qū)間上輸出星號(hào)就行了
? ? ? ? 同樣,對(duì)于圖片中第一行來說,我們只需要寫一串代碼來控制在x屬于(2,4)的區(qū)間上輸出一個(gè)星號(hào)就行了,如下
for(int j=1;j<2*3-1;j++) //3為圖片中菱形的邊長(zhǎng) { if(j>2&&j<4) printf("*"); else printf(" "); }
? ? ? ? 現(xiàn)在,由于行數(shù)不同,每行輸出的星號(hào)數(shù)也就不同,那么,我們就可以找出輸出星號(hào)數(shù)和行數(shù)的的關(guān)系
? ? ? ? 但是,我們又可以看出,最長(zhǎng)的一行星號(hào)上面的星號(hào)輸出方式為由少到多,而最長(zhǎng)一行下面的星號(hào)輸出方式為由多到少,那么,對(duì)于上面和下面,我們要找的星號(hào)數(shù)與行數(shù)的關(guān)系也是不同的
? ? ?2.上方輸出星號(hào)代碼
? ? ? ? 那么,接下來,我們先討論最長(zhǎng)一行星號(hào)的上方(包括最長(zhǎng)一行星號(hào)),輸出星號(hào)數(shù)與行數(shù)的關(guān)系
? ? ? ? 首先,我們要遍歷最長(zhǎng)一行上方的所有行(包括最長(zhǎng)一行),這時(shí),就要用到for循環(huán),這里的a表示最長(zhǎng)的一行的行數(shù),同時(shí)也是菱形的邊長(zhǎng)
for(int i=1;i<=a;i++)
? ? ? ? 接下來,我們要找到行數(shù)與輸出星號(hào)數(shù)的關(guān)系?
? ? ? ? 經(jīng)過觀察,我們發(fā)現(xiàn),如果a為邊長(zhǎng),i表示行數(shù),那么則在(a-i,2*a-(a-i))區(qū)間上要輸出星號(hào)
? ? ?看到這里的友友們可以停下來思考一下,思考通了在接著看?
? ? ? ? 好的,那么接下來,我們要遍歷列,單單遍歷行是不夠的,不能控制星號(hào)以及空格的輸出,所以,我們就需要遍歷列
? ? ? ? 如下,我們用到了輸出星號(hào)的區(qū)間,如果列數(shù)在區(qū)間(a-i,2*a-(a-i))內(nèi),就輸出星號(hào),不在區(qū)間內(nèi),就輸出空格,這樣,就可以控制輸出星號(hào)以及行數(shù)的關(guān)系了。
? ? ? ? 當(dāng)然,也別忘了,每輸出一行星號(hào)就要換行,所以要寫printf("\n"),但要寫在遍歷列for循環(huán)的外面,遍歷行for循環(huán)的里面
? ? ? ? 這就是上方輸出星號(hào)的全部了,看到這兒,是不是想嘗試自己編寫下方星號(hào)的輸出了呢,如果想的話,那就大膽的去嘗試一下(* ̄︶ ̄)
for (int i = 1; i <= a; i++) //遍歷菱形最長(zhǎng)一行上方(包括最長(zhǎng)的一行)所有行 { printf(" "); //每行前面加空格,整齊好看 for (int j = 1; j<=2*a-1; j++) //遍歷菱形最長(zhǎng)一行上方(包括最長(zhǎng)的一行)每行的所有列 { if (j > a - i&& j <2 * a - (a - i)) printf("*"); else printf(" "); } printf("\n"); }
? ? ?3.下方輸出星號(hào)代碼
????????好的,那么下面,我們討論最長(zhǎng)一行星號(hào)的下方(不包括最長(zhǎng)一行星號(hào)),輸出星號(hào)數(shù)與行數(shù)的關(guān)系
? ? ? ? 先寫下方的遍歷行,我們是從最長(zhǎng)的一行的下一行開始輸出,最長(zhǎng)的一行的行數(shù)為a,那么,我們要定義行的初始值為a+1,行的最大值為2*a-1
? ? ? ? 就像上方輸出星號(hào)一樣,接著要找輸出星號(hào)的區(qū)間,經(jīng)過觀察,可以發(fā)現(xiàn),列數(shù)在區(qū)間(i-a,2*a-(i-a))內(nèi),就輸出星號(hào),不在區(qū)間內(nèi),就輸出空格,這樣,就可以控制輸出星號(hào)以及行數(shù)的關(guān)系了。
? ? ? ? 接下來,要遍歷列,代碼如下
for(int i=a+1;i<=2*a-1;i++)
????????當(dāng)然,也別忘了,每輸出一行星號(hào)就要換行,所以要寫printf("\n"),但要寫在遍歷列for循環(huán)的外面,遍歷行for循環(huán)的里面
????????這就是下方輸出星號(hào)的全部了(* ̄︶ ̄)
for (int i = a + 1; i <= 2*a-1 ; i++) //遍歷菱形最長(zhǎng)一行上方(包括最長(zhǎng)的一行)所有行 { printf(" "); //每行前面加空格,整齊好看 for (int j = 1; j <= 2 * a - 1; j++) //遍歷菱形最長(zhǎng)一行下方(不包括最長(zhǎng)的一行)每行的所有列 { if (j > i - a && j < 2*a - (i - a)) printf("*"); else printf(" "); } printf("\n"); }
全部代碼如下
#include <stdio.h> #include <stdlib.h> int main(void) { int a; //菱形的邊長(zhǎng) //注意,由于屏幕的大小限制,過大的邊長(zhǎng)(比如100)會(huì)導(dǎo)致無法輸出正常的菱形,望理解 printf("輸入菱形的邊長(zhǎng):\n"); scanf_s("%d", &a); for (int i = 1; i <= a; i++) //遍歷菱形最長(zhǎng)一行上方(包括最長(zhǎng)的一行)所有行 { printf(" "); //每行前面加空格,整齊好看 for (int j = 1; j<=2*a-1; j++) //遍歷菱形最長(zhǎng)一行上方(包括最長(zhǎng)的一行)每行的所有列 { if (j > a - i&& j <2 * a - (a - i)) printf("*"); else printf(" "); } printf("\n"); } for (int i = a + 1; i < 2*a + 1; i++) //遍歷菱形最長(zhǎng)一行上方(包括最長(zhǎng)的一行)所有行 { printf(" "); //每行前面加空格,不和邊框擁擠,可去掉 for (int j = 1; j <= 2 * a - 1; j++) //遍歷菱形最長(zhǎng)一行下方(不包括最長(zhǎng)的一行)每行的所有列 { if (j > i - a && j < 2*a - (i - a)) printf("*"); else printf(" "); } printf("\n"); } system("pause"); return 0; }
原文鏈接:https://blog.csdn.net/qq_62858590/article/details/122203281
相關(guān)推薦
- 2022-06-06 element ui表單el-form的label自適應(yīng)寬度
- 2022-05-07 redis實(shí)現(xiàn)分布式session的解決方案_Redis
- 2023-01-31 golang獲取變量或?qū)ο箢愋偷膸追N方式總結(jié)_Golang
- 2022-11-03 C#中委托、事件和回調(diào)的使用及說明_C#教程
- 2022-09-24 python基于numpy的線性回歸_python
- 2022-12-29 React修改數(shù)組對(duì)象的注意事項(xiàng)及說明_React
- 2022-10-16 部署k8s集群的超詳細(xì)實(shí)踐步驟_云和虛擬化
- 2022-05-25 flutter實(shí)現(xiàn)底部導(dǎo)航欄_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支