飞道的博客

C语言题库(二)

215人阅读  评论(0)

第一章 数据类型与表达式

一.知识点

1.C语言的特点:①语言简洁、紧凑,使用方便、灵活; ②运算符丰富;

③数据结构丰富;    ④具有结构化控制语句;

⑤语法限制不太严格,程序设计自由度大;

⑥可以进行位操作,能实现汇编语言的大部分功能,能直接对硬件进行操作;

⑦生成的目标代码质量高,程序执行效率高;  ⑧程序的移植性好。

2.C程序的组成:

⑴C程序是由函数构成的;

⑵一个函数包括函数的首部(即函数的第一行)和函数体(即花括号部分);

⑶函数体一般包括声明部分和执行部分;

⑷一个C程序总是从main函数开始执行,从main函数结束;

⑸C程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多行上;

⑹每个语句和数据定义的最后必须有一个分号;

⑺C语言本身没有输入输出语句,是通过函数实现输入输出的;

⑻可以用/*……*/对C程序的任何部分作注释。

3.C语言程序的运行:源程序文件的扩展名为.c,目标程序文件的扩展名为.obj,可执行程序文件的扩展名为.exe。

4.C的数据类型:基本、构造、指针和空类型,char、int、short、long、unsigned、float、double、enum、struct、union、typedef。

5.常量与变量的概念,注意符号常量的定义与使用;

6.整型、实型、字符型常量的表示,注意整型常量的十进制、八进制、十六进制的书写。

7.变量的定义,C的标识符包括关键字、预定义标识符、用户定义标识符;用户定义标识符的可用字符为字母、数字、下划线,第一个字符为字母或下划线。

8.常见数据类型的取值范围,int为-32768~+32767,unsigned int为0~65535。

9.转义字符:\n、\t、\b、\r、\f、\\、\’、\”、\ddd、\xhh

10.不同数值型数据的混合运算,低级类型转换为高级类型运算

11.C的运算符:注意结合方向和运算的优先级

12.算术运算符:+、-、*、/、%、++、--,注意自加、减运算符分前缀和后缀两种方式。其中前缀方式为先自加、减,后引用;后缀方式为先引用,后自加、减;运算符%要求运算量为整数,运算结果也为整数。注意除运算时,若运算量为整型时,其运算结果也是整型的规则。

13.赋值类运算符:=、+=、-=、*=、/=、%=,注意含义和数据类型的转换。

14.逗号运算符的使用,注意逗号运算符的运算规则。

 

二.练习

.填空题

1.在TURBO C环境中用RUN命令运行一个C程序时,所运行的程序的后缀是 .exe

2.C语言源程序文件的后缀是 .c  ,经过编译后,生成文件的后缀是  .obj ,经过连接后,生成文件的后缀是 .exe  

3.结构化程序由  顺序 选择(分支) 、 循环  三种基本结构组成。

4.若k为整型变量且赋值11。请写出运算k++后表达式的值  11    和变量的值   12   

5.若x为double型变量,运算x=3.2,++x后表达式的值 4.2  和变量的值  4.2    

6.函数体由符号 { 开始,用符号  }结束。函数体的前面是 定义 部分,其后是 执行 部分。

7.C语言中的标识符可分为 关键字 用户标识符 和预定义标识符三类。

8.在C语言程序中,用关键字  int    定义基本整型变量,用关键字  float定义单精度实型变量,用关键字 double 定义双精度实型变量。

9.把a1、a2定义成单精度实型变量,并赋初值1的定义语句是 float a1=1.0,a2=1.0;

10.C程序中定义的变量,代表内存中的一个 存储空间

11.表达式3.5+1/2的计算结果是  3.5

12.写出数学表达式三个等价的C语言表达式 a*b/(c*d)a /(c*d)*bb/(c*d)*a

13.通常一个字节包含 8   个二进制位。

14.当计算机用两个字节存放一个整数时,能存放的最大(十进制)整数是216-1(65535)、最小(十进制)整数是 -215(-32768)   

15.在C语言中整数可用   进制数、  进制数和 十六 进制数三种数制表示。

16.C语言中,int型数据占  2  个字节,long型数据占  4  个字节,unsigned int型数据占 2 个字节,short型数据占  2 个字节, float型数据占 4 个字节,double型数据占 8 个字节,char型数据占  1  个字节。

 

.选择题

1.组成C语言程序的是(  )(C)。

A.子程序      B.过程      C.函数      D.主程序和子程序

2.以下叙述中正确的是(  )(C)。

A.在C程序中无论是整数还是实数,只要在允许的范围内都能准确无误的表示。

B.C程序由主函数组成。

C.C程序由函数组成。

D.C程序由函数和过程组成。

3.以下选项中正确的整型常量是(  )(B)。

A.12.        B.-20        C.1,000        D.4  5  6

4.以下选项中正确的实型常量是(  )(D)。

A.0        B.3.  1415     C.0.329╳102        D..871

5.以下选项中不合法的用户标识符是(  )(C)。

A._123        B.printf     C.A$        D.Dim

6.C语言中运算对象必须是整型的运算符是(  )(A)。

A.%        B./        C.!        D.*

7.可在C程序中用作用户标识符的一组标识符是(  )(B)。

A.void        B.as_b3        C.For        D.2c

   define          _123            -abc           DO

   WORD         If               case           SIG

8.若变量已正确定义并赋值,符合C语言语法的表达式是(  )(B)。

A.a=a+7;    B.a=7+b+c,a++    C.int(12.3%4)    D.a=a+7=c+b

9.不合法的八进制数是(  )(B)。 

A.0        B.028        C.077        D.01

10.不合法的十六进制数是(  )(A)(零X)。

A.oxff        B.0Xabc        C.0x11        D.0x19

.程序设计题

1.编写一个C程序,输入a、b、c三个数,输出其中最大者。

#include<stdio.h>

void main()

{int a,b,c,max;

 printf(“input 3 num:\n”);

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

 max=a;

if(b>max)max=b;

if(c>max)max=c;

printf(“%d”,max);

 

}

第二章 算法与顺序结构

一.知识点

1.算法:为解决一个问题而采取的方法和步骤。

2.算法的分类:数值算法、非数值算法。

3.算法的特点:有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性。

4.算法描述方法:自然语言、流程图、改进流程图、N—S流程图、伪代码、计算机语言。

5.C语句的类型:控制语句、函数调用语句、表达式语句、空语句、复合语句。

6.输入输出的概念:输入输出是相对主机而言,C语言是由函数来实现输入输出的。

7.字符数据的输入/输出:getchar()、putchar()

8.格式输入/输出:scanf()、printf()

9.printf的格式符:di,o,xX,u,c,s,f,eEgG;l,m,n,-。

10.scanf的格式符:di,o,xX,u,c,s,f,eEgG;l,m,*;&。注意输入数据时数据流的分隔符,系统默认的分隔符为空格、tab键和回车。

11.顺序结构的设计思想:声明变量、输入数据、处理、输出结果。

 

二.练习

.填空题

1.以下程序段执行后的输出结果是:⑴ 200 2500   i=-200,j=2500  

int i=-200,j=2500;

printf(“⑴ %d %d”,i,j);

printf(“⑵ i=%d,j=%d\n”,i,j);

printf(“⑶ i=%d\n j=%d\n”,i,j);

2.复合语句在语法上被认为是 一条语句。空语句的形式是     

3.C语句的最后用  结束。

4.以下程序段的输出结果是 x=   127,x=   177,x=    7f,x=   127

int  x=0177;printf(“x=%6d,x=%6o,x=%6x,x=%6u\n”,x,,x,x,x);

5.以下程序段的输出结果是 a=513.789215,a= 513.79,a=513.78921500,a=  531.78921500

double  a=513.789215;

printf(“a=%8.6f,a=%8.2f,a=%14.8f,a=%14.8lf\n”,a,a,a,a);

6.以下程序段的输出结果是 83  

a=3+5,a*4;x=11/3;printf(“%d,%%d\n”,a,x);

7.以下程序输入三个整数值给a、b、c,程序把b中的值给a,把c中的值给b,把a中的值给c,交换后输出a、b、c的值。请填空:

#include <stdio.h>

main()

