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 
int main()
{
    int a,b,c,max;
    scanf("%d,%d,%d",&a,&b,&c);//注意输入格式
    if(a>b)
        max=a;
    else
        max=b;
    if(max

(5)输入小于1000的正数,输出它的平方根(注意题目中的要求)

算法分析:注意求次方的sqrt()函数。想输出整形,可以直接赋值b为整形也可在输出格式中进行控制。

#include
#include
int main()
{
    int a;double b;
    printf("请输入一个小于1000的整数\n");
    scanf("%d",&a);
    if(a>1000)
        printf("请重新输入一个小于1000的整数\n");
    b=sqrt(a);
    printf("%.0f",b);
}

C程序设计(第五版) 谭浩强 第四章课后习题详解(包含算法分析,运行结果)_第1张图片

(6)阶跃函数求值

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

#include 
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;
}

C程序设计(第五版) 谭浩强 第四章课后习题详解(包含算法分析,运行结果)_第2张图片

(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语句。

正确的缩进格式为:

1)

#include 
int main()
{
    int x,y;
    printf("enter x:");
    scanf("%d",&x);
    y=-1;
    if(x!=0)
        if(x>0)
            y=1;
        else                            //else与最近的if相匹配
            y=0;
    printf("x=%d,y=%d\n",x,y);
    return 0;
}

2)

# include
int main()
{
    int x,y;
    printf("enter x:");
    scanf("%d",&x);
    y=0;
    if(x>=0)
        if(x>0) 
            y=1;
        else                    //else与它最近的if相匹配
            y=-1;
    printf("x=%d,y=%d\n",x,y);
    return 0;
}

(8)成绩等级

算法分析:对于输出成绩等级,选择比较多,可选用switch多分支语句,也可使用if...else。

# include
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 
int main()
{
    int num;
    scanf("%d",&num);
  if(num/10000)
        printf("该整数为5位正整数\n");
        printf("正序输出:%d",i/10000);//输出万位         正序输出
        printf("%d",i%10000/1000);//输出千位
        printf("%d",i%10000%1000/100);//输出百位
        printf("%d",i%10000%1000%100/10);//输出十位
        printf("%d\n",i%10000%1000%100%10);//输出个位
        printf("逆序输出%d",i%10000%1000%100%10);
        printf("%d",i%10000%1000%100/10);
        printf("%d",i%10000%1000/100);
        printf("%d",i%10000/1000);
        printf("%d",i/10000);m);
   else 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
int main()
{
    double i;
    printf("请输入利润:");
    scanf("%lf",&i);
    if(i<=100000)
       printf("应发奖金:%.1f",i*0.1);    //奖金后保留一位小数
    else if(i>100000&&i<=200000)
        printf("应发奖金:%.1f",(i-100000)*0.075+100000*0.1);
    else if(i>200000&&i<=400000)
        printf("应发奖金:%.1f",(i-200000)*0.05+200000*0.075);
    else if(i>400000&&i<=600000)
        printf("应发奖金:%.1f",(i-400000)*0.03+400000*0.05);
    else if(i>600000&&i<=1000000)
        printf("应发奖金:%.1f",(i-600000)*0.015+600000*0.03);
    else if(i>1000000)
        printf("应发奖金:%.1f",(i-1000000)*0.01+1000000*0.015);
    return 0;
}

#include 
int main()
{
    double i;
    int d;
    printf("请输入利润:");
    scanf("%lf",&i);
    d=i/100000;
    switch(d)              //switch quantity not an integer.so double会报错
    {
        case 0: printf("应发奖金:%.1f",i*0.1);break;
        case 1:
        case 2: printf("应发奖金:%.1f",(i-100000)*0.075+100000*0.1);break;
        case 3:
        case 4: printf("应发奖金:%.1f",(i-100000)*0.075+100000*0.1);break;
        case 5:
        case 6: printf("应发奖金:%.1f",(i-400000)*0.03+400000*0.05);break;
        case 7:
        case 8:
        case 9:
        case 10:printf("应发奖金:%.1f",(i-600000)*0.015+600000*0.03);break;
        default:printf("应发奖金:%.1f",(i-1000000)*0.01+1000000*0.015);//default不写break
    }
    return 0;
}

(11)输入四个整数,按要求由小到大排序

初级排序

#include
int main()
{
    int a,b,c,d,t;
    printf("请输入四个整数");
    scanf("%d %d %d %d",&a,&b,&c,&d);
    if(a>b){t=a;a=b;b=t;}
    if(a>c){t=a;a=c;c=t;}
    if(a>d){t=a;a=d;d=t;}                       //将最小值赋给a,下同
    if(b>c){t=b;b=c;c=t;}
    if(b>d){t=b;b=d;d=t;}
    if(c>d){t=c;c=d;d=t;}
    printf("%d %d %d %d",a,b,c,d);
    return 0;
}

算法分析:为了方便,在这一章中我使用了后面的知识,运用数组将四个数据进行输入,使用冒泡法进行排序

#include 
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
int main()
{
    int x1=2,x2=-2,y1=2,y2=-2;
    float x,y,d1,d2,d3,d4;
    printf("请输入坐标:");
    scanf("%f %f",&x,&y);
    d1=(x-x1)*(x-x1)+(y-y1)*(y-y1); //点与点之间的距离公式为方便计算去掉根号,结果相同
    printf("%f\n",d1);                   //结果更加直观,可省去
    d2=(x-x2)*(x-x2)+(y-y2)*(y-y2);
    printf("%f\n",d2);
    d3=(x-x1)*(x-x1)+(y-y2)*(y-y2);
    printf("%f\n",d3);
    d4=(x-x2)*(x-x2)+(y-y1)*(y-y1);
    printf("%f\n",d4);
    if(d1>1&&2>1&&d3>1&&d3>1)           //全部大于1,该点均不在四个圆中。
        printf("该点的高度为0");        //如果有一个假条件,就说明在其中一个圆上。
    else
        printf("该点的高度为10");
    return 0;
}

C程序设计(第五版) 谭浩强 第四章课后习题详解(包含算法分析,运行结果)_第3张图片

你可能感兴趣的:(c/c++编程语言,算法,c语言)