為了配合專題C語言從零開始,今天開始一個新的專題《21天C語言代碼訓練營》。這個專題重點針對從零開始系列進行練習題講解。以21天為一個周期,為大家提供編程方面的實例講解。
最近,越來越多的初學者朋友在給我的郵件中提出這樣的問題:我在文章中講的東西他們都看懂了,但具體到自己寫代碼的時候卻完全不知道從何入手。其實看懂知識點例程和真正學會寫代碼之間相差了好幾條街,我一再強調,學編程沒有捷徑,只有老老實實地敲代碼。對于文章中的例子,大家一定要達到自己能夠完整的敲出來才行。當然,這里并不是要求大家死記硬背,要求的是在懂得設計思路和程序語法的基礎上,經過自己的二次加工后重新實現的過程。
在這個專題中,我們以練習為主,講解為輔,力求尋找出一種幫助大家快速提高編碼能力的新玩法。也希望朋友們緊跟我的更新速度堅持每天做練習,大家共同進步。
歡迎大家每天前來打卡~
訓練營規則
- 每天出一道練習題,請大家自己完成編碼
- 第二天的文章中會告訴大家一種或幾種經典解決方法
- 完成練習的同學,歡迎大家把代碼貼在留言中
- 如果有問題,也請留言,我會找機會集中解答
希望這種手把手的方式能夠幫助大家盡快掌握C語言編程。
1. 例題
今天我們先來講解一道C語言的經典例題,也是從零開始系列中的一道課后練習題。
請用控制臺程序繪制如下圖案。
2. 分析
這個題目是要求打印30行"*",每行打印的個數不同。通過這個信息,我們應該立刻反映出運用循環來完成。那么我們想想,在循環部分我們都學到了什么。
關于循環,我首先會想到一些例題:
2.1 例題1
打印30個"*",每個"*"占一行。
int i;
for (i = 0; i < 30; i++)
{
printf("*\n");
}
2.2 例題2
打印一行"*",個數為30
int i;
for (i = 0; i < 30; i++)
{
printf("*");
}
這兩個題目的代碼只差一個\n,結果卻完全不同。掌握了這兩個例題,我們自然能夠完成下面這個例題了。
2.3 例題3
打印一個由"*"組成的30行30列的矩陣。
int main()
{
int i, j;
for (i = 0; i < 30; i++)
{
for (j = 0; j < 30; j++)
{
printf("*");
}
printf("*\n");
}
return 0;
}
執行結果如下:
我們再把例3的要求改一改,要求如下
2.4 例題4
打印30行“*”。第一行打印1個“*”,第二行打印3個“*”,第三行打印5個“*”,... ,第三十行打印59個“*”。
在前面的程序中,我們用變量i控制行的循環,變量j控制列的循環。i的范圍029,j的范圍029。那么在例題4中,i和j有什么樣的關系呢?
找規律 | ||
---|---|---|
第一行 | i = 0; | j循環1次 |
第二行 | i = 1; | j循環3次 |
第三行 | i = 2; | j循環5次 |
... | ... | ... |
第三十行 | i = 29; | j循環59次 |
于是得到這樣一個關系:
規律 | ||
---|---|---|
第n行 | i = n - 1; | j循環2i + 1次 |
那么如何實現循環2i + 1次呢,就是讓j從0到2i + 1。
按照這個思路,可以得到下面的代碼:
#include <stdio.h>
#define LINE 30
int main()
{
int i, j;
for (i = 0; i < LINE; i++)
{
for (j = 0; j < 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
執行結果如下:
這里要說一個問題,其實for循環有兩種常見形式:
for (i = 0; i < n; i++)
和
for (i = 1; i <= n; i++)
這種寫法執行的次數相同,可以相互代替。大部分C語言程序員喜歡第一種方式,因為數組的下標訪問是從0開始的,這樣寫更方便。目前大家可以選擇自己喜歡的方法。
好了,回到例題中來。現在我們的代碼距離目標輸出已經很接近了,缺少的是在每行“*”之前需要輸入不同數量的空格。我們分析i和空格數量,可以得到如下關系:
每行輸出LINE - i個空格
于是,我們得到了最終的實現程序。
3. 答案
#include <stdio.h>
#define LINE 30
int main()
{
int i, j;
for (i = 0; i < LINE; i++)
{
for (j = 0; j < (LINE - i); j++)
{
printf(" ");
}
for (j = 0; j < 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
運行一下這段代碼,你會看到打印結果就是最前面的那張圖。
4. 課后練習
自己編寫代碼,打印出下面這張圖。
明天會講解這個程序,請大家先做練習。歡迎將自己的程序貼在留言中。
我是天花板,讓我們一起在軟件開發中自我迭代。
如有任何問題,歡迎與我聯系。
下一篇:21天C語言代碼訓練營(第二天)