c语言习题集-----收藏归纳版


C语言习题集收藏归纳


第一单元 程序设计和C语言

一、选择题
1.C语言的基本构成单位是: 。
A. 函数 B. 函数和过程 C. 超文本过程 D. 子程序

2.一个C语言程序总是从 开始执行。
A. 主过程 B. 主函数 C. 子程序 D.主程序

3.C语言的程序一行写不下时,可以 。
A. 用逗号换行 B. 用分号换行 C. 在任意一空格处换行 D. 用回车符换行

4.以下叙述不正确的是: 。
A. 在C程序中,语句之间必须要用分号";"分隔
B. 若a是实型变量,C程序中a=10是正确的,因为实型变量中允许存放整型数
C. 在C程序中,无论是整数还是实数都能正确无误地表示
D. 在C程序中,%是只能用于整数运算的运算符

5.以下不正确的C语言标识符是 。
A. ABC    B. abc    C. a_bc    D. ab.c

6.下列字符串是标识符的是: 。
A. _HJ    B. 9_student    C. long    D. LINE 1

7.以下说法中正确的是: 。
A. C语言程序总是从第一个定义的函数开始执行
B. 在C语言程序中,要调用的函数必须放在main()函数中定义
C. C语言程序总是从main()函数开始执行
D. C语言程序中的main()函数必须放在程序的开始部分

8.不合法的常量是: 。
A. ‘\2’    B. " "    C. ‘3’    D. ‘\483’
9.已知各变量的类型说明如下,则以下不符合C语言语法的表达式是: 。

int k,a,b;
unsigned long w=5;
double x=1.422;

A. x%(-3) B. w+=-2 C. k=(a=2,b=3,a+b) D. a+=a=+(b=4)*(a=3)

10.在C语言中,字符型数据在内存中以 形式存放。
A. 原码 B. BCD码 C. 反码 D. ASCII码

11.若有定义:int a=7; float x=2.5; y=4.7;
则表达式x+a%3*(int)(x+y)%2/4的值是: 。
A. 2.500000 B. 2.750000 C. 3.500000 D. 0.000000

12.设有说明:char w; int x; float y; double z;
则表达式w*x+z-y值的数据类型为: 。
A. float B. char C. int D. double

13.以下 是不正确的转义字符。
A. ‘\’ B. ‘’ C. ‘081’ D. ‘\0’

14.若x为int型变量,则执行以下语句后,x的值为 。

x=6; x+=x-=x*x;

A. 36 B. -60 C. 60 D. -24

15.字符串"\“ABC”\"的长度是 。
A. 11 B. 7 C. 5 D. 3

二、填空题
1.一个函数由两部分组成,它们是 函数首部函数体
2.一个C源程序至少包含一个 主函数 ,即 main函数
3.设int a=12; 则表达式a/=a+a的值是 0
4.表达式x=(a=3,6a)和表达式x=a=3,6a分别是 赋值 表达式和 逗号 表达式,两个表达式执行完的结果分别是 1818 ,x值分别是 183
5.在C语言中,实数有两种表示形式,即 浮点型指数型
6.在C语言中,运算符的优先级最小的是 逗号 运算符。

第二单元 顺序程序设计

一、选择题
1.若m为float型变量,则执行以下语句后的输出为 。
m=1234.123;
printf("%-8.3f\n",m);
printf("%10.3f\n",m);
A. 1234.123 B. 1234.123 C. 1234.123 D. -1234.123
     1234.123     1234.123      1234.123    001234.123

2.若x,y,z均为int型变量,则执行以下语句后的输出为 。
x=(y=(z=10)+5)-5;
printf(“x=%d,y=%d,z=%d\n”,x,y,z);
y=(z=x=0,x+10);
printf(“x=%d,y=%d,z=%d\n”,x,y,z);
A. X=10,Y=15,Z=10      B. X=10,Y=10,Z=10
X=0,Y=10,Z=0                   X=0,Y=10,Z=10
C. X=10,Y=15,Z=10      D. X=10,Y=10,Z=10
X=10,Y=10,Z=0                  X=0,Y=10,Z=0

3.若x是int型变量,y是float型变量,所用的scanf调用语句格式为:
scanf(“x=%d,y=%f”,&x,&y);
则为了将数据10和66.6分别赋给x和y,正确的输入应是: 。
A. x=10,y=66.6<回车> B. 10 66.6<回车>
C. 10<回车>66.6<回车> D. x=10<回车>y=66.6<回车>

4.已知有变量定义:int a;char c;用scanf(“%d%c”,&a,&c);语句给a和c输入数据,使30存入a,字符‘b’存入c,则正确的输入是: 。
A. 30’b’<回车> B. 30 b<回车>
C. 30<回车>b<回车> D. 30b<回车>

5.已知有变量定义:double x;long a; 要给a和x输入数据,正确的输入语句是 。若要输出a和x的值,正确的输出语句 。
A. scanf(“%d%f”,&a,&x);               B. scanf(“%ld%f”,&a,&x);
printf(“%d,%f”,a,x);                             printf(“%ld,%f”,a,x);
C. scanf(“%ld%lf”,&a,&x);        D. scanf(“%ld%lf”,&a,&x);
printf(“%ld,%lf”,a,x);                      printf(“%ld,%f”,a,x);

6.若有定义double x=1,y;则以下的语句执行的结果是 。
y=x+3/2; printf(“%f”,y);
A.2.500000 B.2.5 C.2.000000 D.2

7.若a为整型变量,则以下语句 。
a=-2L; printf("%d\n",a);
A. 赋值不合法 B. 输出为不确定的值 C. 输出值为-2 D. 输出值为2

二、读程序写结果
1.

 main()
     { 	int x,y;
    	scanf("%2d%*2d%ld",&x,&y);
    	printf("%d\n",x+y);
     }

执行时输入:1234567

结果 17

2.

main()
{ int x=4,y=0,z;
  x*=3+2; 
printf("%d",x);
x*=y=z=4; 
printf("%d",x);
 }

结果 2080
23.

 main()
{ float x; int i;
  x=3.6; i=(int)x;
  printf("x=%f,i=%d",x,i);
}

X=3.600000,i=3
4.

   main()
{ int a=2;
  a%=4-1; printf("%d, ",a);
  a+=a*=a-=a*=3; printf("%d",a);
}

2,0

5.

  main()
{ int x=02,y=3;
  printf("x=%d,y=%%d",x,y);
}

X=2,y=%d
6.

  main()
{ char c1=6,c2=0;
  printf("%c,%c,%d,%d\n",c1,c2,c1-c2,c1+c2);
}

6,0,6,102
7.

main()
        { int x,y,z;
          x=y=1; z=++x-1;
          printf("%d,%d\n",x,z);
          z+=y++;
          printf("%d,%d\n",y,z);
        }

2,1
2,2

三、填空题
1.在C语言中,字符型数据和整型数据之间可以通用,一个字符数据既能以 字符 输出,也能以 整数 输出。
2."%-ms"表示如果串长小于m,则在m列范围内,字符串向左 , 补 空格。
3.printf函数的“格式控制”包括两部分,它们是 格式说明普通字符
4.编写程序求矩形的面积和周长,矩形的长和宽由键盘输入,请填空。

#include 
void main()
{   float l,w; 
                     
printf(“please input length and width of the rectangle\n”);
scanf(%f%f”,&l,&w);
area=                  ;
girth=                  ;
                        
}

(1) float area,girth;
(2) lw
(3) 2
(l+w)
(4) printf(“area=%f,girth=%f\n”,area,girth);

5.编写程序,输入一个数字字符(‘0’~‘9’)存入变量c,把c转换成它所对应的整数存入n,如:字符‘0’所对应的整数就是0。请填空。

                              
void main()
{    char c;
		               ;
		printf(“please input a char:\n”);
		c=           ;
		n=           ;
		printf(               ,c,n);
}

(1) #include “stdio.h”
(2) int n
(3) getchar()
(4) c-‘0’ 或者c-48
(5) “%c,%d\n”

四、编程
1.将华氏温度转换为摄氏温度和绝对温度的公式分别为:
c=(f-32) (摄氏温度)
k=273.16+c (绝对温度)
请编程序:当给出f时,求其相应摄氏温度和绝对温度。
测试数据:① f=34
② f=100
2.写一个程序把极坐标(r,θ) (θ之单位为度)转换为直角坐标( X,Y)。转换公式是:
x=r.cosθ
y=r.sinθ
测试数据:① r=10 θ=45°
② r=20 θ=90°
3.写一个程序,按如下格式输出数据。
name number math english computer
zhanghua 9901 80.50 87.0 80
lina 9902 70.00 80.0 90
wanggang 9903 87.00 76.0 78
4.输入3个双精度实数,分别求出它们的和、平均值、平方和以及平方和的开方,并输出所求出各个值。
5.输入一个3位整数,求出该数每个位上的数字之和。如123,每个位上的数字和就是1+2+3=6。

**

第三单元 分支程序设计

**
一、选择题
1.若x=0,y=3,z=3,以下表达式值为0的是
A. !x B.xC. x%2&&y==z D. y=x||z/3

2.以下运算符中优先级最低的运算符为 e ,优先级最高的为 b。
A. && B. ! C. != D. || E. ?: F. ==

3.若w=1,x=2,y=3,z=4,则条件表达式w A. 4 B. 3 C. 2 D. 1

4.若w,x,z均为int型变量,则执行以下语句后的输出为 。
w=3;z=7;x=10;
printf("%d\n",x>10?x+100:x-10);
printf("%d\n",w++||z++);
printf("%d\n",!w>z);
printf("%d\n",w&&z);
A. 0   B. 1   C. 0   D. 0
1           1       1         1
1           1       0         0
1           1       1         0

5.分析以下程序, 下列说法正确的是 。

main()
  { int x=5,a=0,b=0;
if(x=a+b) printf("* * * *\n");
else   printf("# # # #\n");
  }

A. 有语法错,不能通过编译 B. 通过编译,但不能连接
C. 输出* * * *   D. 输出# # # #

6.分析以下程序, 下列说法正确的是 C 。

main()
  { int x=5,a=0,b=3;
if(x=a+b) printf("* * * *\n");
else   printf("# # # #\n");
			  }
A. 有语法错,不能通过编译             B. 通过编译,但不能连接
C. 输出* * * * *                    D. 输出# # # #

7.分析以下程序, 下列说法正确的是 D 。

main()
  { int x=0,a=0,b=0;
if(x=a+b) printf("* * * *\n");
else   printf("# # # #\n");
			  }
A. 有语法错,不能通过编译             B. 通过编译,但不能连接
C. 输出* * * *                        D. 输出# # # #

8.分析以下程序, 下列说法正确的是 C 。

main()
  { int x=0,a=0,b=0;
if(x==a+b) printf("* * * *\n");
else   printf("# # # #\n");
			  }
A. 有语法错,不能通过编译             B. 通过编译,但不能连接
C. 输出* * * *                        D. 输出# # # #

二、读程序写结果


1.1,0,3
2.200
3.01
4.1 7 0
5.It is B. It is C.other.
6.a=2,b=1


1.

    include <stdio.h>
main()
  { int a=-1,b=4,k;
k=(a++<=0)&&(!(b--<=0));
printf("%d,%d,%d\n",k,a,b);
  }

2.

main()
{ int x=4,y=0,z;
  x*=3+2; 
printf("%d",x);
  x*=(y==(z=4)); 
printf("%d",x);
 }

3.

 main()
{ int x,y,z;
  x=3; y=z=4;
  printf("%d",(x>=z>=x)?1:0);
  printf("%d",z>=y && y>=x);
}

4.

 main()
         { int x=1,y=1,z=10;
           if(z<0)
if(y>0) x=3;
else  x=5;
printf("%d\t",x);
if(z=y<0) x=3;
else if(y==0) x=5;
else x=7;
printf("%d\t",x);
printf("%d\t",z);
 }

5.

    main()
{ char x=‘B’;
  switch(x)
    { case ‘A’: printf(“It is A.);
      case ‘B’: printf(“It is B.);
      case ‘C’: printf(“It is C.);
      default: printf(“other.);
    }
  }

6.

  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;
      case 3: a++;b++;
                 }
                printf("a=%d,b=%d\n",a,b);
              }

三、填空题

1.若a=5,b=6,c=7,d=8,则表达式d=a/2&&b==c||!a的值为 0

2.定义 int x=10,y,z;执行y=z=x;x=y==z后,变量x的值为 1 。

3.分段函数:输入x,计算y值,输出y,其中:

x<0 y=2x+3
x=0,y=0
x>0,y=(x+7)/3

#include 
main()
{
int x,y;
scanf("%d",&x);
if(x<0)      (1)       ;
      (2)       y=0;
      (3)      y=(x+7)/3;
printf(%d”,y);
}

(1) y=2*x+3
(2)else if(x==0)
(3)else

4.由键盘输入三个数,计算以这三个数为边长的三角形面积。

   (1)  
  main()
  {
      (2)  ;
    printf("Please enter 3 reals:\n");
    scanf("%f%f%f",&a,&b,&c);
    if(  (3)  )
      { s=(a+b+c)*0.5;
        s1=s*(s-a)*(s-b)*(s-c);
        s=  (4)  ;
        printf("\nArea of the triangle is %f\n",s);
       }
      (5)  
     printf("It is not triangle!\n");
  }

(1) #include “math.h”
(2) float a,b,c,s,s1
(3) (a+b>c)&&(b+c>a)&&(c+a>b)
(4) sqrt(s1)
(5) else

5.有一方程a+bx+c=0,a,b,c的值由键盘输入,请编程序,打印出以下情况时方程的解。
(1) a=0,b≠0
(2) a=0,b=0,c=0
(3) a=0,b=0,c≠0
(4) a≠0,-4ac≥0
(5) a≠0,-4ac≤0

#include "math.h"
main()
 { float a,b,c,d,pr,pi,x1,x2;
   scanf("%f%f%f",&a,&b,&c);
   printf("a=%f,b=%f,c=%f\n",a,b,c);
    if(a==0)
       { if(  (1)  )
           printf("only one solution x=%f\n",-c/b);
         else
           if(  (2)  )printf("no solution\n");
           else printf("x is any value\n");
       }
     else
       { d=b*b-4*a*c;
         if(  (3)  )
          { x1=(-b+sqrt(d))/  (4)  ;
            x2=(-b-sqrt(d))/  (5)  ;
            printf("x1=%6.2f, x2=%6.2f\n",x1,x2);
          }
         else
          { pr=-b/(2*a);  (6)  ;
            printf("x1=%6.2f +%6.2fi\n",pr,pi);
            printf("x2=%6.2f -%6.2fi\n",pr,pi);
          }
       }
   }

(1) b!=0
(2) c!=0
(3) d>=0
(4) (2a)
(5) (2
a)
(6) pi=sqrt(-d)/(2*a)

