# 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;
}
```
---
贊助單位:財團法人耀登炳南教育基金會
