上一篇的評(píng)論中,大家反饋評(píng)論中貼代碼無(wú)法排版。我們改一下規(guī)則,大家可以把自己實(shí)現(xiàn)的代碼發(fā)布在自己的簡(jiǎn)書(shū)博文中,之后把鏈接貼在評(píng)論中。這樣也方便大家日后追溯。
當(dāng)然,也可以直接發(fā)郵件給我。希望大家堅(jiān)持打卡,共同進(jìn)步。
1. 習(xí)題講解
1.1 題目
上篇最后留下了這樣一道題目,用代碼打印出下面這幅圖。

1.2 分析
這個(gè)圖形共31行,可以分成兩個(gè)部分。上半部分是一個(gè)16行的正三角形,下半部分是一個(gè)15行的倒三角形。三角形的繪制方法我們上一篇已經(jīng)講過(guò)了,很容易,我們可以寫(xiě)出下面這段代碼。
int main()
{
int i, j;
int n;
// 正三角形
for (i = 0; i < 16; i++)
{
for (j = 0; j < 15 - i; j++)
printf(" ");
for (j = 0; j < 2 * i + 1; j++)
printf("*");
printf("\n");
}
// 倒三角形
for (i = 0; i < 15; i++)
{
for (j = 0; j < i + 1; j++)
printf(" ");
for (j = 0; j < 2 * (15 - i) - 1; j++)
printf("*");
printf("\n");
}
return 0;
}
自己執(zhí)行一下這段代碼,功能倒是實(shí)現(xiàn)了,但是兩部分用兩組for循環(huán)實(shí)在有些累贅。把這段代碼進(jìn)行優(yōu)化,得到最終結(jié)果。
1.3 答案
#define LINE 31
int main()
{
int i, j;
int n;
for (i = 0; i < LINE; i++)
{
if (i <= LINE / 2)
n = i;
else
n = LINE - i - 1;
for (j = 0; j < (LINE / 2 - n); j++)
printf(" ");
for (j = 0; j < 2 * n + 1; j++)
printf("*");
printf("\n");
}
return 0;
}
請(qǐng)大家仔細(xì)研讀這段代碼,有問(wèn)題歡迎探討。
2. 例題
今天的例題也不算很難,是之前微信中朋友們提問(wèn)中相當(dāng)簡(jiǎn)單的一個(gè)題目,重點(diǎn)在于幫助大家了解程序設(shè)計(jì)的基本思路。題目如下:
請(qǐng)編程計(jì)算出x + 2y + 3z = 100這個(gè)方程的所有解。
3. 分析
遇到這種問(wèn)題,我們需要有一個(gè)基本的思想就是窮舉出所有的可能,就像密碼試錯(cuò)一樣。我們假設(shè)x,y,z的范圍是0~100,那么總共有100 * 100 * 100種組合。只要我們依次判斷所有的組合就能找到答案。這種排列組合有一個(gè)最基本的方法就是三重循環(huán)。
4. 答案
int main()
{
int x, y, z;
for (x = 0; x < 101; x++)
for (y = 0; y < 101; y++)
for (z = 0; z < 101; z++)
if (x + 2 * y + 3 * z == 100)
printf("x = %d, y = %d, z = %d\n", x, y, z);
return 0;
}
執(zhí)行結(jié)果如下:

當(dāng)然,這個(gè)程序還有繼續(xù)優(yōu)化的空間,x的取值范圍0100,y的取值范圍050,z的取值范圍是0~34。這樣就能大大提高程序運(yùn)行的效率。請(qǐng)大家自己實(shí)現(xiàn)。
5. 課后練習(xí)
周末了,今天的練習(xí)題給點(diǎn)難度。請(qǐng)大家試著編程完成打印楊輝三角。如下圖:

我是天花板,讓我們一起在軟件開(kāi)發(fā)中自我迭代。
如有任何問(wèn)題,歡迎與我聯(lián)系。
上一篇:21天C語(yǔ)言代碼訓(xùn)練營(yíng)(第一天)
下一篇:21天C語(yǔ)言代碼訓(xùn)練營(yíng)(第三天)