全国计算机二级C语言上机答案.docx
1、L 357 + +1)一 22 42 6()")2 直到Mx”)下列给定程序中,函数fun的功能是计算如下公式<10-3,并且把计算结果作为函数值返回。例如,若形参e的值为le3,则函数返回值为0.551690。【参考答案】(1)3.0或(double)3 (2)>(3) (t+1)【解题思路】填空1:变量x定义为double类型,而运算符"/"后面是整型数,所以给x赋值时,需要注 意数据类型,此处不能将3.0写成3。填空2: while循环语句的循环条件,根据题意确定循环变量应大于le-3,因此此处应填"Ha填空3:表达式的通项是(22、下列给定程序中函数fun的功能是:求出如下分数序列的前n项之和。和值通过函数值返 回。2 3 5 8 13 21T,2,3,5,T,i3,例如,若n=5,则应输出8.391667。【参考答案】(1 )double fun(int n)(2)s=s+(double)a/b;【解题思路】(1)由语句"retum(s)"和变量s定义为double数据类型可知,该函数定义时其类型标识符为d ouble类型。(2)注意数据类型double的书写格式。3、请编写函数ftm,其功能是:找出2xM整型二维数组中最大元素的值,并将此值返回调用 函数。【参考答案】int fun (int aM)(int ij,max=a00;fbr(i=0;i<2;i-H-)fbr(j=Oa<M;j-H-)if(max<aij)max=aij;return max;)【解题思路】此类求最大值或最小值的问题,我们可以采用逐个比较的方式,要求对数组中所有元素遍 历一遍,并且从中找出数组最大值或最小值。首先定义变量max存放数组中的第一个元素的值, 然后利用for循环逐个找出数组中的元素,并与max比较,如果元素值大于max,则将该值赋于max,循环结后max的值即为数组最大值,最后将该值返回。4、下列给定程序中,函数fun的功能是:计算如下公式前n项的和并作为函数值返回。1x3 3x5 5x7 (2xn-l)x(2xn + l)5、 = r- + + + + ;224-62(2xn)例如,当形参n的值为10时,函数返回值为9.612558。【参考答案】(1) 0(2) n (3) (t*t)【解题思路】填空1:程序开始定义了变量s,但没有对其进行初始化,根据公式及后面的程序可知变量 s用来存储公式的前n项和,因此该变量应初始化为0。填空2:通过for循环语句将表达式各项进行累加,结果存于变量s中,循环变量i的取值 范围为1n。填空3:根据题目要求确定表达式通项,前而已定义t=2.05、下列给定程序中函数ftm的功能是:统计substr所指的子符串在str所指的字符串中出现的 次数。例如,若字符串为aaas Ikaaas,子字符串为as,则应输出2。【参考答案】(l)fbr(i=0;stri;i+)(2)if(substrk+l= -O')【解题思路】我们先看循环条件for(i = 0, stri, i+),不难发现此处fbr循环语句的格式有误,其中 表达式之间应以";”相隔;同时很容易发现if条件语句处的关键字书写错误。6、编写函数fun,其功能是:根据以下公式求兀的值(要求精度0.0005,即某项小于0.0005时停 止迭代)。lx2x X”3x5x x(2 + l)n , 1 1x2 1x2x3 Ix2x3x43 3x5 3x5x73x5x7=1 + - + +程序运行后,若输入精度0.0005,则程序应输出为3.14。【参考答案】double s=1.0,sl=1.0;int n=l;while(sl>=eps)sl=sl*n/(2*n+l);s=s+sl;n+;double fun ( double eps)/*当某项大于精度要求时,继续求下一项*/*求多项式的每一项*/*求和*/return 2*s;【解题思路】首先应该定义double类型变量,并且赋初值,用来存放多项式的某一项和最后的总和。从 第2项开始以后的每一项都是其前面一项乘以n/( 27、给定程序中,函数fun的功能是:统计形参s所指的字符串中数字字符出现的次数,并存 放在形参t所指的变量中,最后在主函数中输出。例如,若形参s所指的字符串为abcdef35adg h3kjsdf7,则输出结果为4。【参考答案】(1) si '9'(3)*t=n【解题思路】填空1:通过for循环语句,来判断是否到字符串结尾,变量i用来存放字符串数组下标,则应 填入si。填空2:题目要求判断数字字符,所以此处应填入'9'。填空3:将数字字符个数存入变量t中,这里需注意变量t是指针变量。8、下列给定程序中函数fun的功能是:实现两个变量值的交换,规定不允许增加语句和表达 式。例如,变量a中的值原为8, b中的值原为3,程序运行后a中的值为3, b中的值为8。【参考答案】(l)t = *x ; *x = y ;(2)retum(t);或 return t;【解题思路】首先,定义变量t作为中间变量,然后进行数据交换,注意参数x是指针变量,交换时应使用* X,最后确定返回值,根据代码b=fun(8a, b)可以知道返回值将赋给变量b,而b中应存放交换 前*中的值,所以函数应返回变量t9、编写函数fun,其功能是:求出1到1000之间能被7或11整除,但不能同时被7和11整除的所 有整数,并将其放在a所指的数组中,通过n返回这些数的个数。【参考答案】void fiin (int *a, int *n)(int ij=0;for(i=l;i<=1000;i+)/*求1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数,并放入数组a中*/if(i%7=0|i%ll=0)&&i%77!=0)aj+=i:*n=j;【解题思路】该题需要运用循环判断结构来实现,其中循环语句比较容易,只要确定循环变量的范围即可, 下面我们来看判断语句,题目要求找出能被7或11整除,但不能同时被7和11整除的所有整数。能同时被7和11整除的整数一定能被77整除,且不能被77整除的数不一定就是能被7或11整除的 数所以可得出程序中的if()语句。注意:(i%7=0|i%ll = =0)两边必须要有小括号。10、下列给定程序中,函数fun的功能是:把形参a所指数组中的奇数按原顺序依次存放到a0、 al, a2中,把偶数从数组中删除,奇数个数通过函数值返回。例如:若a所指数组中的数据最初排列为:9、1、4、2、3、6、5、8、7,删除偶数后a所 指数组中的数据为:9、1、3、5、7,返回值为5。【参考答案】(1)1(2) j+(3)j【解题思路】填空1:根据题目要求,需要进行奇偶数的判定,我们可以通过if条件语句来判断数组元素是否 是奇数,如果元素不能被2整除,则为奇数,所以填入if (ai%2 = = l)。填空2:将为奇数的元素重新存放到数组的前面,同时下标增1。填空3:函数返回值需要返回数组中奇数的个数,因此返回变量j。11、下列给定程序中函数ftm的功能是:求两个非零正整数的最大公约数,并作为函数值返回。例如,若numl和num2分别为49和21,则输出的最大公约数为7;若numl和num2分别为2 7和81,则输出的最大公约数为27。【参考答案】(1) t=a;a=b;b=t;(2) retum(b);或 return b;【解题思路】求最大公约数算法一般采用辗转相除法。辗转相除法的算法为:首先将m除以n(m>n)得余数 r,再用余数r去除原来的除数,得到新的余数,重复此过程直到余数为0时停止,此时的除数 就是m和n的最大公约数。程序首先判断参数a和b的大小,如果a<b则进行交换,这里是一个数学逻辑错误,应先将a 的值赋给中间变量t,再将b的值赋给a,最后将t的值赋给b。当余数r为0时,除数b即为所 求的最大公约数,所以函数应返回b。12、规定输入的字符串中只包含字母和*号。编写函数firn,其功能是:删除字符串中所有的* 号。编写函数时,不得使用C语言提供的字符串函数。例如,字符串中的内容为:*A*BC*DEF*G*,删除后字符串中的内容应当是:A BCDEFG»【参考答案】void fun( char *a )int ij=0;fbr(>=O;ai!='O'i+)ifiai!='*')aj+=ai;/*若不是要删除的字符'*'则留下*/aj= 0'【解题思路】用循环操作从字符串的开始往后逐个进行比较,若不是要删除的字符(用if(ai! =")来控制) 则保留。变量i和j用来表示原字符串的下标和删除*号后新字符串的下标。注意下标变量j要从0开始,最后还要加上字符串结束标识,0,。13、下列给定程序中,函数fun的功能是:将形参n中,各位上为偶数的数取出,并按原来从 高位到低位相反的顺序组成一个新数,作为函数值返回。例如,输入一个整数27638496,函数返回值为64862。【参考答案】(1)0(2) 10*x (3) n/10【解题思路】填空1:定义变量t用来存放数值几的各个位数值,此处判断t是否为偶数,即对2求余结果是否 为0。填空2:将t作为x的个位数,原来x的各个位上升1位,即x=1014、下列给定程序中函数fun的功能是:将长整型数中各位上为奇数的数依次取出,构成个 新数放在t中。高位仍在高位,低位仍在低位。例如,当s中的数为87653142时,t中的数为7531。【参考答案】(l)*t=0;(2)if(d%2!=0)或 if(d%2=l)【解题思路】(1)由函数定义可知,变量t是指针变量,所以对t进行赋初值0是不对的。因为t指向的 是存放新数的变量,所以此处应给新数赋初值0,即*t=0。(2)变量d表示数s各个位上的数,此处的if条件应为判断d是否为奇数。15编写函数fun,其功能是:实现两个字符串的连接(不要使用库函数strcat),即把p2所指的 字符串连接到pl所指的字符串的后面。例如,分别输入下面两个字符串:FirstStringSecondString程序输出:FirstStringSecondString【参考答案】void fun(char pl, char p2) int i,j;fbr(i=0;pli!=W;i+);fora=0;p2j!='j+)pli+=p2j;pli=W;)【解题思路】本题用两个循环完成操作,第1个循环的作用是求出第1个字符串的长度,即将i指到第1个字符 串的末尾。第2个循环的作用是将第2个字符串的字符连到第1个字符串的末尾。最后在第1个字 符串的结尾加上字符串结束标识,01下列给定程序中,函数ftm的功能是:把形参a所指数组中的最小值放在元素a0中,接着 把a所指数组中的最大值放在al元素中;再把a所指数组元素中的次小值放在a2中,把a 所指数组元素中的次大值放在a3,以此类推。例如,若a所指数组中的数据最初排列为:9、1、4、2、3、6、5、8、7;则按规则移动后, 数据排列为:1、9、2、8、3、7、4、6、5。形参n中存放a所指数组中数据的个数。规定fun函数中的max存放当前所找的最大值,px存放当前所找最大值的下标。【参考答案】(1) ai (2) aU (3) aj【解题思路】填空1 : for循环语句循环体中将数组元素ai赋值给变量max和变量min。填空2:通过一次fbr循环,找到数组中的最大值,if语句的条件表达式是max<aj。填空3:同理,此处if语句的条件表达式是min>aj。17、下列给定程序中函数fun的功能是:用递归算法计算斐波拉契数列中第n项的值。从第1项 起,斐波拉契数列为:1、1、2、3、5, 8、13、21例如,若给n输入7,则该项的斐波拉契数值为13。【参考答案】(1)去掉分号(2) case 1: case 2: return 1;【解题思路】C语言中,switch语句之后不能有分号,并且case语句常量后应用的是冒号。18、某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已在主函数中给 出,请编写函数fim,其功能是:求出该学生的平均分,并放入记录的ave成员中。例如,学生的成绩是:85.5,76,69.5,85,91,72,64.5, 87.5,则他的平均分应为78.875。【参考答案】oid fun(STREC *a)(double ave=0.0;int i;fbr(i=0;i<N;i+)a->ave=a->ave+a->s i;/*求各门成绩的总和*/a->ave/=N;/*求平均分*/【解题思路】本题考查自定义形参的相关知识点,程序流程是这样的:在fun()函数中求出平均分后,返回到 主函数时平均分也要带回,所以只能定义一个指针类型的形参STREC*a ,此时,引用成员的 方式可以使用指向运算符,即a>ave和a->si,当然也可用(*a). ave和(*2). si。19、下列给定程序中,函数fun的功能是进行数字字符转换。若形参ch中是数字字符0''9", 则将'0'转换成'9', '1'转换成'8', '2'转换成'7' '9'转换成'0';若是其它字符则保持不变:并将转换后的结果作为函数值返回。【参考答案】(1) char (2) ch<='9' (3)'O'【解题思路】填空1:函数定义时,类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型, 所以此处应该填入char。填空2:通过if条件语句判断字符串中字符是否是数字字符,既大于等于字符'0',同时小于等 于字符'9'。填空3: return语句完成函数返回操作,要实现字符转换,应填入return夕一(ch。)。20、下列给定程序中函数fun的功能是:将p所指字符串中的所有字符复制到b中,要求每复 制三个字符之后插入一个空格。例如,若给a输入字符串:ABCDEFGKHIJK,调用函数后,字符数组b中的内容为:ABC DEF GHI JK。【参考答案】(1) bk=*p;(2) bk=r 'k+;【解题思路】(1)题目中p是指针型变量作函数参数,因此给bk赋值时出现错误。(2)题目要求赋值3个字符后加一个空格,所以应该是先给bk赋值空格,然后变量k再加21、N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请 编写函数fun,其功能是:求出平均分,并由函数值返回。例如,若学生的成绩是:85 76 69 85 91 72 64 87,则平均分应当是:78.625。【参考答案】double fun( STREC *h )double ave=0.0;STREC *p=h->next;while(p!=NULL)ave=ave+p->s;p=p->next;1return ave/N;)【解题思路】题目要求求链表中数据域的平均位,应首先使用循环语句遍历链表,求各结点数据域中数值的 和,再对和求平均分。遍历链表时应定义一个指向结点的指针p,因为"头结点"中没有数值,所 以程序中让p直接指向"头结点"的下一个结点,使用语句STREC *p=h->next»22、下列给定程序中,函数fun的功能是:求ss所指字符串数组中长度最短的字符串所在的行 下标,作为函数值返回,并把其串长放在形参n所指的变量中。ss所指字符串数组中共有M个 字符串,且串长<N。【参考答案】(1) M (2) <(3) k【解题思路】填空1:题目指出SS所指字符串数组中共有M个字符串,所以fbr循环语句循环条件是i<M。填空2:要求求长度最短的字符串,*n中存放的是已知字符串中长度最短的字符串的长度,这 里将当前字符串长度与*n比较,若小于*n,则将该长度值赋给*n,因此if语句的条件表达式为 len<*n«填空3:将最短字符串的行下标作为函数值返回,变量k储存行下标的值。23、下列给定程序中函数fiin的功能是:将tt所指字符串中的小写字母全部改为对应的大写字 母,其它字符不变。例如,若输入"Ab, cD",则输出"AB, CD"«【参考答案】(l)ifi( tti>=a,)&&( tti <= 'z')(2)tti-=32;【解题思路】(1)分析本题可知,要判断字符是否为小写字母,即判断其是否在az之间,所以这里需要进行 连续的比较,用&&。(2)从ASCII码表中可以看出,小写字母的ASCII码值比对应大写字母的ASCII值大32。将字符 串中的小写字母改为大写字母的方法是:从字符串第一个字符开始,根据ASCH码值判断该字 母是不是小写字母,若是,则ASCH码值减32即可。24、编写函数fun,其功能是:将所有大于1小于整数m的非素数存入xx所指数组中,非素数 的个数通过k返回。例如,若输入17,则应输出:4 6 8 9 10 12 14 15 16。【参考答案】void fun( int m, int *k, int xx)int ij,n=0;for(i=4;i<m;i+) /*找出大于1小于整数m的非素数*/ for(j=2;j<i;j+)if(i%j=O) break;if(j<i) xxn+=i;)*k=n;/*返回非素数的个数*/【解题思路】题目要求将1m之间的非素数存入数组中,应使用循环判断结构。循环语句用来遍历1m之 间的每个数,判断语句用来判断该数是否素数,若不是素数,则将其存入数组中。这道题目是 考查一个数是否为素数的简单延伸,只要掌握了判断素数的方法,问题便能顺利解决。25、下列给定程序中,函数fun的功能是:将s所指字符串中的所有数字字符移到所有非数字 字符之后,并保持数字字符串和非数字字符串原有的次序。例如,s所指的字符串为def35adh3kjsdf7,执行后结果为defhdhajsdf3537。【参考答案】(Dj+或 j+=l 或+或)可+1si=tli (3) j【解题思路】填空1:根据函数fiin中的内容可知,数组tl存储了 s中的非数字字符,数组t2存储了 s中的数 字字符,为了存储下一个数字字符,下标j要进行加1操作。填空2:将s串中的数字与非数字字符分开后,要先将非数字字符放入字符串s中,因此填入si填空3:最后将数字字符加到s串之后,并且i要小于数字的个数j。26、下列给定程序中函数fim的功能是:用冒泡法对6个字符串进行升序排列。请改正程序中的错误,使它能得出正确的结果。【参考答案】(l)for (j = i + 1; j < 6; j+)(2)*(pstr + i) = *(pstr + j);【解题思路】(1)此处考查for语句的格式,各表达式之间应用";"割开。(2)此处考查用指针表示数组元素的方法,*(pstr+l)表示pstr所指向数组的第I个元素,同理*(p str+j)表示pstr所指向数组的第j个元素。27、编写函数fun,其功能是:求ss所指字符串中指定字符的个数,并返回此值。例如,若输入字符串123412132,输入字符为1,则输出3。【参考答案】int fun(char *ss, char c)(int i=0;fbr(;*ss!=I0'ss+)iR*ss=c)i+;/*求出ss所指字符串中指定字符的个数*/return i;【解题思路】从字符串中查找指定字符,需要使用循环判断结构,循环语句用来遍历字符串,循环条件为字 符串没有结束,即当前字符不是-O',判断语句用来判断当前字符是否为指定字符。最后返回指 定字符的个数。28、下列给定程序中,函数fun的功能是:将s所指字符串中的所有数字字符移到所有非数字 字符之后,并保持数字字符串和非数字字符串原有的次序。例如,s所指的字符串为def35adh3kjsdf7,执行后结果为defadhajsdf3537。【参考答案】j+或j+=l或+或上可+1si=tli(3) j【解题思路】填空1:根据函数firn中的内容可知,数组tl存储了 s中的非数字字符,数组t2存储了 s中的数 字字符,为了存储下一个数字字符,下标j要进行加1操作。填空2:将s串中的数字与非数字字符分开后,要先将非数字字符放入字符串s中,因此填入si =tlio填空3:最后将数字字符加到s串之后,并且i要小于数字的个数j。29、下列给定程序中函数fun的功能是:用冒泡法对6个字符串进行升序排列。【参考答案】(Dfor (j = i + 1; j < 6; j+)(2)*(pstr + i) = *(pstr + j);【解题思路】(1)此处考查for语句的格式,各表达式之间应用";"割开。(2)此处考查用指针表示数组元素的方法,*(pstr+I)表示pstr所指向数组的第I个元素,同理*(p str+j)表示pstr所指向数组的第j个元素。30、编写函数fun,其功能是:求ss所指字符串中指定字符的个数,并返回此值。例如,若输入字符串123412132,输入字符为1,则输出3。【参考答案】int fiin(char *ss, char c)int i=0;fbr(;*ss!='0'ss-H-)if*ss=c)i+;/*求出ss所指字符串中指定字符的个数*/return i;【解题思路】从字符串中查找指定字符,需要使用循环判断结构,循环语句用来遍历字符串,循环条件为字 符串没有结束,即当前字符不是、0',判断语句用来判断当前字符是否为指定字符。最后返回指 定字符的个数。31、下列给定程序中已建立一个带头结点的单向链表,链表中的各结点按结点数据域中的数据 递增有序链接。函数fim的功能是:把形参x的值放入一个新结点并插入链表中,使插入后各 结点数据域中的数据仍保持递增有序。【参考答案】(Dx (2)p(3)s【解题思路】填空1:将形参x赋值给结点的数据域。填空2和填空3:将新的结点和原有链表中结点进行比较。32、下列给定程序中函数firn的功能是:计算正整数num各位上的数字之积。例如,若输入252,则输出应该是20。若输入202,则输出应该是0。【参考答案】(l)long k=l;(2)num /=10;【解题思路】(l)k用来存放各位数字的积,初始值应为1。(2)这里是一个符号错误,除号用"/"来表示。33、编写函数fun,其功能是:计算n门课程的平均分,结果作为函数值返回。例如:若有5门课程的成绩是:90.5,72,80,61.5,55,则函数的值为:71.80。【参考答案】float fun ( float *a , int n )(int i;float av=0.0;fbr(i=0; i<n;i+) /*求分数的总和*/av=av+ai;return(av/n) ;/*返回平均值*/【解题思路】本题较简单,只需用一个循环语句就可变成数组元素的求和,再将和除以课程数即可。需要注 意的是本题对指针的操作,当指针变量指向一个数组时,用该指针变量引用数组元素,引用方 式与数组的引用方式相同。如本题中a指向了 score,所以通过a引用score中的元素时可以用 下标法,也可以用指针运算法,ai和*(a+i)具有相同的作用。下标运算实际上是从当前地址开 始往后取出地址中的第几个元素,当前地址下标为0。例如,若有int cc10, *p=cc+5;,即p 指向了 cc的第5个元素,则p0的作用与cc5相同;p3的作用是取出从当前地址(即p所指地 址)开始往后的第3个元素,它与cc8相同;p-2的作用是取出从当前地址开始往前的第2个元 素,它与cc3相同,但不提倡使用"负"的下标。34、下列给定程序中,函数fun的功能是:将形参a所指数组中的前半部分元素中的值与后半 部分元素中的值对换。形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动。例如:若a所指数组中的数据为:1、2、3、4、5、6、7、8、9,则调换后为:6, 7、8、9、5、 1、 2、 3、 4。【参考答案】(1)1(2) i (3) ap+i或*(a+p+i)【解题思路】填空1:该处是判断数组元素的个数是奇数还是偶数,为奇数时要使当前位置加1,以使p指向 数组中间位置。填空2和填空3:这里是一个比较常见的数组位置调换程序,应填入i和ap+i。35、下列给定程序中函数fbn的功能是:把从主函数中输入的3个数,最大的数放在a中,中间 的数放在b中,最小的数放在c中。例如,若输入的数为:55 12 34,输出的结果应当是:a=55.O, b=34.0, c=12.0« 【参考答案】(1 )float k;*c)【解题思路】(1)观察程序中的k,在赋值语句中,k是以变量的形式进行赋值而非指针,所以将k定义为指 针是错误的。(2)此处if语句是为了将小于*c的值放入*c中,所以改为iR*a < *c)z学生的记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组s中,请编 写函数fun,其功能是:把分数最高的学生数据放在b所指的数组中。注意:分数最高的学生可 能不止一个,函数返回分数最高的学生的人数。【参考答案】int fun( STREC *a, STREC *b )int ij=O,max=aO.s;/*找出最大值*)for(i=0;i<N;i+)if(max<ai. s) max=ai.s;for(i=0;i<N;i+)if(max=ai. s) bj+=ai;/*找出成绩与max相等的学生的记录,存入结构体b中*/return j;/*返回最高成绩的学生人数*/【解题思路】该程序使用两个循环判断语句,第1个循环判断语句的作用是找出最大值。第2个循环判断语句 的作用是找出与max相等的成绩(即最高成绩)的学生记录,并存入b中。37、下列给定程序中,函数fun的功能是:从形参ss所指字符串数组中,删除所有串长超过k 的字符串,函数返回剩余字符串的个数。ss所指字符串数组中共有N个字符串,且串长小于M。 【参考答案】(1) N (2) k (3) ssi【解题思路】填空1: for循环语句作用是遍历字符串数组中的每一个字符串,所以循环变量i的循环条件是i <N.填空2:题目要求删除串长度小于k的字符串,所以if条件语句的条件表达式是len<=k。 填空3:通过字符串拷贝函数将串长不大于k的字符串另存,并记录个数。38、下列给定程序中函数fiin的功能是:逐个比较p、q所指两个字符串对应位置上的字符,并 把ASCII值大或相等的字符依次存放到c所指的数组中,形成一个新的字符串。例如,若主函数中a字符串为aBCDeFgH, b字符串为ABcd,则c中的字符串应为aBcde FgHo【参考答案】(1) int k=0;(2)while (*p|*q)【解题思路】(1)变量k存放数组c的下标,因此应初始化为0。(2) while循环语句的循环条件是判断两个字符串是否到达结尾。39、规定输入的字符串中只包含字母和*号。请编写函数firn,其功能是:除了字符串前导的* 号之外,将串中其它*号全部删除。在编写函数时,不得使用C语言提供的字符串函数。例如,字符串中的内容为:*A*BC*DEF*G*,删除后,字符串中的内容应当是:*ABCDEFGo【参考答案】void fun( char *a )(int i=0;char *p=a;while(*p&&*p=*)ai=*p;i+;p+;while(*p)(if(*p!='*')ai=*p;i+;p+;)ai=')【解题思路】函数firn的功能:除了字符串前导的*号之外,将串中其他*号全部删除。解答本题,(1)定义一 个临时指针P,初始指向原串首地址;(2)利用循环语句把字符串前导*号拷贝到原串;(3)继续 移动指针,把串中和串尾的非*号字符拷贝到原串;(4)为修改后的字符串赋结束字符'0'。40、下列给定程序中,函数fun的功能是:把形参s所指字符串中下标为奇数的字符右移到下 一个奇数位置,最右边被移出字符串的字符绕回放到第一个奇数位置,下标为偶数的字符不动 (注:字符串的长度大于等于2)。例如,形参s所指字符串为abcdefjgh,执行结果为ahcbedgf。【参考答案】(1) 1(2) sk或*(s+k)(3) c【解题思路】填空1:函数firn中变量n统计字符的长度,假如长度为偶数,则卜=11-1:假如长度为奇数, 则k=n-2,使得下标为奇数的最后一个元素有效(不是K0,)。填空2: 了解变量k的作用后,则将最右边的奇数位置的数赋值给变量c。填空3:将最后一个下标为奇数的元素移到第一个奇数位置。41、下列给定程序中fun函数的功能是:求表达式s=aa. aa-. aaa - aa -a(此处aa. aa表示n个a, a和n的值在1至9之间)例如,a=3, n=6,则以上表达式为:s=33333333333 3333333333其值是296298。a和n是fun函数的形参,表达式的值作为函数值传回main函数。【参考答案】(1 )long s=0, t=0;(2)t=t/10;【解题思路】(1) t用来存放每次循环后的多位数,第一次循环时,t应当是个位数,所以t的初始值应为0。 (2)根据题意,这里不需要求余数,而是要去掉个位数,重新组合一个数,因此应用除法运算。42、编写函数void fun(char *tt, int pp),统计在tt所指的字符串中'a'到'z'26个小写字母各 自出现的次数,并依次放在pp所指的数组中。例如,当输入字符串abcdefgabcdeabc后,程序的输出结果应该是:3 3 3 2 2 1 1 0000000000000000000【参考答案】void fun(char *tt, int pp)int i;fbr(i=0;i<26;i-H-)ppi=O;/*初始化pp数组各元素为0*/for(;*tt!=' 0' :tt+)if (*tt>=' a' &&*tt<=' z )pp*tt-' a* +;【解题思路】要求统计在tt所指字符串中'a'到'z' 26个小写字母各自出现的次数,并依次放在pp所指数组中。 首先for循环语句体中初始化pp数组中分别用来统计26个字母的个数。再使用循环判断语句对 tt所指字符串中的字符进行逐一比较操作,同时存入相对应的pp数组中。43、下列给定程序中,函数fun的功能是:在形参ss所指字符串数组中查找与形参t所指字符 串相同的串,找到后返回该串在字符串数组中的位置(即下标值),若未找到则返回一 1。ss所指 字符串数组中共有N个内容不同的字符串,且串长小于M。【参考答案】(DN (2)i(3) -1【解题思路】填空1:变量i是循环变量,它的取值范围是在0到N之间。填空2:如果ss所指字符串数组中的字符串和t所指字符串相同的话,则返回其下标值,即ret urn N1;否则返回一1,即 return 1。填空3:在main函数中输出最后结果,判断函数返回值n,如果n=0,说明没有找到,否则输 出n。44、下列给定程序中函数fun的功能是:从整数1到55之间,查找能被3整除且有一位上的数值 是5的数,把这些数放在b所指的数组中,这些数的个数作为函数值返回。规定函数中al放个 位数,a2放十位数。【参考答案】(l)a2=k/10;(2)retum i;【解题思路】(1) a2存放十位数,所以是a2=k/10,此处是一个书写错误。(2)根据题意,要返回能被3整除的数的个数,从循环体中可以知道其个数是由i来计算的,所以 返回的是i。45、规定输入的字符串中只包含字母和I*号。请编写函数fun,其功能是:将字符串尾部的*号全 部删除,前面和中间的*号不动。例如,字符串中的内容为:*A*BC*DEF*G*,删除后,字符串中的内容应当是: *A*BC*DEF*G。在编写函数时,不得使用C语言提供的字符串函数。【参考答案】void fun( char *a )while(*a!=')a+;a-;/*指针a指向字符串的尾部*/while(*a=,*')a-;/*指针a指向最后一个字母*/*(a+1)0" ;/*在字符串最后加上结束标志符*/【解题思路】对于一个字符串耍删除其尾部的*号,只需要在最后一个不是*号的字符后面加上结束符号 具体操作为:首先找到字符串的结尾,然后从最后一个字符开始往前逐个判断是否为*号,直到 找到非*号字符为止,最后在该字符后面加上结束符号'0'。46、下列给定程序中已建立了一个带头结点的单向链表,在main函数中将多次调用fun函数, 每调用一次,输出链表尾部结点中的数据,并释放该结点,使链表缩短。【参考答案】(1 )next(2) t->data (3) t【解题思路】填空1:因为是链表操作,所以要使t逐一往后移动,语句为t=t>next。填空2:输出链表结点的数据域,HP t->data.填空3:使用free函数将t所指向的内