第4章 选择结构程序设计 习题

作者在 2011-10-18 14:54:33 发布以下内容

4.1 什么是算术运算?什么是关系运算?什么是逻辑运算?

算术运算就是数的加、减、乘、除以及乘方开方等数学运算

所谓关系运算就是比较运算将两个数值进行比较,判断其比较的结果是否符给定的条件

逻辑运算又称布尔运算, 通常用来测试真假值。最常见到的逻辑运算就是循环的处理,用来判断是否该离开循环或继续执行循环内的指令。

 

 

4.2 C语言如何表示“真”和“假”?系统如何判断一个值的“真”和“假”?

C语言用1表示真,用0表示假

C语言判断0为假,非0为真

 

4.3 写出下面各逻辑表达式的值。设a=3,b=4,c=5

(1)a+b>c && b==c

a+b>c 为真

b==c 为假

&& 为假

所以表达式的值为0

 

(2) a || b+c && b-c

b+c 为真

b-c 为真

&& 为真

a 为真

|| 为真

所以表达式的值为1

 

(3) !(a>b) && !c ||1

a>b 为假

!(a>b) 为真

c 为真

!c 为假

&& 为假

1 为真

|| 为真

所以表达式的值为1

 

(4) !(x=a) && (y=b) && 0

x=a 为真

!(x=a) 为假

不必继续判断,表达式的值为0

 

(5) !(a+b)+c-1 && b+c/2

a+b 为真

!(a+b) 为假 其值为0

!(a+b)+c-1的值为4 为真

b+c/2 为真

&& 为真

所以表达式的值为1

 

4.4 有三个整数a,b,c 由键盘输入,输出其中最大的数

/*
时间:2011年10月17日14:24:37
题目:习题4.4 有三个整数a,b,c 由键盘输入,输出其中最大的数
*/
# include <stdio.h>

int main()
{
    
    int a,b,c;
    int max(int a,int b,int c);
    
    printf("输入三个整数:\n");
    scanf("%d%d%d",&a,&b,&c);
    
    printf("其中最大的是:%d\n",max(a,b,c));
    
    return 0;
}

int max(int a,int b,int c)
{
    int max;
    
    if(a>=b)
    {
        if(a>c)
        {
            max=a;
        }
        else
        {
            max=c;
        }
    }
    else if(b>=c)
    {
        max=b;
    }
    else
    {
        max=c;
    }
    return(max);
}

 

4.5 从键盘输入一个小于1000的正数,要求输出他的平方根(如果平方根不是整数,输出其整数部分)。要求在输入数据后先对其检查是否为小于1000的正数,若不是,则要求重新输入

/*
时间:2011年10月17日14:47:11
题目:从键盘输入一个小于1000的正数,要求输出他的平方根(如果平方根不是整数,输出其整数部分)
要求:要求在输入数据后先对其检查是否为小于1000的正数,若不是,则要求重新输入
*/
# include <stdio.h>
# include <math.h>

int main()
{
    double a;
    
    printf("请输入一个小于1000的正数\n");
    scanf("%lf",&a);
    
    while(a<=0 || a>=1000)
    {
        printf("请重新输入输入\n");
        scanf("%lf",&a);
    }
    
    printf("平方根的整数部分是:%-5.0lf\n",sqrt(a));
    return 0;
}

/*
在VC++6.0中的输出结果为:
————————————
请输入一个小于1000的正数
1001
请重新输入输入
0
请重新输入输入
5
平方根的整数部分是:2
Press any key to continue
————————————
*/

 

4.6 有一个函数:y=xx<1y=2x-11<=x<10y=3x-11 (x>=10).写程序,输入x的值,输出y相应的值

/*
时间:2011年10月17日15:17:52
题目:有一个函数,写程序,输入x的值,输出y相应的值
函数::y=x(x<1)
         =2x-1(1<=x<10)
         =3x-11 (x>=10)
*/
# include <stdio.h>