6.投票表决器:
–输入Y、y,打印agree
–输入N、n,打印disagree
–输入其他,打印lose

     main()
{
    char c;
    scanf("%c",&c);
            (1)           
{
	case ‘Y’:
	case ‘y’: printf(“agree”);       (2)          ;
	case ‘N’:
	case ‘n’: printf(“disagree”);       (3)         ;
	     (4)        :printf(“lose”);

}

(1) switch ( c )
(2) break
(3) break
(4) default

四、编程
1.写一程序求y值 (x值由键盘输入)。

2.输入一个字符,判断它如果是小写字母输出其对应大写字母;如果是大写字母输出其对应小写字母;如果是数字输出数字本身;如果是空格,输出“space”;如果不是上述情况,输出“other”。
3.有三个数a、b、c,由键盘输入,输出其中最大的数。
4.输入一个数,判断它能否被 3或者被 5整除, 如至少能被这两个数中的一个整除则将此数打印出来,否则不打印,编出程序。
5.读入1到7之间的某个数,输出表示一星期中相应的某一天的单词:Monday、 Tuesday等等,用switch语句做。
6.给出一百分制成绩,要求输出成绩等级‘A’,‘B’,‘C’,‘D’,‘E’,90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为‘E’。
7.有一函数

请编程序计算y的值(x的值由键盘输入)。

第四单元 循环程序设计

一、选择题
1.程序段如下:则以下说法中正确的是: D 。

int k=5;
do{
    k--;
}while(k<=0);
A. 循环执行5次                       B. 循环是无限循环
C. 循环体语句一次也不执行             D. 循环体语句执行一次

2.设i和x都是int类型,则for循环语句 A 。

for(i=0,x=0;i<=9&&x!=876;i++) scanf("%d",&x);
A. 最多执行10次                      B. 最多执行9次
C. 是无限循环                         D. 循环体一次也不执行

3.下述for循环语句 B 。

int i,k;
for(i=0,k=-1;k=1;i++,k++)  printf("* * * *");
A. 判断循环结束的条件非法             B. 是无限循环
C. 只循环一次                         D. 一次也不循环

4.程序段如下:则以下说法中正确的是: C 。

int k=-20;
while(k=0) k=k+1;
A. while循环执行20次                B. 循环是无限循环
C. 循环体语句一次也不执行             D. 循环体语句执行一次

5.下列程序段执行后k值为 A 。

int k=0,i,j;
for(i=0;i<5;i++)
for(j=0;j<3;j++)
   k=k+1 ;
A. 15      B. 3   C. 5           D.  8

6.程序段如下:则以下说法中不正确的是: D 。

#include 
main()
{
int k=2,;
while(k<7) 
{
if(k%2) {k=k+3; printf(“k=%d\n”,k);continue;}
k=k+1;
printf(“k=%d\n”,k);
}
}
A. k=k+3;执行一次                 B. k=k+1;执行2次
C. 执行后k值为7                 D. 循环体只执行一次

二、读程序写结果
1.

main()
         { int num=0;
           while(num<=2){
            num++; 
            printf("%d\n",num);}
          }

1
2
3

2.

main()
         { int i=0,s=0;
           do{
            s+=i*2+1;
            printf("i=%d,s=%d\n",i,s);
            i++;
            }while(s<10);
          }

i=0,s=1
i=1,s=4
i=2,s=9
i=3,s=16
3.

   #include 
  main()
{ int i,m=1;
  for(i=5;i>=1;i--)
    {
m=(m+1)*2;
printf("m=%d\n",m);
    }
  }

m=4
m=10
m=22
m=46
m=94

4.指出下面三个程序的功能,当输入为:"quert?"时,它们的执行结果是什么?

⑴  #include <stdio.h>
        main()
          { char c;
            c=getchar();
            while (c!='?')
               {  putchar(c); c=getchar();}
          }
⑵  #include <stdio.h>
        main()
          { char c;
            while ((c=getchar())!='?')  putchar(++c);
          }
 	⑶  #include <stdio.h>
        main()
          { while (putchar(getchar())!='?');
          } 

(1) quert
(2) rvfsu
(3) quert?
5.

  #include 
  main()
{ int i;
  for(i=1;i<=5;i++)
    { if(i%2)
         putchar(<);
      else
         continue;
      putchar(>);
    }
   putchar(‘#’);
  }

<><><>#
6.

main()
         { int a,b;
           for(a=1,b=1;a<=100;a++)
{ if(b>10) break;
  if(b%3==1)
    { b+=3; continue;}
}
           printf("a=%d\n",a);
         }

a=5
7.

  main()
   		{ int i=1;
     		 while (i<=15)
       		if (++i%3!=2) continue;
         		else printf("%d  ",i);
     		  printf("\n");
   		}

2 5 8 11 14
8.

  #include 
    void main()
	{ int i,j;
	  for(i=0;i<=3;i++)
	    { for(j=0;j<=i;j++)
	         printf("(%d,%d),",i,j);
	       printf("\n");
	    }
	 }

(0,0),
(1,0),(1,1),
(2,0),(2,1),(2,2),
(3,0),(3,1),(3,2),(3,3),
9.

 main()
     {  int i,j,k;
        char space=' ';
        for (i=0;i<=5;i++)
        {  for (j=1;j<=i;j++)  printf("%c",space);
           for (k=0;k<=5;k++)  printf("%c",'*');
             printf("\n");
        }
      }






10.

#include 
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.break语句只能用于 switch 语句和 循环 语句中。
2.计算2+4+6+8+…+98+100

main()
{
int i,     (1)       ;
for(i=2;i<=100;      (2)     )
    s+=i;
}

(1)s=0
(2)i=i+2

3.求满足下式的 x,y,z
X Y Z
+ Y Z Z
──────
5 3 2

   main()
     { int x,y,z,i,result=532;
       for (x=1;    (1)    ;x++)
       for (y=1;    (2)    ;y++)
       for ( (3);   (4)   ;z++)
              { i=   (5)   +(100*y+10*z+z);
                if (i==result) 
                 printf("x=%d, y=%d, z=%d\n",x,y,z);
               }
}

(1) x<=9
(2) y<=9
(3) z=0
(4) z<=9
(5) x100+y10+z

4.求 Sn=a+aa+aaa+…+aa…a之值,其中 a是一个数字。 例如 2+ 22 +222+2222( 此时n=4),n由键盘输入。

   main()
     { int a,n,count=1,Sn=0,Tn=0;
       printf("请输入 a 和 n 的值:\n");
       scanf("%d,%d",&a,&n);
       while (count<=    (1)    )
         {   Tn=    (2)     ;
             Sn=    (3)     ;
             a=a*10;
                 (4)    ;
}
printf("a+aa+aaa+...=%d\n",Sn);
}

(1) n
(2) Tn+a
(3) Sn+Tn
(4) count++

5.一球从 100米高度自由落下,每次落地后反跳回原来高度的一半,再落下,求它在第十次落地时,共经过多少米?第十次反弹多高?

   main()
    { float Sn=100.0,hn=Sn/2;
      int n;
      for (n=2;n<=    (1)    ;n++) 
         {  Sn=    (2)    ;  hn=    (3)    ; }
      printf("第10次落地时共经过%f米\n",Sn);
      printf("第10次反弹%f米\n",hn);
}

(1) 10
(2) Sn+hn*2
(3) hn/2
6.打印出以下图形
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*

main()
      { int i,j,k;
        for (i=0;i<=    (1)    ;i++)
          { for (j=0;j<=2-i;j++)  printf(" ");
            for (k=0;k<=    (2)    ;k++)  printf("*");
               (3)         
          }
         for (i=0;i<=2;i++)
           { for (j=0;j<=    (4)    ;j++)
       	       printf(" ");
             for (k=0;k<=    (5)    ;k++)
       	       printf("*");
             printf("\n");
           }
 }

(1) 3
(2) 2i
(3) printf(“\n”);
(4) i
(5) 4-2
i

7.准备客票。某铁路线上共10个车站,问需要准备几种车票?

    main()
      { int i,j,station,total=0;
        printf("输入车站数:");
        scanf("%d",&station);
        for (i=1;i<    (1)    ;i++)
          for (j=    (2)    ;j<=station;j++)
       	    total=    (3)     ;
        printf("车票种类=%d \n",total);
}

(1) station
(2) i+1
(3) total+2

四、编程
1.计算n的阶乘
2.求 1到 100之间的奇数之和、偶数之积。
3.输入一行字符,统计其中的英文字母、数字、空格和其他字符个数。
4.用循环语句编写求的程序。
5.求(即求1!+2!+3!+…+20!) 。
6.有一分数序列,求出这个数列的前20项之和。
7.任意十个数,打印出它们中的最大数、最小数。
测试数据:① 1,-12,20,30,-5,-23,33,125,200,-100
② 0,10,3,1,5,6,-10,90,9,-4
③ 12,13,14,15,10,-10,-11,-12,-9,9
8.判断一个数是否是素数
9.打印1-100之间所有素数
10.求1-100之间所有非素数的和
11. 输入两个正整数 m和 n,求其最大公约数和最小公倍数。
提示:求 m,n的最大公约数:首先将 m除以 n(m>n)得余数 R,再用余数 R 去除原来的除数,得新的余数,重复此过程直到余数为 0 时停止,此时的除数就是m 和 n的最大公约数。求 m和 n的最小公倍数: m和 n的积除以 m和 n 的最大公约数。
测试数据: m=12, n=24
m=100, n=300
12.打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方和等于该数本身。例如 153是一个水仙花数,因为 153=(要求分别用一重循环和三重循环实现)。
13.一个数恰好等于它的平方数的右端,这个数称为同构数。如 5 的平方是25, 5是25中的右端的数, 5就是同构数。找出1~1000之间的全部同构数。
14.3025这个数具有一种独特的性质:将它平分为两段,即30和25,使之相加后求平方,即(30+25),恰好等于3025本身。请求出具有这样性质的全部四位数。
15.两位数13和62具有很有趣的性质:把它们个位数字和十位数字对调,其乘积不变,即1362=3126。 编程序求共有多少对这种性质的两位数(个位与十位相同的不在此列,如11、22,重复出现的不在此列,如 1362与6213)。
16.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6 的因子为1、2、3,而6=1+2+3,因此6 是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子:
6 its factors are 1,2,3
17.有一个四位正整数,组成这个四位数的四个数字各不相同,如果把它们的首尾互换,第二位与第三位互换,组成一个新的四位数。原四位数为新四位数的4倍,请找出一个这样的四位数。
18.给出一个不多于4位的正整数,要求:① 求出它是几位数 ② 分别打印出每一位数字 ③ 按逆序打印出各位数字。
19.在一个程序中计算出给定误差小于0.1,0.01,0.001,0.0001,0.00001 时,下式的值:

    提示:本题中误差指前 n+1项之积与前 n项积之差。

20.用泰勒展开式求sinx的近似值
sinx=
测试数据:① x=0.3 , n=8
② x=0.5 , n=20

21.验证歌德巴赫猜想。一个充分大的偶数(大于或等于6)可以分解为两个素数之和。试编程序,将 6至50之间全部偶数表示为两个素数之和。
22.用牛顿迭代法求方程在 1.5附近的根(精度为)。

23.两个乒乓球队进行比赛,各出三人,甲队为A、B、C三人,乙队为X、Y 、Z三人,已知抽签决定比赛名单。有人向队员打听比赛的名单, A说他不和 X比,C说他不和 X、Z比,请编程序找出三对赛手的名单。

第五单元 数 组

一、选择题C
1.以下关于数组的描述正确的是 。
A. 数组的大小是固定的,但可以有不同的类型的数组元素。
B. 数组的大小是可变的,但所有数组元素的类型必须相同。
C. 数组的大小是固定的,但所有数组元素的类型必须相同。
D. 数组的大小是可变的,但可以有不同的类型的数组元素。
2.在定义int a[10];之后,对a的引用正确的是 D 。
A. a[10] B. a[6.3] C. a(6) D. a[10-10]
3.以下能正确定义数组并正确赋初值的语句是 D 。
A. int n=5,b[n][n]; B. int a[1][2]={{1},{3}};
C. int c[2][]={{1,2},{3,4}} D. int a[3][2]={{1,2},{3,4}}
4.以下不能正确赋值的是A 。
A. char s1[10];s1=“test”; B. char s2[]={’t’,’e’,’s’,’t’}
C. char s3[20]= “test”; D. char s4[4]={ ’t’,’e’,’s’,’t’}
5.下面程序段运行时输出结果是 C 。
char s[18]= “a book! “;
printf(”%.4s”,s);
A. a book! B. a book! C. a bo D. 格式描述不正确,没有确定输出
6.下面程序段运行时输出结果是 D 。
char s[12]= “A book”;
printf("%d\n",strlen(s));
A. 12 B. 8 C. 7 D. 6
7.在执行int a[][3]={1,2,3,4,5,6};语句后,a[1][0]的值是 A 。
A. 4 B. 1 C. 2 D. 5

二、读程序写结果


1. 1 0 2 2 5 7 13 20
2. 2.20 3.30 4.40 5.50 6.60 1.10
3.k=24
4.sum=6
5.
0
1 0
2 1 0
3 2 1 0
6.-5
7.“BBB”
8.没有输入数据


1.

#include 
void main()
{
		int a[8]={1,0,1,0,1,0,1,0},i;
		for(i=2;i<8;i++)
			a[i]+= a[i-1] + a[i-2];
		for(i=0;i<8;i++)
			printf(%5d”,a[i]);
}

2.

#include 
void main()
{
float b[6]={1.1,2.2,3.3,4.4,5.5,6.6},t;
int i;
t=b[0];
for(i=0;i<5;i++)
b[i]=b[i+1];
b[5]=t;
for(i=0;i<6;i++)
		printf(%6.2f,b[i]);
		}       

3.

#include 
void main()
       {    int p[7]={11,13,14,15,16,17,18},i=0,k=0;
while(i<7 && p[i]%2)
{ k=k+p[i]; i++;}
printf("k=%d\n",k);
        }

4.

void main()
        {   int a[3][3]={1,3,5,7,9,11,13,15,17};
            int sum=0,i,j;
            for (i=0;i<3;i++)
               for (j=0;j<3;j++)
               {  a[i][j]=i+j;
                  if (i==j) 
sum=sum+a[i][j];
                }
            printf("sum=%d",sum);
        }         
  

5.

void  main()
       {   int a[4][4],i,j,k;
           for (i=0;i<4;i++)
              for (j=0;j<4;j++)
                 a[i][j]=i-j;
           for (i=0;i<4;i++)
           {  for (j=0;j<=i;j++)
                  printf("%4d",a[i][j]);
               printf("\n");
            }
        } 

6.

  #include 
         main()
          { int i,s;
            char s1[100],s2[100];
            printf("input string1:\n");  gets(s1);
            printf("input string2:\n");  gets(s2);
            i=0;
            while ((s1[i]==s2[i])&&(s1[i]!='\0'))
                i++;
            if ((s1[i]=='\0')&&(s2[i]=='\0')) s=0;
            else s=s1[i]-s2[i];
            printf("%d\n",s);
          }
输入数据   aid

and  
7.

void main()
{
			char ch[3][5]={ "AAAA","BBB","CC"};
printf("\"%s\"\n",ch[1]);
}  

8.

#inlcude 
#include 
void main()
{
		char str[10][80],c[80];
		int i;
		for(i=0;i<10;i++)
			gets(str[i]);
		strcpy(c,str[0]);
		for(i=1;i<10;i++)
			if(strlen(c)<strlen(str[i]))
				strcpy(c,str[i]);
		puts(c);
	}

三、填空题
1.构成数组的各个元素必须具有相同的 类型
2.下面的程序是输出数组中最大元素的下标(p表示最大元素的下标)。

void main()
{
		               
		int s[]={1,-3,0,-9,8,5,-20,3};
		for(i=0,p=0;i<8;i++)
			if(s[i]>s[p])               ;
		                    
}

(1) int i,p
(2) p=i
(3) printf(“%d\n”,p);
3.输入20个数,输出他们的平均值,输出与平均值之差的绝对值最小的数组元素。

#include 
                 
void main()
{
		float a[20],pjz=0,s,t;
		int i,k;             		               
		for(i=0;i<20;i++)
		{
scanf(%f”,&a[i]);
pjz+=}
		s=fabs(a[0]-pjz);
			t=a[0];
		for(i=1;i<20;i++)
			if( fabs(a[i]-pjz)<s  )
{	                      
     t=a[i];
}
 			                         
		}

(1) #include “math.h”
(2) a[i]/20
(3) s=fabs(a[i]-pjz);
(4) printf(“%f,%f\n”,pjz,t);
4.输出行、列号之和为3的数组元素。

main() 
{	char ss[4][3]={'A','a','f','c','B','d','e','b',
                     'C','g','f','D'};
      int x,y,z;
      	for (x=0;    (1)    ;x++)
        		for (y=0;    (2)    ;y++)
          {   z=x+y;
  	            if (    (3)    )   printf("%c\n",ss[x][y]);
      	    }
}

(1) x<4
(2) y<3
(3) z==3

5.将一个数组中的元素按逆序重新存放。例如原来的顺序为:8,5,7,4,1, 要求改为:1,4,7,5,8 。

#define  N  7
void   main()
      {   int a[N]={12,9,16,5,7,2,1},k,s;
        printf("\n初始数组:\n");
          for (k=0;k<N;k++)
            printf("%4d",a[k]);
          for (k=0;k<    (1)    ;k++)
         {  s=a[k]; a[k]=    (2)     ;    (3)     =s; }
       printf("\n交换后的数组:\n");
         for (k=0;    (4)    ;k++)
           printf("%4d",a[k]);
      }

(1) N/2
(2) a[N-1-k]
(3) a[N-1-k]
(4) k 6.有一行文字,要求删去某一个字符。此行文字和要删去的字符均由键盘输入,要删去的字符以字符形式输入(如输入 a表示要删去所有的 a字符)。

   #include 
    	void main()
  {   /*str1表示原来的一行文字,str2表示删除指定字符后的文字*/
char str1[100],str2[100];
       char ch;
int i=0,k=0;
printf(“please input an sentence:\n”);
gets(str1);
      scanf("%c",&ch);
        for (i=0;    (2)    ;i++)
                if (str1[i]!=ch)
                {  str2[    (3)    ]=str1[i]; k++; }
      str2[    (4)    ]='\0';
            printf("\n%s\n",str2);
        }

(1) str[i]!=’\0’
(2) k
(3) k
7.找出10个字符串中的最大者。

#include 
#include 
#define N 10
void main()
      { char str[20],s[N][20];
        int i;
        for (i=0;i<N;i++)
           gets(    (1)    );
		strcpy(str,s[0]);
		for(i=1;i<N;i++)
          if (   (2)         >0) strcpy(str,s[i]);
        printf("The longest string is : \n%s\n",str);
      } 

(1) s[i]
(2) s[i],str
8.某人有四张 3分的邮票和三张 5分的邮票,用这些邮票中的一张或若干张可以得到多少种不同的邮资?

main()
  { static int a[27];
    int i,j,k,s,n=0;
    for (i=0;i<=4;i++)
      for (j=0;j<=3;j++)
        { s=    (1)    ;
          for (k=0;a[k];k++)
             if (s==a[k])     (2)     ;
          if (    (3)    )
             {  a[k]=s;  n++;}
         }
     printf("%d kind:",n);
     for (k=0;    (4)    ;k++)
        printf("%3d",a[k]);
   }

(1) i3+j5
(2) break
(3) s!=a[k]
(4) k 9.求矩阵的马鞍点。马鞍点即它的值在行中最大,在它所在的列中最小。

    #define N 10
    #define M 10
    main()
     { int i,j,k,m,n,flag1,flag2;
       int a[N][M],max;
       printf("\n输入行数 n:");
       scanf("%d",&n);
       printf("\n输入列数 m:");
       scanf("%d",&m);
       for (i=0;i<n;i++)
         for (j=0;j<m;j++)
	        scanf("%d",     (1)     );
       for (i=0;i<n;i++)
         { for (j=0;j<m;j++)
       	      printf("%5d",a[i][j]);
	            (2)     ;
         }
flag2=0;
       for (i=0;i<n;i++)
         { max=     (3)     ;
           for (j=1;j<m;j++)
	          if (a[i][j]>max)  max=a[i][j];
	       for (j=0;j<m;j++)
	        { flag1=0;
	          if (a[i][j]==max)
	           { for (k=0,flag1=1;k<n&&flag1;k++)
		            if (    (4)    ) flag1=0;
		         if (flag1)
		          { printf("第%d行, 第%d列的 %d是鞍点\n",    (5)    );
		            flag2=1;
		          }
	           }
	         }
           }
       if (!flag2)
          printf("\n矩阵中无鞍点!\n");
      }

(1) &a[i][j]
(2) printf(“\n”)
(3) a[i][0]
(4) a[k][j] (5) i,j,a[i][j]

四、编程
1.有一个正整数数组,包含N个元素,要求编程求出其中的素数之和以及所有素数的平均值。
2.有一个数组,内放10个整数。要求找出最小的数和它的下标,然后把它和数组中最前面的元素对换位置。
3.有 N个数已按由小到大的顺序排好,要求输入一个数, 把它插入到原有序列中,而且仍然保持有序。
4.输入N个数到数组中,输出所有大于N个数平均值的数。
5.输入N个数到数组中,选出其中最大的数和最小的数,并分别将它们与最前面和最后面的数互换。
6.用选择法对10个整数由大到小排序。
7.用筛选法求 2到 100之间的素数。方法如下:首先 2是素数,凡 2 的倍数都不是素数,于是把这些数从数表中筛去, 2以后没有被筛去的第一个数是 3, 然后把 3的倍数都从数表中筛去, 3以后没被筛去的第一个数是 5,然后把 5 的倍数都从数表中筛去。如此下去,直到遇到某数 K(≤ N),其后没有数可筛选为止, 这时保留下的未被筛去的数就是 2到 N的素数。
8.求一个 3×3矩阵两条对角线上元素之和(每个元素只加一次)。
9.打印如下形式的杨辉三角形
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
输出前10行,从 0行开始,分别用一维数组和二维数组实现。
10.有一个二维数组整型数组中,每一行都有一个最大值,编程求出这些最大值以及它们的和。
11.把一个二维实型数组a按照第0列的元素进行排序(由小到大排序,用起泡法)。例如:如果a[i][0]大于a[i+1][0],则i行与i+1行中所有元素都要进行对换。
12.编程序将一个字符串的前 N个子字符送到一个字符型数组中去, 然后再加上一个'\0'(不允许使用strcpy(str1,str2,n)函数)。
13.将字符数组 A中下标为双号(0,2,4,6,8…) 的元素值传给另一个字符数组 B,然后将 B数组的元素按逆序输出。
14.有一行字符,统计其中的单词个数(单词之间以空格分隔),并将每一个单词的第一个字母改为大写。
15.有 N个国家名,要求按字母先后顺序排列(用起泡排序法)后输出。
16.有17个人围成一圈(编号为0~16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。 问此人原来的位置是多少号?

17.编程产生如下形式的方阵。
1 2 2 2 2 2 1
3 1 2 2 2 1 4
3 3 1 2 1 4 4
3 3 3 1 4 4 4
3 3 1 5 1 4 4
3 1 5 5 5 1 4
1 5 5 5 5 5 1
要求:不允许使用键盘输入语句和静态赋值语句,尽量少用循环。
18.打印所有不超过 n( n<256)的其平方具有对称性的数(也称回文数)。
19.求N个数中的最大值,最大值出现的次数,然后求出次大值(次大值一定存在)。
20.找出 M×N 数组中所有不相邻元素,并求出它们的和(相邻的数:前一个是偶数,后一个是素数)。
21.圆盘上有如下图所示的二十个数,请找出哪四个相邻数之和为最大,并指出它们的起始位置及最大和的值。

22.已知 100个自然数 1~100,我们取 1, 2, 3, 4时, 我们可将其排成一圈使每两个数之和都是素数,即→1→2→3→4→,问 1~100内连续取 n个数,即 1~ n(≤ 100)能满足上述要求的最大的 n是多少?

23.打印魔方阵。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如:三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求打印由 1到的自然数构成的魔方阵。
提示:魔方阵中各数的排列规律如下:
⑴ 将“1”放在第一行中间一列;
⑵ 从“2”开始直到n×n为止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1;
⑶ 如果上一个数的行数为1,则下一个数的行数为 n(指最下一行);
⑷ 当一个数的列数为 n,下一个数的列数应为1,行数减1;
⑸ 如果按上面规则确定的位置已有数,或上一个数是第 1行第 n列时, 则把下一个数放在上一个数的下面。
24.统计一个单位职工的年龄,要求把相同年龄最多的那个年龄找出来(可能有几个这样的年龄),并统计出现的次数。
25.n×n的拉丁方阵的每行、每列均为自然数的一个全排列, 每行(列)上均无重复数。如 n=5时, 5×5的一种拉丁方阵可以为:
1 5 2 4 3
2 3 4 5 1
4 1 5 3 2
5 2 3 1 4
3 4 1 2 5
该数组的第一行 1,5,2,4,3 用程序自动生成,但产生的第一行不一定非得是 1,5,2,4,3,第一行填写完毕后,即以第一行作为全方阵索引, 即若第一行中的第 i 列的元素值为 j ,则 j在各行中的列号即为从第一行中元素值为 i的那一列开始读出的 n个自然数(到行末则从行头接着读),例如第一行第2列的元素值为5, 则从元素值为2的那一列(第3列)开始读出 2,4,3,1,5,这就是元素5在各行中的列标号。
测试数据:① n=5 ② n=8

第六单元 函 数

一、选择题
1.在C语言中,当函数调用时 A 。
A. 实参和形参各占一个独立的存储单元
B. 实参和形参共用存储单元
C. 可以由用户指定实参和形参是否共用存储单元
D. 由系统自动确定实参和形参是否共用存储单元
2.以下函数调用语句中实参的个数为 A 。
exce((v1,v2),(v3,v4,v5),v6);
A. 3 B. 4 C. 5 D. 6
3.如果在一个函数的复合语句中定义了一个变量,则该变量 A 。
A. 只在该符合语句中有效,在该符合语句外无效
B. 在该函数中任何位置都有效
C. 在本程序的原文件范围内均有效
D. 此定义方法错误,其变量为非法变量
4.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是 B 。
A. float型 B. int型 C. long型 D. double型
5.C语言规定,函数返回值的类型是由 D 。
A. return语句中的表达式类型所决定
B. 调用该函数时的主调函数类型所决定
C. 调用该函数时系统临时决定
D. 在定义该函数时所指定的函数类型决定
6.在C语言程序中,以下描述正确的是 B 。
A. 函数的定义可以嵌套,但函数的调用不可以嵌套
B. 函数的定义不可以嵌套,但函数的调用可以嵌套
C. 函数的定义和函数的调用均不可以嵌套
D. 函数的定义和函数的调用均可以嵌套
7.以下叙述中正确的是 B 。
A. 全局变量的作用域一定比局部变量的作用域范围大
B. 静态(static)类别变量的生存期贯穿于整个程序的运行期间
C. 函数的形参都属于全局变量
D. 未在定义语句中赋初值的auto变量和static变量的初值都是随机值
8. 以下程序的运行结果是:C

#include
void sub(int s[]int y)
{ static int t=3;
y=s[t];t--}
main()
{ int a[]={1,234},i,x=0for(i=0;i<4;i++){
sub(a,x)printf("%d",x)}
printf("\n")}

A)1234 B)432l C)0000 D)4444

  1. 以下程序的运行结果是:B
