C Primer Plus (第五版) 第五章 程式設計練習 答案

zsdfxcwb發表於2017-09-17
1. 編寫一個程式。將用分鐘表示的時間轉換成以小時和分鐘表示的時間。使用#define或者const來建立一個代表60的符號常量。使用while迴圈來允許使用者重複鍵入值,並且當鍵入一個小於等於0的時間時終止迴圈。
#include <stdio.h>
#define M_PER_H	60		// 一小時有60分鐘
int main(void)                
{
    int min,hour,left;		// min:minute, left: 剩餘分鐘數	

    printf("請輸入分鐘數(0或負數終止迴圈):\n");
    scanf("%d",&min);
	
    while (min > 0)
    {
        hour = min / M_PER_H
        left = min % M_PER_H;

        printf("%d minutes are %d hours, %d minutes.\n",min,hour,left);

        printf("再一次輸入分鐘數(0或負數終止迴圈):");
        scanf("%d",&min);
    }

    printf("That's all!\n");
  
    return 0;
}
Ouput:

2. 編寫一個程式,此程式要求輸入一整數,然後列印出從(包括)輸入的值到(包括)比輸入的值大10的所有整數值(也就是說,如果輸入為5,那麼輸出就從5到15)。要求在各個輸出值之間用空格、製表符或換行符分。
#include <stdio.h>
int main(void)                
{
    int num,end;		// end:列印結束的值

    printf("請輸入一個整數:\n");
    scanf("%d",&num);

    end = num + 10;
	
    while (num <= end)
    {
        printf("%d ",num);	// 各輸出值之間用空格分開
        num++;
    }
	
    printf("\n");

    return 0;
}

/* 方法2

#include <stdio.h>
 
int main(void)
{
    int num, end;
 
    printf("請輸入一個整數:");
    scanf("%d", &num);

    end = 11;

    while (end-- > 0)
    {
        printf("%d\t", num++);
    }

    printf("\n");
 
    return 0;
}

*/

/* 方法3

#include <stdio.h>
 
int main(void)
{
    int num, end;
    end = 0;
 
    printf("請輸入一個整數:");
    scanf("%d", &num);

    while (end++ < 11)
    {
        printf("%d\n", num++);
    }

    printf("\n");
 
    return 0;
}

*/
Output:

3. 編寫一個程式,該程式要求使用者輸入天數,然後將該值轉換為週數和天數。例如,此程式將把18天轉換成2周4天。用下面的格式顯示結果:
18 days are 2 weeks, 4 days.
使用一個while迴圈讓使用者重複輸入天數;當使用者輸入一個非正數(如0或-20)時,程式將終止迴圈。
#include <stdio.h>
#define D_PER_W	7	// 一個星期有7天
int main(void)                
{
    int days,weeks,left;	// left(left days)

    printf("請輸入天數(0或負數退出程式):\n");
    scanf("%d",&days);
	
    while (days > 0)
    {
        weeks = days / D_PER_W;
        left = days % D_PER_W;
        printf("%d days are %d weeks, %d days.\n",days,weeks,left);
        // printf("%d days are %d weeks, %d days.\n",days,days / D_PER_W,days % D_PER_W); 直接輸出和先賦值再輸出有什麼區別

        printf("再一次輸入天數(0或負數退出程式):");
        scanf("%d",&days);
    }
  
    return 0;
}
Output:

4. 編寫一個程式讓使用者按釐米輸入一個高度值,然後,程式按照釐米和英尺英寸顯示這個高度值。允許釐米和英寸的值出現小數部分。程式允許使用者繼續輸入,直到使用者輸入一個非正的數值。程式執行的示例如下面所示:
Enter a height in centimeters: 182
182.0 cm = 5 feet, 11.7 inches
Enter a height in centimeters(<=O to quit): 168
168.0 cm = 5 feet, 6.1 inches
Enter a height in centimeters(<=O to quit): 0
bye
#include <stdio.h>
#define C_PER_I 2.54		// 一英寸等於2.54釐米
#define I_PER_F 12		// 一英尺等於12英寸
int main(void)                
{
    double cm;			// cm = centimeter
    double inch;
    int feet;

    printf("Enter a height in centimeters: ");    
    scanf("%lf",&cm);

    while (cm > 0)
    {
        inch = cm / C_PER_I;
        feet = (int)inch / I_PER_F;

        printf("%.1f cm = %d feet, %.1f inches\n",cm,feet,inch);
        // printf("%.1f cm = %d feet, %.1f inches\n",cm,feet,inch - feet * I_PER_F); 按照書上思路列印

        printf("Enter a height in centimeters (<=0 to quit): ");
        scanf("%lf",&cm);
    }

    printf("bye\n");
	
    return 0;
}
Output:

