---
# System prepended metadata

title: COMM15：C 語言練習題與答案

---

# COMM15：C 語言練習題與答案

[TOC]

---

## 課程練習

### Practice 1：提示使用者輸入一個整數，將該整數加1後輸出

```c=
#include <stdio.h>

int main(){
    int num;
    int ans;

    printf("請輸入一個整數："); // 提示用戶輸入一個整數
    scanf("%d", &num);

    ans = num + 1; // 將num加一後賦值給ans

    printf("加一後的結果是：%d\n", ans);

    return 0;
}
```

### Practice 2：使用者自行輸入a、b兩個整數，並用 if-else 判斷a>b是否成立。

```c=
#include <stdio.h>

int main(){
    int a,b;// 使用者輸入a,b來比較大小，故先宣告a,b 

    printf("請輸入整數a b\n");
    scanf("%d %d", &a ,&b ); // 讀取輸入的值存入整數a,b
    
    if( a>b ){
        printf("a > b成立");
    }
    else{
        printf("a > b不成立");
    }

    return 0;
}
```

### Practice 3：使用者自行輸入a、b兩個整數，並用if-else if判斷有幾個負數。

```c=
#include <stdio.h>

int main(){
    int a, b; // 使用者輸入a,b來比較大小，故先宣告a,b 

    printf("請輸入整數a b\n");
    scanf("%d %d", &a, &b);
  
    //"&&"：and，代表條件必須同時成立
    //"||"：or，代表只要有一個條件成立即可
    if((a < 0) && (b < 0)){
        printf("有2個負數");
    }
    else if((a < 0) && (b >= 0)){
        printf("有1個負數");
    }
    else if((b < 0) && (a >= 0)){
        printf("有1個負數");
    }
    else{
        printf("有0個負數");
    }

    return 0;
}
```

### Practice 4：請使用者輸入n，利用for迴圈，計算1+2+...+n的總和

```c=
#include <stdio.h>

int main(){
    int i, n;
    int sum = 0; // 宣告sum為總和

    printf("輸入n:");
    scanf("%d", &n);

    for(i = 0; i <= n; i++){
        sum += i; // 總和每次加上i
    }  
    
    printf("%d", sum);

    return 0;
}
```

### Practice 5：請使用者輸入多筆數字，利用while迴圈，計算多筆數字不含負數的總和，直到輸入負數後結束迴圈。

```c=
#include <stdio.h>

int main(){
    int sum = 0,n = 0;

    while(n>=0){
        sum += n; // sum每次加總輸入的n值
        printf("請輸入想加總的整數，輸入負數時結束迴圈:");
        scanf("%d", &n); 
    }

    printf("總和 = %d", sum);

    return 0;
}
```

### Practice 6：九九乘法
```c=
#include <stdio.h>

int main(){
    int i, j; // 宣告i,j(for迴圈的控制變數)

    for ( i = 1; i < 10; i ++){
        for ( j = 1; j < 10; j ++){
            printf("%d*%d=%d\t", i, j, i*j);
        }
        printf("\n"); // 同一個i的輸出在同一行
    }

    return 0;
}
```

### Practice 7：宣告一個具有 10 個整數元素的陣列

```c=
#include <stdio.h>

int main(){
    int i; //宣告i為陣列索引值
    int a[10]={1,2,3,4,5,6,7,8,9,10}; //初始化陣列
    
    /*利用 for 迴圈印出前5項*/
    for(i = 0; i < 5; i++){
        printf("a[%d]=%d\t", i, a[i]); 
    }
    a[1]=12; // 修改第二個元素為12
    printf("\n"); // 換行與上面一行做出區隔

    /*再次印出前5項*/
    for(i = 0; i < 5; i++){
        printf("a[%d]=%d\t", i, a[i]);
    }

    return 0;
}
```


## 練習題-基礎

### 1.    (變數宣告)宣告x, y, z並賦值
    
```c=
#include <stdio.h>

int main(){
    int x, y, z; // 宣告整數變數 x、y、z

    x = 5; // 將 x 初始化為 5
    y = 3; // 將 y 初始化為 3

    printf("%d %d\n", x / y, x % y); // 輸出 x 除以 y 的商和餘數 

    x += 2; // 將 x 增加 2，現在 x 變為 7
    z = x + y; // 將 x 與 y 相加後的結果賦值給 z，此時 z 為 10
 
    printf("%d %d %d\n", x, y, z); // 輸出 x、y、z 的值

    return 0;
}
```

### 2.    (條件判斷)使用者輸入三個整數，得出最大值
 
```c=
#include <stdio.h>

int main(){
    int num1, num2, num3;
    int max;

    printf("請輸入三個整數：\n");
    scanf("%d %d %d", &num1, &num2, &num3);
    max = num1; //先將num1的值賦予給max

    /* num2 > max，max = num2, num2 <= max，max的值不變*/
    if (num2 > max) {
        max = num2;
    }
    if (num3 > max) {
        max = num3;
    }

    printf("最大值是：%d\n", max);

    return 0;
}
```

