【真题1】 下列给定程序中,函数fun()的功能是:求出以下分数序列的前n 项之 和。 2/1,3/2,5/3,8/5,13/8,21/13,…… 和值通过函数值返回main()函数。例如,若输入n=5,则应输出8.391667。 试题程序: #include < conio.h >#include < stdio.h >double fun (int n) { int a=2,b=1,c, k; double __1__; for(k=1;k< =n;k++) {s=s+1.0*a/b; c=a; a+=__2__;b=c; } return(s); } main() { int n=5; printf("\nThe value of function is: %1f\n",__3__); } (2011年2月) 解析: 填空1:根据题目的意思,这里应该是对变量s 的声明,注意到后面有 对s 的累加操作,所以声明之后一定要进行初始化,把s 赋值为0。 填空2:根据题目的意思,此处是循环求和,由数列可以容易的看出后一项的分 子是前一项分母与分子之和,即a=a+b或者像题目中那样a+=b。 填空3:由算法可以看出,此处是进行子函数调用。 答案:【1】s=0.0 【2】b 【3】fun(n) 【真题2】 给定程序modi.c 中,函数fun 的功能是:用选择法对数组中的n 个元 素按从小到大的顺序进行排序。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main 函数, #include < stdio.h >#define N 20 void fun(int a[],int n) {int i,j,t,p; for (j=0;j< n-1;j++) { /************found************/ p=j for (i=j;i< n;i++) if(a[i]< a[p]) /************found************/ p=j; t=a[p];a[p]=a[j];a[j]=t; } } main() {int a[N]={9,6,8,3,-1},i,m=5; printf("排序前的数据:"); for(i=0;i< m;i++) printf("%d",a[i]);printf("\n"); fun(a,m); printf("排序后的数据:"); for (i=0;i< m;i++) printf("%d",a[i]);printf("\n"); } (2011年2月) 解析: 选择法排序的思路是:通过一个整型变量指向数组中最小数所在的下 标,第一次循环找出最小的数,与第一个数的位置交换,第二次循环找出次小 的数,与第二个数的位置交换,以此类推,直至数组中的数由小到大排列。 本题中的第一个错误:C 语言中的命令语句应以分号作为分隔符,所以语句 "p=j"应改为"p=j;"; 本题中的第二个错误:结合程序上下文,可知当a[i]中的数小于a[p]中的数 时,应使得下标i 赋给变量p,所以语句"p=j;"应改为"p=i;"。 【真题3】 请编写一个函数 void fun(char *tt, int pp[]),统计在tt 字符串中 'a' 到 'z' 26 个字母各自出现的次数,并由 pp 数组传回 main 函数。 运行时输入字符串:abcdefgabcdeabc 后,并且输出的结果应该是: 3 3 3 2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 注意:部分源程序存在文件prog.c 中。 请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编 写的若干语句。 #include < conio.h >#include < stdio.h >void fun(char *tt, int pp[]) {……} main( ) { char aa[1000] ; int bb[26], k, n ; clrscr() ; printf( "\nPlease enter a char string:" ) ; scanf("%s", aa) ; fun(aa, bb ) ; for ( k = 0 ; k < 26 ; k++ ) printf ("%d ", bb[k]) ; printf( "\n" ) ; } (2011年2月) 解析: 本题的考核点是统计字符串中各个字母出现的次数。 提示思路: 1、由于存放26 个小写字母的数组pp[]在主函数中未赋初值,所以在函数 fun()中第一步就是将其初始化,以保证程序运行安全; 2、建立循环,将每个字母的个数存放到pp[]数组相对应的元素中。 #include < conio.h > #include < stdio.h > /*本题采用的是字母的ASCII码值与数组pp下标的对应转换关系分别求出对 应字母的个数。第一个for()是给pp赋初值0,第二个for()用于控制在字符串 内从头到尾移动。由于字母'a'的ASCII码值为97而它的个数要放在pp[0] 中,而'a'-97的值正好为0,其它的依此类推。*/ void fun(char *tt,int pp[]) { int i; for(i=0;i< 26;i++) pp[i]=0; /*for()循环用于给数组pp[]赋初值0*/ for(;*tt;tt++) /*for()循环用于控制在字符串内从头到尾移动*/ if(*tt< ='z'&&*tt >='a') pp[*tt-97]++; /*统计字符串中各个字母出现的次数*/ } |