main()
{ int w=5fun(w)printf("\n")}
fun(int k)
{ if(k>O) fun(k-1)printf(%d",k)}

A)5 4 3 2 l B)0 1 2 3 4 5 C)1 2 3 4 5 D)5 4 3 2 1 0
10. 以下所列的各函数首部中,正确的是__C_____。
A)void play(vat a:Integer,var b:Integer) B)void play(int a,b)
C)void play(int a,int b) D)Sub play(a as integer,b as integer)
11. 当调用函数时,实参是一个数组名,则向函数传送的是___B____。
A)数组的长度 B)数组的首地址
C)数组每一个元素的地址 D)数组每个元素中的值
12. 在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是____B___。
A)地址传递 B)单向值传递
C)由实参传给形,再由形参传回实参 D)传递方式由用户指定
13. 以下函数值的类型是____A___。
fun(float x)
{ float y;
y=3*x-4;
return y;
}
A)int B)不确定 C)void D)float

二、读程序写结果


1.The final result is:4
2.125
3.9
4.0,0
0,2
5.8, 17
6.5 6
7.31
8.57
9.2 6
10.15
11.4


1.

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("The final result is:%d\n",fun1(x,y));
  }

2.

int x;
main()
  { x=5;
    cude();
    printf("%d\n",x);
  }
cude()
  { x=x*x*x; }

3.

#include 
 	   long fun(int n)
{ long s;
if(n==1||n==2)  
s=2;
else   
s=n+fun(n-1);
return s;
}
	    main()
          { printf("%ld\n",fun(4)); 
}

4.

 main()
          { int i;
for(i=0;i<2;i++)
   add();
          }
        add()
          { int x=0;
static int y=0;
printf("%d,%d\n",x,y);
x++; y=y+2;
          }
 

5.

 main()
          { int k=4,m=1,p;
p=func(k,m); printf("%d, ",p);
p=func(k,m); printf("%d\n",p);
          }
        func(int a,int b)
          { static int m=0,i=2;
i+=m+1; m=i+a+b;
return  m;
          }
 int t(int x,int y,int cp,int dp)
{ cp=x*x+y*y;
dp=x*x-y*y;
} 
main()
{ int a=4,b=3,c=5,d=6t(a,b,c,d)printf("%d%d\n",c,d)}
  fun(int x,int y,int z)
{z=x*x+y*y;}
main()
{  int a=31fun(52,a)printf("%d",a)}
  int a,b;
void fun()
{ a=100;b=200}
main()
{ int a=5,b=7fun()printf("%d%d\n",a,b)}
 int x=3main()
{int i;
for(i=1;i<x;i++) incre()}
incre()
{static int x=1;
x*=x+l;
printf("%d",x)}
  int func(int a,intb)
{ return(a+b)}
main()
{int x=2,y=5,z=8,r;
r=func(func(x,y),z)printf("%d\n",r)}
  long fib(int n)
{ if(n>2)return(fib(n-1)+fib(n-2))else return(2)}
main()
{ printf("%ld\n",fib(3)}}

三、填空题
1.编写一个验证正整数M是否为素数的函数,若M是素数则把1送到T中,否则零送到T中。在主函数中读入N个正整数,每读入一个则调用函数判断它是否为素数,在主函数中将T的值累加到另一个变量中。用此方法可求出N个数中素数的个数。请填空完成上述功能的程序。

       #include
       #include
       int prime(int m) 
        { int i,pp=1;
          for (i=2;  (1)  ;i++)
            if (m % i==0) pp=0;
          if (m==1)    (2)   
          return(pp);
        }
main()
       { int a[20],i,sum=0;
         for(i=0;i<10;i++)
           { scanf("%d",&a[i]);
             sum=  (3)   
           }
         printf("the number of prime data is:%d",sum);
}

(1) i (2) pp=0;
(3) sum+prime(a[i]);

2.编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述的结果。请填空完成上述功能的程序。

     #include
       #include
       void fltj(char str[],int a[]) 
         { int ll,i;
           ll=  (1)  
           for (i=0;i<ll;i++)
             { if (  (2)   ) a[0]++;
               else if (  (3)   ) a[1]++;
               else if (  (4)   ) a[2]++;
               else a[3]++;
      }
}   
       main()
        { static char str[60];
          static int a[4]={0,0,0,0};
          gets(str);
          fltj(str,a);
          printf("%s char:%d digit:%d space:%d other:%d",
str,a[0],a[1],a[2],a[3]);
 }

(1) strlen(str);
(2) str[i]>=’A’ && str[i]<=’Z’ || str[i]>=’a’ && str[i]<=’z’
(3) str[i]>=’0’ && str[i]<=’9’
(4) str[i]= =’ ’
3.用递归方法求N阶勒让德多项式的值,递归公式为

       #include
       main()
        { float pn();
          float x,lyd;
          int n;
          scanf("%d%f",&n,&x);
          lyd=  (1) 
          printf("pn=%f",lyd);
}
float pn(float x,int n)
        { float temp;
          if (n==0) temp=  (2) 
          else if (n==1) temp=  (3)  
          else temp=  (4)  
          return(temp);
 }

(1) pn(x,n);
(2) 1;
(3) x;
(4) ((2*n-1)xpn(x,n-1)-(n-1)*pn(x,n-2))/n;
4.以下函数的功能是:求x的y次方,请填空。

double fun(double x,int y)
{int i;
double z:
for(i=1,z=x;i<y;i++)z=z*__(1)___;
return z:
}

x

四、编程
1.编写一函数判断某数是否素数。
2.编写一函数求三个整数的最大值。
3.打印出3到1100之间的全部素数(判素数由函数实现)。
4.写一函数,使给定的一个二维数组(3×3)转置,即行列互换。
5.写一函数,将两个字符串连接,即编写一strcat函数。
6.写一函数,求一字符串长度,即编写一strlen函数。
7.写一函数将字符数组s1中的全部字符复制到字符数组s2中,不用strcpy函数。
8.写一函数判断某数是否“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方和等于该数本身。例如 153是一个水仙花数,因为 153= 。
9.在主函数内任意输入一个5×6矩阵,编写一函数求出每一行的和放到一个一维数组中,输出此矩阵及其每一行的和。
10.写一主函数输入一数组,写一子函数实现对该数组的冒泡排序并输出。
11.任意输入20个正整数,找出其中的素数,并将这些素数按由小到大排序。要求:判断一个数是否为素数用函数实现;排序用函数实现。
12.编写计算m的n次方的递归函数。
13.编一个程序,读入具有5个元素的整型数组,然后调用一个函数,递归计算这些元素的积。
14.编一个程序,读入具有5个元素的实型数组,然后调用一个函数,递归地找出其中的最大元素,并指出它位置。

第七单元 指 针