### 3.    (條件判斷)使用者自行輸入年齡數字，進行年齡層判斷

```c=
#include <stdio.h>

int main() {
    int age; //宣告整數age紀錄年齡

    printf("請輸入您的年齡："); //提示使用者輸入年齡進行判斷
    scanf("%d", &age);

    //"&&"：and，代表條件必須同時成立
    //"||"：or，代表只要有一個條件成立即可
    if (age < 18) {
        printf("您是未成年人。\n");
    } 
    else if (age >= 18 && age <= 65) {
        printf("您是成年人。\n");
    } 
    else {
        printf("您是老年人。\n");
    }

    return 0;
}
```

### 4.    (條件判斷)使用者自行輸入星期幾，並用switch進行判斷工作日還是休息日

```c=
#include <stdio.h>

int main() {
    int day;

    printf("請輸入星期幾（1-7）：");
    scanf("%d", &day);

    switch (day) {
        case 1:
            printf("星期一：工作日\n");
            break;
        case 2:
            printf("星期二：工作日\n");
            break;
        case 3:
            printf("星期三：工作日\n");
            break;
        case 4:
            printf("星期四：工作日\n");
            break;
        case 5:
            printf("星期五：工作日\n");
            break;
        case 6:
            printf("星期六：休息日\n");
            break;
        case 7:
            printf("星期日：休息日\n");
            break;
        default:
            //當用戶輸入非1-7的數字時，會提醒這是無效的輸入
            printf("無效的輸入\n");
            break;
    }

    return 0;
}
```

### 5.    (迴圈) 計算由80加到-2的偶數和，並計算執行次數

```c=
#include <stdio.h>

int main() {
	int i; 
    int counter = 0; //宣告counter作為計數器
	int sum = 0;//宣告sum，指定值為0

	for (i = 80, counter = 0;i >= -2;i -=2){
		sum += i;// sum = sum + i
        counter++;
	}
	printf("從80加到-2的和為%d\n",sum);
	printf("迴圈執行了%d次，此時i=%d",counter,i);

	return 0;
}
```

### 6.    (陣列)計算陣列中各個元素的總和

```c=
#include <stdio.h>

int main() {
    int nums[] = {5, 10, 15, 20, 25}; // 宣告一個整數陣列
    int sum = 0; // 初始化總和為 0
    int i;
    // 使用迴圈將每個元素添加到總和中
    for (i = 0; i < 5; i++) {
        sum += nums[i]; //迴圈每執行一次，就會添加一個元素至總和中
    }

    printf("陣列元素的總和為：%d\n", sum);

    return 0;
}
```

## 練習題-進階

### 1.	十進位轉二進位

```c=
#include <stdio.h>

int main(){
    int decimal = 0; //紀錄輸入的十進位數
    int binary[32]; //int的最大值是2^31 
    int i=0; //while迴圈變數
    int j; //for迴圈變數
    
    while(decimal <= 0){
        printf("請輸入一個十進位的數字: ");
        scanf("%d",&decimal);
    }

    /*短除法*/
    while(decimal > 0){
        binary[i] = decimal % 2; //取餘數
        decimal /= 2; //取商數
        i++;
    }

    /*反向輸出*/
    for (j=i-1;j>=0;j--){
        printf("%d",binary[j]);
    }
    
    return 0;
}
```

### 2.	判斷質數

```c=
#include <stdio.h>

int main(){
    int i,isPrime;
    int number = 0;
    while(number<=0) //確認輸入值是大於零的正整數，否則會持續要求使用者輸入
    {
        printf("輸出小於等於輸入值的所有質數\n");
        scanf("%d",&number);
    }
    
    /*先假設輸入值為質數*/
    isPrime = 1;   //布林值：1=true; 0=false
    
    /*從2開始除輸入值，直到number-1*/
    for(i=2 ; i < number ; i++){
        /*若被整除不符合質數之定義*/
        if(number % i == 0){
            isPrime = 0;  //假設不成立，改為false
            break;  //跳脫迴圈
        }
    }

    /*根據是不是質數輸出結果*/
    if (isPrime && number != 1){
        printf("%d是質數\n",number);
    }
    /*由於1為例外，需要另外設定*/
    else if(number == 1){
        printf("%d不是質數\n",number);
    }
    else{
        printf("%d不是質數\n",number);
    }

    return 0;
}
```

### 3.	生成質數

```c=
#include <stdio.h>

int main(){
    int i,j,isPrime;
    int number = 0;
    int count = 0; //紀錄找到幾個質數
    
    while(number <= 0){ //確認輸入值是大於零的正整數，否則會持續要求使用者輸入
        printf("輸出小於等於輸入值的所有質數\n");
        scanf("%d",&number);
    }
    
    int prime[number]; //儲存找到的質數
                       //因恆有number>count的關係，所以將大小設為number
    
    /*從2開始判斷是否為質數（已知1不是）*/
    for(i=2 ; i <= number ; i++){
        
        /*先假設輸入值為質數*/
        isPrime = 1; //布林值：1=true; 0=false
        
        for(j=2 ; j<i ; j++){
            if(i % j == 0){
                isPrime = 0;
                break;
            }
        }
        if (isPrime){
            prime[count] = i;
            count++;
        } 
    }

    for (i = 0 ; i < count ; i++){
        printf("%d ",prime[i]);
    }    
    
    if(count == 0){
        printf("無");
    }

    return 0;
}
```

