C语言练习题.docx
《C语言练习题.docx》由会员分享,可在线阅读,更多相关《C语言练习题.docx(15页珍藏版)》请在冰豆网上搜索。
C语言练习题
练习一
1、把十进制数56,-74转化为对应的二进制数,并分别写出它们的8位原码和补码。
2、什么是浮点数?
计算机内部是如何存储浮点数的?
3、什么是ASCII码?
ASCII码编码方案有何特点?
试述常用字符的大致编码顺序。
4、什么是汉字的机内码?
在计算机的内存中如何区分机内码与ASCII码?
5、试述计算机内部采用二进制工作的原因,以及计算机的工作原理。
6、试述程序设计的概念,以及程序设计的基本过程。
7、什么是算法?
算法有哪些特性和描述方法?
算法与程序的关系如何?
8、什么是高级语言?
有哪些主要的高级语言?
9、什么是标识符和关键字?
它们分别有什么作用?
10、标识符是如何构成的?
使用标识符时应注意哪些问题?
11、下列字符序列中,哪些可以构成合法的标识符?
signeda-1x_y_1$useπ
0x56sumnum#_1234age
12、试述C程序的基本结构。
13、试述C程序上机的全过程,并解释这过程中产生的各类错误的含义。
练习二
1、C语言的基本数据类型有哪些?
数据类型对数据的表示和运算有什么约束?
2、什么是常量?
数值常量和符号常量有何区别?
使用符号常量有什么好处?
3、什么是变量?
变量的名字、地址、值、类型有什么关系?
4、如何定义变量?
C语言中为什么规定变量必须先定义,后使用?
5、常量也有数据类型,请问如何区分整型常量和实型常量的数据类型?
6、字符常量与字符串常量的表示形式有何区别?
'a'和"a"有什么不同?
7、字符串常量"\\\34ab\n"中有多少个字符?
8、下列表达式计算时,哪些地方会发生类型转换?
从什么类型转换到什么类型?
表达式计算的结果是什么类型?
值多少?
(1)2.5+2*7%2/4
(2)4*(2L+6.5)-12
(3)10/(5*3)(4)2*10.0/(5*3)
9、设有变量定义:
floatx=2.7,y=4.5;inta=8;求表达式y+a%5*(int)(x+y)/2%4的值。
10、执行下列程序,解释程序的运行结果,并修改程序使得它能输出正确的结果。
#include
intmain()
{floatx;
x=45678*56789;
printf("45678*56789=%f\n",x);
}
答:
程序运行结果为:
45678*56789=-1700959360.000000。
由于45678*56789=2594007942,已经超出了long类型的取值范围,所以结果为负数。
修改后的程序如下:
#include
intmain()
{doublex;
x=45678.0*56789;
printf("45678*56789=%f\n",x);
}
修改后的程序运行结果为:
45678*56789=2594007942.000000
11、执行下列程序,解释程序的运行结果,从中体会常用转义字符的含义。
#include
intmain()
{printf("_ab_c\t_de\rf\tg\n");
printf("h\ti\b\bj_k\n");
}
程序运行结果:
第一个printf由于输出\r光标又回到了最左边,原来屏幕上的_ab_c□□□_(□表示空格)都被接下来输出的f\tg(实际上是输出了字符f、7个空格和字符g),而第二个printf由于输出\b\b删除了字符i和它前面的1个空格,所以得到以上运行结果。
12、执行下列程序,解释程序的运行结果,从中体会字符和数的区别和联系。
#include
intmain()
{intm,n,k;
m='5'*'6';n=5*6;
k=('5'-'0')*('6'-'0');
printf("m,n,k=%d,%d,%d\n",m,n,k);
}
程序运行结果为:
m,n,k=2862,30,30。
由于('5'-'0')起到了将字符5转换为数5的功能,('6'-'0')起到类似作用,所以变量n和k的值一样。
而'5'*'6'实际上是字符5的ASCII码(53)乘以字符6的ASCII码(54),所以变量m的值为2862。
13、执行下列程序,解释程序的运行结果,从中体会前置和后置运算的区别。
#include
intmain()
{intx=5,y,z;
y=8-x++;
printf("%d%d\n",x,y);
z=++x*2;
printf("%d%d\n",x,z);
}
程序运行结果:
由于第一个赋值语句中是后置运算,所以y的值=8-5=3,x的值加了1为6,而第一个赋值语句中是前置运算,x的值首先加了1为7,再乘以2,所以z的值为14。
练习三
1、什么是结构化程序设计方法?
结构化程序设计应遵循哪些原则?
答:
结构化程序设计方法是基于模块化、自顶向下、逐步求精和结构化程序设计等程序设计技术的总称。
结构化程序设计方法应遵循:
(1)在总体设计阶段采用“自顶向下,逐步求精”的模块化设计方法;
(2)在详细设计阶段采用“基本结构,组合而成”的方法,就是程序不论大小,简单还是复杂,程序由三种基本结构(即顺序结构、选择结构和循环结构)组合而成;(3)在最后的编码阶段应做到“清晰第一,效率第二”,并采用良好的程序设计风格,从而提高程序的可读性,便于调试时改正错误,也便于程序的维护。
2、C语言的语句有哪几类?
为什么说C语言是表达式语言?
答:
C语言中语句可分为:
表达式语句、函数调用语句、控制语句、复合语句和空语句五类。
由于任何表达式加上分号“;”就能构成语句,所以称C语言是表达式语言。
3、C语言中如何表示逻辑值“真”和“假”?
一个值参加逻辑运算时又如何判断它是“真”还是“假”?
答:
C语言中逻辑值“真”和“假”分别用数“1”和“0”来表示,一个值参加逻辑运算时非0就认为是“真”,0才认为是“假”。
4、设有变量定义:
inta=3,b=8;表达式(a<5)||(b=5)求值后,b的值是多少?
答:
由于(a<5)为“真”,根据“短路求值法”,表达式(b=5)不求值,所以b的值仍然为8。
.
5、设有n(n>0)个学生要分班,每班k(k>0)个学生,最后不足k个学生也编一班,试用条件表达式表示班级数。
答:
(n%k==0)?
n/k:
n/k+1
6、设有整型变量n,以下选项中,构成死循环的是哪一个?
A.n=100;do{n++;}while(n>100);
B.for(n=100;;n=n%100+1)if(n>100)break;
C.n=100;while(n)--n;
D.n=100;while(n--);
答:
B。
注意A不构成死循环,因为n最终会溢出而成为负数。
7、请消除下列程序中的2个语法错误。
#include
intmain()
{inta,b;floatx=5.7;
a=10;
scanf("%d",b);//应改为:
scanf("%d",&b);
printf("a+b=%d\n",a+b);
printf("x=%d\n",x);//应改为:
printf("x=%f\n",x);
}
8、如果执行下列程序时,数据的输入格式如下,请解释程序的运行结果。
为了使得c1='A'和c2='a',假定程序不做修改,应如何修改数据的输入格式?
假定数据的输入格式不变,又应如何修改程序?
从中体会一般情况下scanf的格式控制字符串中的普通字符不但起不到提示的作用,反而给用户的输入制造了麻烦。
#include
intmain()
{inta,b;floatx,y;charc1,c2;
scanf("a=%db=%d",&a,&b);
scanf("%f%f",&x,&y);
scanf("%c%c",&c1,&c2);
printf("a=%db=%d\n",a,b);
printf("x=%0.1fy=%0.1f\n",x,y);
printf("c1=%cc2=%c\n",c1,c2);
}
输入为:
a=3□b=7↙/*↙表示回车,□表示空格*/
8.5□6.1↙
A□a↙
输出为:
a=3b=7
x=8.5y=6.1
c1=
c2=A
答:
程序不做修改,数据的输入格式应修改为:
a=3□b=7↙
8.5□6.1Aa↙
数据的输入格式不变,程序中最后一句输入语句应修改为:
scanf("%*c%c%*c%c",&c1,&c2);//当然还有其它修改方法
9、编写一个程序,输入一个华氏温度f,输出对应的摄氏温度c。
计算公式是:
c=5/9*(f-32)。
#include
intmain()
{floatf,c;
printf("请输入华氏温度:
");
scanf("%f",&f);
c=5.0/9*(f-32);
printf("对应的摄氏温度:
%.2f\n",c);
return0;
}
10、假定某种手机套餐规定:
月租费10元,可免费发送短信60条,超出部分每条0.10元;可免费与本地手机通话20分钟(包括打入与打出),超出部分每分钟0.15元;与本地固定电话通话可享受每分钟0.2元的优惠(没有免费通话时间)。
在不考虑长途通话的情况下,输入某用户一个月发送短信的条数、与本地手机通话的分钟数和与本地固定电话通话的分钟数,程序计算并输出该用户这个月的手机通信费用。
#include
intmain()
{intmessage,mobilecall,phonecall;floatmoney;
printf("请输入发送短信的条数、与本地手机通话的分钟数和与本地固定电话通话的分钟数:
");
scanf("%d%d%d",&message,&mobilecall,&phonecall);
money=10;
if(message>60)money+=0.1*(message-60);
if(mobilecall>20)money+=0.15*(mobilecall-20);
if(phonecall>0)money+=0.2*phonecall;
printf("手机通信费用:
%.2f\n",money);
return0;
}
11、编写一个程序,输入某乘客先后两次乘坐公交车的上车时间(假定在同一天内),程序判断时间间隔是否大于2小时并输出相应的信息。
输入格式以及输出信息的格式如下所示,程序不考虑输入时间错误(如8:
68:
72)。
提示:
可将时间转换为秒为单位后再做减法。
输入为:
9:
31:
4□11:
8:
25↙/*↙表示回车,□表示空格*/
输出为:
时间间隔=01:
37:
21你能享受公交优惠1元。
输入为:
12:
58:
37□15:
2:
49↙
输出为:
时间间隔=02:
04:
12对不起,你不能享受公交优惠。
#include
intmain()
{inth1,m1,s1,h2,m2,s2,h,m,s;
longdiff;
printf("请输入先后两次乘坐公交车的上车时间(hh:
mm:
sshh:
mm:
ss)");
scanf("%d:
%d:
%d%d:
%d:
%d",&h1,&m1,&s1,&h2,&m2,&s2);
diff=(h2*3600L+m2*60+s2)-(h1*3600L+m1*60+s1);
h=diff/3600;m=diff%3600/60;s=diff%60;
printf("时间间隔=%02d:
%02d:
%02d",h,m,s);
if(diff<=7200)printf("你能享受公交优惠1元。
\n");
elseprintf("对不起,你不能享受公交优惠。
\n");
return0;
}
12、编写一个程序,输入三角形的三条边长,程序判断它是否能够构成三角形,能则输出三角形的面积,否则输出“不能构成三角形”。
三角形面积计算公式:
面积=√s(s-a)(s-b)(s-c),其中,a,b,c为三角形的三条边长,s=(a+b+c)/2。
#include
#include
intmain()
{floata,b,c,s,area;
printf("请输入三角形的三条边长:
");
scanf("%f%f%f",&a,&b,&c);
if(a+b>c&&b+c>a&&a+c>b)
{s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("三角形的面积为:
%.2f\n",area);
}
elseprintf("不能构成三角形!
\n");
return0;
}
13、计算个人所得税征税问题。
应纳税工资=工资总额-3500元,应纳税工资在1500元以下(含1500,以下同)的税率3%,1500元以上4500元以下的部分税率10%,4500元以上9000元以下的部分税率20%,9000元以上35000元以下的部分税率25%,输入工资总额(假定小于38500元),程序计算并输出个人所得税。
个税计算公式如下:
个税=应纳税工资×对应的税率—速算扣除数(见下表)
全月应纳税工资税率%速算扣除数(元)
不超过1500元30
超过1500元至4500元10105
超过4500元至9000元20555
超过9000元至35000元251005
#include
intmain()
{floatsalary,paytax,tax;
printf("请输入工资总额:
");
scanf("%f",&salary);
paytax=salary-3500;
if(paytax<=0)tax=0;
elseif(paytax<=1500)tax=paytax*0.03;
elseif(paytax<=4500)tax=paytax*0.1-105;
elseif(paytax<=9000)tax=paytax*0.2-555;
elsetax=paytax*0.25-1005;
printf("个人所得税为:
%.2f\n",tax);
return0;
}
14、假定银行整存整取存款的存期有1,2,3,5年四种,年利率分别为3.5%,4.4%,5%,6.5%。
输入存款的本金和存期(若输入的存期错误,应报错),程序计算并输出到期后的利息。
利息=本金×存期×年利率。
#include
intmain()
{doubleprincipal,rate,interest;
intterm;
printf("请输入本金:
");scanf("%lf",&principal);
printf("请输入存期:
");scanf("%d",&term);
switch(term)
{case1:
rate=3.5;break;
case2:
rate=4.4;break;
case3:
rate=5.0;break;
case5:
rate=6.5;break;
default:
printf("输入的存期错误!
\n");return1;
}
interest=principal*rate*0.01*term;
printf("利息:
%5.2lf\n",interest);
return0;
}
15、编写一个程序,输入年份和月份,输出该月的天数。
#include
intmain()
{inty,m,d;
printf("请输入年份和月份(yyyy-mm):
");
scanf("%d-%d",&y,&m);
switch(m)
{case2:
d=28;break;
case1:
case3:
case5:
case7:
case8:
case10:
case12:
d=31;break;
case4:
case6:
case9:
case11:
d=30;break;
default:
printf("输入的月份错误!
\n");return1;
}
if((m==2)&&(y%4==0&&y%100!
=0||y%400==0))d++;
printf("该月有%d天\n",d);
return0;
}
16、编写一个程序,输入一个正整数,要求以相反的顺序输出该数。
例如,输入12345,则输出为54321。
#include
intmain()
{intn;
printf("请输入一个正整数:
");
scanf("%d",&n);
printf("反序输出该数:
");
while(n!
=0)
{printf("%d",n%10);
n/=10;
}
printf("\n");
return0;
}
17、编写一个程序,输入一行字符,输出其中的英文字母、数字字符和其他字符各有多少个。
#include
intmain()
{intdigit,letter,other;charch;
digit=letter=other=0;
printf("请输入一个字符串:
");
while((ch=getchar())!
='\n')
if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))
letter++;
elseif(ch>='0'&&ch<='9')
digit++;
else
other++;
printf("各类字符个数:
\n");
printf("英文字母=%d,数字=%d,其他字符=%d\n",letter,digit,other);
return0;
}
18、编写一个程序,用e≈1+1/1!
+1/2!
+1/3!
+……+1/n!
,求e的近似值,直到1/n!
<10-6为止。
#include
intmain()
{intn;floate,t;
n=e=t=1;
do{
t/=n;
e+=t;
n++;
}while(t>1e-6);
printf("e=%f\n",e);
return0;
}
19、编写一个程序,用迭代法求数a的平方根,迭代公式为:
xn+1=(xn+a/xn)/2,要求前后两次求出的x的差的绝对值小于10-5。
数a可从键盘上输入,x0可取a/2。
#include
#include
intmain()
{floata,x1,x2;
printf("请输入一个正数:
");
scanf("%f",&a);
x2=a/2;
do{
x1=x2;
x2=(x1+a/x1)/2;
}while(fabs(x2-x1)>1e-5);
printf("数%.2f的平方根=%f\n",a,x2);
return0;
}
20、假定某一大型比赛中有10名裁判同时为一名体操运动员打分,编写一个程序,输入这10名裁判的打分,输出去掉一个最高分和一个最低分后该运动员的平均得分。
#include
#defineN10
intmain()
{inti;floata,max,min,sum;
max=0;min=10;sum=0;
printf("请输入%d个裁判的打分:
\n",N);
for(i=1;i<=N;i++)
{scanf("%f",&a);
if(maxif(min>a)min=a;
sum+=a;
}
sum=(sum-max-min)/(N-2);
printf("最高分=%.1f最低分=%.1f平均得分=%.3f\n",max,min,sum);
return0;
}
21、编写一个程序,输入10个互不相同的数,输出其中的最大数和次大数。
#include
#defineN10
intmain()
{inti;floata,max,smax;
printf("请输入%d个互不相同的数:
\n",N);
max=-1e30;
for(i=1;i<=N;i++)
{scanf("%f",&a);
if(a>max){smax=max;max=a;}
elseif(a>smax)smax=a;
}
printf("最大数=%f,次大数=%f\n",max,smax);
return0;
}
22、编写一个程序,找出连续整数之和是500的所有整数序列。
例如:
500=98+99+100+101
+102。
#include
intmain()
{inti,j,s,k,n;
for(n=0,i=1;i<250;i++)
{for(s=0,j=i;s<500;j++)
s+=j;
if(s==500)
{printf("%d:
",++n);
for(k=i;kprintf("%d",k);
printf("\n");
}
}
return0;
}
23、“百钱百鸡”问题。
我国古代数学家张丘建在《算经》中出了一道题“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。
百钱买百鸡,问鸡翁、母、雏各几何?
”。
意思是:
公鸡5元钱1只,母鸡3元钱1只,小鸡1元钱3只。
用100元钱买100只鸡,问公鸡、母鸡和小鸡各买多少只?
#include
intmain()
{intx,y,z;
printf("公鸡\t母鸡\t小鸡\n");
for(x=0;x<=20;x++)
for(y=0;y<=33;y++)
{z=100-x-y;
if(3*5*x+3*3*y+z==3*100)
printf("%d\t%d\t%d\n",x,y,z);
}
return0;
}
24、爱因斯坦阶梯问题。
设有一个阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余2阶;每步跨5阶,最后余4阶;每