int main()
{
    double x,y;
    
    printf("输入x的值\n");
    scanf("%lf",&x);
    
    if(x<1)
    {
        y=x;
    }
    else if(1<=x && x<10)
    {
        y=2*x-1;
    }
    else
    {
        y=3*x-11;
    }
    printf("y的值是%lf\n",y);
    
    return 0;
}

/*
在VC++6.0中的输出结果为:
————————————
输入x的值
0
y的值是0.000000
Press any key to continue
输入x的值
1
y的值是1.000000
Press any key to continue
输入x的值
10
y的值是19.000000
Press any key to continue
————————————
*/

 

4.7 有一函数y=-1x<0y=0x=0y=1(x>0)..有人分别编写了以下两个程序,请分析它们是否能实现题目要求。画出流程图

两端程序的运行结果都应该是x>0时,y=1x<0时,y=0x=0时,y=-1,都不能实现题目要求,elae总是与他上面的最近的未配对的if配对,所以题目中的书写格式都不好

(1)段程序实际上的流程是

# include <stdio.h>

int main()
{
    int x,y;
    printf("enter x:");
    scanf("%d",&x);
    y=-1;
    if(x!=0)
        if(x>0)
            y=1;
    else                //这样写格式不好,实际上else是与if(x>0)配对的
        y=0;
    printf("x=%d,y=%d\n",x,y);
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
enter x:1
x=1,y=1
Press any key to continue
enter x:0
x=0,y=-1
Press any key to continue
enter x:-1
x=-1,y=0
Press any key to continue
————————————
*/

 

(2)段程序实际上的流程是

# include <stdio.h>

int main()
{
    int x,y;
    printf("enter x:");
    scanf("%d",&x);
    y=0;
    if(x>=0)
        if(x>0) y=1;
    else y=-1;        //这样写格式不好,实际上else是与if(x>0)配对的
    printf("x=%d,y=%d\n",x,y);
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
enter x:1
x=1,y=1
Press any key to continue
enter x:0
x=0,y=-1
Press any key to continue
enter x:-1
x=-1,y=0
Press any key to continue
————————————
*/

 

4.8 给出一百分制成绩,要求输出成绩等级’A’’B’’C’’D’’E’90分以上为A80~89B70~79C60~69D60分以下为E

/*
时间:2011年10月18日8:32:38
题目:习题4.8 给出一百分制成绩,要求输出成绩等级'A''B''C''D''E'
备注:90分以上为A,80~89为B,70~79为C,60~69为D,60分以下为E
*/
# include <stdio.h>

int main()
{
    double score;
    
    do
    {
        printf("输入分数:");
        scanf("%lf",&score);
        if(score<0 || score>100)
        {
            printf("请重新");
        }
        else
        {
            break;
        }
    }
    while(1);
    
    switch(int(score)/10)
    {
    case 10:
    case 9:
        printf("等级为A\n");
        break;
    case 8:
        printf("等级为B\n");
        break;
    case 7:
        printf("等级为C\n");
        break;
    case 6:
        printf("等级为D\n");
        break;
    default:
        printf("等级为E\n");
    }
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入分数:101
请重新输入分数:-5
请重新输入分数:100
等级为A
Press any key to continue
输入分数:91.5
等级为A
Press any key to continue
输入分数:88
等级为B
Press any key to continue
输入分数:75
等级为C
Press any key to continue
输入分数:60
等级为D
Press any key to continue
输入分数:59.9
等级为E
Press any key to continue
输入分数:0
等级为E
Press any key to continue
————————————
*/

 

4.9 给一个不多于5位的正整数,要求:

1)求出它是几位数

2)分别输出每一位数字

3)按逆序输出每位数字

/*
时间:2011年10月18日9:19:40
题目:习题4.9 给一个不多于5位的正整数
要求:(1)求出它是几位数
      (2)分别输出每一位数字
      (3)按逆序输出每位数字
*/
# include <stdio.h>