一、选择题
1、 若有以下定义和语句,且0≤i<10则对数组元素的错误引用是 C 。
int a[10]={1,2,3,4,5,6,7,8,9,10},*p,i;
p=a;
A. *(a+i) B. a[p-a] C. p+i D. *(&a[i])
2、 若有定义:int a[3][4]; , D 不能表示数组元素a[1][1] 。
A. *(a[1]+1) B. (&a[1][1]) C. ((a+1)[1]) D. *(a+5)
3、 对如下定义,以下说法中正确的是 D 。
char *a[2]={ “abcd”,“ABCD”};
A.数组a的元素值分别为"abcd"和"ABCD"
B.a是指针变量,它指向含有两个数组元素的字符型数组
C.数组a的两个元素分别存放的是含有4个字符的一维数组的首地址
D.数组a的两个元素中各自存放了字符’a’、’A’的地址
4、 char *s="\t\Name\Address\n";
指针s所指字符串的长度为: D 。
A. 说明不合法 B. 19 C. 18 D. 15
5、 分析下面函数,以下说法正确的是 D 。
swap(int *p1,int *p2)
{ int *p;
p=p1; p1=p2; p2=p;
}
A. 交换
p1和
p2的值 B. 正确,但无法改变
p1和
p2的值
C. 交换
p1和
p2的地址 D. 可能造成系统故障,因为使用了空指针
6、 设有说明int (*ptr)[M]; 其中ptr是 C 。
A. M个指向整型变量的指针
B. 指向M个整型变量的函数指针
C. 一个指向具有M个整型元素的一维数组的指针
D. 具有M个指针元素的一维指针数组,每个元素都只能指向整型量
7、 在说明语句:int *f(); 中,标识符代表的是: D 。
A. 一个用于指向整型数据的指针变量 B. 一个用于指向一维数组的指针
C. 一个用于指向函数的指针变量 D. 一个返回值为指针型的函数名
8、 若int x ,*pb; ,则正确的赋值表达式是 A 。
A. pb=&x B. pb=x; C. *pb=&x; D. *pb=*x
9、 有如下程序段
int *p ,a=10 ,b=1 ;
p=&a ; a=*p+b ;
执行该程序段后,a 的值为 B 。
A. 12 B. 11 C. 10 D. 编译出错
10、若有以下定义和语句:D
double r=99 , *p=&r ;
p=r ;
则以下正确的叙述是 。
A. 以上两处的
p 含义相同,都说明给指针变量p 赋值
B. 在"double r=99,*p=&r;“中,把r 的地址赋值给了p 所指的存储单元
C. 语句”*p=r;“把变量r 的值赋给指针变量p
D. 语句”*p=r;“取变量r 的值放回r 中
11、要求函数的功能是交换x 和y 中的值,且通过正确调用返回交换结果.能正确执行
此功能的函数是 D 。
A. funa (int *x,int *y) { int *p; *p=*x; *x=*y;*y=*p; }
B. fund (int x,int y) { int t; t=x;x=y;y=t; }
C. func (int *x,int *y) { *x=*y;*y=*x;}
D. fund (int *x,int *y) { *x=*x+*y;*y=*x-*y;*x=*x-*y; }
12、若有说明:long *p ,a;则不能通过scanf 语句正确给输入项读入数据的程序段是 A 。
A. *p=&a; scanf(”%ld",p);
B. p=(long *)malloc(8); scanf("%ld",p);
C. scanf("%ld",p=&a);
D. scanf("%ld",&a);
13、对于类型相同的两个指针变量之间,不能进行的运算是 C 。
A. < B. = C. + D. -
14、若已定义:int a[9] ,*p=a;并在以后的语句中未改变p 的值,不能表示a[1] 地址的表达式是 C 。
A. p+1 B. a+1 C. a++ D. ++p
15、若有以下说明:
int a[10]={1,2,3,4,5,6,7,8,9,10} ,*p=a ;
则数值为6 的表达式是 C 。
A. *p+6 B. *(p+6) C. *p+=5 D. p+5
16、设P1 和P2 是指向同一个int 型一维数组的指针变量,k 为int 型变量,则不能正确执行的语句是 B 。
A. k=*P1+*P2; B. p2=k; C. P1=P2; D. k=*P1 * (*P2);
17、若有以下的定义:
int a[ ]={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10} , *p=a ;
则值为3 的表式是 A 。
A. p+=2 , (p++) B. p+=2 ,++p
C. p+=3 , *p++ D. p+=2 ,++*p
18、若有以下定义和语句:
int a[10]={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10} ,*p=a ;
则不能表示a 数组元素的表达式是 B 。
A. *p B. a[10] C. *a D. a[p-a]
19、有如下说明
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
则数值为9 的表达式是 B 。
A. *p+9 B. *(p+8) C. *p+=9 D. p+8
20、下面程序输出数组中的最大值,由s 指针指向该元素.

void main()
	{  int a[10]={67291105843}*p,*s;
	   for(p=a, s=a; p-a<10; p++if(【        】)s=p;
	   printf("The max:%d"*s):
	}
则在if 语句中的判断表达式应该是  B       。
A. p>s       B. *p>*s       C. a[p]>a[s]       D. p-a>p-s

21、若有以下定义和语句:
int a[10]={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10} ,*p=a ;
则不能表示a 数组元素的表达式是 B 。
A. *p B. a[10] C. *a D. a[p-a]
22、若有以下定义和语句:
int w[2][3] ,(*pw)[3] ; pw=w ;
则对w 数组元素非法引用是 B 。
A. *(w[0]+2) B. *(pw+1)[2] C. pw[0][0] D. *(pw[1]+2)
23、有以下说明和语句,则 D 是对c 数组元素的正确引用。
int c[4][5] , (*cp)[5] ;
cp=c ;
A. cp+1 B. *(cp+3) C. *(cp+1)+3 D. *(*cp+2)
24、设有如下的程序段:
char str[ ]=“Hello” ;
char ptr ;
ptr=str ;
执行上面的程序段后 ,
(ptr+5)的值为 B 。
A. ‘o’ B. ‘\0’ C. 不确定的值 D. 'o’的地址
25、下面函数的功能是 B 。
sss(char *s ,char *t )
{ while((*s)&&(*t)&&(*t++== *s++)) ;
return(*s-*t) ; }
A. 求字符串的长度 B. 比较两个字符串的大小
C. 将字符串s 复制到字符串t 中 D. 将字符串s 接续到字符串t 中
26、下面各语句行中,能正确进行字符串赋值操作的语句是 C 。
A. char ST[5]={“ABCDE”}; B. char S[5]={‘A’,‘B’,‘C’,‘D’,‘E’};
C. char *S; S=“ABCDE”; D. char *S; scanf("%S",S);
27、下列函数的功能是 A 。
int fun1(char * x)
{ char *y=x;
while(*y++) ;
return(y-x-1);}
A. 求字符串的长度 B. 比较两个字符串的大小
C. 将字符串X 复制到字符串Y D. 将字符串X 连接到字符串Y 后面
28、请读程序:

#include < stdio.h>
		#include < string.h>
		void main( )
		{  char *S1="ABCDEF"*s2="aB";
		   s1++; s2++;
		   printf("%d\n", strcmp( s1,s2));
		}
上面程序的输出结果是      A   。
A. 正数         B. 负数         C. 零         D. 不确定的值

29、设有如下定义:
int (*ptr)( );
则以下叙述中正确的是 C 。
A. ptr 是指向一维组数的指针变量
B. ptr 是指向int 型数据的指针变量
C. ptr 是指向函数的指针 ;该函数返回一个int 型数据
D. ptr 是一个函数名 ;该函数的返回值是指向int 型数据的指针
30、若有函数max(a ,b),并且已使函数指针变量p 指向函数max ,当调用该函数时,正确的调用方法是 C 。
A. (*p)max(a ,b); B. *pmax(a ,b);C. (*p)(a ,b) ; D. *p(a ,b);
31、已有函数max(a,b),为了让函数指针变量p 指向函数max,正确的赋值方法是 A 。
A. p=max; B. *p=max; C. p=max(a,b); D. *p=max(a,b);
32、已有定义 int (*p)();指针p 可以 B 。
A. 代表函数的返回值 B. 指向函数的入口地址
C. 表示函数的类型 D. 表示函数返回值的类型
33、若有以下说明和定义
fun(int *c){ }
void main()
{ int (*a)()=fun,*b(),w[10],c;

}
在必要的赋值之后,对fun 函数的正确调用语句是 B 。
A. a=a(w); B.(*a)(&c); C. b=*b(w); D. fun(b);
34、设有如下定义:
char *aa[2]={“abcd”,“ABCD”};
则以下说法中正确的是 D 。
A. aa 数组成元素的值分别是"abcd"和ABCD"
B. aa 是指针变量,它指向含有两个数组元素的字符型一维数组
C. aa 数组的两个元素分别存放着含有4 个字符的一维字符数组的首地址
D. aa 数组的两个元素中各自存放了字符’a’和’A’的地址
35、以下正确的叙述是 C 。
A. C 语言允许main 函数带形数,且形参个数和形参名均可由用户指定
B. C 语言允许main 函数带形参,形参名只能是argc 和argv
C. 当main 函数带有形参时,传给形参的值只能从命令行中得到
D. 有说明: main(int argc,char *argv),则形参argc 的值必须大于1
36、若有说明:int i, j=2,p=&i;,则能完成i=j 赋值功能的语句是 B 。
A. i=p; B. p=
&j; C. i=&j; D. i=**p;
二、读程序题,写出程序运行的结果。
1、

#include 
void main()
{  int *p1,*p2,*p;
   int a=5,b=8;
   p1=&a; p2=&b;
   if(a<b) { p=p1; p1=p2; p2=p;}
   printf("%d,%d\n",*p1,*p2);
   printf("%d,%d\n",a,b);
}

8,5
5,8
2、

void ast(int x,int y,int *cp,int *dp)
{ *cp=x+y; *dp=x-y; }
void main()
{ int a,b,c,d;
  a=4; b=3;
  ast(a,b,&c,&d);
  printf("%d,%d\n",c,d);
}

7,1
3、

void main()
	{  int a[]={2,4,6,8,10};
	   int y=1,x,*p;
	   p=&a[1];
	   for(x=0;x<3;x++)  y+=*(p+x);
	   printf("y=%d\n",y);
	}

y=19
4、

void main()
	{  int a[2][3]={1,2,3,4,5,6};
	   int m,*ptr;
	   ptr=&a[0][0];
	   m=(*ptr)*(*(ptr+2))*(*(ptr+4));
	   printf("%d\n",m);
	}

15
5、

void prtv(int * x)
	{  printf("%d\n",++*x);
	}
	void main()
	{  int a=25 ;prtv(&a);
	}

26
6、

void fun(int *a, int *b, int *c)
{  int *temp;
   temp=a; a=b; b=temp;
   *temp=*b, *b=*c; *c=*temp;
}
void main()
{  int a,b,c,*p1,*p2,*p3;
   a=5; b=7; c=3;
   p1=&a; p2=&b; p3=&c;
   fun(p1,p2,p3);
   printf("%d,%d,%d\n",a,b,c);
}

3,7,3
7、

#include      
	void main()
	{  static int a[2][3]={1,3,5,2,4,6};
	   int *add[2][3]={*a,*a+1,*a+2,*(a+1),*(a+1)+1,*(a+1)+2};
	   int **p,i;
	   p=add[0];
	   for(i=0;i<6;i++)
	    { printf("%d  ",**p);  p++;}
	   printf("\n");
	}

1 3 5 2 4 6
8、

void main()
	{ char s[]="ABCD",*p;
	  for(p=s+1;p<s+4;p++)   
	     printf("%s\n",p);
	}

BCD
CD
D
9、

int fa(int x)
	{ return x*x; }
	int fb(int x)
	{ return x*x*x; }
	int f(int (*f1)(),int (*f2)(),int x)
	{ return f2(x)-f1(x); }
	void main()
	{ int i;
	  i=f(fa,fb,2); printf(%d\n”,i);
	}

4
10、

#include 
#include 
void main()
{  char b1[8]="abcdefg",b2[8],*pb=b1+3;
  while (--pb>=b1) strcpy(b2,pb);
  printf("%d\n",strlen(b2));
}

7
11、

char cchar(char ch)
	{ if (ch>=‘A’&&ch<=‘Z') 
ch=ch-‘A'+‘a';
	  return ch;
	}
	void main()
	{ char s[]="ABC+abc=defDEF",*p=s;
	  while(*p)
	  { *p=cchar(*p);
	    p++;
	  }
	  printf("%s\n",s);
	}

abc+abc=defdef
12、

void main( )
{  int a[5]={2,4,6,8,10},*p,* *k;
   p=a; k=&p;
   printf("%d",*(p++));
   printf("%d\n",* *k);
}

24
13、

funa(int a,int b ) { return a+b;}
	funb(int a,int b ) { return a-b;}
	sub( int (*t)( ),int x,int y )
	{ return ((*t)(x,y));}
	void main( )
	{ int x ,(*p)( );
	  p=funa;
	  x=sub(p,9,3);
	  x+=sub(funb,8,3);
	  printf("%d\n",x);
	}

17
14、

	void main( )
	{ char *s="12134211"; 
int v[4]={0,0,0,0} ;
	  int k,i;
	  for(k=0;s[k];k++)
	  { switch(s[k])
	    { case '1':i=0;
	      case '2':i=1;
	      case '3':i=2;
	      case '4':i=3;
	    }
	    v[i]++;
	  }
	  for(k=0;k<4;k++) printf("%d",v[k]);
	}

0008
15、

# include "ctype.h"
	void space(char *str)
	{ int i ,t ;
	  char ts[81];
	  for(i=0,t=0 ;str[i]!='\0' ;i+=2)
	  if(! isspace(*(str+i))&&(*(str+i)!='a'))
	  ts[t++]=toupper(str[i]) ;
	  ts[t]='\0' ; strcpy(str ,ts) ;
	}
	void main( )
	{ char s[81]={"abcdefg"} ;
	  space(s); puts(s);
	}

CEG
16、

#include
	sub1(char a ,char b) { char c ; c=a ;a=b ;b=c ;}
	sub2(char * a ,char b) { char c ; c=*a ;*a=b ;b=c ;}
	sub3(char * a ,char *b){ char c ; c=*a ;*a=*b ;*b=c ;}
	void main()
	{  char a ,b ;
	   a='A' ;b='B' ;sub3(&a ,&b) ;
	   putchar(a) ;putchar(b) ;
	   a='A' ;b='B' ;sub2(&a ,b) ;
	   putchar(a) ;putchar(b) ;
	   a='A' ;b='B' ;sub1(a ,b) ;
	   putchar(a) ;putchar(b) ;
	}

BABBAB
17、

void main()
	{  char b[ ]="ABCDEFG";
	   char *chp=&b[7];
	   while(--chp>&b[0])
	   putchar(*chp);
	   putchar('\n');
	}

GFEDCB
18、

void prtv(int * x)
	{  printf("%d\n",++*x);
	}
	void main()
	{  int a=25 ;prtv(&a);
	}

26
19、

int aa[3][3]={{2},{4},{6}};
	void main()
	{ int i ,*p=&aa[0][0];
	  for(i=0;i<2;i++)
	  { if(i==1) aa[i][i+1]=*p+1;
	    else ++p;
	    printf("%d",*p);
	  }
	}

00
20、

int f(int b[ ],int n)
	{ int i ,r=1;
	  for(i=0;i<=n;i++) r=r*b[i];
	  return r;
	}
	void main()
	{ int x,a[]={2,3,4,5,6,7,8,9};
	  x=f(a,3);
	  printf("%d\n",x);
	}

120
21、

#define PR(ar) printf("%d",ar)
	void main( )
	{ int j ,a[ ]={1,3,5,7,9,11,13,15},*p=a+5;
	  for(j=3;j;j--)
	  { switch(j)
	    { case 1:
	      case 2:PR(*p++);break;
	      case 3:PR(*(--p));
	    }
	  }
	}

9911
22、

#include
	void main()
	{ int a[ ]={ 1 ,2 ,3 ,4 } ,i ;
	  void sub( int *s ,int y);
	  int x=0 ;
	  for(i=0 ; i<4 ; i++)
	  {  sub(a ,x) ; printf("%d" ,x) ;
	  }
	  printf("\n") ;
	}
	void sub( int *s ,int y)
	{  static int t=3 ;
	   y=s[t] ; t-- ;
	}

0000
23、

#include< stdio.h>
	void FUN( int *S)
	{  static int J=0;
	   do {S[J] +=S[J+1];}while( ++J<2);}
	void main()
	{  int K, A[10]={ 1,2,3,4,5};
	   for( K=1;K<3;K++) FUN(A);
	   for(K=0;K<5;K++) printf("%d",A[K]);
	}

35745
24、

#include
fun (int * s ,int n1 ,int n2)
{  int i , j , t ;
   i=n1 ; j=n2 ;
   while(i<j)
   { t= *(s+ i) ;
     *(s+i)= *(s+j) ;
     *(s+j)=t ;
     i++ ; j-- ;
   } 
}
void main()
{ int a[10]={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,0} ,i ,*p=a;
  fun (p ,0 ,3) ;
  fun(p ,4 ,9) ;
  fun(p ,0 ,9) ;
  for(i=0 ; i<10 ; i++) printf("%d" , *(a+i));
  printf("\n") ;
}

5678901234
25、

void as( int x ,int y ,int *cp ,int *dp)
	{ *cp=x+y;*dp=x-y;}
	void main()
	{  int a=4 ,b=3 ,c ,d ;
	   as(a ,b ,&c ,&d);
	   printf("%d %d\n",c,d);
	}

7 1
26、

void func(int *a,int b[ ])
	{ b[0]=*a+6; }
	main()
	{  int a ,b[5];
	   a=0; b[0]=3;
	   func(&a,b);
	   printf("%d \n",b[0]);
	}

6
27、

#include 
	sub(int x ,int y ,int *z)
	 { *z=y-x ; }
	main()
	{  int a , b , c ;
	   sub(10 ,5 ,&a) ;
	   sub(7 ,a ,&b) ;
	   sub(a ,b ,&c) ;
	  printf("%d ,%d ,%d\n" ,a ,b ,c) ;
	}

-5,-12,-7
三、填空题
1.在数组中同时查找最大元素下标和最小元素下标,分别存放在main函数的变量max 和min中。

 #include 
	   void find(int *a,int *max,int *min)
	  { int i;
	    *max=*min=0;
	    for(i=1;i<n;i++)
	       if(a[i]>a[*max])        (1)      ;
	       else if(a[i]<a[*min])      (2)      ;
	    return;
	  }
	   main()
	  { int a[]={5,8,7,6,2,7,3};
	    int max,min;
	    find(     (3)      );
	    printf("%d,%d\n",max,min);
	  }

(1) *max=i
(2) *min=i
(3) a,&max,&min
2.写一函数,实现两个字符串的比较。即自己写一个strcmp函数:compare(s1,s2)。 如果s1=s2,返回值为0,如果s1≠s2,返回它们二者第一个不同字符的ASCⅡ码差 值(“BOY"与"BAD”,第二个字母不同,"O"与"A"之差为79-65=14)。如果s1>s2,则 输出正值,如s1

   compare(char *p1,char *p2)
	      { int i;
	        i=0;
	        while(  (1)  )
	          if(*(p1+i++)=='\0')    (2)  
	        return(   (3)  );   
	      }
	  main()
      { int m;
        char str1[20],str2[20],*p1,*p2;
        printf("please input string by line:\n");
        scanf("%s",str1);
        scanf("%s",str2);
        p1=   (4)  
        p2=   (5)  
        m=compare(p1,p2);
        printf("the result is:%d\n",m);
}

(1) (p1+i)==(p2+i)
(2) return(0);
(3) (p1+i)-(p2+i)
(4) str1;
(5) str2;
3.有一个班4个学生,5门课。(1)求第一门课的平均分;(2)找出有2门以上课程不及 格的学生,输出他们的学号和全部课程成绩和平均成绩;(3)找出平均成绩在90分 以上或全部课程成绩在85分以上的学生。分别编三个函数实现以上要求。

 #include
 main()
 { int i,j,*pnum,num[4];
   float score[4][5],aver[4],*psco,*pave;
   char course[5][10],*pcou;
   pcou=&course[0];
   printf("please input the course name by line:\n");
   for (i=0;i<5;i++)
     scanf("%s",pcou+10*i);
   printf("please input stu num and grade:\n");
   printf("stu num:\n");
   for(i=0;i<5;i++)
     printf("%s",pcou+10*i);
   printf("\n");
   psco=&score[0][0];
   pnum=&num[0];
   for(i=0;i<4;i++)
    { scanf("%d",pnum+i);
      for(j=0;j<5;j++)
        scanf("%f",psco+5*i+j);
    }
   pave=&aver[0];
   avsco(psco,pave);
   avcour1(pcou,psco);
   fail2(pcou,pnum,psco,pave);
   printf("\n");
   good(pcou,pnum,psco,pave);
 }
 avsco(float *psco,float *pave)
  { int i,j;
  float sum,average;
   for(i=0;i<4;i++)
     { sum=0;
       for(j=0;j<5;j++)
          sum=sum+   (1)  ;
       average=sum/5;
       *(pave+i)=   (2)  ;
     }
  }
 avcour1(char *pcou,float *psco) 
  {int i;
   float sum=0, average1;
   for (i=0;i<4;i++)
      sum=sum+   (3)  ;
   average1=   (4)  ;
  printf("the first course %s ,average is:%5.2f\n",pcou,average1);
  }
 fail2(char *pcou,int *pnum,float *psco,float *pave)
  {int i,j,k,label;
   printf("stu num:");
   for(i=0;i<5;i++)
     printf("%-8s",pcou+10*i);
   printf("average:\n");
   for(i=0;i<4;i++)
    { label=0;
      for(j=0;j<5;j++)
        if(   (5)  ) label++;
      if (label>=2)
        { printf("%-8s",*(pnum+i));
          for(k=0;k<5;k++)   printf("%-8.2f",   (6)  );
          printf("%-8.2f\n",   (7)  );
         }
       }
     }
 good(char *pcou,int *pnum,float *psco,float *pave)
  { int i,j,k,label;
    printf("=======good students=======\n");
    printf("  stu num");
    for (i=0;i<5;i++)
     { label=0;
       for (j=0;j<5;j++)   printf("%-8s",pcou+10*j);
       printf("   average\n");
       for (i=0;i<4;i++)
        { label=0;
          for(j=0;j<5;j++)
            if(*(psco+5*i+j)>85.0) label++;
          if(label>=5||(*(pave+i)>90))
            { printf("%-8d",*(pnum+i));
              for(k=0;k<5;k++)
                printf("  %-8.2f",   (8)  );
              printf("  %-8.2f\n",*(pave+i));
            }
         }
       }
    }

(1) (psco+5i+j)
(2) average
(3) (psco+5i)
(4) sum/4
(5) (psco+5i+j)<60
(6) (psco+5i+k)
(7) *(pave+i)
(8) (psco+5i+k)
4.输入一个字符串,内有数字和非数字字符,如:
a123x456 17960?302tab5876
将其中连续的数字作为一个整数,依次存放到一数组a中。例如,123放在a[0],456 放在a[1],……。统计共有多少个整数,并输出这些数。

  #include
    main()
     { char str[80],*pstr;
       int i,j,k,m,e10,digit,ndigit,a[10],*pa;
       printf("\nplease input the string:\n"); gets(str);
       pstr=&str[0];
       pa=&a[0];
       ndigit=0;
       i=0; j=0;
       while (   (1)  )
        { if ((*(pstr+i)>='0')&&(*(pstr+i)<='9'))  j++;
          else
            { if(j>0)
               { digit=*(pstr+i-1)-48;
                 k=1;
          while(k<j)
                   { e10=1;
                     for (m=1;m<=k;m++)
                         e10=   (2)  ;
                     digit=   (3)  ;
                     k++;
                   }
                *pa=digit;
                ndigit++;
                pa++;
                j=0;
              }
           }
           i++;
         }
        if(j>0)
          { digit=*(pstr+i-1)-48;
      k=1;
      while(k<j)
              { e10=1;
                for(m=1;m<=k;m++)  e10=e10*10;
                digit=digit+(*(pstr+i-1-k)-48)*e10;
                k++;
              }
            *pa=digit;
              (4)  
            j=0;
          }
        printf("there are %d number digit \n",ndigit);
        j=0;  pa=&a[0];
        for(j=0;j<ndigit;j++)
          printf("%d ",*(pa+j));
        printf("\n");
     }

(1) str[i]!=’\0’
(2) e1010
(3) digit+(
(pstr+i-1-m)-48)*e10
(4) ndigit++;

四、编程题
1、输入三个整数,按由小到大的顺序输出。
2、输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数:①输入10个数;②进行处理;③输出10个数。
3、有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。
4、写一函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。
5、写一函数,将一个3×3的矩阵转置。
6、在主函数中输入10个等长的字符串。用另一函数对它们排序。然后在主函数输出这10个已排好序的字符串。
7、编一程序,打入月份号,输出该月的英文月名。例如,输入"3",则输出"March",要求用指针数组处理。
8、写一函数完成查找串s2在串s1中第一次出现的位置。
9、写一函数完成将无符号十进制整数转换成十六进制字符表示并存于字符串数组中。
10、用指向指针的指针的方法对N个整数排序并输出。要求排序单独写成一个函数。N个整数和N在主程序中输入,最后在主函数中输出。

第八单元 结构体和共用体

一、选择题
1、 说明一个结构体变量时系统分配给它的内存是 A 。
A. 各成员所需要内存量的总和
B. 结构体中第一个成员所需内存量
C. 成员中占内存量最大者所需的容量
D. 结构中最后一个成员所需内存量
2、 C 语言结构体类型变量在程序执行期间 A 。
A. 所有成员一直驻留在内存中
B. 只有一个成员驻留在内存中
C. 部分成员驻留在在内存中
D. 没有成员驻留在内存中
3、 设有以下说明语句
struct stu { int a ; float b ; } stutype ;
则下面的叙述不正确的是 C 。
A. struct 是结构体类型的关键字
B. struct stu 是用户定义的结构体类型
C. stutype 是用户定义的结构体类型名
D. a 和b 都是结构体成员名
4、 程序中有下面的说明和定义
struct abc { int x;char y;}
struct abc s1,s2;
则会发生的情况是 A 。
A. 编译出错
B. 程序将顺利编译、连接、执行
C. 能顺利通过编译、连接、但不能执行
D. 能顺利通过编译、但连接出错
5、 有如下定义
struct person { char name[9]; int age;};
struct person class[10]={ " Johu", 17,“Paul”, 19,“Mary”, 18,“Adam”,
16};
根据上述定义,能输出字母M 的语句是 D 。
A. prinft(" %c\n",class[3].name);
B. printf(" %c\n",class[3].name[1]);
C. prinft(" %c\n",class[2].name[1]);
D. printf(" %c\n",class[2].name[0]);
6、 下面程序的输出是 D 。
A. 0 B. 1 C. 3 D. 6
main()
{ struct cmplx { int x; int y;} cnum[2]={1,3,2,7};
printf("%d\n",cnum[0].y/cnum[0].x*cnum[1].x);}
7、 设有如下定义:
struct sk {int a ;float b ;}data ,*p ;
若有p=&data ; ,则对data 中的a 域的正确引用是 B 。
A.(*p).data.a B.(*p).a C.p->data.a D.p.data.a
8、 当说明一个共用体变量时系统分配给它的内存是 C 。
A. 各成员所需要内存量的总和
B. 共用体中第一个成员所需内存量
C. 成员中占内存量最大者所需的容量
D. 共用体中最后一个成员所需内存量
9、 以下对C 语言中共用体类型数据的叙述正确的是 C 。
A. 可以对共用体变量名直接赋值
B. 一个共用体变量中可以同时存放其所有成员
C. 一个共用体变量中不可以同时存放其所有成员
D. 共用体类型定义中不能出现结构体类型的成员
10、C 语言共用体类型变量在程序运行期间 B 。
A. 所有成员一直驻留在内存中
B. 只有一个成员驻留在内存中
C. 部分成员驻留在在内存中
D. 没有成员驻留在内存中
11、以下对枚举类型名的定义中正确的是 B 。
A. enum a={one ,two ,three} ;
B. enum a {one=9 ,two=-1 ,three} ;
C. enum a={“one” ,“two” ,“three”} ;
D. enum a {“one” ,“two” ,“three”} ;
12、设有如下枚举类型定义:
enum language { Basic=3 ,Assembly ,Ada=100 ,COBOL ,Fortran} ;
枚举量Fortran 的值为 C 。
A. 4 B. 7 C. 102 D. 103
13、下面对的叙述中不正确的是 B 。
A. 用typedef 可以定义各种类型名,但不能用来定义变量
B. 用typedef 可以增加新类型
C. 用typedef 只是将已存在的类型用一个新的标识符来代表
D. 使用typedef 有利于程序的通用和移植
14、以下各选项企图说明一种新的类型名,其中正确的是 C 。
A. typedef v1 int; B. typedef v2=int;
C. typedefv1 int v3; D. typedef v4: int;
15、设有以下说明语句
typedef struct
{ int n;
char ch[8];
}PER;
则下面叙述中正确的是 B 。
A. PER 是结构体变量名 B. PER 是结构体类型名
C. typedef struct 是结构体类型 D. struct 是结构体类型名
16、设有如下定义:
struck sk
{ int a;
float b;
} data;
int *p;
若要使p 指向data 中的a 域,正确的赋值语句是 C 。
A. p=&a; B. p=data.a; C. p=&data.a; D. *p=data.a;

二、读程序题,写出程序运行的结果。


1、 6
2、 Zhao
3、 04515
4、 51, 60, 21
5、 0
6、 270.00
7、 40
8、 80


1、

#include 
struct abc { int a, b, c; };
main()
{ struct abc s[2]={{1,2,3},{4,5,6}};
  int t;
  t=s[0].a+s[1].b;
  printf("%d \n",t);
}

2、

#include 
	struct stu
	{ int num;char name[10]; int age;};
	void fun(struct stu *p)
	{ printf("%s\n" ,(*p).name); }
	void main()
	{ struct stu students[3]={{9801,"Zhang",20} ,{9802,"Wang", 19} ,
	  {9803,"Zhao",18} };
	  fun(students+2);
	}

3、

#include 
	void main()
	{ enum team { my ,your=4 ,his ,her=his+10};
	  printf("%d%d%d%d\n",my,your,his,her);
	}

4、

#include 
	struct st { int x;int *y;} *p ;
	int dt[4]={10,20,30,40};
	struct st aa[4]={50,&dt[0],60,&dt[1],70,&dt[2],80,&dt[3] };
	void main()
	{ p=aa;
	  printf("%d, ", ++p->x);
	  printf("%d, ",(++p)->x);
	  printf("%d\n",++(*p->y));
	}

5、

#include 
	union myun
	{  struct
	   {  int x, y, z; } u;
	   int k;
	} a;
	void main()
	{  a.u.x=4; a.u.y=5; a.u.z=6;
	   a.k=0;
	   printf("%d\n",a.u.x);
	}

6、

#include 
	struct STU
	{ char num[10]; float score[3]; };
	void main()
	{  struct STU s[3]={{20021,90,95,85},{20022,95,80,75},
	       {20023,100,95,90}},*p=s;
	   int i; float sum=0;
	   for(i=0;i<3;i++)
	      sum=sum+p->score[i];
	   printf(%6.2f\n”,sum);
	}

7、

#include 
	#include 
	struct NODE
	{ int num; struct NODE *next; };
	void main()
	{ struct NODE *p,*q,*r;
	  p=(struct NODE*)malloc(sizeof(struct NODE));
	  q=(struct NODE*)malloc(sizeof(struct NODE));
	  r=(struct NODE*)malloc(sizeof(struct NODE));
	  p->num=10; q->num=20; r->num=30;
	  p->next=q;q->next=r;
	  printf(%d\n”,p->num+q->next->num);
	}

8、

#include 
	typedef union student
	{  char name[10];
	   long sno;
	   char sex;
	   float score[4];
	} STU;
	void main()
	{  STU a[5];
	   printf(%d\n”,sizeof(a));
	}

三、填空题
1.在C语言中,要定义一个结构体类型的变量,可采用三种方法,即 先声明结构体类型再定义变量在声明类型的同时定义变量直接定义结构体类型变量
2.编写一个程序,首先定义一个复数数据类型,即结构类型。然后按照复数的运算规则进行计算,并按照复数表示的格式进行输出。

  main()
     { struct complex
         { int re;
           int im;
}x,y,s,p;
       scanf("%d%d",&x.re,&x.im);
       scanf("%d%d",&y.re,&y.im);
       s.re=  (1)  ;
       s.im=  (2)  ;
       printf("   sum=%5d+i*%5d\n",s.re,s.im);
       p.re=  (3)  ;
       p.im=x.re*y.im+x.im*y.re;
       printf("product=%5d+i*%5d\n",p.re,p.im);
}

(1) x.re+y.re
(2) x.im+y.im
(3) x.rey.re-x.imy.im
3.有n个学生,每个学生的数据包括学号(num),姓名(name[20]),性别(sex),年龄(age),三门课的成绩(score[3])。要求在main函数中输入这n个学生的数据, 然后调用一个函数count,在该函数中计算出每个学生的总分和平均分, 然后打印出所有各项数据(包括原有的和新求出的)。

  struct student
{ int num;
        char name[20];
        char sex;
        int age;
        float score[3];
        float total;
        float ave;
      };
    void count(  (1)    b[],int n)
     { int i,j;
       for(i=0;i<n;i++)
         {   (2)  ;
	       for(j=0;j<3;j++)
	           b[i].total=  (3)  ;
	         (4)  ;
         }
      }
    void main()
     { int i;flaot s1,s2,s3;
         (5)  ;
       struct student a[3];
       for(i=0;i<3;i++)
         { scanf("%d%s %c%d%f%f%f",&a[i].num,a[i].name,&a[i].sex,
                  &a[i].age,&s0,&s1,&s2);
           a[i].score[0]=s0;a[i].score[1]=s1;a[i].score[2]=s2;
printf("%d %s  %c %d %4.1f %4.1f %4.1f\n",a[i].num,a[i].name,
a[i].sex,a[i].age,a[i].score[0],a[i].score[1],a[i].score[2]);
         }
       count(a,3);
       printf("==============================================\n");
       printf("NO name sex age score[0] score[1] score[2] total ave\n");
       for(i=0;i<3;i++)
          printf("%d  %s  %c  %d  %5.1f  %5.1f %5.1f %5.1f %5.1f\n",
            a[i].num,a[i].name,a[i].sex,a[i].age,a[i].score[0],
            a[i].score[1],a[i].score[2],a[i].total,a[i].ave);
     }

(1) struct student
(2) b[i].total=0
(3) b[i].total+b[I].score[j]
(4) b[i].ave=b[i].total/3
(5) float s1,s1,s2
4.将上题改为用指针方法处理,即用指针变量逐次指向数组元素,然后向指针变量所指向的数组元素输入数据,并将指针变量作为函数参数将地址值传给count函数, 在函数count中作统计,再将数据返回到main函数,在main函数中输出。

 struct student
    { int num;
      char name[20];
      char sex;
      int age;
      float score[3];
      float total;
      float ave;
     }a[3];
void count(  (1)  ,int n)
     { int i,j;
       for(  (2)  )
         {  (3)  ;
  	       for(j=0;j<3;j++)
	          b->total=  (4)  ;
	       b->ave=b->total/3;
         }
      }
 	main()
     {int i;
      float s0,s1,s2;
      struct student *p;
for(p=a;p<a+3;p++)
       {scanf("%d%s %c%d%f%f%f",&p->num,p->name,&p->sex,&p->age,&s0,&s1,&s2);
        p->score[0]=s0; p->score[1]=s1; p->score[2]=s2;
        printf("%d %s  %c %d %4.1f %4.1f %4.1f\n",p->num,p->name,p->sex,
          p->age,p->score[0],p->score[1],p->score[2]); 
       }
       (5)  ;
     count(p,3);
     printf("=============================================\n");     
     printf("NO  name sex age score[0] score[1] score[2] total ave\n");
     for(  (6)  )
printf("%d  %s  %c  %d  %5.1f %5.1f  %5.1f %5.1f %5.1f\n",p->num,
p->name,p->sex,p->age,p->score[0],p->score[1],p->score[2],
p->total,p->ave);
    }

(1) struct student *b
(2) i=0;i (3) b->total=0
(4) b->total+b->score[j]
(5) p=a
(6) p=a;p 5.有四名学生,每个学生包括学号、姓名、成绩, 要求找出成绩最高者的学号、姓名和成绩(用指针方法)。

    main()
     { struct student
         { int num;
	       char name[20];
	       float score;
         };
       struct student stu[4];
       struct student *p;
       int i,temp=0;
         (1)  ;
       for(  (2)  )
         { scanf("%d%s%f",&p->num,p->name,&s0); 
p->score=s0;
}
       for(  (3)  ;i<4;i++)
          if(stu[i].score>amax)
	         {amax=stu[i].score;temp=i;}
        (4)  ;
       printf(" NO: %d\n name: %s\n score: %4.1f\n",p->num,p->name,p->score);
}

(1) float amax,s0
(2) p=stu;p (3) amax=stu[0].ave,i=1
(4) p=stu+temp
6.有四名学生,每个学生包括学号、姓名、成绩, 要求按学生成绩由高到低进行排序(要求用指针数组方法)。

struct student
     { int num;
       char name[10];
       float score;
     };
    int n=4;
 	main()
     {  (1)   stu[4]={1,"sdff",34.5,2,"hfhf",67.0,3,"dgdg",90.0,4,"yd",85.0};
       struct student *p[4],*pp;
       int i,j;
       for(i=0;i<4;i++)
           (2)  ;
       printf("*********************************\n");
       for(i=0;i<4;i++)
         printf("%4d %-10s %7.1f\n",stu[i].num,stu[i].name,stu[i].score);
   for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
           if(  (3)  )
            { pp=p[i];p[i]=p[j];p[j]=pp;}
       printf("*********************************\n");
       for(  (4)  )
       printf("%4d  %-10s %7.1f\n",p[i]->num,p[i]->name,p[i]->score);
       printf("*********************************\n");
  }

(1) static struct student
(2) p[i]=&stu[i]
(3) p[j]->score>p[i]->score
(4) i=0;i<4;i++

7.打鱼还是晒网
中国有句俗语是叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”, 问这个人在以后的某一天中是在“打鱼”, 还是在“晒网”。
解题过程可分三步:
(1) 计算从1990年1月1日开始到指定日期一共有多少天;
注意:要判断经历年份中是否有闰年。如果:年能被4除尽且不能被100除尽;或能被400除尽,则是闰年,否则不是闰年。
(2) 由于“打鱼”和“晒网”的周期为5天,所以将算出的天数用5去除;
(3) 根据余数判断他是在“打鱼”还是在“晒网”;若余数为 1、2、3,则他是在打鱼,否则是在“晒网”。

   struct date
     { int year;
       int month;
       int day;
     };
   main()
    { struct date today,term;
      int yearday,year,day;
      scanf("%d%d%d",&today.year,&today.month,&today.day);
  term.month=12;term.day=31;
      for(yearday=0,year=1990;year<today.year;year++)
        { term.year=year;  yearday+=days(term); }
      yearday+= (1)  ;
      day=  (2)  ;
      if(day>0&&day<4) printf("he was fishing at that day.\n");
        (3)    printf("he was sleeping at that day\n");
    }
   days(struct date day)
    { static int day_tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
         {0,31,29,31,30,31,30,31,31,30,31,30,31}};
      int i,lp;
      
      lp=day.year%4==0&&day.year%100!=0||day.year%400==0;
      for(i=1;i<day.month;i++)
         day.day+=day_tab[lp][i];
        (4)  (day.day);
}

(1) days(today)
(2) yearday%5
(3) else
(4) return
8.已有a,b两个按学号升序排列的链表,每个链表中的结点包括学号、成绩。要求把两个链表合并, 按学号升序排列。

 #include "stdio.h"
   #define NULL 0
   #define LEN sizeof(struct student)
   struct student
    { long num;
      int score;
        (1)   *next;
    };
   	struct student listA,listB;
int n,sum=0;
main()
     {  (2)   *creat();
       struct student *insert();
       void print();
       struct student *ahead,*bhead,*abh;
       int gs=0;
       ahead=creat();
       gs=sum=n;print(ahead);printf("\n");
       bhead=creat();gs+=n;sum=n;
       print(bhead);printf("\n");
       sum=gs;
       abh=insert(ahead,bhead);
       print(abh);
 }
   struct student *creat()
    { struct student *p1,*p2,*head;
      n=0;
      p1=p2=(struct student *)malloc(LEN);
      scanf("%ld,%d",&p1->num,&p1->score);
      head=NULL;
      while(p1->num!=0)
        {   (3)  ;
        
	     if(n==1)head=p1;
	     else p2->next=p1;
	     p2=p1;
	     p1=(struct student *)malloc(LEN);
	     scanf("%ld,%d",&p1->num,&p1->score);
        }
      p2->next=NULL;
      return(head);
   }
   
      (4)   *insert(struct student *ah, struct student *bh)
     { struct student *pa1,*pa2,*pb1,*pb2;
       pa2=pa1=ah;
       pb2=pb1=bh;
       do
	    { while ((pb1->num>pa1->num)&&(pa1->next!=NULL))
	        { pa2=pa1;
	          pa1=pa1->next;
	        }
	      while(pb1->num<=pa1->num)
	       { if(ah==pa1)  ah=pb1;
	         else  pa2->next=pb1;
	         pb1=pb1->next;  pb2->next=pa1;
	         pa2=pb2;  pb2=pb1;
	       }
	     if (pb1==NULL&&pa1->next!=NULL)
	        while(pa1->next!=NULL)
	         { pa2=pa1;  pa1=pa1->next;
	         }
        }while((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL));
       if((pb1->num>pa1->num)&&(pa1->next==NULL))
          pa1->next=pb1;
       return(ah);
 }
   void print(struct student *head)
    { struct student *p;
      printf("\n%d\n",sum);
      p=head;
      if(p!=NULL)
        do {
	        printf("%ld %d\n",p->num,p->score);
	        p=p->next;
	        }while(p!=NULL);
      }

(1) struct student
(2) struct student
(3) n++
(4) struct student
9.有两个链表a,b。设结点中包含学号、姓名。从a链表中删去与b链表中所有相同学号的那些结点。

 #define LA 4
   #define LB 5
   #define NULL 0
   struct student
    { char num[6];
      char name[8];
      struct student *next;
     }a[LA],b[LB];
main()
{ struct student a[LA]={{"101","wang"},{"102","li"},
{"105","chang"},{"106","wei"}};
       struct student b[LB]={{"103","chang"},{"104","ma"},
{"105","zhang"},{"107","gou"},{"108","liu"}};
	   int i,j;
       struct student *p,*p1,*p2,*pt,*head1,*head2;
       head1=a;head2=b;
       for(p1=head1,i=1;p1<a+LA;i++)
        { p=p1;
          p1->next=a+i;
          printf("%8s%8s\n",p->num,p->name);
            (1)  ;
         }
       p->next=NULL;
       for(p2=head2,i=1;p2<b+LB;i++)
        { p=p2;  p2->next=b+i;
          printf("%8s%8s\n",p2->num,p2->name);
            (2)  ;
        }
       p->next=NULL;
       printf("\n");
         (3)  ;
       while(p1!=NULL)
	    {   (4)  ;
          while(p2!=NULL&&strcmp(p1->num,p2->num)!=0)
          
            p2=p2->next;
          if(strcmp(p1->num,p2->num)==0)
             if(p1==head1)
                head1=p1->next;
            else
                p->next=p1->next;
           p=p1;
             (5)  ;
        }
      p1=head1;
      printf("\n");
      while(p1!=NULL)
       { printf("%7s %7s\n",p1->num,p1->name);
         p1=p1->next;
       }
}

(1) p1=p1->next
(2) p2=p2->next
(3) p1=head1
(4) p2=head2
(5) p1=p1->next
10.将一个链表按逆序排列,即将链头当链尾,链尾当链头。

   #define NULL 0
   struct line
    { int num;
        (1)   *next;
    };
   main()
    { int len=1,i;
      struct line *p1,*p2,*head,*new,*newhead;
      
      p1=p2=head=(struct line *)malloc(sizeof(struct line));
      scanf("%d",&p1->num);
      while(p1->num!=0)
        { p1=(struct line *)malloc(sizeof(struct line));
          scanf("%d",&p1->num);
          if(p1->num==0) p2->next=NULL;
          else
            {   (2)  ;  p2=p1;   (3)  ; }
         }
      p1=head;
      do {
           printf("%4d",p1->num);
           if(p1->next!=NULL)
	          p1=p1->next;
      	  }while(p1->next!=NULL);
	  printf("%4d",p1->num);
      for(i=0;i<len;i++)
        { p2=p1=head;
          while(p1->next!=NULL)
     	    { p2=p1; p1=p1->next; }
	      if(i==0) newhead=new=p1;
	      else  new=new->next=p1;
	      p2->next=NULL;
         }
       p1=  (4)  ;
       printf("\n");
       for(i=0;i<len;i++)
         { printf("%4d",p1->num); p1=p1->next;}
       printf("\n");
      }

(1) struct line
(2) p2->next=p1
(3) p2->next=NULL
(4) newhead

二、编程
1.定义一个结构体其中包括: 职工号、职工名、性别、年龄、工资、地址。按结构体类型定义一个结构体数组, 从键盘输入每个结构体元素所需的数据,然后逐个输出这些元素的数据(可设数组只有三个元素)。
2.有一批图书,每本书有:书名(name),作者(author) , 编号(num),出版日期(date)四个数据,希望输入后按书名的字母顺序将各书的记录排列好,供以后查询。今输入一本书的书名,如果查询到库中有此书,打印出此书的书名,作者,编号和出版日期。如果查不到此书,则打印出“无此书”。
3.13个人围成一圈,从第一个人开始顺序报号1、2、3。 凡报到“3”者退出圈子。找出最后留在圈子里的人原来的序号。
4.编写一个程序,输入n个(少于10个)学生的姓名、性别、 成绩、出生年月日及入学年月日,输出成绩在80分以上的学生的姓名、性别、成绩、出生和入学的年份。
5.将上题改为“输出成绩在80分以上的18岁以下的女生的姓名、成绩、出生和入学的年份”,试编写程序实现之。
6.有10个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入10个学生数据,要求打印出三门课总平均成绩,以及最高分的学生的数据(包括学号、 姓名、三门课成绩、平均分数)。
7.设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序打印出链表中第1,3,5,7…结点。
8.设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序将大于平均成绩的各个结点打印出来。
9.设链表中每个结点包括学号、成绩、和指针三个字段, 试编程序将成绩最高的结点作为链表的第一个结点,成绩最低的结点作为尾结点。
10.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。

第九单元 文 件

一、选择题
1.若fp是指某文件的指针,且已读到文件的末尾,则表达式feof(fp)的返回值是 。
A. EOF B. –1 C. 非零值 D. NULL
2.C语言可以处理的文件类型是 。
A. 文本文件和数据文件 B. 文本文件和二进制文件
C. 数据文件和二进制文件 D. 数据代码文件
3.C语言库函数fgets(str,n,fp)的功能是 。
A. 从文件fp中读取长度n的字符串存入str指向的内存
B. 从文件fp中读取长度不超过n-1的字符串存入str指向的内存
C. 从文件fp中读取n个字符串存入str指向的内存
D. 从str读取至多n个字符到文件fp中
4.函数rewind的作用是 。
A. 使位置指针重新返回到文件的开头
B. 将位置指针指向文件中所要求的特定位置
C. 使位置指针指向文件的末尾
D. 使位置指针自动移至下一个字符位置
5.在执行fopen函数时,若执行不成功,则函数的返回值是 。
A. TRUE B. –1 C. 1 D. NULL
6.在C程序中,可把整型数以二进制形式存放到文件中的函数是 。
A. fprintf函数 B. fread函数 C. fwrite函数 D. fputc函数

二、填空题
1.从键盘输入一个字符串,把它输出到磁盘文件f1.dat中(用字符‘#’作为结束输入的标志)。
  # include
main()
{ FILE *fp ;
char ch,fname[10];
printf(“文件名:”);
gets(fname);
if ((fp= (1) )==NULL)
{ printf(“connot open\n”);
exit(0);
}
while ((ch=getchar())!=’#’)
fputc( (2) );
(3) ;
}

2.将上题名为f1.dat的文件拷贝到一个名为f2.dat的文件中。
  # include
main()
{ FILE *fp1,*fp2 ;
char c;
if ((fp1=fopen(“f1.dat”, (1) )==NULL)

    {  printf("connot open\n");
       exit(0);
    }
  if ((fp2=fopen("f2.dat",    (2)    )==NULL)
    {  printf("connot open\n");
       exit(0);
    }
   c=fgetc(fp1);
   while (    (3)    )
     {  fputc(c,fp2);
        c=fgetc(fp1);
     }
         (4)               
 }

3.打印出worker2.rec中顺序号为奇数的职工记录。(即第 1,3,5,…号职工的数据)
#include
struct worker_type
{ int num;
char name[10];
char sex;
int age;
int pay;
} worker[10];
main()
{ int i;
FILE *fp;
if ((fp=fopen( (1) )NULL)
{ printf(“connot open\n”);
exit(0);
}
for (i=0;i<10; (2) )
{ fseek(fp, (3) ,0);
fread( (4) , (5) ,1,fp);
printf("%5d %-10s %-5c %5d %5d\n",worker[i].num,
worker[i].name,worker[i].sex,worker[i].age,worker[i].pay);
}
fclose(fp);
}
4.统计一篇文章中的小写字母个数和文章中句子个数(句子的结束标志是句点后跟一个或多个空格)。
#include “stdio.h”
main(int argc,char *argv[])
{ FILE *fp;
int k,m;
char c;
if ((fp=fopen(argv[1],“r”))
(1) )
{ printf(“connot open %s\n”,argv[1]);
exit(0);
}
k=0;
m=0;
while (fscanf(fp,"%c",&c)!= (2) )
{ if ( (3) )
k++;
if (c==46)
m++;
printf("%c",c);
}
printf("\n小写字母数:%d\n",k);
printf("\n句子数:%d",m);
(4) ;
}

三、编程
1.将10个整数写入数据文件f3.dat中,再读出f3.dat中的数据并求其和。
2.一个以%5d格式存放20个整数的文件f4.dat,顺序号定为0~19。输入某一顺序号之后,读出相应的数据并显示在屏幕上。
3.将10名职工的数据从键盘输入, 然后送入磁盘文件worker1. rec 中保存。设职工数据包括:职工号、职工名、性别、年龄、工资,再从磁盘调入这些数据,依次打印出来(用 fread和fwrite函数)。
4.将存放在worker1.rec中的职工数据按工资高低排序,将排好序的各记录存放在 worker2.rec中(用 fread和fwrite函数)。
5.用scanf函数从键盘读入 5个学生数据(包括:学生名、学号、三门课程的分数),然后求出平均分数。用 fprintf函数输出所有信息到磁盘文件stud.rec中,再用 fscanf函数从 stud.rec中读入这些数据并在显示屏上显示出来。
6.在文件 worker2.rec 中插入一个新职工的数据,并使插入后仍保持原来的顺序(按工资高低顺序插入到原有文件中),然后写入worker3.rec中。
7.删除worker2.rec中某个序号的职工记录,再存入原文件中(用fread和fwrite函数)。
8.有两个磁盘文件,各自存放已排好序的若干个字符(如a1. dat 中放"abort", a2.dat中放 “boy”)要求将两个文件合并,合并后仍保持有序,存放在a3.dat文件中。
提示:可先将两个文件中的字符存入一个字符型数组中,而后对数组重新排序,再将该数组写入a3.dat文件中。
如果不引入一个中间数组进行重新排序,该如何编程?

附加题

1.编程序求 5X+2Y+Z=50 的所有非负整数解。
2.有一长度不大于40的字符串,已知其中包含两个字符“A”,求处于这两个字符“A”中间的字符个数,并把这些字符依次打印出来。
3.把25个字母A、B 、C、··· 、X、Y按如下要求打印出来:从最中间的字母M开始打印,然后一左一右依次打印出其它字母,即M,L,N,K,O,...。
要求:初始化时按字母表顺序赋值。
4.编一个程序,把一批非零整数中的偶数、奇数的平均值分别计算出来。用零作为终止标记。
5.某单位排队形,开始排成3路纵队,末尾多出了2人。后改成5路纵队,末尾又多出了3人,最后改成7路纵队,正好没有余数。编程序求出该单位至少有多少人。
6.将一个6×6数组的第一行、第六行、主对角线和副对角线上的元素都存入1,其余的元素都存入-1。请编程序实现。
要求:1)不许对数组初始化。
2)尽量少用循环。
7.个位数是6,且能被3整除的五位数共有多少个。
8.求100至200之间能同时被6和8整除的数,把这些数打印出来,并且打印这些数的和。
9.雨淋湿了一道算术题,9个数字现在只能认清4个(第一个数字虽模糊不清但肯定不是1):

[ ×( 3 + )]2 = 8 9
请编程序找出那些看不清的数字。
10.编程序计算下述函数在X=-7,-1,0,7时的值。

11.判断一个给定的5×5方阵是否以第3列为轴线对称?
12.编写一个函数JOIN,让它实现字符串连接运算功能。
13.编写函数IND,让它判断一个字符串是否为另一个字符串的子串的功能,若是则返回第一次出现的起始位置,否则返回0。
14.编写一个函数,由参数传来一个字符串,分别求出此字符串中字母、数字和其它字符(不包括空格)的个数,输入和输出均由主函数实现。
15.已知某年不是闰年,给定该年某一天的月份和日期,求这一天是该年的第几天。
16.找规律,编程序打印6×6的矩阵:

1 2 3 5 8 13
1 4 9 17 30 51
1 6 19 45 92 173
. . .

17.有人说在400,401,402,…499这些数中4这个数字共出现112次,请编程序判定这种说法是否正确。若正确请打印出’YES’,否则打印出’NO’及4的出现次数。
18.设有8×8的二维数组a,其中每个元素取值如下:
当 i=j 时 a[i][j]=M (M是你的学号)
当 i 当 i>j 时 a[i][j]=i×j
编程序求所有的数组元素之和。
19.找3个数字,填在下面式子中,使等式成立。

     6325 = 6325      ×     (等号左边是五位)

  ① 若答案有多个,则打印一组即可;
  ② 若无满足条件的数字,则显示'NO DIGITALS'。

20.某航空公司规定:在旅游旺季7─9月份,若订票超过20张,优惠票价的15%,20张以下,优惠5%;在旅游淡季1─5月、10月、11月份订票超过20张,优惠30%,20张以下,优惠20%;其余月份不优惠。请编程序能根据月份和旅客订票张数决定优惠率。

21.请编程序按如下格式打印一个直角三角形的九九乘法表:
1 2 3 4 5 6 7 8 9
4 6 8 10 12 14 16 18
9 12 15 18 21 24 27
16 20 24 28 32 36
25 30 35 40 45
36 42 48 54
49 56 63
64 72
81
22.有一批实数,用零作终止标记。请编程序找出这批数中的最大值及最小值,并输出该最大值数是这批数中的第几个数(若最大值数多次出现,只打印出第一个的位置)。
又问:若打印出每个最大值数的位置,程序应如何修改?
23.有10个两位整数,把这些数作以下变化,如果它是素数,则把它乘以2,若它是偶数则除以2,其余的数减1,请将变化后的10个数按从小到大的次序打印出来。
24.已知有N个无规律的正整数,请编程序求出其中的素数并打印出能被5整除的数之积。
25.Bessel函数Jn(X)有以下的递推关系:

并且已知

编写程序,利用递推关系,由任意的n和x≠0求Jn(X)。
注:本程序不允许使用数组。
26.把一个偶数位的数从当中分开成为两个数,这两个数的和的平方等于原数。如(8+1)2=81,(20+25)2=2025。求10至9999之间满足这样条件的数是哪些? 共有多少个?

27.已知

计算Yn的值,直到|Yn - Yn-1|<10-6为止,并打印出此时共作了多少次COS计算。
提示:Yn+1=COS(Yn),故本题适用于使用迭代法。
28.已知有9个数,请求出这些数中的最大值、最小值及平均值,以及有多少个数等于平均值?
29.求二维数组中每行元素的平均值,不许引入其它的数组。
30.编程序计算函数
P(x)=b0xn + b1xn-1 + … + bn-1x + bn
的值。要求先将X的各项系数先输入到数组B中,然后再用循环结构求P(X)的值。
31.猜号码∶由随机函数产生一个1至1000之间的整数,让人猜之。计算机仅回答人猜的数大、小还是相等,当人猜对时,由计算机打印出人一共猜了几次。
32.编程序将一个正整数写成其它两个正整数的平方和,若不能成立时输出“NO”。例如
5 = 12 + 22 , 25 = 32 + 42
33.将一个一维数组中的偶数依次交换。例如有8个元素, 若其中第1、4、5三元素是偶数时应按下图交换。

        2   3   1   6   8   7   9   5  

34.编程序将一个6×6的二维数组左下三角部分全赋值为-1,右上三角全赋值为1,主对角线(行,列下标相同)上的元素送入2。把数组中的值按列对齐方式输出。要求: 不允许使用scanf函数。
35.用随机函数求出10组三位正整数,每组十个数,调用一函数打印出每组数,并编一函数求出每组中的最大数。

36.已知有如下递推公式

求该数列的前n项。不允许使用数组。
37.已知有三个数组A,B,C,A为5行5列的二维数组,B、C为只有5个元素的一维数组,键盘输入数据的顺序如下:
23,45,6,1,-3,4,5,233,456,0,3,56,78,-56,5,6,77,8,89,9,3,6,8,9,90
请编写程序,求出A的各行之和放至数组B的相应元素中,求出数组A的各列之和放至数组C的相应元素之中。程序的输出部分要按下边形式显示:
23 45 6 1 -3 72
4 5 233 456 0 698
3 56 78 -356 5 -214
6 777 8 89 9 889
3 6 8 9 90 116
39 889 333 199 101

38.假设a-1和a+1是大于10的素数,验证a3-4a可被120整除。编程序输入a的值,判a-1和a+1是否为素数。若不是输出“NOT PRIME!”;若都是素数,再验证a3-4a是否可被120整除。
39.有n个整数,编程序将前面的各个数依次向后移动k个位置,最后k个数移到最前边的k个位置(见下图,其中n=8,k=3)。

          1   2   3   4   5   6   7   8

  

          6   7   8   1   2   3   4   5

思考: 程序中不许引入其它数组。

40.将一个数M分解为质因数(M≠0)。
41.将一个整数(最多是10位数)从低位到高位打印出来,如该数是12345时,输出应是54321(只占一行)。
42.写一个函数比较两个字符串,如果s1=s2,则返回值0;如果s1>s2,则返回值1;如果s1 43.求n!的末尾有多少个零。可以通过检查n!含有多少个10的因数来求它末尾零的个数。因为10=2×5,在n!中含有2的因数显然多于含有5的因数。
一种求n!中5的因数的个数的算法如下:
1) 输入正整数n;
2) 0=>k, n=>m;
3) 若m<5,转第5步,否则执行第4步;
4) m/5(取整)=>m, k+m=>k, 转第3步;
5) 输出k(n!末尾零的个数)。
44.分别输入N和M个数到数组A和数组B中。把只在其中一个数组中出现的那些数送入到数组C中,并指出它们在A或B数组中的位置。
45.用记录来描述一个学生的成绩情况,内容包括:姓名、学号、数学成绩和PASCAL成绩。要求对一个小组的10个学生的成绩进行统计处理:
1)计算学生的总平均分,并按平均分高低排出名次,打印出姓名。
2)打印出90分以上和不及格者的名字。
要求用子程序来完成。
46.已知M1是3×5的矩阵, M2是5×2的矩阵, 编程序求出M1与M2之积。
47.百马百瓦问题。有100匹马,100块瓦,大马驮3块,小马驮2块,两个马驹驮1块。问大马、小马、马驹各多少?
  要求:① 不许用for循环; ② 循环次数尽量少。
