C程序設計 譚浩強 第四章課後習題詳解(包含算法分析,運行結果)

第四章 選擇結構程序設計

章節重點:這一章應着重掌握if...else語句、switch多分支語句、關係運算符和關係表達式、邏輯運算符和邏輯表達式、條件運算符和條件表達式、會使用選擇結構的嵌套

(1)概念題(這裏着重理解)

算數運算:+、-、*、/運算,對象爲實數或複數,結果也爲實數或者複數。

關係運算:>、>=、<、<=、==、!=,六種,關係運算的值爲邏輯值,true、false。

邏輯運算:&&、||、!,三種,邏輯運算的值爲邏輯值,true、false。

 

(2)概念題(這裏着重理解)

在C的邏輯運算中 1 代表爲 真,以 0 代表爲 假 。

在邏輯表達式中的運算對象 非零 代表 真,以 0 代表 假 。

 

(3)a=3,b=4,c=5。寫出邏輯表達式的值(詳細講解一道題)

a+b>3&&b==c

要掌握符號的優先級問題,因爲a+b=7所以a+b>3爲真,然後b是不等於c的所以爲假,1&&0,結果爲0。

這種題的解題技巧在先處理關係運算,處理完後在分析邏輯運算,分清運算符的結合方向爲自右向左還是自左向右。

 

(4)輸入三個數,輸出最大值

# include <stdio.h>
int main()
{
    int a,b,c,max;
    scanf("%d,%d,%d",&a,&b,&c);//注意輸入格式
    if(a>b)
        max=a;
    else
        max=b;
    if(max<c)
        max=c;
    printf("%d",max);
    return 0;
}

 

(5)輸入小於1000的正數,輸出它的平方根(注意題目中的要求)

算法分析:注意double數據類型的輸入格式以及求次方的pow()函數。想輸出整形,可以直接賦值給整形。y=\begin{cases} & \text{ x , } x<1 \\ & \text{ 2x-1 , } 1<=x<10 \\ & \text{ 3x-11 , } x>= 10 \end{cases}

#include <stdio.h>
#include <math.h>
int main()
{   double n;
    int  m=2;
    int s;
    printf("請輸入一個小於1000的正數n\n");
    scanf("%lf",&n);//double數據類型的輸入需使用%lf
    //printf("%f\n",n);double數據類型的輸出使用%f即可
    if(n>1000)
        printf("請從新輸入正數n\n");
    s=pow(n,2);
    printf("n的平方根爲%d",s);
    return 0;
}

 

(6)階躍函數求值

y=\begin{cases} & \text{ x, } x<1 \\ & \text{2x-1,} 1<=x<10\\ & \text{ 3x-11,} x>= 10 \end{cases}

#include <stdio.h>
int main()
{
    int x,y;  //根據要求定義數據類型
    printf("請輸入x的值\n");
    scanf("%d",&x);
    if(x<1)
        y=x;
    else if((1<=x)&&(x<10))
        y=2*x-1;
    else
        y=3*x-11;
    printf("%d",y);
    return 0;
}

(7)階躍函數求值

Y=\begin{cases} & \text{ -1 , } x<0\\ & \text{ 0 , } x= 0\\ & \text{1 , } x>0 \end{cases}

    這道題根據給出的程序,應該明白if與else的配對關係,else總是與他上面的最近的未配對的if配對。

  程序1不能實現題目要求,當x輸入負數時 ,y輸出的是0,因爲執行了else。當x輸入爲零時,就沒有進入if的判斷體。

  程序2也不能實現題目要求,當x輸入負數時,y輸出0,因爲不進入if判斷體。當x輸入0時,y=-1,執行else語句。

(8)成績等級

算法分析:對於輸出成績等級,選擇比較多,可選用switch多分支語句,也可使用if...else。

# include<stdio.h>
int main ()
{
    int score;
    printf("請輸入百分制成績\n");
    scanf("%d",&score);
    switch(score/10){  //取除數
    case 9:printf("A");break;
    case 8:printf("B");break;
    case 7:printf("C");break;
    case 6:printf("D");break;
    case 5:
    case 4:
    case 3:
    case 2:
    case 1:
    case 0:printf("E");break;//若值爲5,4,3,2,1,0都執行E;
    }
    return 0;
}

