1. 程式人生 > >C語言代碼訓練營(2)

C語言代碼訓練營(2)

周末 int main 基本 之前 lin 例題 鏈接 params

上一篇的評論中,大家反饋評論中貼代碼無法排版。我們改一下規則,大家可以把自己實現的代碼發布在自己的簡書博文中,之後把鏈接貼在評論中。這樣也方便大家日後追溯。

當然,也可以直接發郵件給我。希望大家堅持打卡,共同進步。

1. 習題講解

1.1 題目

上篇最後留下了這樣一道題目,用代碼打印出下面這幅圖。

技術分享
菱形

1.2 分析

這個圖形共31行,可以分成兩個部分。上半部分是一個16行的正三角形,下半部分是一個15行的倒三角形。三角形的繪制方法我們上一篇已經講過了,很容易,我們可以寫出下面這段代碼。

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;
}

自己執行一下這段代碼,功能倒是實現了,但是兩部分用兩組for循環實在有些累贅。把這段代碼進行優化,得到最終結果。

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;
}

請大家仔細研讀這段代碼,有問題歡迎探討。

2. 例題

今天的例題也不算很難,是之前微信中朋友們提問中相當簡單的一個題目,重點在於幫助大家了解程序設計的基本思路。題目如下:

請編程計算出x + 2y + 3z = 100這個方程的所有解。

3. 分析

遇到這種問題,我們需要有一個基本的思想就是窮舉出所有的可能,就像密碼試錯一樣。我們假設x,y,z的範圍是0~100,那麽總共有100 * 100 * 100種組合。只要我們依次判斷所有的組合就能找到答案。這種排列組合有一個最基本的方法就是三重循環。

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;
}

執行結果如下:

技術分享
執行結果

當然,這個程序還有繼續優化的空間,x的取值範圍0~100,y的取值範圍0~50,z的取值範圍是0~34。這樣就能大大提高程序運行的效率。請大家自己實現。

5. 課後練習

周末了,今天的練習題給點難度。請大家試著編程完成打印楊輝三角。如下圖:

技術分享

學習過程中遇到什麽問題或者想獲取學習資源的話,歡迎加入學習交流群
639368839,我們一起學C/C++!

C語言代碼訓練營(2)