2023年甘肃自考《C语言程序设计》练习题及答案

发布日期:2024-01-17 编辑整理:甘肃省自考网 【字体:

程序填空题

  导读:在程序填空题中,已经给出了程序的主干,读者首先要理解程序的思路,再选择正确的内容填入空白处,使程序完成既定的功能。这类习题的设计就是要引导读者逐步掌握编程的方法。本节习题的难度适中,可能有些典型的程序在课堂上已经有所接触,读者一定要独立完成它,这样就可以逐步提高自己的编程能力。在程序设计语言学习的中期,读者对程序设计已经有了初步的了解,而自己编写程序又不知从何处入手,此时解答此类题目可以避免盲目性,从而提高学习的效率。

  【3.1】下面程序的功能是不用第三个变量,实现两个数的对调操作。

  #include

  main()

  { int a,b;

  scanf("%d%d",&a,&b);

  printf("a=%d,b=%d\n",a,b);

  a= ① ;

  b= ② ;

  a= ③ ;

  printf("a=%d,b=%d\n",a,b);

  }

  【3.2】下面程序的功能是根据近似公式:π2/6≈ 1/12+1/22+1/32+ …… +1/n2,求π值。

  #include

  double pi(long n)

  { double s=0.0;

  long i;

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

  s=s+ ① ;

  return( ② );

  }

  【3.3】下面的程序的功能是求一维数组中的最小元素。

  findmin(int *s,int t,int *k)

  { int p;

  for(p=0,*k=p;p<t;p++)< p="" style="padding: 0px; margin: 0px;">

  if(s[p]<s[*k])< p="" style="padding: 0px; margin: 0px;">

  ① ;

  }

  main()

  { int a[10],i,*k=&i;

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

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

  findmin(a,10,k);

  printf("%d,%d\n",*k,a[*k]);

  }

  【3.4】下面程序的功能是计算1-3+5-7+ …… -99+101的值。

  main()

  { int i,t=1,s=0;

  for(i=1;i<=101;i+=2)

  { ① ;

  s=s+t;

  ② ;

  }

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

  }

  【3.5】有以下程序段:

  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;

  do

  { s=s+d;

  ② ;

  d=1.0/(k*(k+1));

  }while( ③ );

  printf("%f\n",s);

  【3.6】下面程序的功能是从键盘上输入若干学生的学习成绩,统计并输出最高成绩和最低成绩,当输入为负数时结束输入。

  main()

  { float x,amax,amin;

  scanf("%f",&x);

  amax=x;

  amin=x;

  while( ① )

  { if(x>amax) amax=x;

  if( ② ) amin=x;

  scanf("%f",&x);

  }

  printf("\namax=%f\namin=%f\n",amax,amin);

  }

  【3.7】下面程序的功能是将形参x的值转换为二进制数,所得的二进制数放在一个一维数组中返回,二进制数的最低位放在下标为0的元素中。

  fun(int x,int b[])

  { int k=0,r;

  do

  { r=x% ① ;

  b[k++]=r;

  x/= ② ;

  }while(x);

  }

  【3.8】下面程序的功能是输出1到100之间每位数的乘积大于每位数的和的数。例如数字26,数位上数字的乘积12大于数字之和8。

  main()

  { int n,k=1,s=0,m;

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

  { k=1;

  s=0;

  ① ;

  while( ② )

  { k*=m%10;

  s+=m%10;

  ③ ;

  }

  if(k>s)

  printf("%d",n);

  }

  }

  【3.9】下面程序的功能是统计用0至9之间的不同的数字组成的三位数的个数。

  main()

  { int i,j,k,count=0;

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

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

  if( ① ) continue;

  else for(k=0;k<=9;k++)

  if( ② ) count++;

  printf("%d",count);

  }

  【3.10】下面程序的功能是输出100以内的个位数为6、且能被3整除的所有数。

  main()

  { int i,j;

  for(i=0; ① ;i++)

  { j=i*10+6;

  if( ② ) countinue;

  printf("%d",j);

  }

  }

  【3.11】下面程序的功能是用辗转相除法求两个正整数m和n的最大公约数。

  hcf(int m,int n)

  { int r;

  if(m<n)< p="" style="padding: 0px; margin: 0px;">

  { r=m;

  ① ;

  n=r;

  }

  r=m%n;

  while( ② )

  { m=n;

  n=r;

  r=m%n;

  }

  ③ ;

  }

  【3.12】下面程序的功能是使用冒泡法对输入的10个浮点数从小到大进行排序。排好序的10个数分两行输出。程序如下:

  #include

  main()

  { ① ;

  int i,j;

  printf("Input 10 numbers please\n");

  for(i=0; ② ;i++ )

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

  printf("\n");

  for(i=2; ③ ;i++ )

  for(j=0; ④ ;j++ )

  if( ⑤ )

  { x=a[j];

  ⑥ ;

  a[j+1]=x;

  }

  printf("The sorted 10 numbers;\n");

  for(i=0; ⑦ ;i++ )

  { if( ⑧ )

  printf("\n");

  printf("%f\t",a[i]);

  }

  printf("\n");

  }

  【3.13】下面程序的功能是读入20个整数,统计非负数个数,并计算非负数之和。

  #include "stdio.h"

  main()

  { int i,a[20],s,count;

  s=count=0;

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

  scanf("%d", ① );

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

  { if(a[i]<0)

  ② ;

  s+=a[i];

  count++;

  }

  printf("s=%d\t count=%d\n",s,count);

  }

  【3.14】下面程序的功能是删除字符串s中的空格。

  #include

  main()

  { char *s="Beijing ligong daxue";

  int i,j;

  for(i=j=0;s[i]!='\0';i++)

  if(s[i]!= ' ') ① ;

  else ② ;

  s[j]= '\0';

  printf("%s",s);

  }

  【3.15】下面程序的功能是将字符串s中所有的字符'c'删除。请选择填空。

  #include

  main( )

  { char s[80];

  int i,j;

  gets(s);

  for(i=j=0;s[i]!= '\0';i++ )

  if(s[i]!= 'c') ① ;

  s[j]= '\0';

  puts(s);

  }