(9)正整數

算法分析:藉助判斷位數,去輸出數據,我完全使用取除數和餘數進行運算輸出。

# include <stdio.h>
int main()
{
    int num;
    int one,two,three,four;//定義個位十位百位千位
    scanf("%d",&num);
    if(num/1000)           //求出它是幾位數並且正序輸出、逆序輸出
        {printf("是四位數\n");
        printf("正序%d",num/1000);
        printf("%d",num%1000/100);
        printf("%d",num%1000%100/10);
        printf("%d\n",num%1000%100%10);
        printf("逆序%d",num%1000%100%10);
        printf("%d",num%1000%100/10);
        printf("%d",num%1000/100);
        printf("%d",num/1000);}
    else if(num/100)
        {printf("是三位數\n");
        printf("正序%d",num/100);
        printf("%d",num%100/10);
        printf("%d\n",num%100%10);
        printf("逆序%d",num%100%10);
        printf("%d",num%100/10);
        printf("%d",num/100);}
    else if(num/10)
       {printf("是二位數\n");
       printf("正序%d",num/10);//正序
       printf("%d\n",num%10);
       printf("逆序%d",num%10);//逆序
       printf("%d\n",num/10);
       }
    else
        {printf("是個位數\n");
        printf("正序%d\n",num/1);
        printf("逆序%d",num/1);}
    return 0;
}

(10)企業發放獎金根據利潤提成

# include <stdio.h>
int main()
{
    int i,m;
    scanf("%d",&i);
    if(i<100000)
        printf("%d",i*0.1);
    else if(100000<i<=20000)
        printf("%d",m=100000*0.1+(i-100000)*0.075);
    else if(200000<i<=400000)
        printf("%d",m=200000*0.075+(i-200000)*0.05);
    else if(400000<i<=600000)
        printf("%d",m=400000*0.05+(i-400000)*0.03);
    else if(600000<i<=1000000)
        printf("%d",m=600000*0.03+(i-600000)*0.015);
    else
        printf("%d",m=1000000*0.015+(i-1000000)*0.01);
    return 0;
}
# include <stdio.h>
int main()
{
    int i,m,c;
    scanf("%d",&i);
    c=i/100000;
    switch(c)
    {
        case 0:printf("%d",m=i*0.1);break;
        case 1:
        case 2:printf("%d",m=100000*0.1+(i-100000)*0.075);break;
        case 3:
        case 4:printf("%d",m=200000*0.075+(i-200000)*0.05);break;
        case 5:
        case 6:printf("%d",m=400000*0.05+(i-400000)*0.03);break;
        case 7:
        case 8:
        case 9:printf("%d",m=600000*0.03+(i-600000)*0.015);break;
        default: printf("%d",m=1000000*0.015+(i-1000000)*0.01);break;
    }
       return 0;
}

(11)輸入四個整數,按要求由小到大排序

算法分析:爲了方便,在這一章中我使用了後面的知識,運用數組將四個數據進行輸入,使用冒泡法進行排序。

#include <stdio.h>
int main()
{
    int a[4];  //定義數組大小
    int temp,i,j;
    for(i=0;i<4;i++)
        scanf("%d",&a[i]);
    for(j=0;j<3;j++)   //使用冒泡法排序
        for(i=0;i<3-j;i++)
           if(a[i]>a[i+1])
        {temp=a[i];
        a[i]=a[i+1];
        a[i+1]=temp;}
    for(i=0;i<4;i++)
        printf("%d ",a[i]);
    return 0;
}

(12)輸座標,求該點的建築高度

算法分析:通過x,y座標的限制,進行判斷座標是否在圓塔內

# include <stdio.h>
int main()
{
    float x,y;
    scanf("%f %f",&x,&y);
    if(-3<x<-1||1<x<3)
    {if(-3<y<-1||1<y<3)
        printf("10");}
    else printf("0");
    return 0;
}

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章