就业数据资源平台
当前位置:首页 > C语言程序设计
计算机等级考试二级C语言试题及答案9

请编写函数fun, 函数的功能是: 删去一维数组中所有相同的数, 使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。
  例如, 一维数组中的数据是: 2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10。
  删除后,数组中的内容应该是: 2 3 4 5 6 7 8 9 10。
  注意:部分源程序在文件PROG1.C中。
  请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入你编写的若干语句。
  给定源程序:
  #include <stdio.h>
  #define N 80
  int fun(int a[], int n)
  {
  }  来源:www.examda.com
  main()
  { int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20;
  printf("The original data :\n");
  for(i=0; i<n; i++)printf("%3d",a[i]);
  n=fun(a,n);
  printf("\n\nThe data after deleted :\n");
  for(i=0;i<n;i++)printf("%3d",a[i]); printf("\n\n");
  NONO();
  }
  解题思路:
  本题是删除已排序过数组中的相同数。
  1. 取出数组中的第1个数存放在临时变量k中,再利用for循环来依次判断所有的数。
  2. 如果取出的数和k相比,如果不相同,则仍存放在原数组中,其中存放的位置由j来控制, 接着把这个数重新存入k。如果相同,则取下一数。
  参考答案:
  int fun(int a[], int n)
  {
  int i, j = 1, k = a[0] ;
  for(i = 1 ; i < n ; i++)
  if(k != a[i]) {
  a[j++]=a[i] ;
  k = a[i] ;
  }
  a[j] = 0 ;
  return j ;
  }
  ※※※※※※※※※※※※※※※※※※※※※※※※※
  第06套:
  给定程序中,函数fun的功能是根据形参i的值返回某个函数的值。当调用正确时, 程序输出:
  x1=5.000000, x2=3.000000, x1*x1+x1*x2=40.000000
  请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。
  注意:源程序存放在考生文件夹下的BLANK1.C中。
  不得增行或删行,也不得更改程序的结构!
  给定源程序:
  #include <stdio.h>
  double f1(double x)
  { return x*x; }
  double f2(double x, double y)
  { return x*y; }
  __1__ fun(int i, double x, double y)
  { if (i==1)
  return __2__(x);
  else
  return __3__(x, y);
  }
  main()
  { double x1=5, x2=3, r;
  r = fun(1, x1, x2);
  r += fun(2, x1, x2);
  printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n\n",x1, x2, r);
  }

  解题思路:
  本题是根据给定的公式来计算函数的值。
  第一处:程序中使用双精度double类型进行计算,所以函数的返回值类型也为double,所以应填:double。
  第二处:当i等于1时,则返回f1函数的值,所以应填:f1。
  第三处:如果i不等于1,则返回f2函数的值,所以应填:f2。
  ***************************************************
  给定程序MODI1.C中函数fun的功能是: 比较两个字符串,将长的那个字符串的首地址作为函数值返回。
  请改正函数fun中指定部位的错误, 使它能得出正确的结果。
  注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构!
  给定源程序:
  #include <stdio.h>
  char fun(char *s, char *t)
  { int sl=0,tl=0; char *ss, *tt;
  ss=s; tt=t;
  while(*ss)
  { sl++;
  (*ss)++;
  }
  while(*tt)
  { tl++;
  (*tt)++;
  }
  if(tl>sl) return t;
  else return s;
  }
  main()
  { char a[80],b[80],*p,*q; int i;
  printf("\nEnter a string : "); gets(a);
  printf("\nEnter a string again : "); gets(b);
  printf("\nThe longer is :\n\n\"%s\"\n",fun(a,b));
  }

  解题思路:
  第一处: 试题要求返回字符串的首地址,所以应改为:char *fun(char *s,char *t)
  第二处: 取字符串指针ss的下一个位置,所以应改为:ss++;。
  第三处:取字符串指针tt的下一个位置,所以应改为:tt++;。
  ***************************************************
  请编写函数fun,函数的功能是: 移动字符串中的内容,移动的规则如下: 把第1到第m个字符, 平移到字符串的最后, 把第m+1到最后的字符移到字符串的前部。
  例如, 字符串中原有的内容为: ABCDEFGHIJK, m的值为3, 则移动后, 字符串中的内容应该是: DEFGHIJKABC。
  注意:部分源程序在文件PROG1.C中。
  请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入你编写的若干语句。
  给定源程序:
  #include <stdio.h>
  #include <string.h>
  #define N 80
  void fun1(char *w) /* 本函数的功能是将字符串中字符循环左移一个位置 */
  {
  int i; char t;
  t=w[0];
  for(i=0;i<strlen(w)-1;i++)
  w[i]=w[i+1];
  w[strlen(w)-1]=t;
  }
  void fun(char *w, int m) /* 可调用fun1函数左移字符 */
  {
  }
  main()
  { char a[N]= "ABCDEFGHIJK";
  int m;
  printf("The original string:\n");puts(a);
  printf("\n\nEnter m: ");scanf("%d",&m);
  fun(a,m);
  printf("\nThe string after moving:\n");puts(a);
  printf("\n\n");
  NONO();
  }
  解题思路:
  本题是考察字符串的操作。
  1. 由于函数fun1是将字符串中字符循环左移一个位置,并通过实参w返回循环左移一个位置的字符串。
  2. 利用循环for语句来操作多少个字符(m)需要循环左移。
  参考答案:
  void fun1(char *w) /* 本函数的功能是将字符串中字符循环左移一个位置 */
  {
  int i; char t;
  t=w[0];
  for(i=0;i<strlen(w)-1;i++)
  w[i]=w[i+1];
  w[strlen(w)-1]=t;
  }
  void fun(char *w, int m) /* 可调用fun1函数左移字符 */
  {
  int i;
  for(i = 0 ; i < m ; i++) fun1(w);
  }
就业数据资源平台