48.找规律填写N×N方阵。如N=8时, 其方阵为:
1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 1
1 2 3 3 3 3 2 1
1 2 3 4 4 3 2 1
1 2 3 4 4 3 2 1
1 2 3 3 3 3 2 1
1 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1
49.插入排序。许多玩牌的人是以这样的方式来对他们手中的牌进行排序的:设手中原有3张牌已排好序,抓1张新牌,若这张新牌的次序在原来的第2张牌之后,第3张牌之前,那么就把这张新牌放在第3张牌的位置上,原来的第3张改为第4张, 然后再抓新牌。按着这个算法,编写一个排序程序。
注:开始一张牌也没有,从第一张牌开始抓起。
50.求N阶方阵(即N×N数组)中各条反斜线上的元素之和。如4×4数组共有7条反斜线:

7
6
5
4
1 2 3
注:求和时,请按斜线编号顺序显示求出的和。
51.自然数N一般写成如下形式:
N=dkdk-1d1 (d1~dk 均是十进制数字)
如果di+1>di (i=k-1,k-2,…,1),则称N是严格降序数;如果di+1 52.用简单迭代法解方程 ex - x - 2 = 0
它有两个根(如图),其迭代公式为:

  1)  xn+1= exn- 2                      y       
   (初值X<0时)
                               y=x+2       y=ex 
  2)  xn+1= Ln(xn + 2)
    (初值X>0时)                     o                 x