【3.16】下面程序的功能是输出两个字符串中对应相等的字符。请选择填空。

  #include

  char x[]="programming";

  char y[]="Fortran";

  main()

  { int i=0;

  while(x[i]!= '\0' && y[i]!= '\0')

  if(x[i]==y[i])

  printf("%c", ① );

  else

  i++;

  }

  【3.17】下面程序的功能是将字符串s中的每个字符按升序的规则插到数组a中, 字符串a已排好序。

  #include

  main()

  { char a[20]="cehiknqtw";

  char s[]="fbla";

  int i,k,j;

  for(k=0;s[k]!= '\0';k++ )

  { j=0;

  while(s[k]>=a[j] && a[j]!= '\0' )

  j++;

  for( ① )

  ② ;

  a[j]=s[k];

  }

  puts(a);

  }

  【3.18】下面程序的功能是对键盘输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的ASCII码之差。例如:输入的两个字符串分别为"abcdefg"和"abceef",则输出为-1。

  #include

  main()

  { char str1[100],str2[100],c;

  int i,s;

  printf("Enter string 1: "); gets(str1);

  printf("Enter string 2: "); gets(str2);

  i=0;

  while((str1[i] == str2[i] && str1[i]!= ① ))

  i++;

  s= ② ;

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

  }

  【3.19】下面的函数expand在将字符串s复制到字符串t时, 将其中的换行符和制表符转换为可见的转义字符表示,即用'\n'表示换行符,用'\t'表示制表符。

  expand(char s[],char t[])

  { int i,j;

  for(i=j=0;s[i]!= '\0';i++ )

  switch (s[i])

  { case '\n': t[ ① ] = ② ;

  t[j++] = 'n';

  break;

  case '\t': t[ ③ ] = ④ ;

  t[j++] = 't';

  break;

  default: t[ ⑤ ] = s[i];

  break;

  }

  t[j] = ⑥ ;

  }

  【3.20】下面的函数index(char s[], char t[])检查字符串s中是否包含字符串t,若包含,则返回t在s中的开始位置(下标值),否则送回-1。

  index(char s[], char t[])

  { int i,j,k;

  for(i=0;s[i]!= '\0';i++ )

  { for(j=i,k=0; ① && s[j]==t[k];j++,k++) ;

  if( ② )

  return (i);

  }

  return(-1);

  }

  n

  【3.21】下面程序的功能是计算S= k! 。

  k=0

  long fun(int n)

  { int i;

  long s;

  for(i=1;i ① ;i++)

  s*=i;

  return( ② );

  }

  main()

  { int k,n;

  long s;

  scanf("%d",&n);

  s= ③ ;

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

  s+= ④ ;

  printf("%ld\n",s);

  }

  【3.22】下面程序的功能是显示具有n个元素的数组s中的最大元素。

  #define N 20

  main()

  { int i,a[N];

  for(i=0;i<n;i++)< p="" style="padding: 0px; margin: 0px;">

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

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

  }

  fmax(int s[],int n)

  { int k,p;

  for(p=0,k=p;p<n;p++)< p="" style="padding: 0px; margin: 0px;">

  if(s[p]>s[k]) ② ;

  return(k);

  }

  【3.23】下面程序的功能是由键盘输入n,求满足下述条件的x、y:

  nx和ny的末3位数字相同,且x≠y,x、y、n均为自然数,并使x+y为最小。

  #include

  pow3(int n,int x)

  { int i, last;

  for(last=1,i=1;i<=x;i++ )

  last= ① ;

  return(last);

  }

  main()

  { int x,n,min,flag=1;

  scanf("%d", &n);

  for(min=2;flag;min++)

  for(x=1;x<min p="" &&="" flag;x++="" )<="" style="padding: 0px; margin: 0px;">

  if( ② && pow3(n,x)==pow3(n,min-x))

  { printf("x=%d,y=%d\n", x, min-x );

  ③ ;

  }

  }

  【3.24】下面的程序是用递归算法求a的平方根。求平方根的迭代公式如下:

  #include

  double mysqrt( double a, double x0 )

  { double x1, y;

  x1 = ① ;

  if( fabs(x1-x0)>0.00001 )

  y = mysqrt( ② );

  else y = x1;

  return( y );

  }

  main()

  { double x;

  printf("Enter x: ");

  scanf("%lf", &x);

  printf("The sqrt of %lf=%lf\n", x, mysqrt( x, 1.0) );

  }

  【3.25】以下程序是计算学生的年龄。已知第一位最小的学生年龄为10岁,其余学生的年龄一个比一个大2岁,求第5个学生的年龄。

  #include

  age( int n )

  { int c;

  if( n==1 ) c=10;

  else c= ① ;

  return(c);

  }

  main()

  { int n=5;

  printf("age:%d\n", ② );

  }

  【3.26】下面的函数sum(int n)完成计算1~n的累加和。

  sum(int n)

  { if(n<=0)

  printf("data error\n");

  if(n==1) ① ;

  else ② ;

  }

  【3.27】下面的函数是一个求阶乘的递归调用函数。

  facto(int n)

  { if( n == 1 ) ① ;

  else return( ② );

  }

  【3.28】组合问题,由组合的基本性质可知:

  (1) C(m,n)=C(n-m,n)

  (2) C(m,n+1)=C(m,n)+C(m-1,n)

  公式(2)是一个递归公式,一直到满足C(1,n)=n为止。当n<2*m时,可先用公式(1) 进行简化,填写程序中的空白,使程序可以正确运行。

  #include"stdio.h"

  main()

  { int m,n;

  printf("Input m,n=");

  scanf("%d%d", &m, &n);

  printf("The combination numbeers is %d\n", combin(m,n));

  }

  combin( int m, int n)

  { int com;

  if( n<2*m ) m=n-m;

  if( m==0 ) com=1;

  else if(m==1) ① ;

  else ② ;

  return(com);

  }

  【3.29】下列函数是求一个字符串str的长度。

   int strlen( char *str )

  { if( ① ) return (0);

    else return ( ② );

  }

  【3.30】用递归实现将输入小于32768的整数按逆序输出。如输入12345,则输出54321。

  #include"stdio.h"

  main()

  { int n;

  printf("Input n : ");

  scanf("%d", ① );

  r(n);

  printf("\n");

  }

  r( int m )

  { printf("%d", ② );

  m = ③ ;

  if( ④ )

  ⑤ ;

  }