### 4.    靠左金字塔

```c=
#include <stdio.h>

int main(){
    int layer = 6; //宣告層數
    int i, j;
    for(i = 1 ; i < layer + 1 ; i++){ //外層迴圈：生成行數
        for(j=0 ; j < i ; j++){ //內部迴圈：生成每行內容
            printf("%d ",j+1); //輸出目標數字
        }
        printf("\n"); //完成一行，需換行
    }
    return 0;
}
```

### 5.    靠右金字塔

```c=
#include <stdio.h>

int main(){
    int layer = 6; //宣告層數
    int i, j;
    for(i=1 ; i < layer + 1 ; i++){ //外層迴圈：生成行數
        for(j=0 ; j < layer + 1 - i ; j++){ //內層迴圈1：生成每行內容
            printf("  "); //輸出空格以靠右
        }
        for(j=i ; j>0 ; j--){ //內層迴圈2：接續剛才的內容繼續生成
            printf("%d ",j); //接續空格輸出目標數字
        }
        printf("\n"); //完成一行，需換行
    }
    return 0;
}
```

### 6.    計算三角形面積

```c=
#include <stdio.h>
#include <math.h> //提供絕對值函數abs()

int main(){
    float Ax, Ay, Bx, By, Cx, Cy; //宣告座標為浮點數
    printf("請輸入A點座標(x y)：");
    scanf("%f %f",&Ax ,&Ay);
    printf("\n請輸入B點座標(x y)：");
    scanf("%f %f",&Bx,&By);
    printf("\n請輸入C點座標(x y)：");
    scanf("%f %f",&Cx,&Cy);

    float area; //宣告面積為浮點數
    area = fabs( 0.5 * (Ax*By + Bx*Cy + Cx*Ay - Bx*Ay- Cx*By - Ax*Cy)); //面積公式：行列式
    printf("\n三角形面積為：%f\n",area);

    return 0;
}
```

### 7.    氣泡排序法

```c=
#include <stdio.h>

int main(){
    /*建立一個讓使用者輸入的陣列*/
    int number,i;
    printf("要輸入幾筆資料？\n");
    scanf("%d",&number);
    printf("開始輸入資料\n");
    int a[number];
    for ( i=0 ; i < number ; i++){
        scanf("%d",&a[i]);
    }

    /*開始排序*/
    int temp, j;
    
    for (i=0 ; i < number - 1 ; i++){
        for (j=0 ; j < number - 1 ; j++){
            if (a[j]>a[j+1]){ //若前項比較大則進行交換
                /*交換*/
                temp = a[j+1];
                a[j+1] = a[j];
                a[j] = temp;
            }
        }
    }

    /*輸出*/
    for (i=0 ; i < number ; i++){
        printf("%d ",a[i]);
    }

    return 0;
}
```

### 8.    費氏數列

```c=
#include <stdio.h>

int main(){
    int number,i;
    printf("請問要產生幾項的費氏數列？（需大於2）");
    scanf("%d",&number);

    int f[number];
    f[0] = 1;
    f[1] = 1;
    printf("%d %d ",f[0],f[1]);

    for (i=2 ; i < number ; i++){
        f[i] = f[i-1] + f[i-2];
        printf("%d ",f[i]);
    }

    return 0;
}
```

### 9.    終極密碼

```c=
#include <stdio.h>
#include <stdlib.h> //提供rand()函數
#include <time.h> //提供time()函數

int main(){
    int answer;
    srand(time(NULL)); //產生隨機種子碼，以免每次的隨機數都是一樣的
    answer = rand() % 1000 + 1; //取餘數只會到被除數-1，因此需要再+1以確保範圍是1~1000
    int max = 1000;
    int min = 0;
    int input;
    int count = 0;
    printf("猜一個數字：\n");

    /*無窮迴圈：while會在括號中的條件成立（True）時執行
    若括號中是1表示此迴圈會不停執行，此時就必須確立好中斷（break）的條件以免當機*/
    while(1){ 
        scanf("%d",&input);
        count++;
        if( input > answer){
            max = input;
        }
        else if( input < answer){
            min = input;
        }
        else{
            printf("猜到密碼了！共猜了%d次 ",count);
            break; //跳脫迴圈，不會執行第30行的敘述。
        }
        printf("%d~%d\n",min,max);
    }
    return 0;
}
```

---

贊助單位：財團法人耀登炳南教育基金會
![螢幕擷取畫面 2024-07-08 145517](https://hackmd.io/_uploads/rJkkVfKv0.png)