注:本程序中选取初值X0 不同时,要分别使用公式1或公式2迭代,得原方程<0或>0的解。(公式由来略)

53.洗扑克牌。将54张牌分别编号为1,2,…,54号,并放在数组M中。洗牌方法如下:产生[1,54]区间内的一个随机数K,将M[1]与M[K]交换;然后产生[2,54]之间的随机整数K,让M[2]与M[K]交换;…,直到剩下最后一张牌为止。请编写实现上述洗牌的程序。
54.有N张牌,计算机和你轮流取牌,每次只能取 1─2张,谁最后取完谁胜利。编写完成此功能的程序。
要求:
1) 让计算机先取。
2) 你取的张数由键盘输入。
3) 计算机第一次取牌时由键盘输入来确定是取1还是取2,以后它再取牌时由程序判断来决定取几张牌。
55.已知A是有30个元素的整型数组,编写一个对A[I1]到A[I2](I1≤I2)之间的元素排序的函数(从大到小排序)。请调用上述函数先将A[5]至A[20]之间的元素排序,然后将A中的所有元素值输出。再调用上述函数对A[15]至A[30]之间的元素排序,最后再将A中30个元素值输出。
要求:1) 输入输出均由主函数实现。
2) 输出时每10个元素占1行。
56.编程序求3至39之间满足下列条件的各组素数:每组有3个素数,第2个比第一个大2,第3个比第2个大4。例如 5,7,11就是满足条件的一组。
要求:1) 不许使用数组。
2) 打印满足条件的各组素数。
3) 求出满足条件的素数共有多少组。
57.已知N是正整数, 它可拆写成三个正整数N1、N2和N3之和的形式N=N1+N2+N3。请编程序打印出满足上式的全部组合,并当N1、N2和N3中至少有两个是素数时打印“YES”否则打印“NO”。
如N=5时输出:
5 = 1 + 1 + 3 NO
5 = 1 + 2 + 2 YES
5 = 1 + 3 + 1 NO
5 = 2 + 1 + 2 YES
5 = 2 + 2 + 1 YES
5 = 3 + 1 + 1 NO

