C语言程序设计教程(第三版)李凤霞 第五章课后习题答案

一、单项选择题 (P111)
1、要判断char型变量m是否是数字字符,可以使用下列表达式( )
A.0<=m&&m<=9 B.’0’<=&&m<=’9’
C.”0”<=m&&m<=”9” D.前面三个答案均是错误的
2、if语句的控制条件( )。
A)只能用关系表达式 B)只能用关系表达式或逻辑表达式
C)只能用逻辑表达式 D)可以是任何表达式
3、以下程序的输出结果是( )。
main()
{float x=2,y;
if(x<0)y=0;
else if(x<5&&!x)y=1/(x=2);
else if(x<10)y=1/x;
else y=10; printf(“%f\n”,y);
}
A)0.000000 B)0.250000 C)0.500000 D)10.000000
4、执行以下程序段后,a,b,c的值分别是( )。
int a,b=100,c,x=10,y=9;
a=(–x= =y++)?–x:++y;
if(x<9) b=x++;c=y;
A)9,9,9 B)8,8,10 C)9,10,9 D)1,11,10
5、执行下列程序段后,x、y和z的值分别是( )。
int x=10,y=20,z=30;
if(x>y)z=x; x=y; y=z;
A)10,20,30 B)20,30,30 C)20,30,10 D)30,30,20
6、以下程序的输出结果是( )。
main()
{int w=4,x=3,y=2,z=1;
if(x>y&&(z==w))printf(“%d\n”,(w<x?w:z<y?z:x));
else printf(“%d\n”,(w>x?w:z>y?z:x));
}
A)1 B)2 C)3 D)4
7、下面的程序段所表示的数学函数关系是( )。
y=-1;
if(x!=0){if(x>0)y=1;}
else y=0;
A) -1 (x<0) B) 1(x<0)
y= 0 (x=0) y= -1(x=0)
1 (x>0) 0(x>0)
C) 0 (x<0) D) -1(X<0)
y= -1 (x=0) y= 1(x=0)
1 (x>0) 0(x>0)
8、若执行以下程序时从键盘上输入3□4,则输出结果是( )。
main()
{int a,b,s;
scanf(“%d%d”,&a,&b); s=a;
if(a<b)s=b;
s*=s;
printf(“%d\n”,s);
}
A)14 B)16 C)18 D)20
9、若a和b均是整型变量,以下正确的switch语句是( )。
A)switch(a/b) B)switch(aa+bb);
{case 1:case 3.2;y=a+b;reak; {case 3:
case 0:case 5:y=a-b; case 1:y=a+b;break;
} case 0:y=b-a;}
C)switch a D)switch(a+b)
{default :x=a+b; {case10:x=a+b;break;
case 10:y=a-b;break; case 11:y=a-b;
case 11:y=a*b;break;} }

二、填空题(p115)
1.if语句控制表达式只有其值为______时表示逻辑“真”,其值为__________表示逻辑“假”。(非0 0)
2.if(!k)a=3;语句中的!k可以改写为________,使其功能不变。(k==0)
3. 表达“若|x|>4,则输出x,否则输出error!”,的if语句是______________。
if ( x>4 || x<-4 ) printf(“%d”,x); else printf(“error!”);
或: x>4 || x<-4 ? printf(“%d”,x) : printf(“error!”);
或:if(abs(x)>4)printf(“%d”,x); else printf(“error!”);
4. 能正确表达“当x的值是[1,10]或[200,210]范围内的奇数时,输出x”的if语句是________。
if ( (x%2!=0) && ( (x>=1 && x<=10) || (x>=200 && x<=210) ) )
5、已知a=15,b=240;则表达式(a&b)&b||b的结果为__________。(1)
a: 00001111
& b:11110000
= 00000000
& b:11110000
= 00000000 0(0为假)
|| b:11110000 1(非0为真)
= 1
6. 下列程序段的输出是__________。(k=1)

