# 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)