资源描述
习题一
一、概念题
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 <stdio.h>
main ( )
{printf(" *\n");
printf(" ***\n");
printf(" ********\n");
}
2.模仿例题编写简单程序,计算a+b+c的值,并输出。
解:
main ( )
{ int a, b, c;
a=10;
b=20;
c=30;
printf (“a+b+c=%d”, a+b+c);
}
习题二
1. 请在下列标识符中,挑选出可用作C语言用户标识符。
void define 3_b3 _123 IF For -abc Case
begin while 2a Do Sizeof
答: define _123 IF For Case begin Do Sizeof
2. C语言中的整型数据(int)和数学上的整数完全一样吗,有什么区别,请举例说明。
答:两者不完全相同。C语言中整型数据(int)所能表示的范围受存储空间的限制,而数学上的整数无限制。
3. 写出定义两个整型变量x、y,并分别赋初始值为10、1000的语句。
答:int x=10;
long y=1000;
4. 将下列程序中的整型常量10用符号常量的形式表示。
#include <stdio.h>
int main()
{
int data[10];
int i;
float average=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 <stdio.h>
#define SIZE 10
int main()
{
int data[SIZE];
int i;
float average=0;
for (i=0; i< SIZE; i++)
{
scanf("%d",&data[i]);
average=average+data[i];
}
average=average/ SIZE;
for (i=0; i< SIZE; i++)
printf("%d ",data[i]);
printf("\naverage=%f",average);
}
5. 运行下面两段程序,观察运行结果有什么不同,找出原因。
(1) #include <stdio.h>
int main()
{
int x,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 <stdio.h>
int main()
{
int x,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 <stdio.h>
int main()
{
float n;
float s;
scanf("%f",&n);
s=1/n;
printf("s=%f\n",s);
}
(2)#include <stdio.h>
int main()
{
int n;
float s;
scanf("%d",&n);
s=1/n;
printf("s=%f\n",s);
}
答:(1)0.333333
(2)0
第二种情况为0,是因为操作数的类型为整型,导致除法的操作结果被取整为0。第二种情况修改如下:
#include <stdio.h>
int main()
{
int n;
float s;
scanf("%d",&n);
s=(float)1/n;
printf("s=%f\n",s);
}
11. 编写程序,输入一个3位整数,依次提取出百位、十位、各位上的信息,并输出。如输入789,则输出7-8-9。
答:
#include <stdio.h>
int main(void)
{
int num,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码。
答:
int main(void)
{
char c;
c=getchar();
printf("%c has ASCII code %d",c,c);
}
13. 编写程序,任意输入一个字符,输出它在ASCII码表中的前一个字符和后一个字符。为方便编程,假设输入的字符不是ASCII码表中的第一个字符和最后
答:
int main(void)
{
char c;
c=getchar();
printf("%c %c",c-1,c+1);
}
习题三
一. 写出下面各表达式的值。设 x = 0 , y = 2 , z = - 2 , a = 3 , b = 4 , c = 5 。
1. x + y < z && b = = c
2. z || b + c && y + z
3. ! x < y && c || 1
4. ( x = b ) && ( y = 0 ) && 1
5. ! ( y + z ) + c – 10 && y – b / 2
解:1、 0 2、1 3、1 4 、 0 5、 0
二.阅读程序,写出执行结果。
1、 请写出当输入x分别为0、1、-1时下面两个程序的执行结果。
(1) main ( ) /*程序1*/
{ int x , y ;
scanf ( " %d " , & x ) ;
if ( x >= 0 )
if ( x > 0 ) y = 1 ;
else y = 0 ;
else y = - 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*/
{ int x , y ;
scanf ( " %d " , & x ) ;
y = -1;
if ( x != 0 )
if ( x > 0 ) y = 1 ;
else y = 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 <sdtio.h>
main( )
{ int i=0;
while (i<=15)
if (++i%3!=2) continue;
else printf("%d ",i);
printf("\n");
}
结果为:2 5 8 11 14
3、 #include <stdio.h>
main( )
{ int i,j,k=0;
for (j=11; j<=30; j++)
{ if (k%10==0)
printf("\n");
for (i=2; i<j; i++)
if (! ( j% i ) ) break;
if (i>=j-1)
{ printf("%d\t",j); k++; }
}
}
结果为:11 13 17 19 23 29
三.程序填空题。
1.以下程序输入三个数,按大小次序输出,请填空。
main ( )
{ float a , 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 ( )
{int year , leap ;
scanf ("%d" , &year ) ;
if ( year % 4 = = 0 )
{ if ( year % 100 = = 0 )
{ if ( year % 400 = = 0 )
leap=1;
else leap=0;
}
else leap=1;
}
else leap=0;
if ( leap ) printf ( " %d is ", year ) ;
else printf ( " %d is not " , year );
printf ( " a leap year \n " ) ;
}
3.以下程序求a x 2 + b x + c = 0 的方程的解,请填空。
1):a = 0 , 不是2次方程
2):b 2 – 4 a c = 0 ,有两个相等实根
3):b 2 – 4 a c > 0 ,有两个不等实根
4):b 2 – 4 a c < 0 ,有两个共轭复根
#include "math、h "
main ( )
{ float a , b , c , disc , x1 , x2 , realpart , imagpart ;
scanf (" %f, %f,%f",&a,&b ,&c ) ;
printf ( " The equation " ) ;
if (a= =0 ) printf ( "不是一元二次方程" ) ;
else disc = b * b - 4 * a * c ;
if ( disc= =0 )
printf ( " has two equal roots : %8.4f \n " , - b / ( 2 * a ) ) ;
else if (disc>0)
{ x1 = (-b +sqrt (disc))/ (2*a) ;
x2 = (-b- sqrt(disc))/(2*a);
printf ( "has distinct real roots :%8.4fand %8.4f\n" ,x1,x2) ;
}
else
{ realpart = -b/ (2* a) ;
imagpart = sqrt (-disc)/(2*a) ;
printf ("has complex roots :\n") ;
printf (" %8.4f + %8.4f i \n " , realpart , imagpart) ;
printf (" %8.4f - %8.4f i \n",realpart ,imagpart) ;
}
}
4 打印出所有的“水仙花数”;所谓“水仙花数”是指一个3位数,其各位数字立方和为该数本身。例如: 153是一个“水仙花数”,因为:153=13+33+53。
main( )
{ int i ,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、 输入一串字符,以?号结束,输出其中小写字母个数和数字个数。
#include <stdio.h>
main( )
{ char ch;
int num1=0,num2=0;
ch=getchar( );
while (ch!=’?’)
{ if ( (ch>=’a’)&&(ch<=’z’)) num1++; /*字母个数加1*/
else if ((ch>=’1’)&&(ch<=’9’))num2++; /* 数字个数加1*/
ch=getchar( ) ; /* 取下一个字符*/
}
printf("%d,%d",num1,num2);
}
6、用下面公式求π的近似值,直到最后一项的绝对值小于10-7为止。在程序空白处填上合适的内容。
#define eps 1e-7
#include <stdio.h>
#include <math.h >
main( )
{ int s=1; float n,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( )
{ float sn=100.0 ,hn=sn/2;
int n;
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( )
{ int t ,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( )
{ int i;
printf("\n请输入一个整数:\n");
scanf("%d\n",&i)
if(i/2= =0)
printf("%d 是一个偶数!\n",i);
else
printf("%d 是一个奇数!\n",i);
}
3.编程计算下面函数值,要求分别用if和switch语句实现。
main( ) /* 用if elseif else语句实现*/
{ int x,y;
printf("请输入x");
scanf(" %d",&x);
if(x<1)
{ y=x/2;
printf("x=%d, y=x/2=%d \n",x,y);
}
else if (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语句实现*/
{ int x,y,t;
printf("请输入x" );
scanf("%d",&x);
if(x<1) t=0;
else if(x<10) t=1;
else t =2;
switch(t)
{ case 0: y=x/2;break;
case:1 y=2*x-1;break;
case 2 y= -x+11;break;
}
printf("x=%d, y=%d \n",x,y);
}
4、有四个圆塔,圆心分别为( 2 , 2 ),( - 2 , 2 ) ,( - 2 , - 2 ) ,( 2 , - 2 ) ,圆半径为1。这四个塔的高度为20米,塔以外无建筑物、高度为0。现输入任一点的坐标,求该点的建筑高度。
main( )
{ int h=10;
float x,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( )
{ int year,month,day;
printf("请输入年,月:");
scanf("%d,%d",&year,&month);
switch(month)
{case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10 :
case 12 : day=31; break;
case 4 :
case 6 :
case 9 :
case 11 : day=30; break;
default : printf("there are not the month");
}
if(month==2)
if((year%4==0&&year%100!=0)||(year%400==0))
day=28;
else day=29;
printf("%d年,%d月 有%d天",year,month,day);
}
6、输入一位学生的生日并输入当前日期,计算该生的实足年龄。
#include "stdio.h"
main( )
{ unsigned int birthday,data;
int year;
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( )
{ long int f1,f2;
int i;
f1=1;
f2=1;
for(i=1;i<=20;i++)
{ printf("%12ld %12ld " ,f1,f2);
if(i%2= =0) printf("\n");
f1=f1+f2;
f2=f2+f1;
}
}
8.编程判断m是否素数。若是,打印:… is a prime;若不是,打印:… is not a prime。
#include <math.h>
main( )
{ int m,i,k;
scanf("%d",&m);
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0) break;
if(i>=k+1)
printf("%d is a prime number、\n",m);
else
printf("%d is not a prime number 、\n",m);
}
9.例:对一段电文进行加密,将电文中的大写字母变为其后的第3个字母。最后的三个字母X,Y,Z变为A,B,C。
#include "stdio.h"
main( )
{ char ch;
printf("请输入你要加密的电文:\n");
while((ch=getchar()!='\n'))
{ if(ch>='A'&&ch<='Z')
ch=ch+3;
if(ch>'Z'&&ch<='Z'+3)
ch=ch-26;
printf("%c",ch);
}
}
10.编程对输入的三个数进行由小到大排序。
main( )
{ int x,y,z,t;
printf("请输入三个数:");
scanf("%d,%d,%d",&x,&y,&z);
if(x>y)
{t=x;x=y;y=t;}
if(x>z)
{t=x;x=z;z=t;}
if(y>z)
{t=y;y=z;z=t;}
printf("x=%d,y=%d,z=%d",x,y,z);
}
11*、两个乒乓球对进行比赛,各出3人,甲队为A,B,C 三人,乙队为x,y,z 三人,已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和x比,C说他不和x,z比,请编程序找出3对赛手的名单。
main( )
{ char i,j,k; /*i是A的对手;j是B的对手;k是C的对手*/
for(i='x';i<='z';i++)
for(j='x';j<='z';j++)
if(i!=j)
for(k='x';k<='z';k++)
if(i!=k&&j!=k)
if(i!='x'&&k!='x'&&k!='z')
printf("A--%c\tB--%c\tC--%c\n",i,j,k);
}
12*、有一分数序列:2/1, 3/2, 5/3, 8/5, 13/8, 21/13,…求这个数列的前20项之和。
main( )
{ int i,t,n=20;
float a=2,b=1,s=0;
for(i=1;i<=n;i++)
{s=s+a/b;
t=a;
a=a+b; /*将前一项分子与分母之和作为下一项的分子*/
b=t ; /*将前一项的分子作为下一项的分母*/
}
printf("sum=%8、4f\n",s);
}
习题四
一. 阅读程序,写出执行结果。
1.下面程序的输出结果是: 4
#include <stdio.h>
f(int a)
{ int b=0; static c=3;
a=c++,b++;
return ( a );
}
main( )
{ int a=2, i, k ;
for (i=0; i<2; i++)
k=f (a++);
printf("%d\n",k);
}
2.下面程序的输出结果是: 84
#include <stdio.h>
int d=1;
fun(int p)
{ int d=5;
d+=p++;
printf("%d",d);
}
main( )
{ int a=3;
fun(a);
d+=a++;
printf("%d\n",d);
}
3、下述程序的运行结果是:Yes、 No、 Yes、 No、 Yes
#include <stdio.h>
#define TRUE 1
#define FALSE 0
int fun(int num)
{ int answer;
if (num%2) answer=TRUE;
else answer=FALSE;
return answer;
}
void main( )
{ int i;
for(i=1; i<6; i++)
{ if (fun(i) ==TRUE)
printf("Yes、");
else printf("No、");
}
}
二.程序填空题。
1.下面程序的功能是:有n个人坐在一起,问第n个人多少岁?他说比第n-1个人大1岁,依次问下去,每个人总说比他前面的人大1岁,最后问到第一个人,他说是6岁。请问第n个人多少岁?在程序空白处填上合适的内容。
int age(int n)
{ int c;
if (n==1) c=6 ;
else c=age(n-1)+1;
return(c);
}
main( )
{ int n;
scanf("%d", &n);
printf("第n个人的岁数是:%d\n", age(n) );
}
2.下面程序完成“根据半径计算圆面积的功能”, 请填空。
#define PI 3.14
#define S(r) PI*r*r
main( )
{ float a,area;
scanf("%f",&a);
area=S(a);
printf("r=%f,area=%f\n",a,area);
}
3、下面的isprime函数“判断m是否素数,若是,函数返回1,否则返回0”。请填空。
#include "math.h"
int isprime( int m )
{ int i,k;
k=sqrt(m);
for (i=2;i<=k;i++)
if ( m%i==0 ) break;
if (i>=k+1) return(1);
else return(0);
}
三.编程题
1. 求圆台的表面积s和体积v。已知,圆台的上半径r1=32.5,下半径r2=40、6,圆台的高h=20.5。
参考圆台的表面积s和体积v的计算公式:
s=π(r12+r22)+ π(r1+r2)L
v=πh(r12+r22+ r1*r2)/3
L=sqrt(h2+(r1- r2)2)
#include <stdio.h>
#include <math.h>
#define PI 3.1415
#define r1 32.5
#define r2 40.6
#define h 20.5
#define L sqrt(h*h+(r1-r2)*(r1-r2))
#define S PI*(r1*r1+r2*r2)+PI*(r1+r2)*L
#define V PI*h(r1*r1+r2*r2+r1*r2)/3
main( )
{
printf("%f,%f",S,V);
}
2. 定义一个函数d(n,m),能够完成求整数n的从右数第m个数字的值。例如:d(12345,4)=2。
#define N 10
#include <string.h>
int dtake(char s[],int m)
{ char i;
if(strlen(s)<m||m<=0)
return(-1);
i=s[strlen(s)-m];
return( i );
}
main( )
{ char str[N],t;
int m;
printf("please input num:");
scanf("%s",str);
printf("please input the num`s position that you want to take:");
scanf("%d",&m);
t=dtake(str,m);
printf("you want the num is %c",t);
}
3、 用递归的方法求fibonacci数列:1,1,2,3,5,8……的第40项的数。fibonacci数列定义如下:
F1=1 (n=1)
F2=1 (n=2)
Fn=Fn-1+Fn-2 (n>=3)
#define N 40
long int fibo(int n)
{
long f;
i f(n= =1||n= =2)
return(1);
else
f=fibo(n-1)+fibo(n-2);
return(f);
}
main( )
{
printf(“%ld”,fibo(N));
}
4、 已知
f(x,n)=n+(n-1)+(n-2)+…+1+x
计算 x=5.2, n=10
及 x=12.5 n=20时的f的值。将f定义成函数做(用两种办法:循环方法和递归方法)。
方法
展开阅读全文