C语言——第五章习题

一、选择题

1、判断char型变量ch是否为大写字母的正确表达式是(  )

A‘A’<=ch<=‘Z’ B(ch>=‘A’)&(ch<=‘Z’)

C(ch>=‘A’)&&(ch<=‘Z’) D(‘A’<=ch)AND(‘Z’>=ch)

考察点:C语言里的’A’<=ch<=’Z’要表示成ch>=’A’&&ch<=’Z’的形式,切忌C语言里没有

=< 和 => 这两个符号。<=和>= 正好符合汉语的小于等于和大于等于。

2、设xyzint型变量,且x=3,y=4,z=5,则下面表达式中值为0的是    。

A ‘x’&&‘y’

B x<=y

C x||y+z&&y-z

D !((x<y)&&!z||1)

考察点:(A)中的’x’’y’表示的是字母而不是变量,其他的没什么了

3、设有:int a=1,b=2,c=3,d=4,m=2,n=2;

执行(m=a>b)&&(n=c>d)n的值为    。

A1 B2 C3 D4

考察点:&&的截断

4、执行以下语句后a的值为【1】,b的值为【2】。

int a,b,c;

a=b=c=1;

++a||++b&&++c;

1 A)错误 B0 C2 D1

2 A1 B2 C)错误 D0

考察点:||的截断,注意这里++c也不执行。可参考谭书第三版94

5、请阅读以下程序:

main()

{

int a=5,b=0,c=0;

if(a=b+c) printf(“***\n”);

else printf(“$$$\n”);

}

以下程序    。

A)有语法错不能通过编译 B)可以通过编译但不能通过连接

C)输出*** D)输出$$$

考察点:=  == 的区别,a=b+c这个是赋值表达式,最终结果看a的值,这里a0

因此执行else语句。

6、以下程序的运行结果是( )

main()

{

int m=5;

if(m++>5) printf(“%d\n”,m);

else printf(“%d\n”,m--);

}

A4 B5 C6 D7

考察点:考察自增自减运算,自增自减总共有四个,这四个无论在哪里出现都会改变相应变量的值。对于前++和后++究竟该如何去记忆,给大家一个小技巧,假设变量为m,看变量在前还是++在前,谁在前先算谁:

m++变量在前,那表达式就是m的值;

++m++在前,m就先加1再说,表达式的值即为m+1

还有一点大家可能对把m--放在printf里面又感觉奇怪了,这个和上面的原则是一样的,因为是m--m在前,先把m当参数传递过去再说,然后再自减1

7、当a=1,b=3,c=5,d=4时,执行完下面一段程序后x的值是( )

if(a<b)

if(c<d) x=1;

else

if(a<c)

if(b<d) x=2;

else x=3;

else x=6;

else x=7;

A1 B2 C3 D6

考察点:if-else的嵌套。大家都知道if-else中只有一个语句序列会被执行,只要任一个语句序列被执行,那么整个if-else就执行完毕了。

8、有一函数关系见下表:

x y=

x<0 x-1

x=0 x

x>0 x+1

下面程序段中能正确表示上面关系的是    。

Ay=x+1; By=x-1;

   if(x>=0)    if(x!=0)

     if(x==0) y=x;      if(x>0) y=x+1;

   else y=x-1;      else y=x;

Cif(x<=0) Dy=x;

     if(x<0) y=x-1;    if(x<=0)

     else y=x;      if(x<0) y=x-1;

   else y=x+1;      else y=x+1;

考察点:if-else主要是一种逻辑上的分类,你想怎么分就怎么分,因此if-else嵌套有很多种形式,只要逻辑上能通就行。

9、若有条件表达式(exp)?a++:b--,则以下表达式中能完全等价于表达式(exp)的是    。

