寫一程式輸入5個整數數字,計算其總合和平均。解析:

  1. 需要1個變數儲存輸入的數字,稱此變數為inputNum好了
  2. 需要1個變數紀錄到目前為止所有inputNum的總和,稱此變數為sum,其初始值為0
  3. 以迴圈執行5次,每次輸入數字到inputNum,並把總和放到sum,迴圈執行的次數以變數i來代表
  4. 平均數為sum/5
#include <stdio.h>
int main {
    int i; // 紀錄迴圈執行次數
    int inputNum; // 儲存目前輸入的數值
    int sum = 0; // 儲存到目前為止的總和
    for (i = 1; i <= 5; i++) { // 此迴圈執行5次
        printf("Please Input Number %d: ",i); // 提示使用者輸入第i個數字
        scanf("%d", &inputNum); // 讀入整數到inputNum
        sum = sum + inputNum; // 加總到sum變數
    }
    printf("Sum is %d, average is %lf\n", sum, (double)sum / 5); // 輸出結果
}

寫一函數輸入參數int n,傳回1+2+3...+n的總合。解析:

  1. 要想辦法拜訪1,2,3...n的每一個數字一次
  2. 可用for(i=1; i <= n; i++)的形式達成上述目標
  3. 拜訪到這些數字時,就把它們加起來
int sum(int n) {
    int i; // 紀錄目前要處理的數字
    int sum = 0; // 紀錄到目前為止的總和
    for (i = 1; i <= n; i++) {
        sum = sum + i;
    }
    return sum;
}

寫一函數輸入參數int n,傳回1+3+5...+n的總合。解析:

  1. 要想辦法拜訪1,3,5...n的每一個數字一次,也就是從1開始每次加2
  2. 可用for(i=1; i <= n; i+=2)的形式達成上述目標
  3. 拜訪到這些數字時,就把它們加起來
int sum(int n) {
    int i; // 紀錄目前要處理的數字
    int sum = 0;
    for (i = 1; i <= n; i += 2) { // i+=2讓i往後面走2個
        sum = sum + i;
    }
    return sum;
}

寫一函數於螢幕上畫出九九乘法表。解析:

  1. 總共有i=1..9列j=1..9行,對第i列第j行元素來說,其數值為i*j
void nine() {
    int i, j; // i表示第i列(橫向),j表示第j行(縱向)
    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= 9; j++) {
            printf("%3d", i * j);
        }
        printf("\n");
    }
}

使用printf撰寫一函數輸入參數int size,並在螢幕上印出正方形,size=3的樣子如下

***
***
***

解析

  1. 螢幕上的游標只能由上而下,由左而右,無法回頭。
  2. 此圖形共有size列,每列有size個*,因此可用兩層迴圈來做。
  3. 要讓一個敘述執行size次,可用for(i = 1; i <= size; i++)的形式來達成
/**
 * print out rectangle
 * @param size length of the rectangle
 */
void print_rectangle(int size) {
    int i, j; // 第i列,第j行
    for (i = 1; i <= size; i++) { // 印出第i列
        for (j = 1; j <= size; j++) { // 第i列有size個*
            printf("*");
        }
        printf("\n");
    }
}

使用printf撰寫一函數輸入int size,並在螢幕上印出斜一邊的三角形,size=3的樣子如下

*
**
***

解析

  1. 螢幕上的游標只能由上而下,由左而右,無法回頭。
  2. 此圖形共有1到size列,第i列有i個*,因此可用兩層迴圈來做。
void print_right_triangle(int size) {
    int i, j; // 第i列,第j行
    for (i = 1; i <= size; i++) { // 印出第i列
        for (j = 1; j <= i; j++) { // 第i列有i個*
            printf("*");
        }
        printf("\n");
    }
}

使用printf撰寫一函數輸入int size,並在螢幕上印出等腰的三角形,size=3的樣子如下

  *
 ***
*****

解析

  1. 總共有1..size列,對第i列而言,有size-i個空格,以及2*i-1個*
void print_equilateral_triangle(int size) {
    int i, j;
    for (i = 1; i <= size; i++) { // 印出第i列
        for (j = 1; j <= size-i; j++) { // 第i列 有size-i個空格
            printf(" ");
        }
        for (j = 1; j <= 2 * i - 1; j++) { // 以及2*i-1個*
            printf("*");
        }
        printf("\n");
    }
}

上述問題的另一個想法是

  1. 總共有1..size列,對第i列而言,總共有size+i-1個符號,其中1..size-i是空白,size-i+1..size+i-1是*
void print_equilateral_triangle(int size) {
    int i, j;
    for (i = 1; i <= size; i++) { // 印出第i列
        for (j = 1; j < size + i; j++) { // 每一列有size+i-1個符號
            if (j <= size - i) {  // 在size-i左邊(含)的符號是空白
                printf(" ");
            } else {                 // 其他的是*
                printf("*");
            }
        }
        printf("\n");
    }
}

使用printf撰寫一函數輸入int size,並在螢幕上印出等腰的三角形,size=3的樣子如下

  *
 ***
*****
 ***
  *

解析

  1. 這個形狀的上半部和前面一題是一模一樣的,下半部則是倒過來了,所謂倒過來的意思是,上半部是依1..n的順序列出,下半部則是依n-1..1的順序列出,因此可以寫成兩個雙重迴圈,且這兩個迴圈的內迴圈完全一樣,只是外面的改為i由n-1..1
void print_diamond(int size) {
    int i, j;
    for (i = 1; i <= size; i++) { // 先印出上面的size列
        for (j = 1; j < size + i; j++) {
            if (j <= size - i) {
                printf(" ");
            } else {
                printf("*");
            }
        }
        printf("\n");
    }
    for (i = size - 1; i >= 1; i--) { // 在印出下面的size-1列
        for (j = 1; j < size + i; j++) { // 這部分和上半部是一樣的
            if (j <= size - i) {
                printf(" ");
            } else {
                printf("*");
            }
        }
        printf("\n");
    }
}

寫一函數求兩個整數的最大公因數,解析:

  1. 此函數需要兩個參數x,y
  2. 當y不能整除x時,將x設成為y,y設為x%y, 重複此步驟直到x%y為0
  3. 此時y就是這兩個數的最大公因數
int gcd(int x, int y) {
    int tmp;
    // 如果x < y 則下面的迴圈執行第一次時就會交換x,y了
    while (x % y != 0) {
        tmp = y;
        y = x % y;
        x = tmp;
    }
    return y;
}      

寫一函數求費氏數,解析:

  1. F(n)=n, if n<=1;
  2. F(n)=F(n-1)+F(n-2), otherwise
  3. 可定義兩變數fn_1,fn_2表示最近兩個找出的費氏數
  4. 下一個費氏數依定義為fn_1 + fn_2
  5. 找到最新的費氏數後,最近的兩個費氏數就變成了fn_1+fn_2以及fn_1
  6. 以變數i紀錄目前要求的是哪一個費氏數
  7. 以變數tmp作為更新最新兩個費氏數所需的記憶體空間
int fab(int n) {
    int fn_1 = 1, fn_2 = 0; // 紀錄最近找到的兩個費氏數
    int i, tmp; // i表示目前要找F(i)
    if (n <= 1) return n;
    for (i = 2; i <= n; i++) {
        tmp = fn_1;   // 先把fn_1紀錄在tmp
        fn_1 += fn_2; // 最新的費氏數是前面兩個相加
        fn_2 = tmp;   // 第二新的就是原先的fn_1
    }
    return fn_1;
}