【3.31】输入n值,输出高度为n的等边三角形。例如当n=4时的图形如下:

  *

  ***

  *****

  *******

  #include

  void prt( char c, int n )

  { if( n>0 )

  { printf( "%c", c );

  ① ;

  }

  }

  main()

  { int i, n;

  scanf("%d", &n);

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

  { ② ;

  ③ ;

  printf("\n");

  }

  }

  【3.32】下面的函数实现N层嵌套平方根的计算。

  double y(double x, int n)

  { if( n==0 )

  return(0);

  else return ( sqrt(x+( ① )) );

  }

  【3.33】函数revstr(s)将字符串s置逆,如输入的实参s为字符串"abcde", 则返回时 s 为字符串"edcba"。递归程序如下:

  revstr( char *s )

  { char *p=s, c;

  while(*p) p++;

  ① ;

  if(s<p)< p="" style="padding: 0px; margin: 0px;">

  { c=*s;

  *s=*p;

  ② ;

  revstr(s+1);

  ③ ;

  }

  }

  如下是由非递归实现的revstr(s)函数:

  revstr (s)

  char *s;

  { char *p=s, c;

  while( *p ) p++;

  ④ ;

  while( s

<p p="" )<="" style="padding: 0px; margin-top: 0px; margin-bottom: 0px; border: 0px; line-height: 40px; color: rgb(51, 51, 51); font-family: "Microsoft YaHei", 微锟斤拷锟脚猴拷, SimSun, 锟斤拷锟斤拷; font-size: 14px; text-wrap: wrap; background-color: rgb(255, 255, 255);">

  { c=*s;

  ⑤ = *p;

  *p-- = c;

  }

  }

  【3.34】下面函数用递归调用的方法,将str中存放的长度为n的字符串反转过来,例如原来是"ABCDE",反序为"EDCBA"。

  void invent(char *str,int n)

  { char t;

  t=*str; *str=*(str+n-1); *(str+n-1)=t; if( n>2 ) invent ( ① ,n-2);

  else ② ;

  }

  【3.35】从键盘上输入10个整数,程序按降序完成从大到小的排序。

  #include

  int array[10];

  sort( int *p, int *q )

  { int *max, *s;

  if( ① )

  return;

  max=p; for( s=p+1; s<=q; s++)

  if( *s > *max )

  ② ; swap( ③ );

  sort( ④ ); }

  swap( int *x, int *y ) { int temp;

  temp=*x;

  *x=*y;

  *y=temp;

  }

  main()

  { int i; printf("Enter data :\n"); for( i=0; i<10; i++)

  scanf("%d", &array[i]); sort( ⑤ );

  printf("Output:");

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

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

  }

  【3.36】下面函数的功能是将一个整数存放到一个数组中。存放时按逆序存放。例如:483存放成"384"。

  #include

  void convert(char *a, int n)

  { int i;

  if((i=n/10) !=0 )

  convert( ① , i );

  *a = ② ;

  }

  char str[10]= " ";

  main()

  { int number;

  scanf("%d", &number);

  convert( str, number );

  puts(str);

  }

  【3.37】下面程序的功能是实现数组元素中值的逆转。

  #include

  main()

  { int i,n=10,a[10]={1,2,3,4,5,6,7,8,9,10};

  invert(a,n-1);

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

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

  printf("\n");

  }

  invert(int *s,int num)

  { int *t,k;

  t=s+num;

  while( ① )

  { k=*s;

  *s=*t;

  *t=k;

  ② ;

  ③ ;

  }

  }

  【3.38】下面程序通过指向整型的指针将数组a[3][4] 的内容按3行×4列的格式输出,请给printf( )填入适当的参数,使之通过指针p将数组元素按要求输出。

  #include

  int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}, *p=a;

  main()

  { int i,j;

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

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

  printf("%4d ", ① );

  }

  }

  【3.39】下面程序的功能是:从键盘上输入一行字符,存入一个字符数组中,然后输出该字符串。

  #include

  main ( )

  { char str[81], *sptr;

  int i;

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

  { str[i]=getchar( );

  if(str[i]== '\n') break;

  }

  str[i]= ① ;

  sptr=str;

  while( *sptr )

  putchar( *sptr ② );

  }

  【3.40】下面函数的功能是将字符变量的值插入已经按ASCII码值从小到大排好序的字符串中。

  void fun(char *w,char x,int *n)

  { int i,p=0;

  while(x>w[p]) ① ;

  for(i=*n;i>=p;i--) ② ;

  w[p]=x;

  ++*n;

  }

  【3.41】下面程序的功能是从键盘上输入两个字符串,对两个字符串分别排序;然后将它们合并,合并后的字符串按ASCII码值从小到大排序,并删去相同的字符。

  #include

  strmerge(a,b,c) /* 将已排好序的字符串a、b合并到c */

  char *a,*b,*c;

  { char t,*w;

  w=c;

  while( *a!= '\0' ① *b!='\0' )

  { t= ② ?*a++:*b<*a ? *b++ : ( ③ ); /* 将*a、*b的小者存入t */

  if( *w ④ '\0' ) *w=t;

  else if( t ⑤ *w) *++w=t; /* 将与*w不相同的t存入w */

  }

  while( *a != '\0' ) /* 以下将a或b中剩下的字符存入w */

  if( *a != *w ) *++w=*a++;

  else a++;

  while( *b != '\0')

  if( *b != *w ) *++w=*b++;

  else b++;

  *++w = ⑥ ;

  }

  strsort( char *s ) /* 将字符串s中的字符排序 */

  { int i,j,n;

  char t,*w;

  ⑦ ;

  for( n=0;*w != '\0'; ⑧ )

  w++;

  for( i=0;i<n-1;i++ p="" )<="" style="padding: 0px; margin: 0px;">

  for( j=i+1;j<n;j++ p="" )<="" style="padding: 0px; margin: 0px;">

  if( s[i]>s[j] )

  { ⑨ }

  }

  main( )

  { char s1[100],s2[100],s3[200];

  printf("\nPlease Input First String:");

  scanf("%s",s1);

  printf("\nPlease Input Second String:");

  scanf("%s",s2);

  strsort(s1);

  strsort(s2);

  ⑩ = '\0';

  strmerge(s1,s2,s3);

  printf("\nResult:%s",s3);

  }

  【3.42】已知某数列前两项为2和3,其后继项根据前面最后两项的乘积,按下列规则生成:

  ① 若乘积为一位数,则该乘积即为数列的后继项;

  ② 若乘积为二位数,则该乘积的十位上的数字和个位上的数字依次作为数列的两个后继项。

  下面的程序输出该数列的前N项及它们的和,其中,函数sum(n,pa) 返回数列的前N项和,并将生成的前N项存入首指针为pa的数组中,程序中规定输入的N值必须大于2,且不超过给定的常数值MAXNUM。

  例如:若输入N的值为10,则程序输出如下内容:

  sum(10)=44

  2 3 6 1 8 8 6 4 2 4

  #include "stdio.h"

  #define MAXNUM 100

  int sum(n, pa)

  int n, *pa;

  { int count, total, temp;

  *pa = 2;

  ① =3;

  total=5;

  count=2;

  while( count++<n p="" )<="" style="padding: 0px; margin: 0px;">

  { temp = *(pa-1) * *pa;

  if( temp<10 )

  { total += temp;

  *(++pa) = temp;

  }

  else

  { ② = temp/10;

  total += *pa;

  if( count<n p="" )<="" style="padding: 0px; margin: 0px;">

  { count ++; pa++;

  ③ = temp%10;

  total += *pa;

  }

  }

  }

  ④ ;

  }

  main()

  { int n, *p, *q, num[MAXNUM];

  do

  { printf("Input N=? (2<n<%d): p="" style="padding: 0px; margin: 0px;">

  scanf("%d", &n);

  }while( ⑤ );

  printf("\nsum(%d)=%d\n", n, sum(n, num));

  for( p=num, q = ⑥ ; p<q; p="" )<="" style="padding: 0px; margin: 0px;">

  printf("%4d", *p);

  printf("\n");

  }

  【3.43】下面程序的功能是输入学生的姓名和成绩,然后输出。

  #include

  struct stuinf

  { char name[20]; /* 学生姓名 */

  int score; /* 学生成绩 */

  } stu, *p;

  main ( )

  { p=&stu;

  printf("Enter name:");

  gets( ① );

  printf("Enter score: ");

  scanf("%d", ② );

  printf("Output: %s, %d\n", ③ , ④ );

  }

  【3.44】下面程序的功能是按学生的姓名查询其成绩排名和平均成绩。查询时可连续进行,直到输入0时才结束。

   #include

  #include

  #define NUM 4

   struct student

   { int rank;

  char *name;

  float score;

  };

   ① stu[ ]={ 3,"liming",89.3,

   4,"zhanghua",78.2,

   1,"anli",95.1,

   2,"wangqi",90.6

  };

  main()

  { char str[10];

   int i;

   do

  { printf("Enter a name");

   scanf("%s",str);

   for( i=0;i<num;i++ p="" )<="" style="padding: 0px; margin: 0px;">

   if( ② )

   { printf("Name :%8s\n",stu[i].name);

   printf("Rank :%3d\n",stu[i].rank);

   printf("Average :%5.1f\n",stu[i].score);

   ③ ;

   }

   if( i>=NUM ) printf("Not found\n");

   }while( strcmp(str,"0")!=0 );

  }

  【3.45】下面程序的功能是从终端上输入5个人的年龄、性别和姓名,然后输出。

  #include "stdio.h"

  struct man

  { char name[20];

  unsigned age;

  char sex[7];

  };

  main ( )

  { struct man person[5];

  data_in(person,5);

  data_out(person,5);

  }

  data_in(struct man *p, int n )

  { struct man *q = ① ;

  for( ;p<q;p++ p="" )<="" style="padding: 0px; margin: 0px;">

  { printf( "age:sex:name" );

  scanf("%u%s", &p->age, p->sex);

  ② ;

  }

  }

  data_out( struct man *p, int n )

  { struct man *q = __③__;

  for( ;p<q;p++ p="" )<="" style="padding: 0px; margin: 0px;">

  printf("%s;%u;%s\n", p->name, p->age, p->sex);

  }

【3.46】输入N个整数,储存输入的数及对应的序号,并将输入的数按从小到大的顺序进行排列。要求:当两个整数相等时,整数的排列顺序由输入的先后次序决定。例如:输入的第3个整数为5,第7个整数也为5,则将先输入的整数5排在后输入的整数5的前面。程序如下:

  #include "stdio.h"

  #define N 10

  struct

  { int no;

  int num;

  } array[N];

  main( )

  { int i,j,num;

  for( i=0;i<n;i++ p="" )<="" style="padding: 0px; margin: 0px;">

  { printf("enter No. %d:",i);

  scanf("%d",&num);

  for( ① ;j>=0&&array[j].num ② num; ③ )

  array[j+1]=array[j];

  array[ ④ ].num=num;

  array[ ⑤ ].no=i;

  }

  for( i=0;i<n;i++ p="" )<="" style="padding: 0px; margin: 0px;">

  printf("%d=%d,%d\n",i,array[i].num,array[i].no);

  }

  【3.47】以下程序的功能是:读入一行字符(如:a、...y、z),按输入时的逆序建立一个链接式的结点序列,即先输入的位于链表尾(如下图),然后再按输入的相反顺序输出,并释放全部结点。

2023年安徽自考《C语言程序设计》练习题及答案


  #include

  main( )

  { struct node

  { char info;

  struct node *link;

  } *top,*p;

  char c;

  top=NULL;

  while((c= getchar( )) ① )

  { p=(struct node *)malloc(sizeof(struct node));

  p->info=c;

  p->link=top;

  top=p;

  }

  while( top )

  { ② ;

  top=top->link;

  putchar(p->info);

  free(p);

  }

  }

  【3.48】下面函数将指针p2所指向的线性链表,串接到p1所指向的链表的末端。假定p1所指向的链表非空。

  #define NULL 0

  struct link

  { float a;

  struct link *next;

  };

  concatenate ( p1,p2 )

  struct list *p1,*p2;

  { if( p1->next==NULL )

  p1->next=p2;

  else

  concatenate( ① ,p2);

  }

  【3.49】下面程序的功能是从键盘输入一个字符串,然后反序输出输入的字符串。

  #include

  struct node

  { char data;

  struct node *link;

  }*head;

  main()

  { char ch;

  struct node *p;

  head = NULL;

  while(( ch=getchar())!='\n' )

  { p = (struct node *)malloc(sizeof(struct node));

  p->data = ch;

  p->link = ① ;

  head = ② ;

  }

  ③ ;

  while( p!=NULL )

  { printf("%c ", p->data);

  p = p->link;

  }

  }

  【3.50】下面程序的功能是从键盘上顺序输入整数,直到输入的整数小于0时才停止输入。然后反序输出这些整数。

  #include

  struct data

  { int x;

  struct data *link;

  }*p;

  input()

  { int num;

  struct data *q;

  printf("Enter data:");

  scanf("%d", &num);

  if( num<0 )

  ① ;

  q = ② ;

  q->x = num;

  q->link = p;

  p=q;

  ③ ;

  }

  main()

  { printf("Enter data until data<0:\n");

  p=NULL;

  input();

  printf("Output:");

  while( ④ )

  { printf("%d\n", p->x);

  ⑤ ;

  }

  }

  【3.51】下面函数的功能是创建一个带有头结点的链表,将头结点返回给主调函数。链表用于储存学生的学号和成绩。新产生的结点总是位于链表的尾部。

  struct student

  { long num;

  int score;

  struct student *next;

  };

  struct student *creat()

  { struct student *head=NULL,*tail;

  long num; int a;

  tail= ① malloc(LEN);

  do

  { scanf("%ld,%d",&num,&a);

  if(num!=0)

  { if(head==NULL) head=tail;

  else ② ;

  tail->num=num; tail->score=a;

  tail->next=(struct student *)malloc(LEN);

  }

  else tail->next=NULL;

  }while(num!=0);

  return( ③ );

  }

  【3.52】下面create函数的功能是建立一个带头结点的单向链表,新产生的结点总是插入在链表的末尾。单向链表的头指针作为函数值返回。

  #include

  #define LEN sizeof(struct student)

  struct student

  { long num;

  int score;

  struct student *next;

  };

  struct student *creat()

  { struct student *head=NULL,*tail;

  long num;

  int a;

  tail=( ① )malloc(LEN);

  do

  { scanf("%ld,%d",&num,&a);

  if(num!=0)

  { if(head==NULL) head=tail;

  else tail=tail->next;

  tail->num=num;

  tail->score=a;

  tail->next=( ② )malloc(LEN);

  }

  else tail->next=NULL;

  }while(num!=0);

  ③ ;

  }

  【3.53】下面程序的功能是统计文件中的字符的个数。

  #include

  main()

  { long num=0;

  ① *fp;

  if((fp=fopen("fname.dat", "r"))==NULL)

  { printf("Can't open the file! ");

  exit(0);

  }

  while( ② )

  { fgetc(fp);

  num++;

  }

  printf("num=%d\n",num);

  fclose(fp);

  }

  【3.54】下面程序的功能是把从键盘输入的文件(用 @ 作为文件结束标志)复制到一个名为second.txt的新文件中。

  #include

  FILE *fp;

  main()

  { char ch;

  if((fp=fopen( ① ))==NULL)

  exit(0);

  while((ch=getchar())!='@')

  fputc(ch,fp);

  ② ;

  }

  【3.55】下面程序的功能是将磁盘上的一个文件复制到另一个文件中,两个文件名在命令行中给出(假定给定的文件名无误)。

  #include

  main(int argc,char *argv[])

  { FILE &f1,*f2;

  if(argc< ① )

  { printf("The command line error! ");

  exit(0);

  }

  f1=fopen(argv[1], "r");

  f2=fopen(arhv[2], "w");

  while( ② )

  fputs(fgetc(f1), ③ );

  ④ ;

  ⑤ ;

  }

  【3.56】下面程序的功能是根据命令行参数分别实现一个正整数的累加或阶乘。例如:如果可执行文件的文件名是sm,则执行该程序时输入:"sm + 10",可以实现10的累加;输入:"sm - 10",可以实现求10的阶乘。

  #include

  #include

  main (int argc,char *argv[])

  { int n;

  void sum(),mult();

  void (*funcp)();

  n=atoi(argv[2]);

  if(argc!=3 || n<=0)

  dispform( );

  switch ( ① )

  { case '+': funcp=sum;

  break;

  case '-': funcp=mult;

  break;

  default: dispform( );

  }

  ② ;

  }

  void sum(int m)

  { int i,s=0;

  for(i=1;i<m;i++ p="" )<="" style="padding: 0px; margin: 0px;">

  ③ ;

  printf("sum=%d\n",s);

  }

  void mult(int m)

  { long int i, s=1;

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

  s *= i;

  printf("mult= %ld\n";s);

  }

  dispform( )

  { printf ("usage:sm n(+/!) (n>0)\n");

  exit (0);

  }

  【3.57】下面程序的功能是键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母,输出到文件test.txt中,然后从该文件读出字符串并显示出来。

  #include

  main()

  { char str[100];

  int i=0;

  FILE *fp;

  if((fp=fopen("test.txt", ① ))==NULL)

  { printf("Can't open the file.\n");

  exit(0);

  }

  printf("Input a string:\n");

  gets(str);

  while(str[i])

  { if(str[i]>= 'a'&&str[i]<= 'z')

  str[i]= ② ;

  fputc(str[i],fp);

  i++;

  }

  fclose(fp);

  fp=fopen("test.txt", ③ );

  fgets(str,strlen(str)+1,fp);

  printf("%s\n",str);

  fclose(fp);

  }

  【3.58】下面程序的功能是将从终端上读入的10个整数以二进制方式写入名为"bi.dat"的新文件中。

  #include

  FILE *fp;

  main()

  { int i, j;

  if(( fp=fopen( ① , "wb" )) == NULL )

  exit (0);

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

  { scanf("%d", &j );

  fwrite( ② , sizeof(int), 1, ③ );

  }

  fclose( fp);

  }

  【3.59】以字符流形式读入一个文件,从文件中检索出六种C语言的关键字,并统计、 输出每种关键字在文件中出现的次数。本程序中规定:单词是一个以空格或'\t'、 '\n'结束的字符串。

  #include

  #include

  FILE *cp;

  char fname[20], buf[100];

  int num;

  struct key

  { char word[10];

  int count;

  }keyword[]={ "if", 0, "char", 0, "int", 0,

  "else", 0, "while", 0, "return", 0};

  char *getword (FILE *fp)

  { int i=0;

  char c;

  while((c=getc(fp)) != EOF && (c==' '||c=='\t'||c=='\n')) ;

  if( c==EOF ) return (NULL) ;

  else buf[i++]=c;

  while((c = ① && c!= ' ' && c!= '\t' && c!= '\n' )

  buf[i++] = c;

  buf[i]= '\0';

  return(buf);

  }

  lookup(char *p)

  { int i;

  char *q, *s;

  for(i=0;i<num;i++)< p="" style="padding: 0px; margin: 0px;">

  { q = ② ;

  s=p;

  while( *s && (*s==*q) )

  { ③

  }

  if( ④ )

  { keyword[i].count++;

  break;

  }

  }

  return;

  }

  main()

  { int i;

  char *word;

  printf("Input file name:");

  scanf("%s", fname);

  if((cp=fopen(fname, "r")) ==NULL )

  { printf("File open error: %s\n", fname);

  exit(0);

  }

  num = sizeof(keyword) / sizeof(struct key);

  while( ⑤ )

  lookup(word);

  fclose(cp);

  for(i=0;i<num;i++)< p="" style="padding: 0px; margin: 0px;">

  printf("keyword:%-20scount=%d\n",keyword[i].word,keyword[i].count);

  }

  【3.60】下面程序的功能是从键盘接受姓名(例如:输入"ZHANG SAN"),在文件"try.dat"中查找,若文件中已经存入了刚输入的姓名,则显示提示信息;若文件中没有刚输入的姓名,则将该姓名存入文件。要求:⑴若磁盘文件"try.dat",已存在,则要保留文件中原来的信息;若文件"try.dat"不存在,则在磁盘上建立一个新文件;⑵当输入的姓名为空时(长度为0),结束程序。

  #include

  main()

  { FILE *fp;

  int flag;

  char name[30], data[30];

  if((fp=fopen("try.dat",  ① ))==NULL )

  { printf("Open file error\n");

  exit(0);

  }

  do

  { printf("Enter name:");

  gets(name);

  if( strlen(name)==0 )

  break;

  strcat(name, "\n");

  ② ;

  flag=1;

  while( flag && (fgets(data, 30, fp) ③ ) )

  if( strcmp(data, name) == 0 )

  ④ ;

  if( flag )

  fputs(name, fp);

  else

  printf("\tData enter error !\n");

  } while(  ⑤  );

  fclose(fp);

  }

【程序填空题参考答案】

  【3.1】答案: ① a+b ② a-b ③ a-b

  【3.2】答案:① 1.0/(float)(i*i) ② sqrt(6*s)

  【3.3】答案:① *k=p

  【3.4】答案:① t=t*i ② t=t>0?-1:1

  【3.5】答案:① d=1 ② k++ ③ k<=n

  【3.6】答案: ① x>=0 ② x<amin< p="" style="padding: 0px; margin: 0px;">

  【3.7】答案: ① 2 ② 2

  【3.8】答案:① m=n ② m>0 ③ m=m/10

  【3.9】答案:① i==j ② k!=i&&k!=j

  【3.10】答案:① i<=9 ② j%3!=0

  【3.11】答案:① m=n ② r!=0 ③ return(n)

  【3.12】答案:① float a[10],x ② i<=9 ③ i<=8 ④ j<=9-i

  ⑤ a[j]>a[j+1] ⑥ a[j]=a[j+1] ⑦ i<=9 ⑧i%5==0

  【3.13】答案:① &a[i] ② continue

  注释:①是基本概念,使用scanf函数输入数组元素的值。当输入的元素值小于0时,应当跳过后面的语句,取下一个数,所以②要填入continue。

  【3.14】答案:① s[j++]=s[i] ② s[j]=s[i]

  【3.15】答案:① s[j++]=s[i]

  【3.16】答案:① x[i++]

  【3.17】答案:① i=strlen(a);i>=j;i-- ② a[i+1]=a[i]

  【3.18】答案:① '\0' ② str1[i]-str2[i]

  【3.19】答案:① j++ ② '\\' ③ j++ ④ '\\' ⑤ j++ ⑥ '\0'

  【3.20】答案:① t[k]!= '\0' ② t[k]== '\0'

  【3.21】答案:① <=n ② s ③ 0 ④ fun(k)

  【3.22】答案:① a[fmax(a,N)] ② k=p

  【3.23】答案:① last*n%1000 ② x!=min-x ③ flag=0

  【3.24】答案:① (x0+a/x0)/2 ② a,x1

  注释:根据迭代公式,①处应当是计算迭代值x1=(x0+a/x0)/2。按照求平方根的要求,当迭代的精度不能满足"(fabs(x1-x0)>0.00001)"时,则要继续迭代,因此②处应当填写"a,x1"。程序中调用了求绝对值的库函数fabs( )。

  【3.25】答案:① 2+age(n-1) ② age(5)

  注释:由于程序是递归算法,因此首先要建立问题的递归数学模型。根据原题的描述可以写出如下递归公式:

  age(n) = 10 (n=1)

  age(n) = 2+age(n-1) (n>1)

  对照程序和递归公式可以看出:n的含义是第n位学生。很显然,要求第5位学生的年龄,②处应当是调用函数age,实参的值应当是5。在①处应该是函数的递归调用,根据递归公式,应当填写:2+age(n-1)。

  【3.26】答案:① return(1) ② return (sum(n-1)+n)

  注释:按照常规的编程方法,此问题可采用一个循环语句实现。阅读程序,没有发现循环语句,这时,应当认为原来的编程者使用的是非常规的算法。对于这样常规算法需要用循环实现而没有使用循环的程序,就可以肯定地认为,一定是使用了递归算法。

  将问题"求1~n的累加和"的公式写成递归定义,可以是如下形式;

  sum(n)=1 当n=1时

  sum(n)=sun(n-1)+n 当n>1时

  根据此递归定义,可以很容易完成程序。

  【3.27】答案:① return(1) ② n*facto(n-1)

  注释:我们熟悉的求n!的算法一般是采用循环语句实现,但在此程序中根本没有循环语句。这时我们应该想到:是采用递归算法实现的。首先写出求n!的递归公式;

  n!=1 当n=1时

  n!=n*(n-1) 当n>1时

  根据此递归定义,可以很容易完成程序。

  【3.28】答案:① com=n ② com=combin(n-1,m-1) + combin(n-1,m)

  注释:题目的说明中已经给出组合问题的递归定义,不需要读者自己寻找递归表达式。程序中的语句"if (n<2*m) m=n-m;"完成了题目中叙述的"用公式(1)进行简化"的工作。

  【3.29】答案:① *str=='\0' ② 1+strlen(str+1)

  注释:求串长算法的关键是确定串结束标记'\0'的位置。根据求串长的方法,可以得到如下递归算法:指针str指向字符串的首字符

  如果 当前字符(*str)== 串结束标记'\0'

  则 串长=0

  否则 串长 = 1+除第一个字符之外的剩余字符串的串长

  因此,在①的位置上应当填写"*str=='\0'",以判断当前字符(*str)是否是串结束标记'\0'。在②的位置应当是根据上面的递归算法进行递归调用,因此应当填写"1+strlen(str+1)"。

  【3.30】答案:① &n ② m%10 ③ m/10 ④ m>0 ⑤ r(m)

  【3.31】答案:① prt(c, n-1) ② prt(' ' , n-i) ③ prt('*', i)

  注释:函数prt的功能是输出n个字符c。

  【3.32】答案:① y(x, n-1)

  注释:这显然是一个递归问题,首先要对原来的数学函数定义形式进行变形,推导出原来函数的等价递归定义。可以推导出原来函数的递归定义如下。

  y(x,n)=x 当n=0时

  y(x,n)=sqrt(x+y(x,n-1)) 当n>0时

  【3.33】答案:① p-- ② *p='\0' ③ *p=c ④ p-- ⑤ *s++

  注释:在递归算法中,指针s指向字符串首部要反向的字符,即要将指针s所指向的字符与指针p 所指向的字符串尾的字符('\0')进行交换,在交换过程中,将尚没有交换的字符串的中间部分作为一个整体,进行递归处理。程序中首先执行"c=*s",将首字符存入临时变量;然后执行"*s=*p",将尾字符存入串首;执行"revstr(s+1)"是递归处理串的中间部分,这时,在②处应当填入"*p='\0'",即存入串结束标记。这是这一程序中的关键所在。在③处要完成将存在临时变量c中的字符存入串尾的工作,应当填写"*p=c"。

  【3.34】答案:① str+1 ② return ①改为 n-2

  【3.35】答案:① p>=q ② max=s ③ p,max

  ④ p+1,q ⑤ &array[0], &array[9]

  注释:本程序中的排序部分采用的是递归算法。函数sort的两个形参的含义是:对指针p和指针q之间的数据进行排序。由语句"for( s=p+1; s<=q; s++)"中指针p和指针q之间的关系可以得出:指针p不应在指针q之后,因此①处应填"p>=q"、⑤处应填"&array[0],&array[9]"。

  由于变量max是指向当前最大值的指针,则当找到新的最大值时,max中保存的应该是新的最大值的指针,因此②处应填"max=s"。

  当调用函数swap交换两个变量值的时候,要求实参是变量的地址,因此,③处应填"p,max"将最大值存入指针p所指的单元。

  由于问题的要求是"从大到小"排序,通过执行一次函数sort使最大值已经放到了指针p所指的单元中,因此,下一遍排序的时候,只要对指针p之后的元素进行即可,所以④处应填"p+1,q"。

  【3.36】答案:① a+1 ② n%10+'0'

  【3.37】答案:① s<t p="" ②="" s++="" ③="" t--<="" style="padding: 0px; margin: 0px;">

  【3.38】答案;①*(p+4*i+j)

  注释:p是一个一级指针,赋值后保存二维数组a的首地址,做加法运算加1时,实际地址增加一个它所指向的数据类型的长度。在C语言中,多维数组在计算机中是按行存储的,所以在本题中要通过指针访问二维数组中的数据,必须将二维下标转换为一维下标。

  【3.39】答案:① '\0' 或 0 ② ++

  注释:在C语言中,进行字符串处理时,必须注意串结束标记'\0',它是在进行串处理时的最基本的要求,所以①中要填入'\0'。为了使用putchar输出一个字符串,则必须有改变指针的运算,这里只能使用++运算。

  【3.40】答案:① p++ ② w[i+1]=w[i]

  【3.41】答案:① && ② *a<*b ③ *a++, *b++ ④ ==

  ⑤ != ⑥ '\0' ⑦ w=s ⑧ n++

  ⑨ t=s[i];s[i]=s[j];s[j]=t; ⑩ s3[0]

  【3.42】答案:① *++pa ② *++pa ③ *pa

  ④ return(total) ⑤ n<=2 || n>=MAXNUM+1 ⑥ num+n

  【3.43】答案:① stu.name ② &stu.score ③ p->name ④ p->score

  注释:这是结构中的最基本概念。

  【3.44】答案:① struct student ② strcmp(stu[i].name,str)==0 ③ break

  注释:程序的主体是一个二重循环,内层for循环完成查找学生的工作。①处是进行结构数组说明并初始化,按照结构变量说明的格式规定,应该填写:strcut student。②处为if语句的逻辑条件,应当是当查找到指定的学生后输出学生的情况,因此应当填写:strcmp(stu[i].name,str)==0。③处应当将控制退出内层的for循环,只能选择break语句。

  【3.45】答案:① p+n ② gets(p->name) ③ p+n

  注释:本程序是通过函数完成对于结构数组的输入和输出操作。函数data_in和data_out十分相似,都是通过结构指针p和结构指针q来操作结构数组的元素。由于指针q在两个函数中的作用相同,所以①和③填写的内容也应该是相同的;由for语句中的循环终止条件"pname)。

  【3.46】答案:① j=i-1 ② > ③ j-- ④ j+1 ⑤ j+1

  注释:程序的基本思想是:对于输入的第i个整数num,从数组array中已有的元素中倒序开始查找。若数组array中的第j个元素的值大于num,则将数组中的元素j向后移动一个位置;否则,就应将num插入到当前位置作为元素j。因此,程序的基本设计思想就是插入排序。

  程序中内层的for循环完成查找插入位置的工作,因此答案①、②和③有密切的关系,要统一考虑。同样,程序中的答案④和⑤也有密切的关系,要统一考虑。

  【3.47】答案:① != '\n' ② p=top

  【3.48】答案:① p1->next

  【3.49】答案:① head ② p ③ p=head

  注释:程序在从键盘接受字符的同时就在建立起链表,所建立的链表本身就已经是反序排列的,因此在反序输出字符串的时候实际只需沿着链表的第一个结点开始,顺序操作即可。

  【3.50】答案:① return ② (struct data *) malloc(sizeof(struct data))

  ③ input( ) ④ p!=NULL ⑤ p=p->next

  【3.51】答案:① (struct student *) ② tail=tail->next ③ head

  注释:①malloc函数的作用是在内存开辟指定字节数的存储空间,并将此存储空间的地址返回赋给尾指针tail,但是此地址为void型,应将其强制转换为所要求的结构指针类型。

  ②新开辟的结点的内存地址存于tail所指向的已建立的链表的尾结点的结构成员next,新结点连入链表以后,尾指针tail应指向新的结点。

  【3.52】答案:① (struct student *) ② (struct list *) ③ return(head)

  【3.53】答案:① FILE ② !feof(fp)

  注释:FILE 是文件结构类型名。feof()是测试文件结束标志的函数。

  【3.54】答案:① "second.txt" ② fclose(fp)

  【3.55】答案:① 3 ② !feof(f1)或feof(f1)==0 ③ f2 ④ fclose(f2) ⑤ fclose(f1)

  注释:程序中使用了带参数的main函数,其中整型参数argc为命令行中字符串的个数,此程序运行时输入的字符串有可运行程序名、文件1和文件2,故argc不应小于3。字符串指针argv[0]指向可运行程序名、字符串指针argv[1]指向输入文件名、字符串指针argv[2]指向输出文件名,由上所述②处给出循环条件是输入文件是否结束,③处需要填出输出文件名。最后两处是关闭两个文件,原则上关闭文件没有顺序要求,但习惯上是后打开的文件先关闭。

  【3.56】答案:① *argv[1] ② (*funcp)(n) ③ s+=i

  注释:程序执行时输入的命令及参数的个数(操作系统规定用空格表示字符串的分隔)由系统赋给主函数的形数argc,输入的命令和参数以字符串的格式保存,字符串的首地址分别赋给指针数组argv的各个元素,其中argv[1]是'+'或'-',分别表示累加或阶乘。程序根据argv[1]所指向的字符串的内容给指向函数的指针变量funcp赋值。②处要求的语句是根据指向函数的指针变量的内容对相应的函数实现调用,所以选择A或B是错误的;据funcp是被调函数的地址,*funcp实现了对函数的调用,根运算符的结合性,(*funcp)表示取funcp的目标,而*funcp(n)则funcp先和(n)结合,funcp就被解释为函数名,显然是错误的。

  【3.57】答案:① "w" ② -32 ③ "r"

  【3.58】答案:① "bi.dat" ② &j ③ fp

  【3.59】答案:① fgetc(fp))!=EOF ② &keyword[i].word[0]

  ③ s++; q++; ④ *s==*q ⑤ (word=getword(cp))!=NULL

  【3.60】答案:① "a+" ② rewind(fp) ③ !=NULL ④ flag=0 ⑤ ferror(fp)==0

【2.31】下面程序的输出结果是____。

  #include

  #include

  main( )

  { char str[100] ="How do you do";

  strcpy( str + strlen(str)/2, "es she");

  printf("%s\n", str);

  }

  A) How do you do B) es she C) How are you D) How does she

  【2.32】下面程序的输出结果是____。

  #include

  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);

  }

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

  【2.33】下面程序的输出结果是____。

  #include

  void fun(int *s)

  { static int j=0;

  do

  { s[j]+=s[j+1];

  }while(++j<2);

  }

  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]);

  }

  A) 35756 B) 23445 C) 35745 D) 12345

  【2.34】下面程序的输出结果是____。

  #include

  int k=1;

  main( )

  { int i=4;

  fun(i);

  printf ("\n%d,%d",i,k); /* ① */

  }

  fun(int m)

  { m+=k;k+=m;

  { char k='B';

  printf("\n%d",k-'A'); /* ② */

  }

  printf("\n%d,%d",m,k); /* ③ */

  }

  ① A) 4,1 B) 5,6 C) 4,6 D) A,B,C参考答案都不对

  ② A) 1 B) -59 C) -64 D) A,B,C参考答案都不对

  ③ A) 5,66 B) 1,66 C) 5,6 D) A,B,C参考答案都不对

  【2.35】下面程序的输出结果是____。

  #include

  fun(int n, int *s)

  { int f1, f2;

  if(n==1||n==2)

  *s=1;

  else

  { fun(n-1, &f1);

  fun(n-2, &f2);

  *s=f1+f2;

  }

  }

  main()

  { int x;

  fun(6, &x);

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

  }

  A) 6 B) 7 C) 8 D) 9

  【2.36】下面程序的输出结果是____。

  int w=3;

  main()

  { int w=10;

  printf("%d\n",fun(5)*w);

  }

  fun(int k)

  { if(k==0) return(w);

  return(fun(k-1)*k);

  }

  A) 360 B) 3600 C) 1080 D) 1200

  【2.37】下面程序的输出结果是____。

  #include

  funa(int a)

  { int b=0;

  static int c=3;

  a=c++,b++;

  return(a);

  }

  main()

  { int a=2,i,k;

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

  k=funa(a++);

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

  }

  A) 3 B) 0 C) 5 D) 4

  【2.38】下面程序的输出结果是____。

  #include

  void num()

  { extern int x,y;

  int a=15,b=10;

  x=a-b;

  y=a+b;

  }

  int x,y;

  main()

  { int a=7,b=5;

  x=a-b;

  y=a+b;

  num();

  printf("%d,%d\n",x,y);

  }

  A) 12,2 B) 5,25 C) 1,12 D) 输出不确定

  【2.39】下面程序的输出结果是____。

  main()

  { int a=2,i;

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

  printf("M",f(a));

  }

  f(int a)

  { int b=0;

  static int c=3;

  b++;

  c++;

  return(a+b+c);

  }

  A) 7 7 7 B) 7 10 13 C) 7 9 11 D) 7 8 9

  【2.40】下面程序的输出结果是____。

  #include

  try( )

  { static int x=3;

  x++;

  return(x);

  }

  main( )

  { int i, x;

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

  x=try( );

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

  }

  A) 3 B) 4 C) 5 D) 6

  【2.41】下面程序的输出结果是____。

  #include

  main( )

  { int x=1;

  void f1( ), f2( );

  f1( );

  f2(x);

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

  }

  void f1(void)

  { int x=3;

  printf("%d ", x);

  }

  void f2( x )

  int x;

  { printf("%d ", ++x);

  }

  A) 1 1 1 B) 2 2 2 C) 3 3 3 D) 3 2 1

  【2.42】下面程序的输出结果是____。

  #include

  #define SUB(X,Y) (X)*Y

  main()

  { int a=3,b=4;

  printf("%d\n",SUB(a++,b++));

  }

  A) 12 B) 15 C) 16 D) 20

  【2.43】下面程序的输出结果是____。

  main()

  { int a[]={1,2,3,4,5,6};

  int *p;

  p=a;

  printf("%d ",*p);

  printf("%d ",*(++p));

  printf("%d ",*++p);

  printf("%d ",*(p--));

  p+=3;

  printf("%d %d ",*p,*(a+3));

  }

  A) 1 2 3 3 5 4 B) 1 2 3 4 5 6 C) 1 2 2 3 4 5 D) 1 2 3 4 4 5

  【2.44】下面程序的输出结果是____。

  main()

  { int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

  int *p=a;

  p+=6;

  printf("%d ",*p); /* ① */

  printf("%d ",*(*(a+6))); /* ② */

  printf("%d ",*(a[1]+=2)); /* ③ */

  printf("%d",*(&a[0][0]+6));/* ④ */

  }

  A) 7 7 7 7 B) ②句语法错误 C) ③句语法错误 D) ④句语法错误

  【2.45】下面程序的输出结果是____。

  #define FMT "%X\n"

  #include

  main( )

  { static int a[ ][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };

  printf( FMT, a[2][2]); /* ① */

  printf( FMT, *(*(a+1)+1) ); /* ② */

  }

  ① A) 9 B) 11 C) A D) B

  ② A) 6 B) 7 C) 8 D) 前面三个参考答案均是错误的

  【2.46】下面程序的输出结果是____。

  #include

  main ( )

  { int a[]={1, 2, 3, 4, 5} ;

  int x, y, *p;

  p=&a[0];

  x=*(p+2);

  y=*(p+4);

  printf("%d,%d,%d\n", *p, x, y);

  }

  A) 1,3,5 B) 1,2,3 C) 1,2,4 D) 1,4,5

  【2.47】下面程序的输出结果是____。

  void ive(x,n)

  int x[],n;

  { int t,*p;

  p=x+n-1;

  while(x<p)< p="" style="padding: 0px; margin: 0px;">

  { t=*x;

  *x++=*p;

  *p--=t;

  }

  return;

  }

  main()

  { int i,a[]={1,2,3,4,5,6,7,8,9,0};

  ive(a,10);

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

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

  printf("\n");

  }

  A) 1 2 3 4 5 6 7 8 9 0 B) 0 9 8 7 6 5 4 3 2 1

  C) 1 3 5 7 9 2 4 6 8 0 D) 0 8 6 4 2 9 7 5 3 1

  【2.48】下面程序的输出结果是____。

  #include "string.h"

  fun(char *w,int n)

  { char t,*s1,*s2;

  s1=w;s2=w+n-1;

  while(s1<s2)< p="" style="padding: 0px; margin: 0px;">

  { t=*s1++;

  *s1=*s2--;

  *s2=t;

  }

  }

  main()

  { static char *p="1234567";

  fun(p,strlen(p));

  printf("%s",p);

  }

  A) 7654321 B) 1717171 C) 7171717 D) 1711717

  【2.49】下面程序的输出结果是____。

  #include

  char *p = "abcdefghijklmnopq" ;

  main( )

  { int i=0;

  while( *p++!='e' );

  printf("%c\n", *p);

  }

  A) c B) d C) e D) f

  【2.50】下面程序的输出结果是____。

  #include

  f(int x, int y)

  { return (y-x);

  }

  main( )

  { int a=5, b=6, c;

  int f(), (*g)()=f;

  printf("%d\n", (*g)(a,b) );

  }

  A) 1 B) 2 C) 3 D) 前面三个参考答案均是错误的