A(exp==0) B)(exp!=0 C(exp==1)

考察点:大家以后会遇到好多这种写法,特别是if(表达式)和while(表达式),可能这种形式很怪异,但是还是希望大家能够理解并记住这一点,这可以避免你以后在这上面浪费太多的脑力。

10、以下程序的运行结果是    。

main()

{

int k=4,a=3,b=2,c=1;

printf(“\n%d\n”,k<a?k:c<b?c:a);

}

A4 B3 C2 D1

11、执行以下程序段后,变量abc的值分别是    。

int x=10,y=9;

int a,b,c;

a=(--x==y++)?--x:++y;

b=x++;

c=y;

Aa=9,b=9,c=9 Ba=8,b=8,c=10

Ca=9,b=10,c=9 Da=1,b=11,c=10

考察点:让大家尽可能的熟悉自增自减运算。这个大家一定要注意,因为你有可能碰到有的公司只有选择题,那么自增自减在其中就可能占很大的分量。因此一定要整理出自己方便记忆的思路,反复的想上几遍,以后就很容易做这一类题了。

二、填空题

1、以下程序的运行结果是    。

#include <stdio.h>

void main(void)

{

int x=1,y,z;

x*=3+2;

printf(“%d\t”,x);

x*=y=z=5;

printf(“%d\t”,x);

x=y==z;

printf(“%d\n”,x);

}

答案:5    25    1

2、以下程序的运行结果是    。

main()

{

int x,y,z;

x=1; y=1; z=0;

x=x||y&&z;;

printf(“%d,%d”,x,x&&!y||z);

}

答案:1,0

3、以下程序实现输出xyz三个数中的最大者,请在【】内填入正确内容。

main()

{

int x=4,y=6,z=7;

int 1;

if(2) u=x;

else u=y;

if(3) v=u;

else v=z;

printf(“v=%d”,v);

}

答案:【1u,v2x>y3u>z

4、以下程序实现:输入三个整数,按从大到小的顺序进行输出。请在【】内填入正确内容。

main()

{

int x,y,z,c;

scanf(“%d %d %d”,&x,&y,&z);

if(1)

{ c=y; y=z; z=c; }

if(2)

{ c=x; x=z; z=c; }

if(3)

{ c=x; x=y; y=c; }

printf(“%d,%d,%d”,x,y,z);

}

答案:【1y<z2x<z3x<y

考察点:熟练掌握交换,没事画画交换的内存图。

5、以下程序对输入的一个小写字母,将字母循环后移5个位置后输出。如‘a’变成‘f’‘w’变成‘b’。请在【】内填入正确内容。

#include “stdio.h”

main()

{

char c;

c=getchar();

if(c>=‘a’&&c<=‘u’) 1;

else if(c>=‘v’&&c<=‘z’) 2;

putchar(c);

}

答案:【1c = c+52c=c-‘v’+’a’

6、请阅读以下程序:

main()

{

int s,t,a,b;

scanf(“%d,%d”,&a,&b);

s=1;

t=1;

if(a>0) s=s+1;

if(a>b) t=s+t;

else if(a==b) t=5;

else t=2*s;

printf(“s=%d,t=%d”,s,t);

}

为了使输出结果t=4,输入量ab应满足的条件是【 】。

答案:a>0 && a<b

7、以下程序根据输入的三角形的三边判断是否能组成三角形,若可以则输出它的面积和三角形的类型。请在【】内填入正确内容。

#include “math.h”

main()

{

float a,b,c;

float s,area;

scanf(“%f %f %f”,&a,&b,&c);

if(1)

{

s=(a+b+c)/2;

area=sqrt(s*(s-a)*(s-b)*(s-c));

printf(“%f”,area);

if(2)

printf(“等边三角形”);

else if(3)

printf(“等腰三角形”);

else if((a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c==a*a))

printf(“直角三角形”);

else printf(“一般三角形”);

}

else printf(“不能组成三角形”);

}

答案:【1a+b>c && a+c>b && b+c>a2a==b && b==c3a==b || b==c || c==a

注意:连等不能写成a==b==c思考如果写成这样这个表达式等于多少。

8、以下程序的功能是判断输入的年份是否是闰年。请在【】内填入正确内容。

main()

{

int y,f;

scanf(“%d”,&y);

if(y%400==0) f=1;

else if(1) f=1;

else 2;

if(f) printf(“%d is”,y);

else printf(“%d is not”,y);

printf(“a leap year\n”);

}

答案:【10==y%4 && y%100!=02f=0;

注意点:笔试或者是机试极有可能出现闰年的判断相关的题,因此这个知识点一定要熟记。

9、以下程序的运行结果是    。

#include <stdio.h>

main()

{

int a=-10,b=-3;

printf(“%d,”,-a%b);

printf(“%d,”,(a=a-b,a+b));

printf(“%d\n”,a-b?a-b:a+b);

}

答案:1,-10,-4

考察点:负数的求余,逗号表达式。

负数的求余:只看被余数的符号,被余数符号为正,求余表达式为正,被余数为负,求余表达式为负。

逗号表达式:依次求解逗号表达式,整个表达式的值为最后一个式子的值。

10、当运行时输入:1992<回车>,则以下程序的运行结果是    。

main()

{

int y,t;

scanf(“%d”,&y);

t=((y%4==0&&y%100!=0)||y%400==0)?1:0;

if(t) printf(“%d is”,y);

else printf(“%d is not”,y);

printf(“a leap year”);

}

答案:1992 isa leap year

注意点:这是一种比较好的方法,建议大家以后写可以采用这种方法比如

isLeap = ((y%4==0&&y%100!=0)||y%400==0)?1:0;

因为以后会碰到好多依is开头的函数,函数执行结果为真返回1,执行结果为假返回0

这个题就相当于预热一下。

注意答案的形式,如果写成1992 is a leap year算错。

11、根据以下嵌套的if语句所给条件,填写switch语句,使它完成相同的功能。

(假设mark的取值在1100之间。)

if语句:

if(mark<60) k=1;

else if(mark<70) k=2;

else if(mark<80) k=3;

else if(mark<90) k=4;

else if(mark<=100) k=5;

switch语句:

switch(1)

{

2   k=1; break;

case 6: k=2; break;

case 7: k=3; break;

case 8: k=4; break;

3   k=5;

}

答案:【1mark/102case 1:case 2:case 3:case 4:case 5:3case 9:case10:

12、请读程序:

#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++; break;

}

printf(“a=%d,b=%d”,a,b);

}