58.编写程序,按照 1,2, … , 28的顺序填一个7×7数组的左上角,程序的输出结果为:
1 2 4 7 11 16 22
3 5 8 12 17 23
6 9 13 18 24
10 14 19 25
15 20 26
21 27
28
59.编写求最大平台问题的程序。
有n个整数a1,a2, … an, 若满足a1≤a2≤ … ≤ an ,则认为在这n个数中有最大平台。在这种情况下,若n个数互不相同,则最大平台值为1,若在n个数中最多有连续m个整数的值相等,则最大平台值为m。
例如: n=10时
1,2,3,4,5,6,6,7,4,5 无最大平台
1,1,2,2,2,2,2,2,2,2 最大平台值为8
1,1,2,2,2,3,3,4,4,5 最大平台值为3
0,1,2,3,4,5,6,7,8,9 最大平台值为1
60.回文数指左右数字对称的数,如121,2112都是回文数。回文数猜想:取一任意十进制数,将其倒过来,并将这两个数相加,然后把这个相加的和倒过来再与原数相加…, 重复此过程可得到一个回文数。如取68为任意数,经三步相加可得回文数:
6 8
+ 8 6 测试数据:
───── ① 68
1 5 4 ② 5
4 5 1 ③ 876
───── ④ 12501
6 0 5
5 0 6
─────
1 1 1 1
注意:

  1. 上机时不要随便自选数据,因为对有的数经几十万次以上相加还未得到回文数。
  2. 由于一位、两位数十分简单,故仅从3位数开始才判它是否为回文数。即5,55,66这样的数在此处不把它当作回文数。
    61.编写子函数, 求一维整型数组M[10]的最大值及次最大值(次最大值可能不存在)。主函数中输入10个整数, 然后调用上述子函数, 若次最大值存在, 则输出最大值及次最大值, 否则输出最大值及’NO’(输出也在主程序中实现)。
    62.比高矮: 100个学生任意排成10行、10列的正方形队列,在每一列中选出一个最矮的(10个), 然后在这10个矮人中选出最高的一个人, 叫做“矮人中的高个子”。而后这10个矮人仍站回到各自的位置,再在每一行中选出一个最高者(10个),又从这10个高人中选出最矮的一人, 叫做“高人中的矮个子”。问“矮人中的高个子”和“高人中的矮个子”中谁的个子高?
    63.某桔农家共有2520只桔子, 父亲要将它们分给六个儿子,其分法如下:父亲先将2520只桔子分给六个儿子, 然后说:“老大,把你分到的桔子的八分之一给老二;老二拿到以后,连同原来的桔子分出七分之一给老三;老三拿到以后,连同原来的桔子分出六分之一给老四;老四拿到以后,连同原来的桔子分出五分之一给老五;老五拿到以后,连同原来的桔子分出四分之一给老六;老六拿到以后,连同原来的桔子分出三分之一给老大”。这样分完之后,六个儿子手里的桔子正好一样多。问六个儿子原先分到的桔子各是多少只?
    64.任意两个互质的自然数, 经过若干次加减后,总可获得结果为1的数值。所谓互质数(即互素的数),是指这两个数除 1外再没有其它公因数。如14,9为互质数,又如187,79也是互质数。例如:对于互质数14和9,14+14=28 9+9+9=27 因28-27=1, 目的达到。请编程序对两个互质数验证上述结论。
    65.二维数组排序。设有4×5的数组M,通过排序使M[1][1]≤M[1][2]≤…≤M[1][5]≤M[2][1]≤M[2][2]≤…≤M[2][5]≤…≤M[4][1]≤M[4][2]≤…≤M[4][5]。排序时不允许引入其它数组。
    66.编写将一个十进制数M转化成N进制数(2≤N≤16)的程序。提示:转化成N进制数的各位数可以分别放在数组的各个元素中。
      注意:进制N超过10时, 用A表示10,B表示11,…,F表示15。
    67.间隔元素排序。用随机函数产生25个[25,75]之间的整数, 把它送到一维数组M中。要求对M[I],M[I+J],M[I+2*J],…这些元素按从小到大的顺序排序。J的值由键盘输入,I从1到J变化。实际上是以J为间隔排了J个对列,每个对列中从小到大排序。
    68.在主函数中输入10个不等长的字符串,用另一函数对它们排序。然后在主函数中输出这10个已排好序的字符串,用指针数组完成。
    69.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,将此结点删除,输出最后的链表。
    70.有两个链表a和b。设结点中包含学号、姓名。从a链表中删除与b链表中有相同学号的那些结点。
  1. 建立一个链表,每个结点包括的成员为:职工号、工资。用new函数开辟新结点。要求链表包括5个结点,从键盘输入结点中的有效数据。然后把这些结点的数据打印出来。要求用函数creat来建立链表,用list函数来输出数据。这5个职工的职工号是101,103,105,107,109。
    72.在上题的基础上,新增加一个职工数据。这个新结点不放在最后,而是按职工号顺序插入,新职工号为106。写一函数insert来插入结点。
    73.在上两题的基础上,写一函数,用来删除一个结点(按指定职工号删除)。
    74.八皇后问题。
    在一个8×8的国际象棋棋盘上放入8个皇后,且这八个皇后互不相吃,即这8个皇后的任意两个都不在同一行、同一列及同一斜线上。编程序找出所有放法。
    其中一个答案是:(*表示皇后)
    & *
    *
    *
    *
    *
    *
    •   *				
      

提示:
1) 可用一维数组(8个元素)存贮上述答案:
1 5 8 6 3 7 2 4
2) 为了使问题简单,可先做5×5棋盘上的5皇后问题。
75.求阶乘N!。
设输入的N最大可使N!达到100位,要求打印出全部有效数字。方法如下:用数组M[100]代表一个100位的数。M[1]代表最高位,M[100] 代表最低位。先对M[100]置1,其余各元素置零,然后从1到N进行累乘。同通常作乘法一样,数组M与I(1≤I≤N)相乘时,从低位数乘起,乘积大于9时进到上一位去,然后将结果打印(从头一个不等于零的位开始)。
76.编写“N个人放鞭炮问题的程序”。
N个人同时刻开始放鞭炮, 第一个人每隔T1秒放一次,第二个人每隔T2秒放一次,…第N个人每隔Tn秒放一次。每个人各放M个鞭炮。问总共能听到多少次鞭炮声。
77.大数相加。
写一个程序,实现对任意长的两个大整数(例如100位)进行相加。每个数可用以下形式存放,例如整数179534679198可放于数组N中,其中:
N[1]=198, N[2]=679, N[3]=534, N[4]=179
把两个数组中的元素一一相加,并根据需要进行进位。
要求:
1) 输出一个大数时中间不允许有空格, 如上述N数组输出时不允许输出:
179 534 679 198
而应输出
179534679198
2) 输出的数据中间的零不能用空格代替。
假设N[1]=23, N[2]=5, N[3]=534, N[4]=179时应输出
179534005023
而不应输出
179534 5 23
思考: 一个数组元素存放一位数时应如何修改程序?
78.打印年历。
要求:每行打印两个月日历。如下图:

             一月                        二月


             三月                         四月           

             .                 .
             .                 .
             .                 .
            十一月                       十二月         

思考: 每行打印三个月日历。

79.猎人过河。
猎人要把一只狼,一头羊和一些白菜从河的左岸带到右岸,但他的船太小,一次只能带一样,因为狼要吃羊,羊会吃白菜,所以狼和羊,羊和白菜不能在无人监视的情况下相处,问猎人怎样才能达到目的? 请编程序实现猎人过河。
80.巧填运算符。
在下式的方块中填上加号或减号,使等式成立,共有多少种填法? 把每种填法的式子打印出来。

1 2 3 4 5 6 7 8 9 = 9

81.SHELL排序程序。
该方法的特征是:一个元素与它间隔为J 的元素进行比较或交换,然后逐步缩小这个间隔到1为止。J缩小的规律可以是 J<=J/2或J<=(J+1)/2,我们取 J<=J/2(取整)编程。具体地说方法如下:对于N个数据,首先让J<=INT(N/2),让X[1]与X[J+1]比较(假设数组名X),X[2]与X(J+2)比较,…,X[N-J]与X[N]比较,若次序颠倒,则互相交换。然后再重新比较一轮,直到没有交换为止。于是令J<=INT(J/2),再重复以上操作,直到J=1,而且在这一轮比较中没有交换,才排序完成。
例如 N=9
数据为: 5 7 6 4 9 1 3 2 8 交换次数
J取4(INT(9/2)) 5 1 3 2 8 7 6 4 9 4
再比较一轮 不变 0
J取2(INT(4/2)) 3 1 5 2 6 4 8 7 9 3
再比较一轮 不变 0
J取1(INT(2/2)) 1 3 2 5 4 6 7 8 9 4
再比较一轮 1 2 3 4 5 6 7 8 9 2
再比较一轮 不变
停止
82.试编写一个程序寻找一条通过迷宫的路径。
一个迷宫可以看成是一个矩阵(数组),它有一个入口单元和一个出口单元,图中阴影处表示障碍物,白格表示可以通行的道路。只能从入口进去,从出口出去,中间只能通过白格子(即只能从一个白格单元走到一个相邻的白格单元,相邻指上、下、左、右四个单元),遇见死路时,退回去重找其它路。用户可设入口处(1,1)为2,出口位置(5,6)为-1,白格处送入0,障碍物位置送入1。

83.人机搏弈。
有15颗棋子,你和计算机轮流取,每次只允许取1─3颗,直到取尽为止,谁手中的棋子总数为奇数者为赢。先由键盘输入来确定计算机先取还是你先取。
提示:取胜者秘诀是:第一次先取两颗,以后按下边规则进行:

  1. 刚取的棋子数如果和已取得的棋子数加起来是个奇数,那么剩下的棋子数必须是1或8或9;

  2. 刚取的棋子数如果和已取得的棋子数加起来是个偶数,那么剩下的棋子数必须是4或5。
    思考: n颗棋子时,程序应如何修改?
    84.十个数字组成完全平方数。
    把0、1、2、3、4、5、6、7、8、9十个数字分别组成一个一位数,一个二位数,一个三位数和一个四位数,使它们都是完全平方数(其平方根是整数),共有几种方法? 每种方法的结果是什么? (每个数字只允许用一次)。下边就是一种填法:
    1 ( 1 )
    36 ( 6 )
    784 ( 28 )
    9025 ( 95 )
    85.相邻数之和为素数。
    将1,2,3,4,… ,19,20这20个自然数排成一圈,使每两个相邻数之和都为素数。问这20个数应如何排列?
    86.编程序求出应派谁去执行任务。
    侦察班长准备在A、B、C、D、E、F 这6个人员中挑选若干人去执行任务,其人员配备条件是:
      ① A、B两人中至少去一人;
    ② A、B不能同去;
    ③ A、E、F三人中派两人去;
    ④ B、C两人都去或者都不去; 1
    ⑤ C、D中去一人; 10 2
    ⑥ 若D不去,则E也不去。
    87.在5条直径线的两端分别 9 3
    放置1到10的顺序数,如右图所
    示。但这样放置法只有一种情 8 4
    况,两个相邻数之和等于相对
    位置上的两个邻接数之和,即: 7 5
      10+1=5+6 6
    而 1+2≠6+7
    2+3≠7+8
    现请你变换一下这些数的位置,使任何两个相邻数之和等于相对位置上的两个邻接数之和,要求找出全部答案。
      提示:下图是一种答案:
    1
    10 4
                    其相邻数之和是:
    7 5     1+4=2+3
    4+5=3+6
    5+8=6+7
    6 8 .
    .
    3 9 .
    2 10+1=9+2
    88.模拟计算器。
    编写模拟计算器进行加、减、乘、除四则运算的程序(假设这四种运算的优先级都是相同的)。如果在终端上敲入:8.5+0.5*2.5=后,程序应得结果22.5。
    89.牛虎同渡问题。
    三只牛和三只虎渡河,船只能容1至2只牛和虎(牛和虎各一只、单独一只牛或虎、或两只同类)。任一岸边若虎多于牛则虎会吃牛,问怎样才能使牛不被伤害而安全过河。
    90.确定药瓶。
    两种不同的药片,一种重11mg,另一种重10mg。这两种药片外形相同,且装在相似的药瓶中。由于工作的疏忽,将这两种还未贴药鉴的药瓶混放在一起。现要求用天平只称一次,把两种药瓶完全分开。
    91.建立两个链表,来表示x幂的两个多项式,链表中的结点有三个字段coef、exp和next,分别表示多项式每项的系数、x的指数及指向下一项的指针。编一程序,按x的降幂输入多项式的系数和指数,建立两个链表,然后编一函数来完成把两个多项式的链表叠加到第三个链表中。例如:
    第一个多项式为: -4x8 +5x6 +3x4 -4x的链表为:

    -4 8 5 6 3 4 -4 1

第二个多项式为: 5x9 -5x8 -3x4 +7x的链表为:

5   9           -9   8           5   6           3   1    

结果的多项式为: 5x9 -9x8 +5x6 +3x

5   9            -9  8            5   6           3   1    

92.编程把链表(1)变成链表(2)。
head
(1) data next data next data next

          记录1              记录2             记录3

              data  next      data  next  

记录4 记录5

 head

(2) data next data next data next

         记录1              记录2              记录3        
                          
             data  next       data  next  

               记录4              记录5

93.把下面(1)、(2)两个有序链表合并为一个链表(3),合并之后链表仍有序。

(1) first 10 30 90

(2) second 45 100

(3) first

10 30 45 90 100

94.填写n阶(n>2)纵横图(纵横图又称魔方阵、幻方)。
纵横图是指这样一种方阵,它的每一行和每一列以及两个对角线上的每一元素之和都是相等的。最普通的纵横图由 1到n2个自然数构成。沿每行、每列及对角线的各数之和为 1/2×n(n2+1),称为纵横图常数。
例如:3×3的纵横图如下图所示,它的每行、每列及对角线各数之和为1/2×3×(9+1)=15。一个 n阶纵横图便是一个n×n的矩阵。每个格中放一个数,共可放n2个数,请你把整数 1到整数n2分别放入各格中,且使每行的和、每列的和以及两个对角线上的和均相等。
  (一)填写方法分析:
  1)奇阶纵横图
举个最简单的例子(3阶纵横图的填法)。 画一正方形,把它分为九个格,按左下图的样子依斜线方向将1~9各数顺序填入图内。正方形外的数字填到图内与它相反的那面(仍在原行),结果得到右下图的正方形。

        3             
     2     6  
 1   5     9
     4     8  
        7 

当n为奇数,n阶方阵共有n2个数,排序为1、2、…、n2。按数的排序依次填入 n阶方阵中每个空格。以下图的5阶方阵为例:

11 10 4 23 17
18 12 6 5 24
25 19 13 7 1
2 21 20 14 8
9 3 22 16 15
填法如下:
  ⑴先将1填在行、列位置为((n+1)/2,n),即1填在((5+1)/2,5)
=(3,5)的3行、5列位置上;
  ⑵继续在该位置所在的对角线上(斜线)上,由左上往右下依次填;
  ⑶若列出界,则当前行加1,以n为模的余数为应填的列数。
⑷若行出界, 则当前行加1,以n为模的余数为应填的行数。
⑸若应填的位置上行、列并未出界,却已填上它数,应在当前位置左横移一个位置(即行不变,列数减1),继续填。
这种奇阶纵横图方阵通式为 n=2m+1, m=1、2、3、…。
2)偶阶纵横图(分两种情况进行探讨)
⑴当n=2(2m+1)时,即n=6、10、14、18、…这种纵横图的解法比较复杂,可将n=2(2m+1)纵横图分成四个小纵横图,由于n2=4(2m+1)2,所以这四个小纵横图为四个奇次纵横图。四个小纵横图定为A、B、C、D如下图所示位置排列。
1~u2用1~9填入A;
u2+1~2u2用10~18填入B;
2u2+1~3u2用19~27填入C;
3u2+1~4u2用28~36填入D。
(n=6时)
记:u=n/2=2m+1,分为1~u2,u2+1~2u2,2u2+1~3u2,3u2+1~4u2,
将这4u2=4×(2m+1)2=n2个数分别填入A、B、C、D,填法按奇阶方法进行,然后将A中最左边那列诸元素(除去该列中间的那个元素), 与D中相对位置的元素交换,再将A中从左起第2列至左起(u+1)/2-1列的诸元素与D中相对位置的诸元素交换,再将A中((u+1)/2,(u+1)/2) 这个元素与D中相对位置的元素交换。最后,将C中右起第(u-1)/2 -1列的元素与B中相对位置的元素交换。至此,n=2(2m+1)的纵横图已排完。当 n=6时,上述交换过程如下图中的序号①~⑥,就是交换次序,数字下画横线者,为交换的数字。

8   1   6  26  19  24       35   1   6  26  19  24
3   5   7  21  23  25        3  32   7  21  23  25
4   9   2  22  27  20       31   9   2  22  27  30

35 28 33 17 10 15 8 38 33 17 10 15
30 32 34 12 14 16 30 5 34 12 14 16
31 36 29 13 18 11 4 26 29 13 18 11

当n=4m时,如n=4、8、12、16、20…此类纵横图填法较简单, 给出一个纵横图,只要顺序填入 1~u2个数,再将所有对角线上的数都划掉,记下划掉的数,然后由大到小将划掉的数依次填到空格中(刚划掉的数为空格),即可完成。对于 n=8如左下图所示,是将对角线上的数划掉的过程。右下图是将数由大到小进行填入。

(二)程序设计
⑴奇阶纵横图n=2m+1请见填写方法分析1)。

⑵偶阶纵横图n=2(2m+1)时,算法分析是把方阵划成A、B、C、D四个小子阵,然后进行多次交换数字来完成,较麻烦,但可从中发现巧妙的规律,A、B、C、D子阵中各元素,都可以由 A子阵中相对位置上的元素加上一个常数得到,如B~(u/2)2,C~2(u/2)2D~3(u/2)2,只要按奇阶纵横图先填A子阵,而B、C、D子阵便可由A子阵演变而成。
⑶偶阶纵横图n=4m时,先用循环判断方阵中每一位置是否在对角线上,如在对角线上,则将该位置赋值为1,否则,赋值为0。然后将X←0,Y←N*N+1,X、Y为行列值。然后用二重循环(I,J)从1依次变化至n。若A[I][J]=1,则A[I][J]←Y,若A[I][J]=0, 则A[I][J]←X,循环结束即得n=4m的方阵。

模拟试卷一

一、选择题(每题2分,共20分)
1、以下不正确的C语言标识符是 。
A. ABC B. abc C. a_bc D. ab.c
2、设有说明:char w; int x; float y; double z;
则表达式w*x+z-y值的数据类型为: 。
A. float B. char C. int D. double
3、根据下述定义,可以输出字符’A’的语句是 。
struct person
{ char name[11];
struct
{ char name[11];
int age;
}other[10];
};
struct person man[10]={{ “Jone”,{“Paul”,20}},{“Paul”,{“Mary”,18}},
{“Mary”,{“Adam”,23}},{“Adam”,{“Jone”,23}}};
A. printf("%c",man[2].other[0].name[0]); B. printf("%c",other[0].name[0]);
C. printf("%c",man[2].(*other[0])); D. printf("%c",man[3].name);
4、以下说法中正确的是: 。
A. C语言程序总是从第一个定义的函数开始执行
B. 在C语言程序中,要调用的函数必须放在main()函数中定义
C. C语言程序总是从main()函数开始执行
D. C语言程序中的main()函数必须放在程序的开始部分
5、在定义int a[10];之后,对a的引用正确的是 。
A. a[10] B. a[6.3] C. a(6) D. a[10-10]
6、以下不能正确赋值的是 。
A. char s1[10];s1=“test”; B. char s2[]={’t’,’e’,’s’,’t’}
C. char s3[20]= “test”; D. char s4[4]={ ’t’,’e’,’s’,’t’}
7、设i和x都是int类型,则for循环语句 。
for(i=0,x=0;i<=9&&x!=876;i++) scanf("%d",&x);
A. 最多执行10次 B. 最多执行9次
C. 是无限循环 D. 循环体一次也不执行
8、C语言中表示“在使用x之前,先使x的值加1”的正确方式是 。
A. ++x B. x++ C. +x D. +x+
9、设有说明int (*ptr)[M]; 其中ptr是 。
A. M个指向整型变量的指针 B. 指向M个整型变量的函数指针
C. 一个指向具有M个整型元素的一维数组的指针
D. 具有M个指针元素的一维指针数组,每个元素都只能指向整型量
10、在下面关于指针的说法中,错误的一条是 。
A. 变量的指针就是变量的地址
B. 可以将一个整型量或任何其他非地址类型的数据赋给一个指针变量
C. 一个指针变量只能指向同一类型的变量
D. 指针变量中只能存放地址(指针)