int i=0,k=100,j=4;
if(i+j)k=(i=j)?(i=1):(i=i+j); 
printf(“k=%d\n”,k);
  1. 下列程序段当a的值为014和0x14时的执行结果分别是________。
if(a=0xa|a>12)    
if(011&10==a)printf(%d! \n”,a); 
else         printf(“Right!%d\n”,a); 
当a=014时,a>12=0,0xa|0=10,a=10,
10==a=1,011&1=9;输出10!
当a=0x14时,a>12=1,0xa|1=11,a=11,
10==a=0,011&0=0;输出Right!11
  1. 以下程序的输出是__________。($$$ a=0)
main()
{int a=0,b=0,c=0;
if(a=b+c)printf(*** a=%d\n”,a); 
else printf(“$$$ a=%d\n”,a);
}

9.下列程序的输出结果是__________。(a=2,b=1)

#include “stdio.h”
main()
{int x=1,y=0,a=0,b=0;
switch(x)
{case 1:switch(y)
{case 0:a++;break;
case 1:b++;break;
        }
     case 2:a++;b++;
 }
printf(“a=%d,b=%d\n”,a,b);
}

10、 若下列程序执行后t的值为4,则执行时输入a,b的值的范围是______________。(0<a<b)

#include “stdio.h”
main()
{int a,b,s=1,t=1;
scanf(%d,%d”,&a,&b);
if(a>0)s+=1;/*(2)要s=2,则必须a>0 */
if(a>b)t+=s;          /*(3)要使t=4,则此if-else不能被执行,即a<b */
else if(a==b)t=5;
else   t=2*s; /*(1)要t=4,则必s=2 */
printf(“s=%d,t=%d\n”,s,t);
}