上面程序的运行结果是    。

答案:a=2,b=1

考察点:switch-case中的case 1:后面可以是任何的C语言语句。

三、编程题

1、编程实现以下功能:读入两个运算数(data1data2)及一个运算符(op),计算表达式data1 op data2的值,其中op可为+-*/

#include <stdio.h>

int main()

{

float data1,data2;

char op;

puts("输入两个数字:");

scanf("%f%f",&data1,&data2);

//吃掉回车符号

getchar();

puts("输入一个运算符(可以是+-*/):");

scanf("%c",&op);

switch(op)

{

case '+':printf("%.2f+%.2f=%.2f\n",data1,data2,data1+data2);break;

case '-':printf("%.2f-%.2f=%.2f\n",data1,data2,data1-data2);break;

case '*':printf("%.2f*%.2f=%.2f\n",data1,data2,data1*data2);break;

case '/':

if(data2 == 0)

{

printf("输入错误:除数为0\n");

return -1;

}

else

{

printf("%.2f/%.2f=%.2f\n",data1,data2,data1/data2);break;

}

default:printf("输入运算符不符合要求!\n");

}

return 0;

}

2、输入1个四位数,求各位数字的平方和。

例如:输入 1234,输出30

#include <stdio.h>

int main()

{

int num;

int digits,tens,hundreds,thousands;//分别代表个位、十位、百位、千位数字

printf("输入一个四位数字:");

scanf("%d",&num);

digits    = num%10;

tens      = num/10%10;

hundreds  = num/10/10%10;

thousands = num/10/10/10%10;

printf("%d的各位数字的平方和为:%d\n"

,num,digits*digits + tens*tens + hundreds*hundreds + thousands*thousands);

return 0;

}

3、铁路托运行李规定:行李重不超过50公斤的,托运费按每公斤0.15元计费;如超50公斤,超过部分每公斤加收0.10元。编一程序完成自动计费工作(行李重量用int即可)。

#include <stdio.h>

int main()

{

int   weight;

float expense;

printf("输入行李的重量:");

scanf("%d",&weight);

if(weight<=50)

{

expense = weight*0.15f;

}

else

{

expense = 50*0.15f+(weight-50)*0.10f;

}

printf("%d公斤的行李需要支付%.2f元费用\n",weight,expense);

return 0;

}

4、输入一个四位数,要求将它的千位、百位、十位、个位上的数字按由小到大排列,输出一个新数。

(如:输入 4287  要求输出为  2478

#include <stdio.h>

int main()

{

int num;

int digits,tens,hundreds,thousands;//分别代表个位、十位、百位、千位数字

int temp;

printf("输入一个四位数字:");

scanf("%d",&num);

digits    = num%10;

tens      = num/10%10;

hundreds  = num/10/10%10;

thousands = num/10/10/10%10;

if(thousands>hundreds)

{

temp      = thousands;

thousands = hundreds;

hundreds  = temp;

}

if(thousands>tens)

{

temp      = thousands;

thousands = tens;

tens  = temp;

}

if(thousands>digits)

{

temp      = thousands;

thousands = digits;

digits  = temp;

}

if(hundreds>tens)

{

temp     = hundreds;

hundreds = tens;

tens     = temp;

}

if(hundreds>digits)

{

temp     = hundreds;

hundreds = digits;

digits   = temp;

}

if(tens>digits)

{

temp   = tens;

tens   = digits;

digits = temp;

}

printf("%d各位数字由小到大排列得出的新数字为:%d\n"

,num,thousands*1000 + hundreds*100 + tens*10 + digits);

return 0;

}

5、输入两门课的成绩,如果两门成绩都在60分以上。则输出“it is pass.”只要有一门低于60分就输出“it is not pass.”如果输入的任何一门成绩不在0-100范围内则输出“it is error.”(要求用switch语句来编程)

#include <stdio.h>

int main()

{

float score1,score2;

int flag = 0;

printf("请输入两门课程的成绩:");

scanf("%f%f",&score1,&score2);

/*(score1-0<0)||(score1-100>0) + (score2-0<0)||(score2-100>0)中任意一个表达式为真,

就表示有一个分数不在正常范围之内

(score1-60>0) && (score2-60>0)有任意一门不及格整个表达式就为假。

由于&&||会截断运算。

因此flag = (score1-0<0)||(score1-100>0) + (score2-0<0)||(score2-100>0) + (score1-60>0) && (score2-60>0);

整个表达式的意义为:

flag == 0;表示有一门成绩不合格

flag == 1;表示要么有一个成绩不再正常范围之内,要么两个都及格。

所以在flag == 1case语句中又用了一个switch进行筛选

*/

flag = (score1-0<0)||(score1-100>0) + (score2-0<0)||(score2-100>0) + (score1-60>0) && (score2-60>0);

switch(flag)

{

case 0:printf("it is not pass.\n");break;

case 1:

switch((score1-0<0)||(score1-100>0) + (score2-0<0)||(score2-100>0))

{

case 0: printf("it is pass.\n");break;

case 1: printf("it is error.\n");break;

}

}

return 0;

}

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值