二、读程序写结果(每题3分,共21分)
1、以下程序运行后输出的结果是:
#include
void main()
{ int i,j,m,n;
i=8;
j=10;
m=++i;
n=j++;
printf("%d,%d,%d,%d\n",i,j,m,n);
}
2、若输入B,以下程序的输出结果是:
void main()
{ char grade;
scanf("%c",&grade);
switch(grade)
{ case ‘A’: printf(">=85");
case ‘B’:
case ‘C’: printf(">=60");
case ‘D’: printf("<60");
default: printf(“error”);
}
}
3、以下程序的输出结果是:
void ast(int x,int y,int *cp,int dp)
{ cp=x+y; dp=x-y; }
main()
{ int a,b,c,d;
a=6; b=3;
ast(a,b,&c,&d);
printf("%d,%d\n",c,d);
}
4、以下程序的输出结果是:
main()
{ int a[2][3]={1,3,5,7,9,11};
int m,ptr;
ptr=&a[0][0];
m=(ptr)(
(ptr+2))
(
(ptr+4));
printf("%d\n",m);
}
5、以下程序的输出结果是:
main()
{ int i,j;
for(i=0;i<5;i++)
{ for(j=0;j<5;j++)
if(ij || i+j4)
printf("
");
else
printf("+");
printf("\n");
}
}
6、以下程序的输出结果是:
main()
{ int k=4,m=1,p;
p=func(k,m); printf("%d,",p);
p=func(k,m); printf("%d\n",p);
}
int func(int a,int b)
{ static int m=0;
int i=1;
i+=m+1; m=i+a+b;
return m;
}
7、以下程序的输出结果是:
main()
{ char s[]=“china”,*p;
for(p=s+1;p printf("%s\n",p);
}

三、程序填空(每空2分,共20分)
1、将一个数组中的元素按逆序重新存放。例如原来的顺序为:8,6,5,4,1, 要求改为:1,4,5,6,8。
#define N 7
main()
{ int a[N]={12,9,16,5,7,2,1},k,s;
printf("\n初始数组:\n");
for (k=0;k printf("%4d",a[k]);
for (k=0;k< (1) ;k++)
{ s=a[k]; a[k]= (2) ; (2) =s;
}
printf("\n交换后的数组:\n");
for (k=0; (3) ;k++)
printf("%4d",a[k]);
}
2、用递归方法求N阶勒让德多项式的值,递归公式为

   #include
   main()
    { float pn();
      float x,lyd;
      int n;
      scanf("%d%f",&n,&x);
      lyd=  (1) 
      printf("pn=%f",lyd);

}
float pn(float x,int n)
{ float temp;
if (n0) temp= (2)
else if (n
1) temp= (3)
else temp= (4)
return(temp);
}

3、在数组中同时查找最大元素下标和最小元素下标,分别存放在main函数的变量max和min中。
#include
void find(int *a,int *max,int *min)
{ int i;
*max=*min=0;
for(i=1;i if(a[i]>a[*max]) (1) ;
else if(a[i] return;
}
main()
{ int a[]={5,8,7,6,2,7,3};
int max,min;
find( (3) );
printf("%d,%d\n",max,min);
}

四、填空题(每空1分,共10分)
1、已知整型变量a=6,b=7,c=1,则表达式 (a*3-b+c)/5 的值是 。
2、当a=3,b=4,c=3时,表达式 a==c的值为 ,a!=c的值为 。
3、int (*p)(); 定义的p是一个 。
4、数学公式 , 写成C语言表达式是 。
5、若w=5,x=2,y=3,z=4,则条件表达式w 6、C语言可以处理的文件类型是 和 。
7、如下图所示,在链表中p1和p2两个结点间插入p所指向的节点的关键语句是:
和 。
其中结构体数据类型和指针变量的定义如下:
struct stu
{ int a;
float b;
struct stu *next;
} *head, *p1,*p2,*p;

五、编程题(第1题9分,第2、3题各10分,共29分)
1、打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方和等于该数本身。例如 153是一个水仙花数,因为 153=。
2、任意输入一个5×6矩阵,求出每一行的和放到一个一维数组中,输出此矩阵及其每一行的和。
3、任意输入20个正整数,找出其中的素数,并将这些素数按由小到大排序。要求:判断一个数是否为素数用函数实现;排序用函数实现。

模拟试卷二

一、选择题(每题2分,共20分)
1.以下正确的C语言标识符是 。
A. case B. 3_1 C. _chap6 D. ex 2
2.三种基本程序结构不包括 。
A. 顺序结构 B. 选择结构 C. 循环结构 D. 函数结构
3.以下运算符中优先级最低的运算符为 。
A. ?: B. ! C. != D. ||
4.程序段如下:则以下说法中正确的是: 。
int k=-20;
while(k=1) k=k+1;
A. while循环执行20次 B. 循环是无限循环
C. 循环体语句一次也不执行 D. 循环体语句执行一次
5.以下能正确定义数组并正确赋初值的语句是 。
A. int n=5,a[n]; B. int a[1][2]={{1},{3}};
C. char s2[]={’t’,’e’,’s’,’t’} D. char s1[10];s1=“test”;
6.在C语言中,当函数调用时 。
A. 实参和形参共用存储单元
B. 实参和形参各占一个独立的存储单元
C. 可以由用户指定实参和形参是否共用存储单元
D. 由系统自动确定实参和形参是否共用存储单元
7.若有定义:int a[3][4]; , 不能表示数组元素a[1][1]。
A. *(a[1]+1) B. *(&a[1][1]) C. (a+5) D. ((a+1)[1])
8.下面程序段运行时输出结果是 。
char s[12]= “China”;
printf("%d\n",strlen(s));
A. 5 B. 6 C. 7 D. 8
9.在说明语句:int *f(); 中,标识符代表的是: 。
A. 一个用于指向整型数据的指针变量 B. 一个返回值为指针型的函数名
C. 一个用于指向函数的指针变量 D. 一个用于指向一维数组的指针
10.当用户定义了一个结构体变量时,系统分配给它的内存为 。
A. 各成员所需内存的总和 B. 成员中占内存量最大者所需的容量
C. 结构中第一个成员所需内存量 D. 结构中最后一个成员所需内存量

二、读程序写结果(每题3分,共21分)
1、以下程序运行后输出的结果是:
void main()
{ int x=0,a=0,b=0;
if(x=a+b) printf("* * * *\n");
else printf("# # # #\n");
}

2、以下程序的输出结果是:
void main()
{ int x=1,y=0,a=5,b=6;
switch(x)
{ case 1: switch(y)
{ case 0: a++;break;
case 1: b++;break;
}
case 2: a++;b++;break;
case 3: a++;b++;
}
printf(“a=%d,b=%d\n”,a,b);
}

3、以下程序的输出结果是:
void main()
{ int i;
for(i=1;i<=5;i++)
{ if(i%2)
putchar(‘*’);
else
continue;
putchar(‘#’);
}
putchar(‘%’);
}

4、以下程序的输出结果是:
void main()
{ int i;
for(i=0;i<2;i++)
add();
}
add()
{ int x=0;
static int y=0;
printf("%d,%d,",x,y);
x=x+3; y=y+5;
}

5、以下程序的输出结果是:
#include
main()
{ int *p1,*p2,*p;
int a=5,b=8;
p1=&a; p2=&b;
if(a printf("%d,%d,",*p1,*p2);
printf("%d,%d\n",a,b);
}
6、以下程序的输出结果是:
main()
{ int a[]={2,4,6,8,10};
int y=1,x,p;
p=&a[1];
for(x=0;x<3;x++)
{ y=
(p+x);
printf("%d,",y);
}
}

7、以下程序的输出结果是:
main()
{ char s[]=“program”,*p;
for(p=s;p printf("%s\n",p);
}

三、程序填空(每空2分,共20分)
1、有 N个国家名,要求按字母先后顺序排列(用起泡排序法)后输出。
#define N 20
#include
#include
void main()
{ int a[N][30],t[30],i,j,s;
printf("\n初始数组:\n");
for (i=0;i gets(a[i]);
for (i=0;i< (1) ;i++)
for(j=0;j< (2) ;j++)
if( (3) )
{ strcpy(t,a[j]);
strcpy(a[j],a[j+1]);
strcpy(a[j+1],t);
}
printf("\n排序后:\n");
for (i=0;i printf("%s\n",a[i]);
}
2、求出两数的最大公约数。其中求非负整数X,Y的最大公约数GCD(X,Y)的公式如下:

   #include
    int gcd(int x,int y) 

{ int temp;
if(y==0) temp= (1)
else if(x>=y) temp= (2)
else temp= (3)
return(temp);
}
main()
{ int x,y,grs;
scanf("%d%d",&x,&y);
grs=gcd(x,y);
printf(“gcd=%d “,grs );
}
3、已知数组a中有7个互不相等的元素,数组b中有 5 个互不相等的元素,而数组c中包含那些在a中但不在b中的元素,编程产生数组c,并输出数组c。请填空:
#include
void main()
{ int a[7],b[5],i,j,count;
(1)
for(i=0;i<7;i++) scanf(”%d”,&a[i]);
for(i=0;i<5;i++) scanf("%d",&b[i]);
count=0;
for(i=0;i<7;i++)
{ for(j=0;j<5;j++)
if(a[i]b[j]) (2)
if(j
5)
{ (3)
count++;
}
}
for(i=0; (4) ;i++)
printf("%5d",c[i]);
}
四、填空题(每空1分,共10分)
1、数学公式 , 写成C语言表达式是 。
2、若x=3,y=z=4,则表达式(z>=y>=x)?1:0的值为 。
3、表达式x=(a=3,6a)和表达式x=a=3,6a分别是 表达式和 表达式
4、break只能用于 和 循环语句中。
5、int (*p)[5]; 定义的p是一个 。
6、C语言可以处理的文件类型是 和 。
7、如下图所示,在链表第一个结点前插入p所指向的结点的关键语句是:
和 。
其中结构体数据类型和指针变量的定义如下:
struct stu
{ int a;
float b;
struct stu *next;
} *head, *p;

五、编程题(共29分,分别9分、10分、10分)
1、打印200到300之间所有的素数。
2、20个学生3门课,求每门课的最高分,放入一个一维数组中,输出每门课的最高分。
3、有 N个数的数组中找出最小的数与最后一个交换。要求:编写函数实现上述交换功能,在main()函数里进行函数调用并打印。

模拟试卷三

一 、选择题(每题1分,共15分)
1.以下说法正确的是 。
A、C语言程序总是从第一个定义的函数开始执行
B、C语言程序中main函数的定义必须放在程序的开始
C、C语言程序总是从main函数开始执行
D、在C语言中有自己的输入输出语句
2.下列合法的C语言标识符是 。
A、M.D.John B、3count C、while D、_total
3.在C语言中,要求运算数必须是整型的运算符是 。
A、/ B、% C、< D、&&
4.对于int a,表达式1<=a<=5的值是 。
A、根据a的值来定 B、0 C、1 D、语法错误
5.已有如下定义和输入语句,若要求a和b的值分别为10、20.5,正确的数据输入方法是 。(↙代表回车)
int a; float b;
scanf(“a=%d,b=%f”,&a,&b);
A、10,20.5↙ B、a=10 b=20.5↙ C、a=10,b=20.5↙ D、10↙20.5↙
6.执行语句char str[]=”ab\tde\fg\n”;printf(“%d”,strlen(str));后输出 。
A、12 B、9 C、14 D、10
7.有如下程序
void main()
{ int x=1,y=0,a=1,b=1;
switch(x)
{case 1: switch(y)
{case 0:b++;break;
case 1:a++;
}
case 3: b++;
case 2: a++;
}
printf(“a=%d,b=%d”,a,b);
}
该程序的输出结果是 。
A、a=3,b=3 B、a=1,b=3 C、a=2,b=3 D、a=1,b=2
8.以下程序的运行结果是 。
void main()
{ int i;
for(i=3;i<10;i++)
{ if(ii /20) break;
printf(“%d ”,i);
}
}
A、3 4 5 6 7 B、3 4 C、3 4 5 D、3 4 5 6
9.以下正确定义数组并正确赋初值的语句是 。
A、int n=5;int a[n]; B、char str[20];str=”happy”;
C、float a[2][]={{1.1,2,3},{2.5,1.2,5.6}} D、int a[][2]={1,2,3,4};
10.有如下程序段:
int * p,a=10,b=1;
p=&a;a=p+b;
执行该程序段后,a的值是 。
A、12 B、11 C、10 D、编译出错
11.执行如下程序段的结果是 。
char str[]=”hello”,p=str;
printf(“%s”,p+2);
A、lo B、ello C、llo D、语法错误
12.若有定义int a[3][5]; 不能表示a[2][1]。
A、
(&a[2][1]) B、
(
(a+2)+1) C、(a+11) D、(a[2]+1)
13.在C语言中,有关函数的定义正确的是 。
A、函数的定义可以嵌套,函数的调用不可以嵌套
B、函数的定义不可以嵌套,函数的调用可以嵌套
C、函数的定义和调用都不可以嵌套
D、函数的定义和调用都可以嵌套
14.有如下函数调用语句:
func(e1,e2+e3,fabs(e4));
函数调用语句中含有的实参个数是 。
A、4 B、5 C、3 D、语法错误
15.下面说法正确的是: 。
A、定义结构体时,它的每个成员的数据类型必须不同
B、定义结构体时,各成员项之间可以用分号也可用逗号隔开
C、定义结构体时,其成员不能是另一个结构体的变量
D、定义一个结构体,实际上是定义了一个新的类型

二、填空题(每空1分,共10分)
1.著名计算机科学家沃思提出一个公式:程序= +算法
2.在内存中,字符型数据在内存中以 形式存放。
3.若有如下定义float f=123.4567;要求输出该数时保留1位小数,共占8列,左对齐,则具体的printf语句是 。
4.若有如下定义:int year;若year能被4整除且不能被100整除;或year能被400整除,就是闰年,其在c语言中的表达式是 。
5.数学式子:所对应的C语言表达式是 。
6.设x=3.5,a=10,y=5.7,则算术表达式x+a%3*(int)(x+y)%2/4的值是 。
7.do…while循环语句至少能执行 次循环体。
8.构成数组的各元素具有相同的 。
9.共用体变量所占的内存的长度为 。
10.当用fopen函数打开一个文件时,若打开成功返回 类型的指针。

三、阅读程序写结果(每题3分,共15分)
(假设所需的头文件都已经包含了)
1.以下程序运行的结果是 。
int i=5,j=1;
int f(int x)
{ static int k=0;
x+=k;
++k;
return x;
}
void main()
{ int i;
i=f(2);
i=f(3);
printf(“%d”,i+j);
}

2.以下程序运行的结果是 。
long fun(int n)
{
long s;
if(n==1) s=1;
else s=fun(n-1)+n;
return s;
}
void main()
{ printf(“%ld”,fun(5));
}

3.以下程序运行的结果是 。
void main()
{ char a[100]=”abcde”,b[]=”xyz”;
int i=0,j=0;
while(a[i])!=’\0’) i++;
while(b[j]!=’\0’) { a[i]=b[j];j++;i++;}
a[i]=’\0’;
puts(a);
}
4.以下程序运行的结果是 。
void main()
{ int i,j,k;
for(i=0;i<=3;i++)
{ for(j=1;j<=i;j++)
printf(“#”);
for(k=0;k<3;k++)
printf(“*”);
printf(“\n”);
}
}
5.以下程序运行的结果是 。
void main()
{
int a[6]={5,9,6,4,3,1},i,j,k;
int * p[6],*t;
for(i=0;i<6;i++) p[i]=&a[i];
for(i=0;i<5;i++)
{ k=i;
for(j=i+1;j<6;j++)
if(*p[j]<*p[k]) k=j;
t=p[i];p[i]=p[k];p[k]=t;
}
for(i=0;i<6;i++) printf(“%2d”,*p[i]);
}

四、程序填空题(每空2分,共20分)
1.下面程序是求出一个数组中的最大值,请填空
void maxvalue(int *a,int n,int * pmax)
{ int i;

for(i=1;i*pmax)                

}
void main()
{ int a[8]={10,-1,8,30,90,-67,0,66};
int max;

printf(“max=%d\n”,max);
}
2.以下程序要任意输入10个学生的学号和成绩,并求出他们的平均成绩,请填空:
struct student
{ int num;
float score;
};
void main()
{ struct student stu[10];
int i;

for(i=0;i<10;i++)
{	printf(“please input num score\n”);
	                  
	sum+=stu[i].score;
}
printf(“average is %7.2f\n,sum/10);

}
3.任意输入3行文字,统计3行文字中,数字字符、空格、英文字母的个数,请填空:
void main()
{
char str[3][80], c;
int i,j,n1,n2,n3; /n1:数字字符的个数,n2:英文字母的个数,n3:空格的个数/
n1=n2=n3=0;
for(i=0;i<3;i++)

for(i=0;i<3;i++)
	for(j=0;            ;j++)
		if(              )  n1++;
		else if(c>=’a’&&c<=’z’ || c>=’A’&&c<=’Z’)  n2++;
		else if(c= =’ ‘) n3++;
printf(“number=%d,letter=%d,space=%d\n”,n1,n2,n3);

}
4.求1!+2!+3!+…+10!,请填空
void main()
{
int i;
double t,sum=0;

for(i=1;i<=10;i++)
{
sum+=t;
}
printf(“sum=%.0f\n”,sum);
}

五、编程题(共40分)
1.(5分)给一个不多于5位的正整数,要求求出它是几位数,并输出所求出的位数。
2.(10分)任意输入一个字符串,判断它是不是回文。如:“level”“abba”等是回文,但“abcd”不是回文。并输出判断结果。
3.(5分)已有一个链表,它的结点类型是下面定义的结构体类型。
struct node
{ int data;
struct node * next:
}
现要求编写一个函数insertfront,功能是在函数内部动态创建一个新结点,把该结点插入到已知的链表的最前面,使该结点成为新的头结点。
4.(1)(10分)写一个函数findprime,功能是找出一个整型数组中的所有素数,存放到另一个数组中,并返回素数的个数。
(2)(5分)写一个函数sort,功能是把一个整型数组中的元素用“起泡法”进行由小到大的排序。
(3)(5分)写出主函数,在主函数中定义二个10个元素的整型数组a、b,从键盘任意输入10个数存到a中,通过调用(1)中的函数求出a数组中的所有素数,存放到数组b中,然后通过调用(2)中的函数来对b数组中的元素进行排序。最后先输出a中的各元素,再输出b中的各元素。

你可能感兴趣的:(C/C++,学习题库,c++,c语言,c#)