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

大城市里の小女人 提交于 2020-03-01 17:53:49

第四章 选择结构程序设计

章节重点:这一章应着重掌握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()函数。想输出整形,可以直接赋值给整形。

#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)阶跃函数求值

#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)阶跃函数求值

    这道题根据给出的程序,应该明白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;
}

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!