{ int a,b,c, m  

  printf(“Enter a,b,c:”);

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

   m=a ;a=b;b=c; c=m

  printf(“a=%d,b=%d,c=%d\n”,a,b,c);}

8.以下程序不借助任何变量把a、b中的值进行交换。请填空:

#include <stdio.h>

main()

{ int a,b;

  printf(“Input a,b:”);

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

  a+=  b  ;b=a-  b ;a=a- b

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

 

.选择题

1.若a、b、c、d都是int型变量且初始值为0,下列不正确的赋值语句是(  )(C)。

A.a=b=c=100;      B.d++;      C.c+b;      D.d=(c=22)-(b++);

2.以下选项中不是C语句的是(  )(C)。

A.{int i;i++;printf(“%d\n”,i);}    B.;      C.a=5,c=10      D.{ ;}

3.以下合法的C语言赋值语句是(  )(D)。

A.a=b=58        B.k=int(a+b);        C.a=58,b=58        D.--i;

4.以下程序的输出结果是(  )(C)。

A.0        B.1        C.3        D.不确定的值

main()

{ int x=10,y=3;  printf(“%d\n”,y=x/y);}

5.若变量已正确说明为int类型,要给a、b、c输入数据,正确的输入语句是(  )D。

A.read(a,b,c);                    B.scanf(“%d%d%d”,a,b,c);

C.scanf(“%D%D%D”,&a,&b,&c);      D.scanf(“%d%d%d”,&a,&b,&c);

6.若变量已正确定义,要将a和b中的数进行交换,下面不正确的语句组是(  )C。

A.a=a+b,b=a-b,a=a-b;      B.t=a,a=b,b=t;

C.a=t;t=b;b=a;        D.t=b;b=a;a=t;

7.若变量已正确定义,以下程序段的输出结果是(  )D。

A.输出格式说明与输出项不匹配,输出无定值

B.5.1700        C.5.16800        D.5.16900

x=5.16894;printf(“%f\n”,(int)(x*1000+0.5)/(float)1000);

8.执行以下程序段后,c3中的值是(  )A。

A.0        B.1/2        C.0.5        D.1

int c1=1,c2=2,c3;c3=c1/c2;

9.执行以下程序段后,其输出结果是(  )B。

A.0,0,-10        B.0,0,3        C.-10,3,-10        D.3,3,-10

int a=0,b=0,c=0; c=(a-=a-5),(a=b,b+3);

printf(“%d,%d,%d\n”,a,b,c);

10.以下程序的输出结果是(  )D。

A.a=%2,b=%5      B.a=2,b=5      C.a=%%d,b=%%d      D.a=%d,b=%d

main()

{ int a=2,b=5;  printf(“a=%%d,b=%%d\n”,a,b);}

11.若int型占两个字节,以下程序段的输出是(  )D。

A.-1,-1        B.-1,32767        C.-1,32768        D.-1,65535

int a=-1;printf(“%d,%u\n”,a,a);

12.以下程序段的输出结果是(  )C。

A.|3.1415|        B.|    3.0|        C.|     3|        D.|     3.|

float a=3.1415;printf(“|%6.0f|\n”,a);

13.以下程序段的输出结果是(  )B。

A.9  8        B.8  9        C.6  6        D.以上三个都不对

#include <math.h>

main()

{ double a=-3.0,b=2;

  printf(“%3.0f  %3.0f\n”,pow(b,fabs(a)),pow(fabs(a),b));}

14.若a为整型变量,则以下语句(  )B。

A.赋值不合法      B.输出值为-2      C.输出为不确定值      D.输出值为2

a=-2L;printf(“%d\n”,a);

15.若有定义char s=‘\092’;则该语句(  )B。

A.使s的值包含1个字符        B.定义不合法,s的值不确定

C.使s的值包含4个字符        D.使s的值包含3个字符

16.若k、g均为int型变量,则下列语句的输出为(  )D。

A.15        B.16        C.15        D.16

   6f           70           71           6f

k=017;g=111;printf(“%d\n”,++k);printf(“%x\n”,g++);

17.已知字母a的ASCII十进制代码为97,执行下列语句后的输出为(  )C。

A.b,c         B.a--运算不合法,故有语法错误

C.98,c        D.格式描述和输出项不匹配,输出无定值

char a=‘a’;a--;printf(“%d,%c\n”,a+‘2’-‘0’,a+‘3’-‘0’);

18.下列程序的输出为(  )A。

A.27.000000      B.27.500000      C.28.000000      D.28.500000

#include <stdio.h>

main()

{ int m=7,n=4;  float a=38.4,b=6.4,x;

  x=m/2+n*a/b+1/2;printf(“%f\n”,x); }

19.下列程序的输出结果是(  )C。

A.18        B.9        C.-18        D.-9

main() { int a=9;a+=a-=a+a;printf(“%d\n”,a); }

20.下列程序的输出结果是(  )A。

A.0        B.5        C.1        D.不确定值

main() { int a=7,b=5;printf(“%d\n”,b=b/a);}

21.下列程序的输出结果是(  )C。

A.12        B.11        C.10        D.9

main() { int a=011;printf(“%d\n”,++a);}

 

.程序设计题

用N—S图表示下列问题:

1.有两个瓶子A和B,分别盛放醋和酱油,要求将它们互换。

    编写程序

2.依次将10个数输入,要求将其中最大的数打印出来。

#include <stdio.h>
main()
{
int i,a,max;
scanf("%d",&max);
for (i=1;i<=9;i++)
{
scanf("%d",&a);
if (a>max) max=a;
}
printf("%d",max);
}

3.有3个数a、b、c,要求按从大到小的顺序把它们打印出来。

main()
{
float a,b,c,t;
scanf("%f,%f,%f",&a,&b,&c);
if(a>b)
{t=a;a=b;b=t;} /*实现a和b的互换*/
if(a>c)
{t=a;a=c;c=t;} /*实现a和c的互唤*/
if(b>c)
{t=b;b=c;c=t;] /*实现b和c的互换*/
printf("%5.2f,%5.2f,%5.2f\n",a,b,c);
}

4.求1+2+3+……+100。

#include <stdio.h>

int main()

{

 int i,sum=0;

i=1;

while(i<=100)

  {

   sum=sum+i;

  i=i+1;

  }

printf(“%d”,sum);

}

 

5.判断一个数n能否同时被3和5除。

#include <stdio.H>
main(void)
{
int n;
scanf("%d",&n);
if(n%3 == 0 && n%5 == 0)
printf("%d能否同时被3和5整除\n",n);
else
printf("%d不能否同时被3和5整除\n",n);
return 0;
}

6.将100~200之间的素数打印出来。

#include <stdio.h>
int isPrime(int n)
{
int i;
for(i=2;i*i<=n;i++)
if(n%i==0)
return 0;

return 1;
}
int main()
{
int i;
for(i=100;i<=200;i++)
{
if(isPrime(i))
printf("%d\n",i);
}
}

7.求两个整数m和n的最大公约数和最小公倍数。

main()

{

int a,b,num1,num2,temp;

printf("please input two numbers:\n");

scanf("%d,%d",&num1,&num2);

if(num1 { temp=num1;

num1=num2;

num2=temp;

}

a=num1;b=num2;

while(b!=0)/*利用辗除法,直到b为0为止*/

{

temp=a%b;

a=b;

b=temp;

}

printf("gongyueshu:%d\n",a);

printf("gongbeishu:%d\n",num1*num2/a);

}

8.求方程ax2+bx+c=0的根

#include <stdio.h>

#include <math.h> //用到平方根函数

void main()

{

float a,b,c,x1,x2,p,q,m;

scanf("%f%f%f",&a,&b,&c);

if ((a==0.0)&&(b==0.0)&&(c!=0.0))

printf(“no value!");

else if ((a==0.0)&&(b==0.0)&&(c==0.0))

printf("any value!");

else if ((a==0.0)&&(b!=0.0))

printf("x1=x2=%f",-c/b);

else

{m=b*b-4.0*a*c;

 if(m>=0)

 { x1=(-b+sqrt(m))/(2.0*a);

x2=(-b-sqrt(m))/(2.0*a);

printf("x1=%f\n",x1);

printf("x2=%f\n",x2);

 }

 else

 { p=-b/(2.0*a);

q=sqrt(-m)/(2.0*a);

printf("x1=%f+%fi\n",p,q);

printf("x2=%f-%fi\n",p,q);

  }

}}

 

9.编写程序,输入两个整数1500和350,求出它们的商和余数并进行输出。

#include <stdlib.h>
#inclued <stdio.h>
void main()
{int a;
int b;
int c,d;
a=1500,b=350;
c=a/b;//商数
d=a%b;//余数
pritf("商数为: %d\n",c);
printf("余数为:%d\n",d);
return 0;
}

10.编写程序,读入三个双精度数,求它们的平均值并保留此平均值小数点后一位数,对小数点后第二位数进行四舍五入,最后输出结果。

#include<stdio.h>
main()
{ double a, b, c, d;
printf("输入三个双精度数\n");
scanf("%lf%lf%lf", &a, &b, &c);
d = ( a + b + c) / 3;
printf("%.1f\n", d);
}

11.求三角形的面积:a,b,c是边长,p是半边长,s是面积,则s=[p(p - a)(p - b)(p - c)] 1/2

#include<stdio.h>

#include<math.h>

main()

{float a,b,c,p,s;

printf("input 3 num:");

scanf("%f%f%f",&a,&b,&c);

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

s=p*(p-a)(p-b)(p-c);

s=pow(s,0.5);

printf("s=%f",s);

}

12.输入一个华氏温度,要求输出摄氏温度。公式为:c=5(f-32)/9。

#include<stdio.h>
main()
{ double tem_c, tem_f;
puts("=====华氏温度至摄氏温度转换程序=====");
printf("请输入华氏温度:");
scanf("%lf", &tem_f);
tem_c = (tem_f - 12) * 5.0 / 9.0;
printf("%f对应的摄氏温度为%.2f", tem_f, tem_c);
renturn 0;
}

第三章 选择结构程序设计

一.知识点

1.关系运算符、逻辑运算符、逻辑值的表示与含义;注意&&、||的运算规则。

2.三种if语句

3.选择结构的嵌套,注意if与else的配对;

4.条件运算符:?:

5.switch语句,注意其执行过程;

6.选择结构程序设计思想。

 

二.练习

.填空题

1.C语言中用  非0  表示逻辑值“真”,用 0   表示逻辑值“假”。

2.C语言中的关系运算符按优先级别是                        

答案:>、<、>=、<=、==、!=

3.C语言中的逻辑运算符按优先级别是            

答案:!、&&、||

4.C语言中的关系运算符和逻辑运算符的优先级别是                     

                 

!、>、<、>=、<=、==、!=、&&、||

5.C语言中逻辑运算符的  !  优先级高于算术运算符。

6.将下列数学式改写成C语言的关系表达式或逻辑表达式:

a=b或a<c  a=b||a<c      |x|>4    x>4||x<-4   

7.下列程序的输出结果  1  

main()

{ int a=100;

  if(a>100) printf(“%d\n”,a>100); else printf(“%d\n”,a<=100);}

8.若已知a=10、b=15、c=1、d=2、e=0,请分别给出下列表达式的运算结果:

⑴ a*b && c   1      ⑵ a+b>10 || a+b<0   1       ⑶ e    0     ⑷ c==b>e    1    

⑸ !a<e    0         ⑹ a++ && e++ && c++    0     ⑺ !e && e==b==++c    1    

⑻ (0<a) && (a<2)   0      ⑼ 1.234 && 5.982   1   

⑽ (b==10) && (a==10)   0      ⑾ !0 || d && a==c+d   1   

⑿ (a+c==b)==(b+d==a) || (c=b+a)>(d=c+b)   1    

 

9.当a=1、b=2、c=3时,执行以下if语句后,a=  3 、b=  1 、c= 1   

if(a>c);b=a;a=c;c=b;

10.当a=1、b=2、c=3时,执行以下if语句后,a=  3  、b= 2   、c= 2   

if(a>c)b=a;a=c;c=b;

11.当a=1、b=2、c=3时,执行以下if语句后,a=  1  、b= 2   、c= 2   

if(a>c)b=a,a=c;c=b;

12.将以下两条if语句合并为一条if语句:                                   

if(a>b) scanf(“%d”,&x);else scanf(“%d”,&y);

if(a<=b) i++;else j++;

答案:if(a>b) {scanf(“%d”,&x);j++;}

else {scanf(“%d”,&y);i++;}

13.将以下嵌套的if语句改写成不嵌套的if语句:                             

if(w<0) k=0;else if(w<=100) k=1; else  k=0;

答案:if(w>=0&&w<=100)k=1; else  k=0;

14.以下程序判断输入的一个整数是否能被3或7整除,若能整除,输出“YES”,若不能整除,输出“NO”。请填空:

#include <stdio.h>

main()

{ int k;

  printf(“Enter a int number:”);scanf(“%d”,&k);

  if(  k%3==0||k%7==0 )printf(“YES\n”);else printf(“NO\n”);}

15.在switch语句中,当执行到break语句时,使流程 跳出开关语句   

 

.选择题

1.若给定条件表达式(M)?(a++):(a--),则和表达式M等价的表达式为(  )C。

A.M==0        B.M==1        C.M!=0        D.M!=1

2.为表示关系x≥y≥z,应使用的C语言表达式是(  )A。

A.(x>=y) && (y>=z)    B.(x>=y)AND(y>=z)    C.(x>=y>=z)    D.(x>=y)&(y>=z)

3.以下程序的输出结果是(  )D。

A.0        B.1        C.2        D.3

main()

{ int a=2,b=-1,c=2;

  if(a<b)

if(b<0) c=0;

  else c+=1;

  printf(“%d\n”,c); }

4.以下程序的输出结果是(  )A。

A.1        B.2        C.3        D.4

main()

{ int w=4,x=3,y=2,z=1;printf(“%d\n”,(w<x ? w : z<y ? z : x));}

5.若执行以下程序时,从键盘上输入3和4,则输出结果是(  )B。

A.14        B.16        C.18        D.20

main()

{ int a,b,s;scanf(“%d %d”,&a,&b); s=a;

  if(a<b)s=b;

  s*=s;printf(“%d\n”,s); }

6.在C语言中,if语句后的一对圆括号中,用以决定分支的流程的表达式(  )。D

A.只能用逻辑表达式        B.只能用关系表达式

C.只能用逻辑表达式或关系表达式        D.可用任意表达式

7.下列程序段运行后,x的值是(  )D。

A.14        B.4        C.15        D.3

ok1=1;ok2=2;ok3=3;x=15;

if(!ok1) x--;else if(ok2) if(ok3)x=3;else x=4;

8.在C语言中,switch语句后一对圆括号中exp的类型(  )。A

A.可以是任何类型        B.只能为int型

C.可以是整型或字符型        D.只能是整型或实型

9.以下各组运算符中,优先级最高的分别为(⑴B  ⑵C   ⑶C   ⑷D)。

⑴A.?:      B.++        C.&&          D.+=

⑵A.*=        B.>=        C.(类型)     D.,

⑶A.||        B.%         C.!           D.==

⑷A.=         B.!=        C.*(乘)       D.( )

10.若a为整型变量,b为字符型变量,则以下正确的switch语句是(  )A。

A.switch((int)x/10)        B.switch(b)

   { case 1:a++;break;         { case ‘\042’;x=a/b;break;

     case 2:b++;break;           case ‘6’;x=a*b;break;

     case 3:c++;break;           case ‘\010’;x=a+c;break;

   }                              }

C.switch((int)x/10);       D.switch(a/100+10)

   { case 0:a++;break;         { case2 :x=a/b;break;

     default:b++;break;          case6 :x=a*b;break;

     case 3+1:c++;break;         case8 :x=a+c;break;

     case 3:d++;break;           case10 :x=a-c;break;

   }                              }

 

.程序设计题

1.从键盘输入一个字母,若是大写字母,要求改用小写字母输出。

#include<stdio.h>

void main()

{char var;

 var=getchar();

 if(var>=65&&var<=90)

 var=32+var;

 putchar(var);

}

2.求ax2+bx+c=0的根。a、b、c由键盘输入,设b2-4ac>=0.

#include<stdio.h>

#include<math.h>

void main()

{float a,b,c,p,x1,x2;

 printf("input 3 numbers:\n");

 scanf("%f%f%f",&a,&b,&c);

 if(b*b-4*a*c>=0)

       {

  p=pow(b*b-4*a*c,0.5);

  x1=(-b+p)/2;

  x2=(-b-p)/2;

  printf("x1=%f,x2=%f",x1,x2);

       }

 else

      {

  p=pow(-b*b+4*a*c,0.5);

  printf("x1=%f+%fi,x2=%f-%fi",-b/2,p/2,-b/2,p/2);

       }

}

第四章 循环结构程序设计

一.知识点

1.循环的概念,C实现循环的方法;

2.goto语句,注意标号的书写;

3.while语句,注意条件表达式的设计;

4.do……while语句,注意条件表达式的设计,及while之后的分号;

5.for语句,注意for中三个表达式的一般含义;

6.循环的嵌套;

7.break与continue语句,注意二者之间的区别;

8.循环结构程序设计思想

 

二.练习

.填空题

1.以下程序段的输出结果        。y=7,x=21

x=y=0;while(x<20)y++,x+=3;

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

2.当执行以下程序段后,i的值是    、j的值是    、k的值是    5、4、6

int a,b,c,d,i,j,k;a=10;b=c=d=5;i=j=k=0;

for( ;a>b;++b)i++;

while(a>++c) j++;

do k++;while(a>d++);

3.以下程序段的输出结果        。死循环没有输出结果

int k,m,n;n=10;m=1;k=1;

while(k<=n) m*=2; printf(“%d\n”,m);

4.以下程序的输出结果    -1    

main()

{ int x=2;while(x--);printf(“%d\n”,x);}

5.以下程序段的输出结果    11    

int i=0,sum=1;do{ sum+=i++;}while(i<5);printf(“%d\n”,sum);

6.有以下程序段:

s=1.0;for(k=1;k<=n;k++)s=s+1.0/(k*(k+1));printf(“%f\n”,s);

要使下面的程序段的功能与上面程序段的功能相同,请填空:

s=0.0;k=0; d=1.0

do{ s=s+d; k++ ;d=1.0/(k*(k+1));}while( k<=n);

printf(“%f\n”,s);

7.以下程序的功能是:从键盘上输入若干学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。请填空:

main()

{ float x,amax,amin;

  scanf(“%f”,&x);amax=x;amin=x;

  while( x>=0

  { if(x>amax)amax=x;

    if( x<amin )amin=x;

    scanf(“%f”,&x);}

  printf(“\namax=%f\namin=%f\n”,amax,amin); }

8.以下程序段的输出结果        。a=12,y=12↙a=16,y=28↙a=16,y=44↙a=16,y=60

a=10;y=0;

do { a+=2;y+=a;

     printf(“a=%d,y=%d\n”,a,y);

     if(y>50)break;}while(a=14);

9.下列程序段中,for循环的循环次数为        。10 9 8 7 6

a=2;b=10;for(i=b;i<=a;i--,a++) printf(“%3d”,i);

10.以下程序段的输出结果        。8 *6 *4 *2 *0↙ 8 *6 *4 *2 *0

for(i=0;i<3;i++,i++)

{ for(j=10;j>0;j--)

  { if((j+i)%2){ j--;printf(“*%d ”,j);continue;}

  --j;--j;printf(“%d ”,j);}

  printf(“\n”);}

 

.选择题

1.以下程序段的输出结果是(  )D。

A.9        B.1        C.11        D.10

int k,j,s;

for(k=2;k<6;k++,k++){ s=1;for(j=k;j<6;j++) s+=j;}

2.以下程序段的输出结果是(  )。C

A.12        B.15        C.20        D.25

int i,j,m=0;

for(i=1;i<=15;i+=4)

  for(j=3;j〈=19;j+=4〉m++;

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

3.以下程序段的输出结果是(  )。B

A.10        B.9        C.10        D.9

   9            8           9            8

   8            7           8            7

                            7            6

int n=10;while(n>7){ n--;printf(“%d\n”,n);}

4.以下程序段的输出结果是(  )。C

A.1        B.3  0        C.1  -2        D.死循环

int x=3;do { printf(“%3d”,x-=2);}while(!(--x));

5.以下程序的输出结果是(  )。C

A.15        B.14        C.不确定        D.0

main()

{ int i,sum;for(i=1;i<6;i++)sum+=sum;printf(“%d\n”,sum);}

6.以下程序的输出结果是(  )。B

A.741        B.852        C.963        D.875421

main(){ int y=10;

  for( ;y>0;y--)if(y%3==0){ printf(“%d”,--y);continue;} }

7.若x是int型变量,以下程序段的输出结果是(  )。D

A.**3        B.##3        C.##3        D.**3##4

   ##4           **4           **4##5        **5

   **5           ##5

for(x=3;x<6;x++)printf((x%2)?(“**%d”) :(“##%d\n”),x);

8.以下程序的输出结果是(  )。A

A.*#*#*#$        B.#*#*#*$        C.*#*#$        D.#*#*$

main()

{ int i;

  for(i=1;i<=5;i++)

  { if(i%2)printf(“*”);else continue;

    printf(“#”);}

  printf(“$\n”);   }

9.以下叙述正确的是(  )。D

A.do_while语句构成的循环不能用其它语句构成的循环来代替。

B.do_while语句构成的循环只能用break语句退出。

C.用do_while语句构成循环时,只有在while后的表达式为非零时结束循环。

D.用do_while语句构成循环时,只有在while后的表达式为零时结束循环。

10.以下程序的输出结果是(  )。D

A.39  81        B.42  84        C.26  68        D.28  70

main()

{ int x,i;

  for(i=1;i<=100;i++)

  { x=i;if(++x%2==0)if(++x%3==0)if(++x%7==0)printf(“%d  ”,x);}

  printf(“\n”); }

11.对下面程序段描述正确的是(  )。C

A.while循环执行了10次         B.循环是无限循环

C.循环体语句一次也不执行        D.循环体语句只执行一次

int x=10;while(x=0)x=x-1;

12.以下关于for循环的正确描述是(  )。D

A.for循环只能用于循环次数已确定的情况

B.for循环是先执行循环体语句,后判断表达式

C.在for循环中,不能用break语句跳出循环体

D.for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来

13.下列程序段中是死循环的是(  )。C

A.int n=1;while(!n)n++;          B.int n=1;do { n--;}while(n);

C.int n=1;do { n++;}while(n);     D.for(n=5;n<1;);

14.以下能正确计算1╳2╳3╳…╳10的程序段是(  )。C

A.do { k=1;n=1;n=n*k;k++;}while(k<=10);

B.do { k=1;n=0;n=n*k;k++;}while(k<=10);

C.k=1;n=1;do { n=n*k;k++;}while(k<=10);

D.k=1;n=0;do { n=n*k;k++;}while(k<=10);

 

.程序设计题

1.编写程序,求1-3+5-7+…-99+101的值。

#include "math.h"
#include "stdio.h"
void main()
{
int i;
double sum=0.0;
for(i=0;i<=50;i++)
{
sum=sum+pow(-1,i)*(i*2+1);
}
printf("1-3+5-7+……-99+101=%0.0f",sum);
}

或者

#include "math.h"
#include "stdio.h"
void main()
{
int i,k=1;
long sum=0;
for(i=1;i<=51;i++)
{
sum+=k*(i*2-1);
k=-k;
}
printf("1-3+5-7+……-99+101=%ld",sum);
}

2.求1+2+3+…+100的值。

#include <stdio.h>

int main()

{

 int i,sum=0;

i=1;

while(i<=100)

  {

   sum=sum+i;

  i=i+1;

  }

printf(“%d”,sum);

}

 

3.把100~200之间的不能被3整除的数输出。

#include<stdio.h>
void main()
{
int n;
for(n=100;n<=200;n++);
{
if(n%3!=0)
printf("%d ",n);
}
printf("\n");
}

4.求Fibonacci数列前20个数。

#include<stdio.h>

void main()

{int a[20],i;

 a[0]=1;a[1]=1;

 for(i=2;i<=19;i++)

 a[i]=a[i-1]+a[i-2];

 printf("\n");

 for(i=0;i<20;i++)

 printf("%d,",a[i]);

}

5.打印1000以内的所有素数。

#include"stdio.h"

void main()

{int a[1001],i,j;

 a[0]=a[1]=0;

 for(i=2;i<=1000;i++)

 a[i]=i;

 for(i=2;i<1001;i++)

    {  if(a[i]!=0)

        for(j=i+1;j<1001;j++)

        {    if(j%i!=0);

              else a[j]=0;

        }

     }

 printf("\n");

 for(i=0;i<1001;i++)

 {

 if(a[i]!=0)

 printf("%d,",a[i]);

 }

}

 

第五章 数组及其应用

一.知识点

1.数组的概念与定义

2.数组的初始化

3.数组元素的引用

4.字符数组的定义、使用、字符串处理函数

5.数组数据的一般处理方式

 

二.练习

.填空题

1.若有定义:double w[10];则w数组元素下标的上限是  9  ,下限是 0   

2.以下程序的输出结果是   12     

main()

{ int arr[10],i,k=0;

  for(i=0;i<10;i++) arr[i]=i;

for(i=0;i<4;i++) k+=arr[i]+i;

printf(“%d\n”,z); }

3.以下程序的输出结果是  300,0,2      

main()

{ int i,j,row,col,m;

  int arr[3][3]={ {100,200,300},{28,72,-30},{-850,2,6}};

  m=arr[0][0];

  for(i=0;i<3;i++)

    for(j=0;j<3;j++) if(arr[i][j]<m){ m=arr[i][j];row=i;col=j;}

  printf(“%d,%d,%d\n”,m,row,col); }

4.在C语言中,二维数组元素在内存中的存放顺序是 按行存放

5.若二维数组a有m列,则计算任一元素a[i][j]在数组中相对位置的公式为i*m+j+1

6.若有定义:int a[3][4]={ {1,2},{0},{4,6,8,10}};则初始化后,a[1][2]得到的初值是    0    ,a[2][1]得到的初值是      6  

7.若有说明char s[20];如果想从键盘上把字符串“This is a book.”输入到数组s中,应当调用的函数是   strcpy  ;函数调用语句的形式是strcpy(s, “This is a book.”) 。

8.若有char str1[20]={“a good”},str[ ]={“ student”};能把str2中的字符串接到str1中的字符串后面的函数调用语句是   strcat(str1,str) 

9.以下findmax函数返回数组s中最大元素的下标,数组中元素的个数由t传入,请填空。

findmax(int s[ ],int t)

{ int k,p;

  for(p=0,k=p;p<t;p++)

    if(s[p]>s[k])    p=k         

  return    p         ; }

10.以下程序统计从终端输入的字符中每个大写字母的个数,num[0]中统计字母A的个数,其它依次类推。用#号结束输入,请填空。

#include “stdio.h”

#include “ctype.h”

main()

{ int num[26]={0},i; char c;

  while(c=getchar()!=‘#’)

    if(isupper(c)) num[c-‘A’]+=1;

  for(i=0;i<26;i++)

    if(num[i]) printf(“%c: %d\n”,i+‘A’,num[i]);

}

 

.选择题

1.以下程序的输出结果是(  )。A

A.不确定的值        B.3        C.2        D.1

main()

{ int n[2]={0},i,j,k=2;

  for(i=0;i<k;i++)

    for(j=0;j<k;j++)n[j]=n[i]+1;

  printf(“%d\n”,n[k]);}

2.以下对一维数组a的正确说明是(  )。D

A.char a(10);        B.int a[ ];

C.int k=5,a[k];        D.char a[ ]={‘a’,‘b’,‘c’};

3.若有说明语句:int a[2][4];则对a数组元素的正确引用是(  )。A

A.a[0]3]        B.a[0][4]        C.a[2][2]        D.a[2][2+1]

4.以下能对二维数组y进行正确初始化的语句是(  )。B

A.int y[2][ ]={ { 1,0,1 },{ 5,2,3 }};

B.int y[ ][3]={ {1,2,3},{4,5,6}};

C.int y[2][4]={1,2,3},{4,5},{6};

D.int y[ ][3]={ {1,0,1,0},{ },{1,1}};

5.若有说明语句:int y[ ][4]={0,0};则下面不正确的叙述是(  )。D

A.数组y的每个元素都可以得到初值0;

B.二维数组y的行数为1;      C.该说明等价于int y[ ][4]={0};

D.只有元素y[0][0]和y[0][1]可得到初值0,其余元素均得不到初值0;

6.若有说明语句:int a[ ][3]={1,2,3,4,5,6,7,8};则a数组的行数为(  )。A

A.3        B.2        C.无确定值        D.1

7.若二维数组y有m列,则在y[i][j]前的元素个数为(  )。B

A.j*m+i        B.i*m+j        C.i*m+j-1        D.i*m+j+1

8.若有以下语句,则正确的描述是(  )。B

char x[ ]=“12345”;char y[ ]={‘1’,‘2’,‘3’,‘4’,‘5’};

A.x数组与y数组的长度相同        B.x数组长度大于y数组长度

C.x数组长度小于y数组长度        D.x数组等价于y数组

9.下面程序段的运行结果是(  )。B

A.‘a’‘b’        B.ab        C.ab c        D.abc

char c[5]={‘a’,‘b’,‘\0’,‘c’,‘\0’};printf(“%s”,x);

10.有两个字符数组a、b,则以下能正确为a、b进行赋值的语句是(  )。D

A.gets(a,b);        B.scanf(“%s%s”,&a,&b);

C.getchar(a);getchar(b);        D.gets(a);gets(b);

11.有字符数组s1[80]和s2[80],则以下能正确对s1、s2进行输出的语句是(  )。B D

A.puts(s1,s2);        B.printf(“%s,%s\n”,s1,s2);

C.putchar(s1,s2);        D.puts(s1),puts(s2);

12.下面描述正确的是(  )。D

A.两个字符串所包含的字符个数相同时,才能比较字符串;

B.字符个数多的字符串比字符个数少的字符串大

C.字符串“STOP ”与“STOP”相等    D.字符串“That”小于字符串“The”

13.以下对字符数组的描述中错误的是(  )。C

A.字符数组中可以存放字符串        B.字符数组中的字符串可以整体输入、输出

C.可以在赋值语句中通过赋值运算符“=”对字符数组整体赋值

D.不可以用关系运算符对字符数组中的字符串进行比较

14.语句printf(“%d\n”,strlen(“school”));的输出结果是(  )。B

A.7        B.6        C.存在语法错误        D.不定值

15.有语句char s1[10],s2[10]={“books”};则能将s2的值正确赋给s1的语句是(  )。B

A.s1={“books”};  B.strcpy(s1,s2);  C.s1=s2;  D.strcpy(s2,s1);

 

.程序设计题

1.编写程序打印九九乘法表。

#include<stdio.h>

void main()

{int a[9][9],i,j;

 for(i=0;i<9;i++)

 for(j=0;j<=i;j++)

 a[i][j]=(i+1)*(j+1) ;

 for(i=0;i<9;i++)

   { for(j=0;j<=i;j++)

     printf("%d*%d=%d",j+1,i+1,a[j][i]);

   printf("\n");

   }

}

2.用随机函数产生20个100以内的整数,用选择法对它们排序。

#include<stdio.h>

#include<time.h>

#include<stdlib.h>

void main()

{int a[20],i,j,min,mid,f;

 srand((unsigned)time(0));

 for(i=0;i<20;i++)

 a[i]=rand()%100;

 for(i=0;i<19;i++)

  {min=a[i];f=i;

   for(j=i+1;j<20;j++)

   {if(min>a[j])

     {min=a[j];f=j;

     }

    else ;

   }

   if(f==i)continue;

   else {mid=a[i];a[i]=a[f];a[f]=mid;}

  }

   printf("\n");

   for(i=0;i<20;i++)

   printf("%d,",a[i]);

}

3.用随机函数产生50个200以内的整数,用冒泡法对它们排序。

#include<stdio.h>

#include<time.h>

#include<stdlib.h>

void main()

{int a[50],i,j,mid;

 srand((unsigned)time(0));

 for(i=0;i<50;i++)

 a[i]=rand()%200;

 for(i=0;i<50;i++)

  {

   for(j=0;j<49;j++)

    { if(a[j]<a[j+1])

     {mid=a[j];a[j]=a[j+1];a[j+1]=mid;}

    }

  }

   printf("\n");

   for(i=0;i<50;i++)

   printf("%d,",a[i]);

}

4.打印杨辉三角形的前10行。

#include<stdio.h>

void main()

{int a[10][10],i,j,k;

 for(i=0;i<10;i++)

 {a[i][0]=1;a[i][i]=1;}

 for(i=2;i<10;i++)

   for(j=1;j<i;j++)

   a[i][j]=a[i-1][j-1]+a[i-1][j];

 printf("\n");

 for(i=0;i<10;i++)

   {printf("\n");

    for(j=0;j<=i;j++)

    printf("%d,",a[i][j]);

   }

}

5.有一篇文章,共有3行文字,每行有80个字符。要求统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。

#include<stdio.h>

void main()

{int A[26],a[26],N[10],M=0,Q=0,i;

 char c;

 int line=0;

 int l=0;

 for(i=0;i<26;i++)

 {A[i]=0;

  a[i]=0;

  if(i<10)

  N[i]=0;

 }

 while((c=getchar())!=EOF)

  {if(line>=2)break;

   else if(l>80){line++;continue;}

        else l++;

   {if(c>=65&&c<=90)A[c-65]+=1;

    else if(c>=97&&c<=122)a[c-97]+=1;

    else if(c>=48&&c<=57)N[c-48]+=1;

    else if(c==32)M++;

    else if(c=='\n')line++;

    else Q++;

 

   }

  }

 printf("\n");

 for(i=0;i<26;i++)

 printf("%d,",A[i]);

 printf("\n");

 for(i=0;i<26;i++)

 printf("%d,",a[i]);

 printf("\n");

 for(i=0;i<10;i++)

 printf("%d,",N[i]);

 printf("\n");

 printf("%d",M);

 printf("\n");

 printf("%d",Q);

}

6.从键盘输入数组a[10]中的十个数,并输出其中的最大值及其下标

#include<stdio.h>

main()

{int i,flag;

float a[10],max;

 printf("input 10 num:");

 for(i=0;i<10;i++)

scanf("%f",&a[i]);

 flag=0;

max=a[0];

for(i=1;i<10;i++)

if(max<a[i])

{flag=i;max=a[i];}

printf("%d,%f",flag,a[flag]);

}

 

7.输入一行数字字符,请用数组元素作为计数器来统计每个字符的个数。用下标为0的元素统计字符“1”的个数,下标为1的元素统计字符“2”的个数,依次类推。

#include<stdio.h>

void main()

{int N[10],i;

 char c;

 for(i=0;i<10;i++)

 {

  N[i]=0;

 }

 while((c=getchar())!=EOF)

  { if(c>=49&&c<=57)N[c-49]+=1;

   else if(c==48)N[9]+=1;

   else ;

  }

 printf("\n");

 for(i=0;i<10;i++)

 printf("%d,",N[i]);

}

第六章 函数与模块化程序设计

一.知识点

1.函数定义的一般形式:函数类型 函数名(形参类型 形参名,……) { 函数体 }

2.函数的参数:注意形参与实参在类型、个数上的一一对应关系。

3.函数值:函数的返回值,也就是函数类型,若函数无返回值,则为void;

4.函数的调用:注意调用的形式;

5.函数原型与对被调函数的声明,注意整型函数可以不用声明;

6.函数的嵌套调用:

7.函数的递归调用,要求能用递归编写求n!、1+2+……+n等问题的程序。

8.数组作为函数参数,注意其含义及使用的情况;

9.变量的存储类型,注意static类型的初值、值的变化,外部变量的使用等;

10.内部函数和外部函数:注意其区别。

 

二.练习

.填空题

1.以下程序的输出结果是   12     

unsigned fun6(unsigned num)

{ unsigned k=1;

  do

{ k*=num%10;num/=10;}while(num);

return k;}

main()

{ unsigned n=26;

  printf(“%d\n”,fun6(n)); }

2.以下程序的输出结果是 9.000000       

double sub(double x,double y,double z)

{ y-=1.0;z=z+x;return z;}

main()

{ double a=2.5,b=9.0;

  printf(“%f\n”,sub(b-a,a,a));}

3.以下程序的输出结果是   4     

fun1(int a,int b)

{ int c;

a+=a;b+=b;c=fun2(a,b);

  return c*c;}

fun2(int a,int b)

{ int c;

  c=a*b%3;return c;}

main()

{ int x=11,y=19;

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

4.下面pi函数的功能是,根据以下公式返回满足精度ε要求的π的值。请填空。

 

double pi(double eps)

{ double s=0.0,t=1.0;int n;

  for(n=1;t>eps;n++)

  { s+=t;t=n*t/(2*n+1);

  return (2.0*    s      );}

5.以下函数是求x的y次方。请填空。

double fun(double x,int y)

{ int i;double z=1;

  for(i=1;i <=y;i++) z=  z*x        ;return z;}

6.以下程序的功能是计算s=1!+2!+……+n!请填空。

long f(int n)

{ int i;long s;

  s=      1    ;for(i=1;i<=n;i++) s= s*n         

  return s;}

main()

{ long s;int k,n;

  scanf(“%d”,&n);s= 0         

  for(k=0;k<=n;k++) s=s+ f(k)         

  printf(“%d\n”,s);}

7.在定义一个函数时如果不加类型说明,则它隐含的类型为  int     

8.下列程序的运行结果是a=  4    ,b= 6     

f( )

{ int a=3; static  b=4; a=a+1; b=b+1;

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

main( )

{ f( ); f( );}

9.下列程序的运行结果是  7;6;72;7;5                 

main( )

{int i=2,x=5,j=7;

 fun(j,6 );

printf(“i=%d;j=%d;x=%d\n”,i,j,x);}

fun( int i, int j)

{ int x=7; printf(“i=%d;j=%d;x=%d\n”,i,j,x);}

10.下列程序的运行结果是  #  x=2  y=3  z=0↙*  x=4  y=9  z=5↙@  x=2  y=3  z=0

main( )

{ int x=2; y=3; z=0;

  printf(“#  x=%d  y=%d  z=%d\n”, x, y, z);

 add(x, y, z);

  printf(“@  x=%d  y=%d  z=%d\n”, x, y, z);}

add( int x, int y, int z)

{ z=x+y; x=x*x;; y=y*y;

  printf(“*  x=%d  y=%d  z=%d\n”, x, y, z);}

 

.选择题

1.以下说法中正确的是(  )。C

A.C语言程序总是从第一个定义的函数开始执行

B.在C语言程序中,要调用的函数必须在main函数中定义

C.C语言程序总是从main函数开始执行

D.C语言程序中的main函数必须放在程序的开始部分

2.以下函数的类型是(  )。C

A.与参数x的类型相同      B.void类型      C.int类型      D.无法确定

fff(float x)

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

3.以下函数调用语句中,含有的实参个数是(  )。B

A.1        B.2        C.4        D.5

func((exp1,exp2),(exp3,exp4,exp5));

4.以下程序的输出结果是(  )。C

A.11        B.20        C.21        D.31

func(int a,int b)

{ int c;c=a+b;return c;}

main()

{ int x=6,y=7,z=8,r;

  r=func((x--,y++,x+y),z--);

  printf(“%d\n”,r);}

5.以下程序的输出结果是(  )。A

A.-1        B.0        C.1        D.2

main()

{ int i=2,p;

  p=f(i,i+1);

  printf(“%d\n”,p);}

int f(int a,int b)

{ int c;c=a;

  if(a>b) c=1;else if(a==b) c=0;else c=-1;

  return (c);}

6.以下程序输出的结果是(  )。C

A.0        B.1        C.6        D.无定值

fun(int a,int b,int c)

{ c=a*b;}

main()

{ int c;

  fun(2,3,c);printf(“%d\n”,c);}

7.以下程序输出的结果是(  )。A

A.5.500000      B.3.000000      C.4.000000      D.8.25

double f(int n)

{ int i;double s;

  s=1.0;for(i=1;i<=n;i++) s+=1.0/i;return s;}

main()

{ int i,m=3;float a=0.0;

  for(i=0;i<m;i++) a+=f(i);

  printf(“%f\n”,a);}

  1. 以下不正确的概念是(  ) B

 A.函数不能嵌套定义,但可以嵌套调用

B.main函数由用户定义,并可以被调用

C.程序的整个运行最后在main函数中结束

D.在C语言中以源文件而不是以函数为单位进行编译

9.以下概念正确的是(  ) B

A.形参是虚设的,所以它始终不占用存储单位

B.实参与它所对应的形参占用不同的存储单元

C.实参与它所对应的形参占用一个存储单元

D.实参与它所对应的形参同名时可占用一个存储单元

10.以下不正确的说法是B

A.在C语言中允许函数递归调用

B.函数值类型与返回值类型出现矛盾时,以函数值类型为准

C.形参可以是常量、变量或表达式

D.C语言规定,实参变量对形参变量的数据传递是“值传递”

11.以下正确的函数首部是C

A.float swap(int x,y)

B.int max(int a,int b)

C.char scmp(char c1,char c2);

D.double sum(float x;float y)

12.在函数中未指定存储类别的变量,其隐含存储类别为( )B

A.静态   B.自动  C.外部  D.存储器

13.在一个文件中定义的全局变量的作用域为( )D

A.本程序的全部范围

B.离定义该变量的位置最近的函数

C.函数内全部范围

D.从定义该变量的位置开始到本文件结束

14.以下函数的返回值类型是( )B

 fun(int x)

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

A.void类型  B.int类型  C.没有  D.不确定的

15.在一个函数中的复合语句中定义了一个变量,则该变量的有效范围是( )A

A.在该复合语句内

B.在该函数中

C.本程序范围内

D.非法变量

16.若用数组名作为函数调用的实参,传递给形参的是( )A

A.数组的首地址       B.数组第一个元素的值

C.数组中全部元素的值   D.数组元素的个数

 

.程序设计题

1.用递归法求n!。

#include<stdio.h>

void main()

{  int n;

   float func(int);

   scanf("%d",&n);

   printf("\n%.0f",func(n));

}

float func(int n)

{if(n<0)

 printf("error!");

 if(n==0||n==1)

 return(1.0);

 else return(n*func(n-1));

}

2.用递归法求1+2+……+n。

#include<stdio.h>

void main()

{int n;

 int func(int);

 printf("input a num:");

 scanf("%d",&n);

 printf("\n%d",func(n));

}

int func(int n)

 {if(n<=0)

  printf("error!");

  if(n==1)return(1);

  else return(n+func(n-1));

  

 }

第七章 编译预处理

一.知识点

1.宏定义:注意带参宏定义

2.文件包含:注意两种书写方式的区别

 

二.练习

.选择题

1.以下程序的输出结果是(  )。B

A.15        B.100        C.10        D.150

#define MIN(x,y) (x)<(y)?(x):(y)

main()

{ int i,j,k;i=10;j=15;k=10*MIN(i,j);

  printf(“%d\n”,k);}

2.以下程序中的for循环执行的次数是(  )。C

A.5        B.6        C.8        D.9

#define N 2

#define M N+1

#define NUM (M+1)*M/2

main()

{ int i;for(i=1;i<=NUM;i++);

  printf(“%d\n”,i);}

3.以下程序的输出结果是(  )。B

A.11        B.12        C.13        D.15

#include “stdio.h”

#define FUDGF(y) 2.84+y

#define PR(a) printf(“%d”,(int)(a))

#define PRINT1(a) PR(a);putchar(‘\n’)

main()

{ int x=2;PRINT1(FUDGF(5)*x); }

4.以下叙述正确的是(  )。D

A.用#include包含的头文件的后缀不可以是“.a”

B.若一些源程序中包含某个头文件;当该头文件有错时,只需对该头文件进行修改,包含此头文件所有源程序不必重新进行编译

C.宏命令可以看做是一行C语句

D.C编译中的预处理是在编译之前进行的。

5.以下有关宏替换的叙述不正确的是(  )。D

A.宏替换不占用运行时间           B.宏名无类型

C.宏替换只是字符替换             D.宏名必须用大写字母表示

 

第八章 指针

一.知识点

1.指针的概念

2.指针变量

3.指针与数组

4.指针与字符串

 

 

二.练习

.填空题

1.若有定义:char ch;

⑴使指针p可以指向变量ch的定义语句是                    。char *p=&ch; 

⑵使指针p指向变量ch的赋值语句是                    。p=&ch;

⑶通过指针p给变量ch读入字符的scanf函数调用语句是   。scanf(“%c”,p); 

⑷通过指针p给变量ch赋字符的语句是                    。*p=’a’;

⑸通过指针p输出ch中字符的语句是                    。putchar(*p);或printf(“%c”,*p)

2.若有如图8.1所示五个连续的int类型的存储单元并赋值,且p和s的基类型皆为int,p已指向存储单元a[1]。

⑴通过指针p,给s赋值,使其指向最后一个存储单元a[4]的语句是            。s=p+3; 

⑵用以移动指针s,使之指向中间的存储单元a[2]的表达式是            。s-=2 或s--,s-- 

⑶已知k=2,指针s已指向中间的存储单元a[2],表达式*(s+k)的值是  。50 

⑷指针s已指向存储单元a[2],不移动指针s,通过s引用存储单元a[3]的表达式是

            。*(s+1) 

⑸指针s指向存储单元a[2],p指向存储单元a[0],表达式s-p的值是            。2 

⑹若p指向存储单元a[0],则以下语句的输出结果是            。10  20  30  40  50

for(i=0;i<5;i++) printf(“%d  ”,*(p+i));printf(“\n”);

 

.选择题

1.若有定义:int x,*pb;则以下正确的赋值表达式是(  )。A

A.pb=&x      B.pb=x      C.*pb=&x      D.*pb=*x

2.以下程序的输出结果是(  )。B

A.因变量无定义输出不定值      B.0      C.-1      D.1

#include “stdio.h”

main()

{ printf(“%d\n”,NULL);}

3.已知指针p的指向如图8.1所示,则表达式*++p的值是(  )。B

A.20        B.30        C.21        D.31

4.已知指针p的指向如图8.1所示,则表达式++*p的值是(  )。C

A.20        B.30        C.21        D.31

5.以下程序的输出结果是(  )。D

A.23        B.24        C.25        D.26

void prtv(int *x)

{ printf(“%d\n”,++*x); }

main()

{ int a=25;prtv(&a);}

6.指针变量a所指的字符串长度为( )D

A.26    B.27   C.28   D.23

char  *a=”\nMy Name is Zhang Li.\”\n”;

7.在C语言中,变量的指针是指该变量的( )C

A.值     B.名   C. 地址  D.一个标志

8.下面程序段的运行结果是( )D

  A.cde                  B.无确定的输出结果

 C.字符’c’的ASCII码值  D.存放字符’c’的存储单元的地址

char  *s=”abcde”;  s+=2;  printf(“%d”,s);

9.若有定义:int *p[4];则标识符p( )B

A.是一个指向整型变量的指针            B.是一个指针数组名

C.是一个指针,它指向一个含有四个整型元素的一维数组

D.说明不合法

10.有一个二维数组a[3][4],2行3列元素的正确表示方法为( )D

A.&a[2][3]    B.a[2]+3    C.*(a+2)+3    D.*(a[2]+3)

11.若有以下说明语句

char  *language[ ]={“FORTRAN”,”BASIC”,”PASCAL”,”JAVA”,”C”};

则表达式:*language[1] >*language[3]  比较的是()B

A.字符B和字符J          B.字符串BASIC和字符串JAVA

C.字符串FORTRAN和字符串PASCAL D.字符F和字符P

12.指向一个包含4个整型元素的一维数组的指针变量的定义形式为( )A

A.int (*p)[4];    B.int *p[4];   C.int (p[4]);    D.int (p)[ ]

13.以下程序的运行结果是( )A

fun( int *p1,int *p2)

 { if(*p1>*p2)  printf(“%d\n”,*p1);

  else printf(“%d\n”,*p2);}

main( )

{ int a=3,b=7; fun(&a,&b);}

A.7     B.3     C.10    D.4

 

第九章 结构体与共用体

一.知识点

1.结构体的概念与定义

2.结构体变量的定义

3.结构体变量的引用

4.结构体数组

5.共用体的概念与定义

6.枚举类型

7.用户自定义类型

 

二.练习

.填空题

1.为了建立如图所示的存储结构(即每个结点含两个域,data是数据域,next是指向结点的指针域),请填空。

struct link

{ char data;

     struct link  *next        ;}node;

2.访问结构体数组元素a[k]的成员b,写作       。a[k].b

3.以下程序的运行结果是 Zhang

    struct s

     { int num;

       char name[20];

       int age;

      };

     main( )

{ struct s stud[3]={ {101,”Li”,18},{102,”Wang”,19},{103,”Zhang”,21}};

   fun(stud+2);

 }

  fun(struct s *p)

    { printf(“%s\n”,(*p).name);}

4.以下程序的运行结果是__2,3___。

    main( )

    { struct EXAMPLE

       {struct

         {int x;

          int y;

         }in;

      int a;

      int b;

     }e;

     e.a=1;e.b=2;

     e.in.x=e.a*e.b;

     e.in.y=e.a+e.b;

     printf(“%d,%d”,e.in.x,e.in.y);

 

.选择题

1.根据以下定义,能输出字母M的语句是(  )D。

A.printf(“%c\n”,class[3].name);     B.printf(“%c\n”,class[3].name[1]);

C.printf(“%c\n”,class[2].name[1]);  D.printf(“%c\n”,class[2].name[0]);

struct person{ char name[9];int age;};

struct person class[10]={ “John”,17,“Paul”,19,“Mary”,18,“Adam”,16};

2.以下程序的输出结果是(  )D。

A.32        B.16         C.8        D.24

typedef union{ long x[2];int y[4];char z[8];}MYTYPE;

MYTYPE them;

main(){ printf(“%d\n”,sizeof(them));}

3.设有定义语句

enum weekday{sun,mon,tue,wed,thu,fri,sat} workday;

则以下语句中编译能通过的语句为___________. B

A.sun=0;  B.workday=thu;  C.workday=3;  D.workday=1/7;

4.以下对结构体类型变量的定义中,不正确的是(  )。C

A. typedef struct aa                    B.#define AA    struct aa

{  int   n;                                AA { int n;

float m;                                     float m;

 }AA;                                         }td1;

AA td1;

C) struct                                  D) struct

{ int n;                                   {  int n;

float m;                                    float m;

}aa;                                       }td1;

stuct aa td1;

5.当定义一个结构体变量时,系统分配给它的内存是( )B

   A.结构体最后一个成员所需内存量的大小。

   B.各成员所需内存量的总和。

   C.成员中占内存量最大者所需的容量。

   D.结构体中第一个成员所需内存量。

6.在16位IBM-PC机上使用C语言,如果有以下说明语句,则变量ss所占内存的字节数为( )C

   struct s

   { int m;  char c;  double d; }ss;

 A.8       B.1       C.11     D.2

7.下面程序的运行结果是( )D

   main( )

     { struct cmplx

                 { int x;

                   int y;

                  }cnum[2]={1,3,2,7}; prinyf(“%d\n”,cnum[0].y/cnum[0].x*cnum[1].x);}

    A.0         B.1        C.3        D.6

   

第十章 位运算

一.知识点

1.位运算符与位运算赋值运算符

 

二.练习

.填空题

1.设变量a的二进制数是00101101,若想通过运算a^b使a的高4位取反,低4位不变,则b的二进制数应是            。11110000

2.a为任意整数,能将变量a清零的表达式是            。a&0 

3.a为任意整数,能将变量a中的各二进制位均置成1的表达式是            。a|1 

4.能将两字节变量x的高8位置全1,低字节保持不变的表达式是            。x|ff00 

5.运用位运算,能将八进制数012500除以4,然后赋给变量a的表达式是          。a=012500>>2

6.运用位运算,能将变量ch中的大写字母转换成小写字母的表达式是            。ch+=1<<5 

7.3 && 5的值是——,3& 5的值是——,3||5的值是——,3|5的值是——。 1、1、1、7

8.表达式~2&3<<2|3的值是——。15

9.表达式5^3|2<<1的值是——。6

10.表达式025&012的值是——。0

11.在位运算中,操作数每向右移动一位相当于操作数—除—以—2—。

12、在位运算中,操作数每向左移动一位相当于操作数—乘—以—2—。

 

.选择题

1.以下程序的输出结果是(  )。D

A.100        B.160        C.120        D.64

main(){ char x=040;printf(“%d\n”,x=x<<1);}

2.以下程序段中c的二进制值是(  )。B

A.00011011      B.00010100      C.00011100      D.00011000

 

3.以下程序的输出结果是(  )。B

A.0        B.1        C.2        D.3

main(){ int x=35;char z=‘A’;printf(“%d\n”,(x&15)&&(z<‘a’));}

4.以下程序的输出结果是(  )。A

A.0        B.1        C.2        D.3

main()

{ int a=5,b=6,c=7,d=8,m=2,n=2;

  printf(“%d\n”,(m=a>b)&(n=c>d));}

5.执行以下语句后a和b的值分别为(  ) C

   int a=1,b=2;a=a^b;b=b^a;a=a^b;

 A.a=1,b=2  B.a=2,b=2  C.a=2,b=1  D.a=1,b=1

6.以下程序段的执行结果是(  ) A

char a=56;a=a&056;printf(“%d,%o\n”,a,a);

   A.40,50  B.1,1  C.56,60  D.50,56

 

第十一章 文件

一.知识点

1.文件类型指针:FILE

2.文件的打开与关闭:fopen()、fclose()

3.文件的读写:fputc()、fgetc()、fread()、fwrite()、fprintf()、fscanf()

4.文件的定位:rewind()、fseek()、ftell()

5.出错检测:ferror()、clearerr()

 

二.练习

.填空题

1.在C程序中文件可以用两种方式存取,它们是                    。顺序  和 随机

2.在C程序中数据可以用两种代码形式存放,它们是        。ASCII码  和 二进制码

3.在C语言中,文件的存取是以        为单位的,这种文件被称作        文件。字节、流式

4.在C语言中,文件的打开使用          ,文件的关闭使用          。fopen()、fclose()

5.在C语言中,文件类型为          。文本文件或二进制文件

.选择题

1.若执行fopen函数时发生错误,则函数的返回值是(  )。D

A.随机值        B.1        C.NULL        D.EOF

2.若用fopen函数打开一个新的二进制文件,要求文件既能读也能写,则应选用的文件方式字符串是(  )。A

A.“wb+”      B.“r+”      C.“rb+”      D.“ab+”

3.当正常执行了文件关闭操作时,fclose函数的返回值是(  )。C

A.-1        B.随机值        C.0        D.1

4.在C语言中,对文件的存取是以(  )为单位的。C

     A)记录   B)函数    C)字节   D)模块

5.定义fp为文件型指针变量,使用fopen函数打开一个既能读也能写的新的二进制文件,以下正确的调用形式是(  )C

  A. fp=fopen(“filel”,”ab+”)

  B. fp=fopen(“filel”,”r+”)

  C. fp=fopen(“filel”,”wb+”)

  D.fp=fopen(“filel”,”ab”)

6.fgetc函数的作用是从指定文件读入一个字符,该文件的打开方式必须是( )C

  A.只写   B.追加   C.读或读写   D.答案B和C都正确

7.若调用fputc函数输出字符成功,则其返回值是( )D

  A.EOF    B.1        C.0           D.输出的字符

8.fread和fwrite函数常用来要求一次读入/输出( )数据D

  A.一个整数   B.一个实数   C.一个字节   D.一组

9.函数调用语句:fseek(fp,-20L,2);的含义是( )C

   A.将文件位置指针移到距离文件头20个字节处

  B.将文件位置指针从当前位置向后移动20个字节

    C.将文件位置指针从文件末尾处向后退20个字节

    D.将文件位置指针移到离当前位置20个字节处

10.函数rewind的作用是( )B

   A.位置指针自动移到下一个字符位置

   B.位置指针重新返回文件的开头

   C.位置指针自动移到文件尾

   D.位置指针移到指定的位置

11.当fclose函数正确执行后,函数的返回值是( )A

   A.0    B.-1    C.1    D.非零值

 


转载:https://blog.csdn.net/qq_27248989/article/details/111053306
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场