三、编程题
1、 以下程序求3个整数中的最小值,程序是否有错?若有错,请改正。(p116)
main()
{int a,b,c,t;
scanf(“%d,%d”,&a,&b);
if(a>b)&&(a>c)
if b<c printf(“min=%d\n”,b);
else printf(min=%d\n",c)
if(a<b)&&(a<c)printf(“min=%c\n”,a);
}
修改程序如下:
main( )
{ int a, b, c;
scanf (“%d,%d,%d”, &a, &b, &c);
if ( ( a>b)&&(a>c) )
if (b<c) printf(“min=%d\n”,b);
else printf(“min=%d\n”,c);
else if ( (a<b)&&(a<c) ) printf(“min=%d\n”,a);
else printf(“min=%d\n”,b<c?b:c);
}

/*p116_1A.c */
main()
{int a,b,c;
scanf(“%d%d%d”,&a,&b,&c);
if(a>b)
if(b>c)printf(“%d\n”,c);
else printf(“%d\n”,b);
else if(a>c)printf(“%d\n”,c);
else printf(“%d\n”,a);
}

/*p115_1b.c */
main()
{int a,b,c;
scanf(“%d%d%d”,&a,&b,&c);
printf(“%d\n”,a<b&&a<c?a:b<c?b:c);
}

/*p116_1c.c */
main()
{int a,b,c;
scanf(“%d%d%d”,&a,&b,&c);
if(a<b&&a<c)printf(“%d\n”,a);
if(b<a&&b<c)printf(“%d\n”,b);
if(c<a&&c<b)printf(“%d\n”,c);
}
2、 给出一个5位数,按逆序输出它的各位数值。如输入12345,请输出54321。
方法1、

main( )
{  long a;
   int k;
   scanf ("%ld",&a);
   printf ("%ld\n",a);
   loop: if ( a != 0 )
         {  k = a%10;
            printf ("%d",k);
            a = a/10;
goto loop; 
}
}

方法2、

main()                                            
{int n;                                         
printf("Input n:(0--32767\n");                    
scanf("%d",&n);                                    
if(n>10000){printf("%d",n%10);n=n/10;}               
if(n>1000){printf("%d",n%10);n=n/10;}                 
if(n>100){printf("%d",n%10);n=n/10;}                   
if(n>10){printf("%d",n%10);n=n/10;}                
printf("%d\n",n);                                   
}

方法3:

main()
{long n,s=0;
 scanf("%ld",&n); 
   while(n>0)
    {s=s*10+n%10;
     n=n/10;
       }
  printf("s=%ld\n",s);
  }

3、有一个函数:

分别用:(1)简单if语句,(2)嵌套的if语句,(3)if…else语句,(4)switch语句编写程序,要求输入x的值,输出y的值。
(1) 用简单的 if 结构

main( )                             
{  int x, y;                         
   scanf ("%d",&x);                   
   if ( x<0 && x>-5 )     y=x;        
   if ( x<5 && x=0 )      y=x-1;      
   if ( x>=5 && x<10 )    y=x+1;        
   printf ("%d,%d\n",x,y);                
}            

(2) 用嵌套的if 结构

main( )
{int x,y;
 printf("Please input  x :-5-----10\n");
 scanf("%d",&x);
 if(x<5)
   if(x<0)
     { if(x>-5)  y=x; }
   else    y=x-1;
   else
if(x<10)  y=x+1;
  printf("%d,%d\n",x,y);
}

(3) 用if-else分支结构

main( )
{  int x, y;
   scanf ("%d",&x);
   if ( x<0 && x>-5 )        y=x;
   else if ( x<5 && x>=0 )   y=x-1;
   else if ( x>=5 && x<10 )  y=x+1;     
   printf ("%d,%d\n",x,y);                     
}    

(4) 用switch( )结构

main( )                                       
{  int x, y, k;                                 
   printf ("Please input  x :-5-----10\n");      
   scanf ("%d",&x);                              
   if ( x<0 )  k=-1;                             
   else        k=x/5;                            
   switch (k)                                     
   {  case  1: y=x+1; break;                       
      case  0: y=x-1; break;                       
      case -1: y=x;   break;                       
   }                                             
   printf("%d,%d\n", x, y);                      
}

4、编写程序输入一位学生的生日(年:y0、月:m0、日:d0);并输入当前的日期(年:y1、月:m1、日:d1);输出改学生的实足年龄。 (P116)

 main( )
 {  int y0, m0, d0, y1, m1, d1, age;
    printf("Please input current day:\n");
    scanf("%d,%d,%d",&y1,&m1,&d1);
    printf("Please input birthday:\n");
    scanf("%d,%d,%d",&y0,&m0,&d0);
    age = y1-y0; 
    if ( m1<m0 )            age--;
    else if(m1==m0&&d1<d0)  age--;
    printf("age=%d\n",age);
}

5、编写程序,输入3个整数,判断它们是否能构成三角形,若能构成三角形,则输出三角形的类型(等边、等腰或一般三角形) (P117)

main( )
{   int a, b, c;
    printf("Please input a,b,c:\n");
    scanf("%d,%d,%d",&a,&b,&c);   /*  输入三角形的三条边   */
    if (a+b>c&&a+c>b&&b+c>a)      /* 判断两边之和大于第三边 */
       if (a==b&&b==c)            /* 判断等边三角形   */
           printf(" 等边三角形\n"); 
       else if (a==b||a==c||b==c)     /* 判断等腰三角形   */
                printf("等腰三角形\n");
            else if(a*a+b*b=c*c||a*a+c*c=b*b||b*b+c*c=a*a) /* 判断直角三角形   */
                     printf(“直角三角形\n”);
                 else printf("一般三角形\n");
    else  printf("不能组成三角形\n");
}

6、将下列程序用switch语句改写,并使其功能不变。

main()
{int x,y;
 scanf("%d",&x);
 if(x<20)y=1;
 else if(x<30)y=2;
      else if(x<40)y=3;
           else if(x<50)y=4;
                else if(x<60)y=5;
                    else y=6;
  printf("x=%d,y=%d\n",x,y);
}

改正:

main( )
{  int x, y, k;
   scanf ("%d", &x);
   k = x/10;
   switch ( k )
   {  case 0:  
case 1:  y=1; break;
      case 2:  y=2; break;
      case 3:  y=3; break;
      case 4:  y=4; break;
      case 5:  y=5; break;
      default: y=6; break;
   }
   printf("x=%d,y=%d\n",x,y);
}

7、某商店位促销推出如下让利销售方案,其中M位购买金额,n为让利百分比。
M<100, N=0; 100<=M<200, N=1.5%
200<=M<300, N=2.5% 300<=M<400, N=3.5%
400<=M<500, N=4.5% 500<=M<600, N=5.5%
M>600, N=6%;
编写程序,对输入的购买金额,输出顾客购买金额、实际支出金额和返还金额。

main( )
{  int m,k;
   float n;
   printf ("Please input 购买金额 m :\n");
   scanf ("%d",&m);
   k = m/100;
   switch (k)
   {  case 0: n=0;       break;
      case 1: n=0.015;   break;
      case 2: n=0.025;   break;
      case 3: n=0.035;   break;
      case 4: n=0.045;   break;
      case 5: n=0.055;   break;
      default: n=0.06;   break;
   }
   printf("%5d,%7.2f,%7.2f",m,m-n*m,m*n);/*输出购买金额、实际支付金额和返还金额 */
}
 

8、编写程序,计算从1995年元月1日到2000年12月10日共有多少天,闰年的2月有29天,闰年Y满足的条件:Y能被400整除或Y能被4整除,但不能被100整除。
解:本程序使用goto语句实现,仅供参考,请勿模仿。(P117)

main( )
 {  int year=1995, month, days=0;
loop:  if ( year <= 2000 )
    {
       days = days+7*31+4*30+28;                      /* 每年增加 365天  */
       if ( year%4==0&&year%100!=0 || year%400====0 )   /* 判断闰年   */
             days++;
      year++;
      goto loop;
    }
    days = days-21;                          /* 仅计算到2000年12月10日 */
    printf("The total days is :%d\n" ,days);
 }

9、编写程序,输入一个不超过5位的正整数,输出它的的个位数,并指出它有几位数。
解:本程序使用goto语句实现,仅供参考,请勿模仿。(p116)
方法1:

main ( )
{  long a;
   int b, k=0, m;
   printf ("Please input a<99999:\n");
   scanf ("%ld",&a);
   b = a%10;
   if ( a/10==0 )
   {  k=1;
printf("%ld\n",a);
   }
   else
   {  printf("%d\n",b);
	  m=a;
	  loop:  if ( m!=0 )
	         {   k++;
	             m=m/10;
	             goto loop;
	         }
   }
   printf ("%ld,%d\n",a,k);
 }

方法2:

main()
{int x,n;
 printf("Input x(0__32767):");
 scanf("%d",&x);
 if(x>=10000)n=5;
 if(x>=1000&&x<10000)n=4;
 if(x>=100&x<1000)n=3;
 if(x>=10&&x<100)n=2;
 if(x<10) n=1;
 printf("n=%d,x=%d\n",n,x%10);
 }

10、编写加密数据程序,方法:对给定的数值,每一位数字加2,且在[0,9]范围内,若加2后某位数值大于9,则取其被10除的余数。如:6987加密后位8109。
:本程序使用goto语句实现,仅供参考,请勿模仿。(p117)
方法1

#include<math.h>
main( )
{  long a, m, n=0;
   int i=0, k;
   scanf("%ld",&a);
   m=a;
   loop: if ( m != 0 )
         {   k = m%10;
             k = k+2;
             if ( k >= 9 )
                 k=k%10;
             m = m/10;
             n = k*pow(10,i)+n;
             i++;
             goto loop;
         }
   printf ("%ld,%ld\n", a, n);
}

方法2

main()
{long x,y,k=1;
 printf("Input x:");
 scanf("%ld",&x);
 y=x;
 ff:if(y>=10)
    {y=y/10;
     k=k*10;
     goto ff;
     }
     y=0;
 gg:if(k>0)
    {
    y=y*10+(x/k+2)%10;
    x=x%k;
    k=k/10;
    goto gg;}
    printf("%ld\n",y);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是筱倩阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值