【2.51】下面程序的输出结果是____。

  #include

  main( )

  { int a=1,*p,**pp;

  pp=&p;

  p=&a;

  a++;

  printf ("%d,%d,%d\n", a,*p, **pp);

  }

  A) 2,1,1 B) 2,1,2 C) 2,2,2 D) 程序有错误

  【2.52】下面程序的输出结果是____。

  main()

  { char *alpha[7]={"ABCD","EFGH","IJKL","MNOP","QRST","UVWX","YZ"};

  char **p;

  int i;

  p=alpha;

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

  printf("%c",*(p[i]));

  printf("\n");

  }

  A) AEIM B) BFJN C) ABCD D) DHLP

  【2.53】下面程序的输出结果是____。

  #include

  char *pp[2][3]={ "abc", "defgh", "ijkl", "mnopqr", "stuvw", "xyz"};

  main ( )

  { printf("%c\n",***(pp+1)); /* ① */

  printf("%c\n",**pp[0]); /* ② */

  printf("%c\n",(*(*(pp+1)+1))[4]); /* ③ */

  printf("%c\n",*(pp[1][2]+2)); /* ④ */

  printf("%s\n",**(pp+1)); /* ⑤ */

  }

  ① A) a B) d C) i D) m

  ② A) a B) d C) i D) m

  ③ A) h B) l C) q D) w

  ④ A) k B) o C) u D) z

  ⑤ A) ijkl B) mnopqr C) stuvw D) xyz

  【2.54】下面程序的输出结果是____。

  #include "stdio.h"

  struct str1

  { char c[5];

  char *s;

  };

  main( )

  { struct str1 s1[2]={ {"ABCD""EFGH"},{"IJK","LMN"} };

  struct str2

  { struct str1 sr;

  int d;

  }s2={"OPQ","RST",32767};

  struct str1 *p[2];

  p[0]=&s1[0];

  p[1]=&s1[1];

  printf("%s",++p[1]->s); /* ① */

  printf("%c",s2.sr.c[2]); /* ② */

  }

  ① A) LMN B) MN C) N D) IJK

  ② A) O B) P C) Q D) R

  【2.55】以下程序的输出结果是____。

  struct st

  { int x,*y;

  }*p;

  int s[]={10,20,30,40};

  struct st a[]={1,&s[0],2,&s[1],3,&s[2],4,&s[3]};

  main()

  { p=a;

  printf("%d\n",++(*(++p)->y));

  }

  A) 10 B) 11 C) 20 D) 21

  【2.56】以下程序的输出结果是____。

  #include

  main()

  { union EXAMPLE

  { struct

  { int x,y;

  }in;

  int a,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\n",e.in.x,e.in.y);

  }

  A) 2,3 B) 4,4 C) 4,8 D) 8,8

  【2.57】下面程序的输出结果是____。

  #include

  main()

  { union

  { int i[2];

  long k;

  char c[4];

  }r,*s=&r;

  s->i[0]=0x39;

  s->i[1]=0x38;

  printf("%c\n",s->c[0]);

  }

  A) 39 B) 9 C) 38 D) 8

  【2.58】下面程序的输出是 。

  main ( )

  { printf("%d\n", EOF);

  }

  A) -1 B) 0 C) 1 D) 程序是错误的

  【阅读程序题参考答案】

  【2.1】参考答案:D

  注释:程序中除法运算的两个操作数均是整型,运算结果也是整型。

  【2.2】参考答案:B

  注释:C语言允许在程序块(分程序)中说明变量。

  【2.3】参考答案:C

  注释:变量i中的负号传送给变量n后,因n是无符号数,已不作为负号处理。

  【2.4】参考答案:D

  注释:对变量x的――操作是后缀形式,变量x的减1操作要在执行完 printf函数之后才进行,所以变量x的值在输出的时候仍然保持原值10。

  【2.5】参考答案:B

  注释:C语言在执行printf()时,对函数中的表达式表列的处理顺序是从后向前,即先处理n- -,再处理n++,最后处理n,而且每一个表达式作为一个处理单元,也就是说在不同的表达式中自增自减运算是单独考虑的。

  【2.6】参考答案:A

  注释:变量x和变量y做按位与,结果为0x0200,右移4位为0x0020,再与0x005f做按位或,最后结果为0x007f。

  【2.7】参考答案:A

  注释:逗号表达式的结果是用逗号分开的最后一个表达式的值,此题由于 c=='A'的值是0,所以逗号表达式的值为0。

  【2.8】参考答案: B

  【2.9】参考答案: A

  【2.10】参考答案: C

  注释:在输出格式描述"%m.ns"中,m是输出总长度,n是实际字符的个数,这里m没有给出,则输出总长度就是实际输出字符的个数。

  【2.11】参考答案: C

  【2.12】参考答案:B

  【2.13】参考答案:C

  【2.14】参考答案:B

  【2.15】参考答案:D

  【2.16】参考答案:A

  【2.17】参考答案: C

  【2.18】参考答案:A

  【2.19】参考答案: C

  注释:在switch语句中,case本身仅起到语句标号的作用,不会改变语句的流程,执行break语句才能退出当前的switch语句。

  【2.20】参考答案: D

  注释:siwtch语句的表达式中,变量c是后缀的增一运算,第一次执行do-while循环时,执行case 'A'后面的语句。

  【2.21】参考答案: D

  【2.22】参考答案: B

  【2.23】参考答案: B

  注释:fabs()是浮点数绝对值函数。

  【2.24】参考答案: A

  【2.25】参考答案: C

  注释:C语言允许在程序块(分程序)内说明变量,如果在程序块内说明的变量和程序块外的变量同名,在块外说明的变量在块内是不可见的。可将此题和【2.11】进行比较,加深理解。

  【2.26】参考答案: C

  【2.27】参考答案: B

  【2.28】参考答案: ① D ② A

  【2.29】参考答案:D

  【2.30】参考答案: B

  注释:输出结果为字符串长度。

  【2.31】参考答案: D

  注释:字符串拷贝函数strcpy()要求的两个参数都是字符串首地址。本题中第二个参数是字符串常量,接受这个字符串的第一个参量不是直接给出字符数组名,而是进行了地址运算后的结果。由于str字符串的长度是13,除2取整后是6,第一个参数给出的地址是字符数组str的首地址加6,也就是原来字符串中第二个空格的位置,把"es she"从该处放入,字符串str变为"How does she"。

  【2.32】参考答案: C

  注释:main函数调用func函数时,第一个实参使用的是逗号表达式的值,也就是x+y的结果。由于对变量x、y、z进行的是后缀运算,所以函数func的参数值是13和8。

  【2.33】参考答案: C

  【2.34】参考答案: ① C ② A ③ C

  【2.35】参考答案: C

  【2.36】参考答案: B

  注释:函数fun进行了递归调用,实际进行的运算是5×4×3×2×1×3×10。主函数内说明的局部变量w屏蔽了外部变量w,所以在主函数中外部变量w是不可见的,在调用printf函数时表达式"fun(5)*w"中w的值是10。

  【2.37】参考答案: D

  注释:main函数三次调用了函数funa,在funa函数中的静态变量c仅在第一次调用时进行了初始化,再次调用时不再对静态变量赋初值。

  【2.38】参考答案: B

  注释:main函数和num函数中都说明了变量a和b,由于它们是内部变量,所以它们分别在说明它们的函数内有效。外部变量x和y在函数num之后被说明,而在num函数中又要引用它们,所以在num函数中用关键字"extern"说明变量x和y是一个外部变量,也就是通知计算机这两个变量在fun函数以外被说明,此处不是定义两个int型变量。

  【2.39】参考答案: D

  注释:函数f中的变量c是静态变量,仅在第一次调用函数f时它被初始化为3,第二次调用函数f时c的值是4,第三次调用函数f时c的值是5。

  【2.40】参考答案: D

  【2.41】参考答案: D

  注释:程序中有三个"x"分别在三个不同的函数中,这三个"x"都是自动变量,所以三个"x"分别局部于三不同的函数,在三个函数中对"x"的操作互不影响。

  【2.42】参考答案: A

  【2.43】参考答案: A

  注释:*(++p)和*++p都是指针变量值前加1,第一次指向a[1],第二次指向a[2];a+3是a[3]的地址。

  【2.44】参考答案: C

  注释:②句没有语法错误,但是a+6指向数组之外,因为a是a[0]的地址,a+1是a[1]的地址,a+2是a[2]的地址,显然数组a没有a[6]分量。③句错误,因为a[1]是地址常量,它是a[1][0]的地址,对于地址常量是不可以进行赋值运算的。

  【2.45】参考答案: ① D ② A

  注释:如果FMT定义为"%x\n",则输出的16进制数据用小写字母表示。

  【2.46】参考答案: A

  注释:语句"p=&a[0]"表示将数组a中元素a[0]的地址赋给指针变量p,则p就是指向数组首元素a[0]的指针变量,"&a[0]"是取数组首元素的地址。对于指向数组首址的指针,p+i(或a+i)是数组元素a[i]的地址,*(p+i)(或*(a+i))就是a[i]的值。

  【2.47】参考答案: B

  【2.48】参考答案: D

  【2.49】参考答案: D

  【2.50】参考答案: A

  注释:变量g是指向函数的指针,(*g)(a,b)是调用指针g所指向的函数。

  【2.51】参考答案: C

  注释:p是指针,pp是指向指针的指针。

  【2.52】参考答案: A

  注释:对于指向数组的指针变量可以做下标运算,p[i]和alpha[i]都是指向字符串的首地址,*p[i]取出字符串的第一个字符。

  【2.53】参考答案: ① D ② A ③ D ④ D ⑤ B

  注释:pp是一个二维指针数组,pp+1指向数组的第二维,*(pp+1)是第二维的起始地址,**(pp+1)是第二维第一个元素的地址,***(pp+1)是第二维第一个元素的内容,所以,①的参考答案应选D。*(pp+1)+1是第二维第二个元素的地址,*(*(pp+1)+1)是第二维第二个元素,(*(*(pp+1)+1))[4]则是第二维第二个元素所指字符串下标为4的元素,即是字符w,故③应当选D。

  【2.54】参考答案: ① B ② C

  【2.55】参考答案:D

  【2.56】参考答案:C

  注释:联合体成员的取值是最后一次给成员赋的值。

  【2.57】参考答案: B

  注释:整型数组i和字符数组c共用存储空间,给i赋值也等于给c赋值,所以s->c[0]=0x39,所以输出9。

  【2.58】参考答案:A

  注释:基本概念。EOF是由C语言在头文件stdio.h中定义的,用户可以直接使用。




免责声明

1、由于各方面情况的调整与变化,本网提供的考试信息仅供参考,考试信息以省考试院及院校官方发布的信息为准。

2、本网信息来源为其他媒体的稿件转载,免费转载出于非商业性学习目的,版权归原作者所有,如有内容与版权问题等请与本站联系。联系邮箱:952056566@qq.com


甘肃自考便捷服务

  • 微信交流群
  • 微信公众号


微信扫一扫加入考生微信群
①学习交流、②考试提醒、③自考解答
④自考资料、⑤新闻通知、⑥备考指导


  • 视频课程
  • 真题下载
英语(二)

英语(二)

行政法学

行政法学

文学概论(一)

文学概论(一)

内科护理学(一)

内科护理学(一)

思修(03706)

思修(03706)

中国近现代史纲要

中国近现代史纲要