C语言重零开始习题集.docx
《C语言重零开始习题集.docx》由会员分享,可在线阅读,更多相关《C语言重零开始习题集.docx(104页珍藏版)》请在冰点文库上搜索。
C语言重零开始习题集
习题一
一、概念题
1.C语言的特点是什么?
C语言由于它的下述特点,被广泛地应用于各个领域的程序设计中,具有很强的通用性。
(1)语言简洁:
C语言只有32个关键字,提供了很多语法供程序员尽量简化程序。
(2)运算符丰富:
共提供了34种运算符。
运算符多,运算对象的种类也多。
(3)数据类型丰富:
提供了整型、实型、字符型、枚举型、数组、结构体、共用体、指针、空等9种以上的数据类型。
(4)语法限制不太严格。
(5)允许直接访问物理地址,能进行位操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。
(6)生成目标代码质量高,程序执行效率高:
C的目标代码的效率仅比汇编语言低15%。
(7)可移植性好,基本不做修改就能用于各种计算机和各种操作系统。
2.请描述C语言的基本结构。
C语言的结构特点,归纳起来有下面几点。
(1)C程序是由一个或多个函数构成的,有且仅有一个主函数(main函数)。
(2)无论程序中有多少函数,程序的执行总是从main函数开始的,即main函数是整个程序的入口。
(3)函数由函数的首部和函数体两部分组成。
首部包含函数类型、函数名、函数形式参数名、形式参数定义;函数体部分包括说明部分和语句部分,是由最外层的大括弧括起的部分。
(4)C语言书写格式自由,一行内可以写几条语句,一条语句也可以分写在多行。
(5)C语言中使用大括号“{”“}”来表示程序的结构参次范围,左大括号和右大括号应该配对使用。
(6)每条语句和说明的后面必须有一个分号。
(7)可以用/*…*/对程序的任何地方做注释。
3.编写和运行程序的主要步骤有哪些?
编写和运行程序主要有以下步骤:
(1)分析讨论问题并定义数据;
(2)进行算法的设计。
算法的设计过程就是对数据处理步骤的描述过程;
(3)写出可供计算机运行的程序,并交给计算机编译运行;
4.请描述用VC编写和运行程序的主要步骤和具体操作。
.
获得C程序的运行结果需要经过下面几个步骤:
(1)新建VC工程;
(2)编辑源文件;
(3)编译源文件;
(4)连接、执行程序;
(5)查看结果。
二、编程题
1.模仿例题编写一个简单程序能够输出下面的图形:
*
***
*******
解:
#include
main()
{printf("*\n");
printf("***\n");
printf("********\n");
}
2.模仿例题编写简单程序,计算a+b+c的值,并输出。
解:
main()
{inta,b,c;
a=10;
b=20;
c=30;
printf(“a+b+c=%d”,a+b+c);
}
习题二
1.请在下列标识符中,挑选出可用作C语言用户标识符。
voiddefine3_b3_123IFFor-abcCase
beginwhile2aDoSizeof
答:
define_123IFForCasebeginDoSizeof
2.C语言中的整型数据(int)和数学上的整数完全一样吗,有什么区别,请举例说明。
答:
两者不完全相同。
C语言中整型数据(int)所能表示的范围受存储空间的限制,而数学上的整数无限制。
3.写出定义两个整型变量x、y,并分别赋初始值为10、1000的语句。
答:
intx=10;
longy=1000;
4.将下列程序中的整型常量10用符号常量的形式表示。
#include
intmain()
{
intdata[10];
inti;
floataverage=0;
for(i=0;i<10;i++)
{
scanf("%d",&data[i]);
average=average+data[i];
}
average=average/10;
for(i=0;i<10;i++)
printf("%d",data[i]);
printf("\naverage=%f",average);
}
答:
#include
#defineSIZE10
intmain()
{
intdata[SIZE];
inti;
floataverage=0;
for(i=0;i{
scanf("%d",&data[i]);
average=average+data[i];
}
average=average/SIZE;
for(i=0;iprintf("%d",data[i]);
printf("\naverage=%f",average);
}
5.运行下面两段程序,观察运行结果有什么不同,找出原因。
(1)#include
intmain()
{
intx,y,temp;
x=10,y=1000;
printf("x=%d,y=%d\n",x,y);
temp=x;
x=y;
y=temp;
printf("x=%d,y=%d\n",x,y);
}
(2)#include
intmain()
{
intx,y;
x=10,y=1000;
printf("x=%d,y=%d\n",x,y);
x=y;
y=x;
printf("x=%d,y=%d\n",x,y);
}
答:
(1)结果:
x=10,y=1000
x=1000,y=10
(2)结果:
x=10,y=1000
x=1000,y=1000
原因:
(2)没有提供暂存变量。
交换时避免变量原值被覆盖。
6.将下列数学式子写成C语言表达式。
答:
(1)1/2(x/y+(1.5+x)/(4*a))
(2)1-2*x*x-4*y*y*y
7.假设用变量x、y、z分别表示三条边长,写出判断能否构成三角形的表达式。
答:
a+b>c&&a+c>b&&b+c>a
8.假设用变量x、y、z分别表示三角形的三条边,写出判断三角形是否为等边三角形的表达式。
答:
x==y&&y==z
9.假设x,y为两个整型变量,并已赋值,如何判断x能否被y整除。
答:
(x%y)==0
10.运行下面两段程序,输入相同的数据,观察运行结果有什么不同,找出原因。
并使用强制类型转换运算实现第二段程序的功能。
(1)#include
intmain()
{
floatn;
floats;
scanf("%f",&n);
s=1/n;
printf("s=%f\n",s);
}
(2)#include
intmain()
{
intn;
floats;
scanf("%d",&n);
s=1/n;
printf("s=%f\n",s);
}
答:
(1)0.333333
(2)0
第二种情况为0,是因为操作数的类型为整型,导致除法的操作结果被取整为0。
第二种情况修改如下:
#include
intmain()
{
intn;
floats;
scanf("%d",&n);
s=(float)1/n;
printf("s=%f\n",s);
}
11.编写程序,输入一个3位整数,依次提取出百位、十位、各位上的信息,并输出。
如输入789,则输出7-8-9。
答:
#include
intmain(void)
{
intnum,a,b,c;
scanf("%d",&num);
if(num<100||num>1000)
exit(0);
a=num%10;
b=num%100/10;
c=num/100;
printf("%d-%d-%d",c,b,a);
}
12.编写程序,任意输入一个字符,输出它的ASCII码。
答:
intmain(void)
{
charc;
c=getchar();
printf("%chasASCIIcode%d",c,c);
}
13.编写程序,任意输入一个字符,输出它在ASCII码表中的前一个字符和后一个字符。
为方便编程,假设输入的字符不是ASCII码表中的第一个字符和最后
答:
intmain(void)
{
charc;
c=getchar();
printf("%c%c",c-1,c+1);
}
习题三
一.写出下面各表达式的值。
设x=0,y=2,z=-2,a=3,b=4,c=5。
1.x+y2.z||b+c&&y+z
3.!
x4.(x=b)&&(y=0)&&1
5.!
(y+z)+c–10&&y–b/2
解:
1、02、13、14、05、0
二.阅读程序,写出执行结果。
1、请写出当输入x分别为0、1、-1时下面两个程序的执行结果。
(1)main()/*程序1*/
{intx,y;
scanf("%d",&x);
if(x>=0)
if(x>0)y=1;
elsey=0;
elsey=-1;
printf("x=%d,y=%d\n",x,y);
}结果为:
当输入0时:
x=0,y=0;
当输入1时:
x=1,y=1;
当输入-1时:
x=-1,y=-1
(2)
main()/*程序2*/
{intx,y;
scanf("%d",&x);
y=-1;
if(x!
=0)
if(x>0)y=1;
elsey=0;
printf("x=%d,y=%d\n",x,y);
}结果为:
当输入0时:
x=0,y=-1;
当输入1时:
x=1,y=1;
当输入-1时:
x=-1,y=0
2、#include
main()
{inti=0;
while(i<=15)
if(++i%3!
=2)continue;
elseprintf("%d",i);
printf("\n");
}
结果为:
2581114
3、#include
main()
{inti,j,k=0;
for(j=11;j<=30;j++)
{if(k%10==0)
printf("\n");
for(i=2;iif(!
(j%i))break;
if(i>=j-1)
{printf("%d\t",j);k++;}
}
}
结果为:
111317192329
三.程序填空题。
1.以下程序输入三个数,按大小次序输出,请填空。
main()
{floata,b,c,t;
scanf("%f,%f,%f",&a,&b,&c);
if(a>b)
{t=a;a=b;b=t;}
if(a>c)
{t=a;a=c;c=t;}
if(b>c)
{t=b;b=c;c=t;}
printf("%5、2f,%5、2f,%5、2f",a,b,c);
}
2.以下程序判断某年是否闰年,请填空。
main()
{intyear,leap;
scanf("%d",&year);
if(year%4==0)
{if(year%100==0)
{if(year%400==0)
leap=1;
elseleap=0;
}
elseleap=1;
}
elseleap=0;
if(leap)printf("%dis",year);
elseprintf("%disnot",year);
printf("aleapyear\n");
}
3.以下程序求ax2+bx+c=0的方程的解,请填空。
1):
a=0,不是2次方程
2):
b2–4ac=0,有两个相等实根
3):
b2–4ac>0,有两个不等实根
4):
b2–4ac<0,有两个共轭复根
#include"math、h"
main()
{floata,b,c,disc,x1,x2,realpart,imagpart;
scanf("%f,%f,%f",&a,&b,&c);
printf("Theequation");
if(a==0)printf("不是一元二次方程");
elsedisc=b*b-4*a*c;
if(disc==0)
printf("hastwoequalroots:
%8.4f\n",-b/(2*a));
elseif(disc>0)
{x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("hasdistinctrealroots:
%8.4fand%8.4f\n",x1,x2);
}
else
{realpart=-b/(2*a);
imagpart=sqrt(-disc)/(2*a);
printf("hascomplexroots:
\n");
printf("%8.4f+%8.4fi\n",realpart,imagpart);
printf("%8.4f-%8.4fi\n",realpart,imagpart);
}
}
4打印出所有的“水仙花数”;所谓“水仙花数”是指一个3位数,其各位数字立方和为该数本身。
例如:
153是一个“水仙花数”,因为:
153=13+33+53。
main()
{inti,j,k,n;
printf("水仙花数是:
");
for(n=100;n<1000;n++)
{i=n/100;j=n/10-i*10;k=n%10;
if(n==i*i*i+j*j*j+k*k*k)printf("%d",n);
}
}
5、输入一串字符,以?
号结束,输出其中小写字母个数和数字个数。
#includemain(){charch;intnum1=0,num2=0;ch=getchar();while(ch!
=’?
’)
{if((ch>=’a’)&&(ch<=’z’))num1++;/*字母个数加1*/
elseif((ch>=’1’)&&(ch<=’9’))num2++;/*数字个数加1*/
ch=getchar();/*取下一个字符*/
}
printf("%d,%d",num1,num2);
}
6、用下面公式求π的近似值,直到最后一项的绝对值小于10-7为止。
在程序空白处填上合适的内容。
#defineeps1e-7
#include
#include
main()
{ints=1;floatn,t,pi;
for(n=t=1,pi=0;fabs(t)>=eps;n=n+2,s=s*(-1),t=s/n)pi=pi+t;
pi=4*pi;
printf("pi=%f\n",pi);
}
7、一球从100米的高度自由落下,每次落地后反跳回原高度的一半,再落下。
求它在第10次落地时,共经过多少米?
第10次反弹多高?
在程序空白处填上合适的内容。
main()
{floatsn=100.0,hn=sn/2;
intn;
for(n=2;n<=10;n++)
{sn=sn+2*hn;
hn=hn/2;
}
printf("第10次落地时共经过%f米\n",sn);
printf("第10次反弹%f米\n",hn);
}
四.编程题
1.输入四个数,按代数值由小到大次序输出这四个数。
main()
{intt,a,b,c,d;
printf("请输入四个数:
");
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
printf("\na=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
if(a>b)
{t=a;a=b;b=t;}
if(a>c)
{t=a;a=c;c=t;}
if(a>d)
{t=a;a=d;d=t;}
if(b>c)
{t=b;b=c;c=t;}
if(b>d)
{t=b;b=d;d=t;}
if(c>d)
{t=c;c=d;d=t;}
printf("\n排序结果如下:
\n");
printf("%d%d%d%d\n",a,b,c,d);
}
2、写一程序判断所输入整数的奇偶性
main()
{inti;
printf("\n请输入一个整数:
\n");
scanf("%d\n",&i)
if(i/2==0)
printf("%d是一个偶数!
\n",i);
else
printf("%d是一个奇数!
\n",i);
}
3.编程计算下面函数值,要求分别用if和switch语句实现。
main()/*用ifelseifelse语句实现*/
{intx,y;
printf("请输入x");
scanf("%d",&x);
if(x<1)
{y=x/2;
printf("x=%d,y=x/2=%d\n",x,y);
}
elseif(x<10)
{y=2*x-1;
printf("x=%d,y=2*x-1=%d\n",x,y);
}
else
{y=-x+11;
printf("x=%d,y=-x+11=%d\n",x,y);
}
}
main()/*用switch语句实现*/
{intx,y,t;
printf("请输入x");
scanf("%d",&x);
if(x<1)t=0;
elseif(x<10)t=1;
elset=2;
switch(t)
{case0:
y=x/2;break;
case:
1y=2*x-1;break;
case2y=-x+11;break;
}
printf("x=%d,y=%d\n",x,y);
}
4、有四个圆塔,圆心分别为(2,2),(-2,2),(-2,-2),(2,-2),圆半径为1。
这四个塔的高度为20米,塔以外无建筑物、高度为0。
现输入任一点的坐标,求该点的建筑高度。
main()
{inth=10;
floatx,y,x0=2,y0=2,d1,d2,d3,d4;
printf("请输入一个点(x,y):
");
scanf(“%f,%f”,&x,&y);
d1=(x-x0)*(x-x0)+(y-y0)*(y-y0);
d2=(x-x0)*(x-x0)+(y+y0)*(y+y0);
d3=(x+x0)*(x+x0)+(y-y0)*(y-y0);
d4=(x+x0)*(x+x0)+(y+y0)*(y+y0);
if(d1>1&&d2>1&&d3>1&&d4>1)
h=0;
printf("该点的高度为%d",h);
}
5*、输入年、月,输出该月天数。
#include"stdio.h"
main()
{intyear,month,day;
printf("请输入年,月:
");
scanf("%d,%d",&year,&month);
switch(month)
{case1:
case3:
case5:
case7:
case8:
case10:
case12:
day=31;break;
case4:
case6:
case9:
case11:
day=30;break;
default:
printf("therearenotthemonth");
}
if(month==2)
if((year%4==0&&year%100!
=0)||(year%400==0))
day=28;
elseday=29;
printf("%d年,%d月有%d天",year,month,day);
}
6、输入一位学生的生日并输入当前日期,计算该生的实足年龄。
#include"stdio.h"
main()
{unsignedintbirthday,data;
intyear;
printf("请输入学生的生日(到月):
\n");
scanf("%ud",&birthday);
printf("请输入当前的日期(到月)\n");
scanf("%ud",&data);
year=data-birthday;
year/=100;
printf("这个学生的年龄是:
%d",year);
}
7、编程求fibonacci数列:
1,1,2,3,5,8……的前40个数。
fibonacci数列定义如下:
F1=1(n=1)
F2=1(n=2)
Fn=Fn-1+Fn-2(n>=3)
#include"stdio.h"
main()
{longintf1,f2;
inti;
f1=1;
f2=1;
for(i=1;i<=20;i++)
{printf("%12ld%12ld",f1,f2);
if(i%2=