2011软考软件设计师练习题:第六章及解答
软考考试网 更新:2011-6-29 编辑:lovethea 查看评论(0)
  6.1  单项选择题
  1.函数调用语句“f((ele2)(e3e4e5));”中参数的个数是(  )
  ①1            2
  ③4            5
  【解】上述函数调用中,(e1e2)(e3e4e5)是两个带括号的表达式,所以函数调用只提供两个实参,其中第一个实参先计算el的值,然后计算e2,并以e2的值为实参。第二个实参顺序计算e3e4e5,并以e5的值为实参。所以解答是②。
  2.C语言中,函数的隐含存储类型是( 
  ①auto              static
  ③extern          ④无存储类别
  【解】由于C函数内不能再定义函数,C函数的存储类型只能是静态的或外部的之一。若定义函数时不指定存储类型是静态的,则它的存储类型就是外部的(extern),即函数允许被程序的
其它函数调用。所以解答是③。
  3.以下对C语言函数的有关描述中,正确的是(  )
  ①在C语言中,调用函数时,只能把实参的值传递给形参,形参的值不能传递给实参
  ②C函数既可以嵌套定义,又可以递归调用
  ③函数必须有返回值,否则不能定义成函数
  ④C程序中,有调用关系的所有函数必须放在同一个源程序文件中
  【解】C语言规定,调用函数时,只能把实参的值传递给函数的形参。函数调用时,形参从实参表达式得到初值,报参也是函数的一种局部变量,其值可以改变,但形参的值不能传回给对应的实参。当函数设置非指针类型的形参时,实参可以是同类型的一般表达式;当函数设置指针类型的形参时,对应的实参也必须是同类型的指针表达式。所以叙述①是正确的。C语言虽可以递归调用,但同时规定,在函数内不能再定义函数,所以叙述②是错误的。通常C函数会有返回值,但也可以没有返回值。有许多情况,函数的执行是完成某种预定的工作,并没有返回值,所以叙述③是不正确的。在C程序中,如函数未指定是静态的,则就是外部的,能让别的文件中的函数调用。但函数要调用别的文件中的函数,在调用代码之前,需对它作说明,所以叙述④也是不正确的。正确的解答只有①。
  4.设函数的功能是交换字符串函数应用详解Xy的值,且通过正确调用返回交换结果。不能正确执行此功能的函数是( 
  ① funa(int *x, int *y)
  { int * p
  * p*x *x*y *y=*p
  }
  ② funb(int x int y)
  { int t
  t=xx=yy=t;
  }
  ③ func(int *x int *y)
  { int p
  p*x *x*y * yp
  }
  ④fund( int *xint *y)
  {
  *x=*x+ *y*y=*x- *y*x= *x- *y
  }
  【解】设计实现交换两个变量值的函数。希望函数调用能改变调用环境中的变量,方法之一是让函数设置指针类型的形参,实参传送给形参的是希望交换值的两个变量的指针。函数的两个形参得到这两个变量的指针后,函数就能通过形参间接引用要交换值的变量,或引用它们的值,或改变它们的值。从而实现从函数传回信息存于调用环境的变量中。以上所述是设计交换变量值函数的一般原则,具体编写函数时还需注意对上述原则的正确应用。
  对于函数funa,该函数的定义满足设置指针形参,并通过指针形参间接引用环境变量的要求。但是在函数体中定义了指针变量p,并在p宋明确设定它所指向的变量下,代码*p* x企图将值存入它所指的变量中,这是初学者经常出现的一种严重的错误。该函数因有错,不能实现交换变量值的功能。
  对于函数funb,该函数不定义指针形参,函数体也没有可用的指针间接引用调用环境中的变量,所以该函数也不能实现交换变量值的功能。
  对于函数func,该函数正确定义了指针形参,函数体也正确通过指针形参间接引用环境中
的变量,并正确定义了自己的局部变量。该函数能实现交换变量值的功能。
  对于函数fund,该函数也正确定义指针形参和函数体通过形参间接引用环境变量。特别要指出的是,该函数是利用*x*y的;日值与新值之间的关系实现问题要求的。其中第一个赋值使。x存有原来未交换之前的*x*y之和;第二个赋值从这个和中减去原来的*y,并将差赋给*y,使*y的值是交换之前的*x的值;第三个赋值再次从和中减去新的*y,即减去交换之前的*x,这个差就是交换之前的*y,并将差赋给*x。经以上三个赋值,实现两变量之间的值交换。所以不能正确执行交换变量值的函数是funafunb,即正确选择是①②。
  5.要求函数的功能是在一维数组a中查x值。若到,则返回所在的下标值;否则,返回0。设数据放在数组元素的a[1]a[n]中。在以下给出的函数中,不能正确执行此功能的函数是( 
  ① funa(int *aint n int x)
  { *ax
  whlie(a[n]!x) n--
  return n
  }
  ② funb(int *a int n int x)
  { int k
  for( kl k<n k++)
  if(a[k]==x) return k
  return 0
  }
  ③ func(int a[], int n int x)
  { int * k
  a[O]x kan
  while(*k!x)k--
  return kn
  }
  ④ fund(int a[] int n int x)
  { int k0
  do  k++
  while((k            if((k              else return 0;
  }
  【解】在数组中指定值是经常遇到的计算要求,有多种编程方法。在这里,数据预放在数组下标1n的元素中,下标为0的元素没有放数据,程序可以利用这个位置简化查函数。函数funa先将要查的情放入a[0],从数据表的最后一个元素开始逆序向前查。这样做的好处是循环条件不必担心因数组中原先没有值为x的元素而一直顺序查下去,访问不是数表的元素,需插入条件nO。在a[0] 处放入x后,这个条件就不必要了,循环至少在访问了a[0] 后终止,并返回0值。所以该函数能完成指定的功能。函数funb采用常规的办法编写,循环在a[1] a[n]之间顺序寻,一旦到立即返回到处的下标,直至查循环结束,查不到指定的值而返回0值。函数func采用与函数funa相同的方法,不过是另外引入一个指针变量。但是该函数return语句后的表达式有严重的错误,应返回ka,两指针的差,其值等于到元素的下标。表达式kn是指针k向前移n个位置的指针值。函数fund预置k0,循环让 k 1,并在 k在界内和 a[k] 不等于 x的情况下循环。循环结束有两种情况,或 k已不在界内,或k在界内,并且a[k]等于x。若是后者,函数返回k,而若前者,函数返回比该函数也能正确完成查工作。这样,不能正确完成查工作的函数是函数fonc。所以正确选择是③。
  6.以下程序的输出结果是( 
  # include
  subl(char achar b) {char ccaabb=c}
  sub2(char *achar b){ char cc*a*abbc}
  sub3(char *achar *b) { char cc*a*a*b*bc}
  main()
  { char a b
  a=’A’; b=’B’; sub3(&a&b) putchar(a); putchar(b);
  a=’A’;b=’B Sub2(&ab)putchar(a); rutchar(b)
  a=A; b=B; sub1(a,b); putchar(a)putchar(b)
  }
  ①BABBAB              ABBBBA
  ③ BABABA              BAABBA
  【解】在上述程序中,函数subl完成两形参值的交换,这个交换不影响实参变量,这是一个没有意义的函数。函数sub2将第二个形参的值置入由第一个指针形参所指的变量中,指针形
参所指的变量由调用时的实参提供。函数sub3完成将两个形参所指的变量的值交换。程序调用sub3,使变量ab的值交换输出BA;调用subZ,使变量b的值传送到a,输出BB;调用subl,变量ab的值不改变,输出AB。所以程序输出BABBAB。正确解答是①。
  6.2  填充题
  1.静态型内部变量的作用域是___________
  【解】静态存储类型的主要特性是永久性和专用性。静态局部变量提供永久存储,但因它是局部变量,也得遵守局部变量的作用域规则,是定义它的函数或复合语句。
  2.函数中的形参和调用时的实参都是数组名时,传递方式为______;都是变量时,传递方式为_____________
  【解】在C语言中,实参向形参传递方式只有值传递,但传递的内容可能是非指针类型的值,如基本类型值,或结构类型值,也可以是指针类型值。通常传递指针类型值特称为传地址方式。其中实参向指针形参传递数组名,就是一种传地址方式。若形参不是指针类型的,形参是一般的变量,实参可以是变量或表达式,就是值传递方式。
  3.函数的形式参数的作用域为_____,全局的外部变量和函数体内定义的局部变量重名时,________变量优先。
  【解】函数将它的形参当作它的局部变量,所以函数形参的作用城为定义它的函数。当函数的形参或函数内的局部变量与函数外的全局变量同名时,函数的局部变量优先。
  4.若自定义函数要求返回一个值,则应在该函数体中有一条________语句,若自定义函数要求不返回一个值,则应在该函数说明时加一个类型符____________
  【解】苦自定义的函数有返回值,则函数返回时应执行带表达式的return语句返回,该表达式的值将作为函数调用的结果。为了强调函数是一个不返回值的函数,应在该函数说明时,加上一个void类型说明符。
  5.若给fun函数的形参s传送字符串:"ㄩㄩ 6354abcc"(其中ㄩ表示空格字符),则函数的返回值是__________
  # include
  long fun(char s[])
  { long nint sign
  for( isspace(*s) s++)
  sign(*s==’- )?1l
  if(*s==’+’ ||*s==’-’) s++
  for(n0 isdigit(*s) s++) n10*n(*s-’0)
  return sign *n;
  }
  【解】函数fun的第一个for循环跳过字符串的前导空白符,接着分析第一个非空白符是否是负号,若是置变量sign-1;否则,置变量sign1。接着的if语句在第一个非空白字符是负号或正号时,跳过该字符。以后的for循环将后面的数字符当作十进制数的各位数字译出一个长整数n。遇字符a时,结束译数循环。最后,函数返回signn的乘积。所以若调用函数时提供的实参是"ㄩㄩ6354abc",函数返回值是整数6354
  6.下面函数要求计算两个整数Xy之和,并通过形参Z传回该和值,请填空。
  void add(int x,int y,________z)
  {_________x y return}
  【解】函数希望通过形参z传送结果,形参z必须是指针类型的,由于返回整型结果,所以z的说明是int *z。函数返回前必须先把结果通过形参z间接引用(写成* z)传回。7.以下函数用来在w数组中插入x。在n所指向的存储单元中存放着w数组中的字符个数。数组W中的字符已按从小到大的顺序排列,插入后数组W中的字符仍有序。请填空。
  void fun(char *wchar x int *n)
  { int i, p
  p0
  w[*n]x
  whlie( x>w[p] ) p++
  for(i=* n i>pi--) w[i]_____________
  w[p] x
  ++ *n
  }
  【解】在用数组实现的有序序列中插入内容,必须先寻插入位置。插入位置到后,需将插入位置之后的元素向后移动一个位置,留出插入点。最后,将元素插入,并增加序列的元素个数。函数为了简化寻插入位置循环的循环条件,预先在序列的最后置人插入值。插入位置之后的元素向后移动一个位置必须从最后一个元素开始往前逆序移动,是将前一个元素向后移,所以在空框处应填入w[il]
  8.函数my_cmp()的功能是比较字符串st的大小,当S等于t时返回0,否则返回st的第
一个不同字符的ASCII码差值,即s>t时返回正值,当s      my_cmp( char *s char * t)
  {while(*s==* t)
  { if(*s==’\0) return 0
  ++s++t
  }
  return____________;
  }
  【解】两字符串大小比较必须从它们的首字符开始,在对应字将相等情况下循环,直至不相等结束。相等时,老字符率已到了字符串的结束标记符,则两字符率相同,函数退回0值;如还有后继字符,则准备比较下一对字符。对应字符不相同,循环结束。循环结束时,就以两个当前字符的差返回。所以在空框处应填入*s-*t,保证在s>t时返回正值,当s
  6.3  程序分析题
  1.阅读函数,写出函数的主要功能:
  ch(int *p1int *p2)
  { int p
  if(*pl>*p2) { p* pl*pl*p2* p2p }
  }
  【解】函数办有两个指针形参p1p2,函数体通过*pl*p2间接引用它们所指变量。当pl所指变量的位大于p2所指变量的值时,交换两形参所指变量的值。所以函数的功能当形参1所指变量比形参2所指变量的值大时,交换这两个变量的值。调用该函数能保证形参1所指变量的值不大于形参2所指变量的值。
  2.阅读函数,写出函数的主要功能:
  float av(an)
  float a[]
  int n
  { int i float s
  for(i0s 0i    return s/n;
  }
  【解】函数有一个数组形参a和一个整型形参n。函数首先用循环求数组a的前n个元素和,然后将和除以n。即求数组元素的平均值。
  3.阅读下面程序,写出运算结果。
  unsigned fun6( unsigned num)
  { unsigned kl
  do { k* num_num/10}
  while(n)
  return k
  }
  main()
  { unsigned n26
  printf("%d\n" fun6(n));
  }
  【解】函数有一个形参num,循环前变量 k 1,循环中,表达式num_是取num的个位,将num的个位值累乘于k中,然后num除以10。循环直至num0结束,这是逐一求出num十进制表示的各位数字,并累乘于变量k的循环。函数最后返回k。函数fun6的功能是求整数的各位十进数字积。所以程序输出12
  6.4 程序设计题
  1.编一个名为root的函数,求方程ax*x + bx + c=0b*b4ac,并作为函数的返回值。其中的abc作为函数的形式参数。
  【解】该函数应设3个形参,分别表示一元二次方程的三个系数。函数按公式求出结果返回即可:
  double root(double adouble bdouble c)
  {  return b*b4.0*a*c
  }
  2.编一个函数,若参数y为闰年,则返回1;否则返回0
  【解】由每四年一个闰年,但每100年少一个闰年,每400年又增加一个闰年的约定。记年份为y,则y年是闰年的条件是:
  (y能被4整除,但不能被100整除)或(y能被400整除)
  用逻辑表达式可描述如下:
  (y%4==0 && y_0) ||y@0==0
  写成函数为:
  int isLeap(int y)
  { return( y% 4==0 && y% 100) || y@0== 0
  }
  3.编一个无返回值,名为root2的函数,要求如下:
  形式参数: a,b,c单精度实型,root单精度实型数组名。
  功能:计算ax*x +bxc0的两个实根(b*b4ac> 0)存入数组root[2]中。
  【解】函数根据形参。a,b,c的值,首先计算db*b-4*a*c。考虑到实数运算时的计算误差,两个几乎相等的数相减有效位数也几乎全部丢失的情况,应先求出绝对值大的根,然后利用报与系数之间的关系,再求绝对值小的根。函数定义如下:
  void root2( float afloat bfloat c float root[])
  { float reimdb*b4.0*a*c/*求判别式*/
  re=-b/(2.0*)
  if(d>0.0) { /*有两个实根,先求绝对值大的根*/
  im(float)sqrt((double)d)/(2.0*a)
  root[0] re(b<0.0? im-im)
  root[1]c/(a*root[0])
  }
  }
  4.编一个无返回值,名为trus的函数,要求如下:
  形式参数:数组s1[2][3]s2[3][2] 是整型数组。
  功能:将s1数组转置后存入s2数组中。
  【解】为实现问题要求,可用两重循环,按行按列的顺序遍历数组s1的元素,将它们分别复制到数组s2的对位位置即可。
  void trus(int sl[][3] int s2[][2])
  {  int ij
  for(i0 i<2 i++)
  for(j 0;j<3 j++)
  s2[j][i] s1[i][j]
  }
  5.编一个名为countc函数,要求如下:
  形式参数:array存放字符串的字符型数组名。
  功能:统计array数组中存放的字符串中的大写字母的数目。
  返回值:字符串中的大写字母的数目。
  【解】为统计字符串中大写英文字母的个数,函数引入一个计数变量.通过遍历字符串,当发现字符率中的字符是大写字母时,计数变量增1。字符率遍历结束,返回计数变量的值。
  int counic(char *array)
  { int c0
  while(* M) {
  if(*array>=’A && *array<Z) c++
  array ++
  }
  return c
  }
  6.编一个名为link函数,要求如下:
  形式参数:s1[40]s2[40],s3[80] 是用于存放字符串字符数组。
  功能:将s2连接到s1后存入s3中。
  返回值:连接后字符串的长度。
  【解】这是要编写两字符串连接拷贝到另一字符串的函数,函数返回连接后的字符串的长度。实现函数的功能,就是先将s1中的字符串复制到s3,继续将s2中的字符串复制到s3
  void link( char *sl char *s2char *s3)
  { while(*s3++=*sl++)
  s3 - -  /* 准备复盖字符串结束标记符*/
  while(*s3++= * s2++)
  }
  7.编一个函数,求一维实型数组前n个元素的最大数、最小数和平均值。函数利用数组和n两个形参,求得最大值、最小值、平均值,并分别利用另外三个指针形参将求得的最大值。最小值、平均值传回。本函数无返回值。
  【解】函数设一个数组形参a、一个整数形参n、传回最大值的指针形参、传回最小值的指针形参和传回平均值的指针形参。函数通过遍历出最大值、最小值和数组的元素和,最后
将数组元素和除以n求得平均值。
  void maxMinAve( double a[]double n double *maxpdouble *minpdouble *avep)
  {double s0.0 max* a min*a int m
  while(m--) {
  s+=*a
  if(*a> max) max* a
  if(*a    a++;
  }
  *maxp max *minpmin *avep s/n
  }
edu.21cn/ruankao/g_185_571326-1.htm
www.edulife/school/yhjy/infos.aspx?newsid=81487
广州自考_自考高级语言程序设计习题答案详解(34
2012-07-06 11:25:48 来源:中山大学自考招生网 浏览:1
5.要求函数的功能是在一维数组a中查x值。若到,则返回所在的下标值;否则,返回0.设数据放在数组元素的a[1]a[n]中。在以下给出的函数中,不能正确执行此功能的函数是(
  funaint *aint n int x
  { *ax
  whliea[n]!=x n——
  return n
  }
  funbint *a int n int x
  { int k
  for kl k<n k++
  ifa[k]==x return k
  return 0
  }
  funcint a[] int n int x
  { int * k
  a[O]x kan
  while*k!=xk——
  return kn
  }
  fundint a[] int n int x
  { int k0
  do k++
  while((k<N+1 &&A[K] =X));
  if((k<N1 &&[K]==X)) RETURN K
  else return 0
  }
  「解」在数组中指定值是经常遇到的计算要求,有多种编程方法。在这里,数据预放在数组下标1n的元素中,下标为0的元素没有放数据,程序可以利用这个位置简化查函数。函数funa先将要查的情放入a[0],从数据表的最后一个元素开始逆序向前查。这样
做的好处是循环条件不必担心因数组中原先没有值为x的元素而一直顺序查下去,访问不是数表的元素,需插入条件nO.a[0] 处放入x后,这个条件就不必要了,循环至少在访问了a[0] 后终止,并返回0值。所以该函数能完成指定的功能。函数funb采用常规的办法编写,循环在a[1] a[n]之间顺序寻,一旦到立即返回到处的下标,直至查循环结束,查不到指定的值而返回0值。函数func采用与函数funa相同的方法,不过是另外引入一个指针变量。但是该函数return语句后的表达式有严重的错误,应返回ka,两指针的差,其值等于到元素的下标。表达式kn是指针k向前移n个位置的指针值。函数fund预置k0,循环让 k 1,并在 k在界内和 a[k] 不等于 x的情况下循环。循环结束有两种情况,或 k已不在界内,或k在界内,并且a[k]等于x.若是后者,函数返回k,而若前者,函数返回比该函数也能正确完成查工作。这样,不能正确完成查工作的函数是函数fonc.所以正确选择是
  6.以下程序的输出结果是(
  # include
  sublchar achar b {char ccaabb=c}
  sub2char *achar b{ char cc*a*abbc}
  sub3char *achar *b { char cc*a*a*b*bc}
  main()
  { char a b
  a‘A’ b‘B’ sub3&a&b); putchara); putcharb);
  a‘A’b‘B’ Sub2&ab);putchara); rutcharb);
  a=‘A’ b=‘B’ sub1ab); putchara);putcharb);
  }
  BABBAB ABBBBA
  BABABA BAABBA
  「解」在上述程序中,函数subl完成两形参值的交换,这个交换不影响实参变量,这是一个没有意义的函数。函数sub2将第二个形参的值置入由第一个指针形参所指的变量中,指针形参所指的变量由调用时的实参提供。函数sub3完成将两个形参所指的变量的值交换。程序调用sub3,使变量ab的值交换输出BA;调用subZ,使变量b的值传送到a,输出BB;调用subl,变量ab的值不改变,输出AB.所以程序输出BABBAB.正确解答是
www.zikao84/article/4031.html
www.hbzkw/exam/20081108500843.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。