int main()
{
    int i,j,k=1;
    int a[5];
    
    do
    {
        printf("输入一个正整数(1~99999):");
        scanf("%d",&i);
        if (i<=99999 && i>0)
        {
            break;
        }
        else
        {
            printf("输入超出范围,请重新");
        }
    }
    while(1);
    
    for(j=0; j<5; ++j)
    {
        a[j]=i%10;
        i/=10;
        if(i!=0)
        {
            ++k;
        }
    }
    
    printf("这个整数一共有%d位\n",k);
    
    for(i=k-1; i>=0; --i)
    {
        printf("第%d位的数字是%d\n",i+1,a[i]);
    }
    
    printf("这个数的逆序输出是:");
    for(i=0; i<k; ++i)
    {
        printf("%d",a[i]);
    }
    printf("\n");
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入一个正整数(1~99999):0
输入超出范围,请重新输入一个正整数(1~99999):100000
输入超出范围,请重新输入一个正整数(1~99999):12345
这个整数一共有5位
第5位的数字是1
第4位的数字是2
第3位的数字是3
第2位的数字是4
第1位的数字是5
这个数的逆序输出是:54321
Press any key to continue
输入一个正整数(1~99999):1234
这个整数一共有4位
第4位的数字是1
第3位的数字是2
第2位的数字是3
第1位的数字是4
这个数的逆序输出是:4321
Press any key to continue
————————————
*/

 

4.10 企业发放的奖金根据利润提成,从键盘输入当月利润I,求应发奖金总数。要求

1)用if语句编程序

/*
时间:2011年10月18日11:20:53
题目:习题4.10 企业发放的奖金根据利润提成,从键盘输入当月利润I,求应发奖金总数。
要求:用if语句编程序
*/
# include <stdio.h>

int main()
{
    double profit,bonus=0;
    
    printf("输入当月利润I:");
    scanf("%lf",&profit);
    
    if(profit>1000000)
    {
        bonus = 1.0/100*(profit-1000000);
        profit = 1000000;
    }
    if(profit<=1000000 && profit>600000)
    {
        bonus += 1.5/100*(profit-600000);
        profit = 600000;
    }
    if(profit<=600000 && profit>400000)
    {
        bonus += 3.0/100*(profit-400000);
        profit = 400000;
    }
    if(profit<=400000 && profit>200000)
    {
        bonus += 5.0/100*(profit-200000);
        profit = 200000;
    }
    if(profit<=200000 && profit>100000)
    {
        bonus += 7.5/100*(profit-100000);
        profit = 100000;
    }
    if(profit<=100000 && profit>=0)
    {
        bonus += 10.0/100*profit;
    }

    printf("可获得奖金总数为%lf\n",bonus);
    
    return 0;
}
/*
在VC++6.0中的输出结果为:
————————————
输入当月利润I:100000
可获得奖金总数为10000.000000
Press any key to continue
输入当月利润I:200000
可获得奖金总数为17500.000000
Press any key to continue
输入当月利润I:400000
可获得奖金总数为27500.000000
Press any key to continue
输入当月利润I:600000
可获得奖金总数为33500.000000
Press any key to continue
输入当月利润I:1000000
可获得奖金总数为39500.000000
Press any key to continue
输入当月利润I:2000000
可获得奖金总数为49500.000000
Press any key to continue
————————————
*/

 

2)用switch编程序

/*
时间:2011年10月18日11:20:53
题目:习题4.10 企业发放的奖金根据利润提成,从键盘输入当月利润I,求应发奖金总数。
要求:用switch语句编程序
*/
# include <stdio.h>

int main()
{
    double profit,bonus=0;
    
    printf("输入当月利润I:");
    scanf("%lf",&profit);
    
    switch(int(profit)/100000)
    {
    default:
        bonus += 1.0/100*(profit-1000000);
        profit = 1000000;
    case 10:
    case 9:
    case 8:
    case 7:
    case 6:
        bonus += 1.5/100*(profit-600000);
        profit = 600000;
    case 5:
    case 4:
        bonus += 3.0/100*(profit-400000);
        profit = 400000;
    case 3:
    case 2:
        bonus += 5.0/100*(profit-200000);
        profit = 200000;
    case 1:
    &
《C程序设计》学习 | 阅读 12598 次
文章评论,共0条
游客请输入验证码