一、选择题
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、设x、y和z是int型变量,且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的值为 。
A)1 B)2 C)3 D)4
考察点:&&的截断
4、执行以下语句后a的值为【1】,b的值为【2】。
int a,b,c;
a=b=c=1;
++a||++b&&++c;
【1】 A)错误 B)0 C)2 D)1
【2】 A)1 B)2 C)错误 D)0
考察点:||的截断,注意这里++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的值,这里a为0
因此执行else语句。
6、以下程序的运行结果是( )。
main()
{
int m=5;
if(m++>5) printf(“%d\n”,m);
else printf(“%d\n”,m--);
}
A)4 B)5 C)6 D)7
考察点:考察自增自减运算,自增自减总共有四个,这四个无论在哪里出现都会改变相应变量的值。对于前++和后++究竟该如何去记忆,给大家一个小技巧,假设变量为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;
A)1 B)2 C)3 D)6
考察点:if-else的嵌套。大家都知道if-else中只有一个语句序列会被执行,只要任一个语句序列被执行,那么整个if-else就执行完毕了。
8、有一函数关系见下表:
x y=
x<0 x-1
x=0 x
x>0 x+1
下面程序段中能正确表示上面关系的是 。
A)y=x+1; B)y=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;
C)if(x<=0) D)y=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);
}
A)4 B)3 C)2 D)1
11、执行以下程序段后,变量a,b,c的值分别是 。
int x=10,y=9;
int a,b,c;
a=(--x==y++)?--x:++y;
b=x++;
c=y;
A)a=9,b=9,c=9 B)a=8,b=8,c=10
C)a=9,b=10,c=9 D)a=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、以下程序实现输出x,y,z三个数中的最大者,请在【】内填入正确内容。
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);
}
答案:【1】u,v【2】x>y【3】u>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);
}
答案:【1】y<z【2】x<z【3】x<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);
}
答案:【1】c = c+5【2】c=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,输入量a和b应满足的条件是【 】。
答案: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(“不能组成三角形”);
}
答案:【1】a+b>c && a+c>b && b+c>a【2】a==b && b==c【3】a==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”);
}
答案:【1】0==y%4 && y%100!=0【2】f=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的取值在1~100之间。)
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;
}
答案:【1】mark/10【2】case 1:case 2:case 3:case 4:case 5:【3】case 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、编程实现以下功能:读入两个运算数(data1和data2)及一个运算符(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 == 1的case语句中又用了一个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;
}