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

1、 下列程序执行的结果是( )。
a=1;b=2;c=3;
While(b<a<c){t=a;a=b;b=t;c–;}/* a、b的值交换3次,c–执行3次,结果为0*/
printf(“%d,%d,%d”,a,b,c); a b c b<a b<a<c
A)1,2,0 B)2,1,0 C)1,2,1 D)2,1,1 1 2 3 0 1
2 1 2 1 1
1 2 1 0 1
2 1 0 0 0
2、 执行语句for(i=1;i++ <4;);后,i的值是( )。
A)3 B)4 C)5 D)不定
3、 下列程序段( )。
x=3;
do{y=x–;
if(!y){printf(“x”);continue;}
printf(“#”);
}while(1<=x<=2);
A输出 # # B)输出##x C)是死循环 D)有语法错
4、 若int x;则执行下列程序段后输出是( )。
for(x=10;x>3;x–)
{if(x%3)x–;–x;–x;
printf(“%d”,x);
}
A)63 B)74 C)62 D)73
5、 下列说法中正确的是( )。
A) break用在switch语句中,而continue用在循环语句中。
B) break用在循环语句中,而continue用在switch语句中。
C) break能结束循环,而continue只能结束本次循环。
D) continue能结束循环,而break只能结束本次循环。
6、 指出程序结束时,j、i、k的值分别是( )。
main()
{int a=10,b=5,c=5,d=5,i=0,j=0,k=0;
for(;a>b;++b )i++;
while(a> ++c)j++;
do k++;while(a>d++);
}
A)j=5,i=4,k=6; B)i=5,j=4,k=6; C)j=6,i=5,k=7 D)j=6,i=6,k=6;
7、 下面程序的输出结果是( )。
main()
{int i,j;float s;
for(i=6;i>4;i–)
{s=0.0;
for(j=i;j>3;j–)s=s+i*j;
}
printf(“%f\n”,s);
}
A}135.000000 B)90.000000 C)45.000000 D)60.000000
8、 若有:do{i=a-b++;printf(“%d”,i);}while(!i);
则while中的!i可用( )代替。
A)i= =0 B)i!=1 C)i!=0 D)以上均不对
二、填空题
1、以下while循环执行的次数是________。(无限)

k=0;while(k=10)k=k+1;

2、 下列程序段的执行结果是________。(8)

int a,b;
for(a=1,b=1;a<=100;a++)
{if(b>=20)break;
 if(b%3==1)
   {b+=3;continut;}  
  b-=5;   /*不执行*/
}
printf(%d\n”,a);

3、 以下循环语句执行________次循环;(5×4)

int i,j;
        for(i=5;i;i--)
        for(j=0;j<4;j++){……}

4、以下程序段的输出结果是________。(11)

int i=0,sum=1;
do{sum+=i++;}while(i<5);
printf(%d\n”,sum);

5、执行以下程序后,输出是________。(2.400000)

#include “math.h”
main()
{float x,y,z;
x=3.6;y=2.4;z=x/y;  /*z=1.5*/
while(1) 
if(fabs(z)>1){x=y;y=x;z=x/y;} 
else break;
printf(%f\n”,y);}