5. 改寫用來找到前20個整數之和的程式addemup.c(程式清單5.13)(如果您願意,可以把addemup.c程式看成是一個計算如果您第一天得到$l,第二天得到$2,第三天得到$3,以此類推,您在20天裡會掙多少錢的程式)。修改該程式,目的是您能互動地告訴程式計算將進行到哪裡。也就是說,用一個讀入的變數來代替20。
#include <stdio.h>
int main(void)               
{
    int count, sum;   	
    int num;
	
    printf("請輸入一個整數,求1到這個數的和:\n");
    scanf("%d",&num);

    count = 0;                
    sum = 0;  

    while (count++ < num)     
        sum = sum + count;

    printf("sum = %d\n",sum);
  
    return 0;
}
Output:

6. 現在修改程式設計練習5中的程式,使它能夠計算整數平方的和(如果您喜歡,可以這樣認為:如果您第一天得到$l,第二天得到$4,第三天得到$9,以此類推您將得到多少錢。這看起來像一個很好的買賣)。C沒有平方函式,但是您可以利用n的平方是n*n的事實。
#include <stdio.h>
int main(void)               
{
    int count, sum;   	
    int num;
	
    printf("請輸入一個整數,求1到這個數的平方和:\n");
    scanf("%d",&num);

    count = 0;                
    sum = 0;  

    while (count++ < num)     
        sum = sum + count * count;
    printf("Square sum = %d\n",sum);
  
    return 0;
}
Output:

7. 編寫一個程式,該程式要求輸入一個float型數並列印該數的立方值。使用您自己設計的函式來計算該值的立方並且將它的立方列印出來。main()程式把輸入的值傳遞給該函式。
#include <stdio.h>
void cube(float n);
int main(void)               
{
    float num;

    printf("請輸入一個浮點數:\n");
    scanf("%f",&num);

    cube(num);
  
    return 0;
}

void cube(float n)
{
    printf("%.2f 的立方是:%.2f\n",n,n * n * n);
}
Output:

8. 編寫一個程式,該程式要求使用者輸入一個華氏溫度。程式以double型別讀入溫度值,並將它作為一個引數傳遞給使用者提供的函式Temperatures()。該函式將計算相應的攝氏溫度和絕對溫度,並以小數點右邊有兩位數字的精度顯示這三種溫度。它應該用每個值所代表的溫度刻度來標識這3個值。下面是將華氏溫度轉換成攝氏溫度的方程:
Celsius = 1.8 * Fahreneit + 32.0
通常科學上的絕對溫度的刻度是0代表絕對零,是可能溫度的下界。下面是將攝氏溫度轉換為絕對溫度的方程:
Kelvin=Celsius+273.16
Temperatures()函式使用const來建立代表該轉換裡的3個常量的符號。main()函式將使用一個迴圈來允許使用者重複地輸入溫度,當使用者輸入q或其他非數字值時,迴圈結束。
#include <stdio.h>
void temperatures(double f);
int main(void)               
{
    double fahrenheit;		

    printf("請輸入一個華氏溫度:\n");

    while (scanf("%lf",&fahrenheit) == 1)
    {
        temperatures(fahrenheit);
        printf("請輸入一個華氏溫度(輸入q或非數字值,迴圈結束):\n");
    }

    printf("That's all!\n");

    return 0;
}

void temperatures(double f)		// 按照書中給出的公式計算,但是公式好像有錯,錯在將華氏和攝氏弄反
{
    const double FTC_S1 = 1.8;		// 華氏溫度轉換成攝氏溫度的轉換因子1
    const double FTC_S2 = 32.0;		// 華氏溫度轉換成攝氏溫度的轉換因子2
    const double CTK_S1 = 273.16;	// 攝氏溫度轉換成絕對溫度的轉換因子

    double celsius,kelvin;
	
    celsius = FTC_S1 * f + FTC_S2;
	
    kelvin = celsius + CTK_S1;
	
    printf("Fahrenheit: %.2f℉\n",f);
    printf("Celsius: %.2f℃\n",celsius);
    printf("Kelvin: %.2fK\n",kelvin);
}

/* 正確公式的函式

void temperatures(double f)			
{
    const double FTC_S1 = 1.8;		// 華氏溫度轉換成攝氏溫度的轉換因子1
    const double FTC_S2 = 32.0;		// 華氏溫度轉換成攝氏溫度的轉換因子2
    const double CTK_S1 = 273.16;	// 攝氏溫度轉換成絕對溫度的轉換因子

    double celsius,kelvin;
	
    celsius = (f - FTC_S2) / FTC_S1;
	
    kelvin = celsius + CTK_S1;
	
    printf("Fahrenheit: %.2f℉\n",f);
    printf("Celsius: %.2f℃\n",celsius);
    printf("Kelvin: %.2fK\n",kelvin);
}

*/
Output:

相關文章