6、以下程序的输出结果是________。(##*#$)

main()
{int i;
for(i=1;i<=5;i++)
{if(i%2)printf(*); /*i=1、3、5 输出’*#’  */
else continue;        /*i=2、4不输出*/
printf(“#”);}      
printf(“$\n”);   /*循环结束后输出$ */
}

7、以下程序段的输出结果是________。(8 5 2)

main()
{int y=10;
for(;y>0;y--)
{if(y%3)continue;
printf(%4d”,--y);
  }
 }

8、 以下程序段:
s=1.0;
for(k=1;k<=n;k++)s=s+1.0/(k*(k+1)); /计算 s=1+1/(12)+1/(23)+……/
printf(“%f\n”,s);
请填空,使下面的程序段的功能完全与之等同。
s=0.0;k=0;________ ; (d=1.0;)
do
{s=s+d;
________ ; (k++)
d=1.0/(k*(k+1));
}while( ________ ) ; (k<=n)
printf(“%f\n”,s);
9、 以下程序的功能:从键盘上输入若干学生的成绩,统计并输出最高成绩和最低成绩,当输入负数是结束输入。填空,使程序正确。
main()
{float x,amax,amin;
scabf(“%f”,&x);
amax=x;amin=x;
while( ________ ) (x>=0)
{if(x>amax)amax=x;
if( ______ )amin=x; (x<amin)
scanf(“%f”,&x);
}
printf(“\namax=%f\namin=%f\n”,amax,amin);
}
三、编程题
1、求1-3+5-7+…-99+100的值。
(1)

main( )                                                          
{  int i, k, s=0;                         
for ( i=1,k=1; i<=101;i +=2,k*=-1 )   
s = s+i*k;                             
printf (%d\n”, s);                     
}                         

(2)

  main()
   {int s=0,i;
    foa(i=1;n<=101;i=i+4)
       s=s+i;
    for(i=3;i<=100;i=i+4)
     s=s-i;
    printf(%d\n”,s);    
    }

(3)

main()
  {int s=0,i;
   for(i=1;i<=101;i=i+2)
     if(i%4==1)s=s+i;
     else s=s-i;
   printf(“s=%d\n”,s);
    }

2、任意输入10个数,计算所有正数的和、负数的和以及这10个的总和。

main( )
{ int i, k, p=0, n=0, s=0;
for ( i=1; i<=10; i++ )
{ printf (“i=%d:,i);
scanf (%d”,&k);
s += k; 
if ( k>0 ) p += k;
if ( k<0 ) n += k;
         }
printf (“s=%d,p=%d,n=%d\n”, s, p, n);
}

3、任意输入小余32768的正整数s,从s的个位开始输出每一位数字,用逗号分开。

main( )
{ int i;
printf(“Please Enter Number:);
scanf(%d”,&i);
while ( i > 0 )
{ printf (%d,,i%10);
i /= 10;
       }
}

/*P129_20B.c */

main()
{long s,n,k=1;
 printf("Input s:");
 scanf("%ld",&s);
 n=s;
while(n>0)
{n=n/10;
 k=k*10;}
 k=k/10;
 for(;k>0;k=k/10)
 {printf("%3d,",s/k);
  s=s%k;
  }
 printf("\n");
}

4、对输入的正整数a,b,求ab的最后三位数。
(1) 注释:此题的关键是要保证乘积不超过int型允许的最大数。由于仅要求结果的最后三位,被乘数的后三位参加运算;则将乘数后三位的每一位分别和被乘数相乘,然后部分积再相加。

main( )
{ int i, a, b, c1, c2, c3, y, y1, y2, y3;
printf (“Please Enter a,b:); 
scanf (%d,%d”,&a,&b); y = a;
      c1 = a%10;                          /* c1保存乘数个位上的数 */
      c2 = a/10%10;                       /* c2保存乘数十位上的数 */
      c3 = a/100%10;                      /* c3保存乘数百位上的数 */
      for ( i=1; i<b; i++ )                     /* 求a的b次乘方 */
       { y %= 1000;                              /* 被乘数保留三位 */
         y1 = y*c1;                        /* 被乘数和乘数个位相乘 */ 
         y2 = y*c2%100;      /* 被乘数和乘数十位相乘,结果保留两位 */ 
         y3 = y*c3%10;       /* 被乘数和乘数百位相乘,结果保留一位 */ 
         y = y1+y2*10+y3*100;                        /* 部分积相加 */
        }
printf (%d\n”,y%1000);
}

(2) 解法2。

main ( )
{   int a, b, k;
    long last;
    scanf (%d%d”, &a, &b);
    for ( last=k=1; k<=b; k++)
       last = last * (a%1000) % 1000;
    printf (“last=%ld\n”, last );
}

5、输入6个学生5门课的成绩,分别求出每个学生的平均成绩。
/* p129_22.c */

main()
{int i,j;
 float x,s;
 printf("Input data:\n");
 for(i=1;i<=6;i++)
  {s=0;
   for(j=1;j<=5;j++)
    {scanf("%f",&x);
     s=s+x;
     }
   printf("average=%6.2f\n",s/5);
  }
}

6、编修程序,求e的近似值。
e≈1+1/1!+1/2!+1/3!+…+1/n!
(1)计算前20项。
(2)计算各项,直到最后一项的值小于10-4为止(计算的项均大于等于10-4)。
(1)注释:变量t储存阶乘,20!已经超出单精度实型数的范围,所以t被说明为double型。

main( )
{  int    i=1;
double t=1; float  e=1;
do
       { t = t*i;   /*计算i!*/
         e = e+1./t;
} while ( i++ <20 );
printf(%f\n”,e);
}

(2)

main( )                               
{  int i=1;                           
double t=1;                       
float e=1;                         
do                                   
   {   e = e+1/t;                        
       t = t*++i;                           
} while ( 1/t >= 1.0e-4 );             
printf (%f\n”,e);                 
}     

(3)

 main()
 {int i,j;
  float s,e=1;
  for(i=1;i<=20;i++)
    {s=1;
    for(j=1;j<=i;j++)
       s=s*j;
      e=e+1.0/s;
     }
   printf(“e=%f\n”,e);
   }                

7、设X数列定义如下:

  Xn=   n ,n=1,2,3
       xn-1+xn-2+xn-3 , n>3
  编写程序,对输入的正整数n,输出数列的前n项。
main( )
{  int n, x1, x2, x3, xn, i;
printf(“Enter n:); scanf (%d”,&n); if ( n<=3 )
xn=n;
else
   { x1=1; x2=2; x3=3;
     for ( i=4; i<=n; i++ )
      { xn=x1+x2+x3;
	    x1=x2;
	    x2=x3;
	    x3=xn;
       }
    }
printf (“Xn=%d\n”,xn);
}

8、输入所有大于1010的4位偶数,且该数的各位数字两两不相同。

main( )
{ int i, j, k, l;
for ( i=1; i<=9; i++ )
for ( j=0; j<=9; j++ )
{ if ( j==i )  continue;
for ( k=1; k<=9; k++ )
{ if ( k==i || k==j ) continue;
for ( l=0; l<=9; l+=2 )
	     {if ( l==i || l==j || l == k )  continue;
	      printf (%d\n”,i*1000+j*100+k*10+l);
	       }
	    }
    }
}

9、用40元买苹果、西瓜和梨,三种水果都要。已知苹果0.4元一个,西瓜4元一个,梨方
0.2元一个。问可以各买多少个?输出全部购买方案。
注释:题中水果的价格以元计价,为了避免计算中出现实数,则改为以角为计价单位。
法1:

 main( )
{int i, j, k;
for ( i=0; i<=100; i++ )
for( j=0; j<=100-i; j++ )
if ( i*4+j*40+(100-i-j)*2 == 400 )
printf (“apple=%d watermelon=%d pear=%d\n”,i,j,100-i-j);
}

方法2:

#include "math.h"
main()
{int a,b,c;
 float s;
 printf("\n");
 for(a=1;a<25;a++)
   for(b=1;b<100;b++)
    {c=100-a-b;
     s=a*4+b*.4+c*.2;
     if(a+b+c==100&&fabs(s-40)<1e-4)printf("a=%d,b=%d,c=%d,s=%f\n",a,b,c,s);
     }
 }

10、编写程序,输出以下图案。
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*

#include <stdio.h>

int main()
{
    int i, j, n;
    printf("\nPlease Enter n: ");
    scanf("%d", &n);

    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n + i - 1; j++)
        {
            if (j > n - i)
                printf("* ");
            else
                printf("  ");
        }
        printf("\n");
    }

    for (i = 1; i < n; i++)
    {
        for (j = 1; j <= 2 * n - i - 1; j++)
        {
            if (j > i)
                printf("* ");
            else
                printf("  ");
        }
        printf("\n");
    }

    return 0;
}

方法2

#include <stdio.h>
#include <math.h>

int main()
{
    int n, i, j;
    scanf("%d", &n);
    n = n / 2 + 1;
    
    // 打印上半部分倒三角形
    for (i = -n; i <= n; i++)
    {
        // 控制每行的输出个数
        for (j = 1; j < 40 + n - abs(i) - 1; j++)
        {
            // 根据位置判断输出空格还是星号
            if (j < 40 - n + abs(i))
                printf(" ");
            else
                printf("*");
        }
        printf("\n");
    }

    return 0;
}

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是筱倩阿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值