C语言上级资料答案(解析)

申明敬告: 本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。

文档介绍

C语言上级资料答案(解析)

第一套1、本题的考核点是结构体类型变量的定义和引用以及文件函数的应用。fopen函数的作用是打开一个文件,在fun函数中为输入打开一个二进制文件,所以第一个空填:"rb"或与此语句功能相同的语句;利用嵌套循环语句按学号从小到大排序,所以第二个空填:>s[j].sno或与此语句功能相同的语句;再用二进制方式把排序后的数据输出到指定文件中,fwrite函数的作用是往文件的当前位置写入指定字节的数据块,所以第三个空填:fwrite。2、首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错误的重要前提。程序中的重要思想如下:1、函数fun()的功能是根据一个整型形参计算题目中的数学公式;2、由于公式中运用了除法,所以公式的最终值必须使用double型,以保持最终值的精确性。题中的第一个错误出现在函数fun()中的语句"for(i=2;im){m=x1+x2;x1=x2;x2=m;}returnm;}第二套1、本题的考核点是C语言中的基本算法和简单语句的使用。fun函数是用来对整数进行判断是否符合题目中规定的条件。首先对变量赋初值,n返回的是符合条件的整数的个数,因此第一个空填:0;while语句用于求出100至x(x≤999)之间的符合条件的整数个数,故第二个空填:x;由while循环语句可知第三个空是设置循环变量的步长,根据题义可知循环步长是1,因此第三个空填:t++或与此语句相同功能的语句。2、本题的考核点是C语言的一些基本常识和循环语句的使用。n从本题的要求看,如果某一个元音字母没有在字符串中出现时,程序应返回0。主函数中num[5]代表一块C编译器随机分配的内存地址,在没有对这块内存地址初始化之前,这块内存中存放着随机的数据,也有可能是1,2...等数字,因此在fun函数开始应对num数组进行初始化。fun函数的第一个for循环中,k才是循环变量,而i只是一个常量,因此"num[i]=0;"应改为"num[k]=0;"或相同作用的语句。另外,s代表的只是一个字符串的指针,把它直接当一个数据看待是没有意义的,应该把"switch(s)"语句改为"switch(*s)"语句。本评析仅供参考。3、本题的考核点是数组、循环语句。解题思路:使用循环语句将数组下标为奇数的元素与2取余,如果余数不为零则将其值存入另外一个数组中。本评析仅供参考。voidfun(char*s,chart[]){inti,slenth,n=0;slenth=strlen(s);/*统计字符串s中字符的个数*//*将字符串s中所有下标和ASCII值同时为奇数的字符复制到数组t中*/for(i=1;ip)"。本评析仅3.本题的考核点是公式算法。解题思路:从1至m累计log(i)的和值,最后求它的平方根。本评析仅供参考。doublefun(intm){inti;ndoubles=0;for(i=1;i<=m;i++)/*求In(1)~In(m)的和*/s=s+log(i);s=sqrt(s);/*求s的平方根*/return(s);}第四套1.本题的考核点是字符串中字符的移动。本题程序实现的是将字符串中的字母顺序前移,其它字符顺序后移操作。在fun函数中定义了字符型指针变量指向字符串地址,if语句判断字符串中的字符是否为字母,若是则将其内容赋值给指针变量t;若不是则将其内容赋值给指针变量p,所以第一个空填:*(s+i)或与此语句相同功能的语句。第一个for循环结束后,指针变量t中的内容为字符串中的所有字母字符,指针变量p中的内容为字符串中的其它字符,变量k的值是字符串中其它字符的个数。第二个for循环是将指针变量p中存储的字符赋给指针变量t,所以第二个空填:k或与此语句相同功能的语句。指针变量最后指向的应该是个空值或是0,所以第三个空填:0。2.本题的考核点是C语言的标识符。解题思路:通过循环语句来交叉合并数组。本题中while语句出现了逻辑错误,其i应该是小于j。第二处错误是没有注意到C语言是区分大小写的。本评析仅作参考。3.本题的考核点是数组、循环语句。解题思路:使用循环语句将数组下标为偶数的元素与2做取余操作,如果余数为零则将其值存入另外一个数组中。本评析仅供参考。voidfun(char*s,chart[]){inti,slenth,n=0;slenth=strlen(s);/*统计字符串s中字符的个数*//*将字符串s中所有下标和ASCII值同时为偶数的字符复制到数组t中*/for(i=0;ipp[k]){x=pp[i];pp[i]=pp[j];pp[j]=x;}/*对进行符合条件的整数进行从小到大的排序*/}第八套1.本题的考核点是C语言中字符串数组和字符串指针变量的应用。在fun函数中通过字符串指针变量来访问字符串数组元素。首先利用for循环语句将二维数组中各元素的首地址赋给指针变量ps。变量k作为指针变量ps的下标值,其值根据循环中变量i的值变化,所以第一个空填:i;内层循环判断指针变量所指向的数组元素的长度,所以第二个空填:*(ps+j)或与此语句功能相同的语句;题目要求将字符串按由长到短的顺序排序,所以第三个空填:tp。2.本题着重考察考生对C语言中一些简单算法的掌握情况。八进制转换成十进制的方法是:例如77777=7*8^4+7*8^3+7*8^2+7*8^1+7*8^0本题中的第一个错误:题中要求将一个由八进制数字字符组成的字符串转换为等值的十进制数,思路应是:先将字符串中相应的字符减去字符0的ASCII值,得出该字符的八进制数,然后乘以8的次幂之和,即可求得该数的十进制数,所以程序中语句"n=*p-'o';"应改为"n=*p-'0';";本题中的第二个错误与第一个错误相似,另外,八进制转换成十进制应乘以8的次幂,所以应将程序中n语句"n=n*7+*p-'o';"改为"n=n*8+*p-'0';"。解决问题的方法是多种多样的,同一个问题的答案不止一个。本评析仅作参考。3.本题的考核点是二维数组、循环语句的嵌套。解题思路:先用一个变量记录二维数组的第一个元素,然后通过嵌套的循环语句依次将数组中的其他元素与这个变量作比较,如果大于它则交换两者的值。本评析仅供参考。fun(inta[][M]){inti,j,base;base=a[0][0];/*将二维数组的第一个元素赋给变量base,该变量是存放数组中最大元素的值*/for(i=0;i<2;i++)/*设置循环变量*/for(j=0;j='a'&&ss[i]<='z')/*判断该字符是否为小写字母*/ss[i]=ss[i]-'a'+'A';/*若上述条件成立,则将其转换为大写字母*/}第十一套1.本题的考核点是结构体类型变量的定义和引用以及文件函数的应用。fopen函数的作用是打开一个文件,在fun函数中为读/写打开一个二进制文件,while循环控制语句的作用是在打开的文件内找到与形参相匹配的内容,feof函数的作用是检测文件位置指示器是否已到末尾,n所以第一个空填:feof(fp);sizeof操作符以字节形式给出了其操作数的存储大小,fread函数的作用是从文件的当前位置开始读取size*count个字节的数据,所以第二个空填:==sno;如果在指定文件中找到相同数据并且未到文件尾,则将每门课的分数加3,fseek函数的作用是设定文件操作指示器位置,所以第三个空填:sizeof(STU)。2.本题主要考查的是函数的递归调用。由于k!=k*(k-1)!,当k=0时,其阶乘为1,当k大于0时,其阶乘为k*(k-1)!,即递归调用fun函数,所以第一处错误"k<0"应改为"k>0"。由于条件判断是否相等用的是关系运算符"==",而不是赋值运算符"=",所以第二处错误"k=0"应改为"k==0"。本评析仅供参考。3.本题的考核点是公式算法。解题思路:累计1/(i*(i+1))的和,通过一循环即可实现。本评析仅供参考。doublefun(intn){inti;doubles=0;for(i=1;i<=n;i++)s=s+1.0/(i*(i+1));/*累加各分式的值*/return(s);}第十二套1.本题的考查的是指针、循环语句和判断奇偶数的算法。解题思路:定义一个变量t,用于存放指针变量n所指向数据的任意一个位上的数(从低位到高位依次),所以第一个空填:10;如果取出的这个数值不为偶数即t%2!=0,则保留此数值,所以第二个空填:0;在满足while(*n)为真的情况下继续执行循环,直到将所有的偶数去除,x用来存放去除偶数后剩余的数,题目中要求将新的数通过形参指针n传回,x中就存放着新的数,所以第三个空填:x。本评析仅供参考。2.本题考查的是二维数组。本程序通过输入的数据控制输出矩阵的行列数,并调用fun函数控制二维数组各元素的值。在fun函数中,定义了二维数组a作为形参,由于定义数组时对第一维的长度可以不指定,但第二维的长度不能省,所以本程序第一处错误中应将"a[][]"改为"a[][M]"。在fun函数中采用嵌套的for循环给二维数组赋值,其中变量j控制行下标,变量k控制列下标,并由题面所给矩阵可看出,第j行第k列中的元素值等于行下标加1与列下标加1的乘积,所以第二处错误中应将"a[k][j]"改为"a[j][k]"。本评析仅作参考。3.本题的考核点是公式算法。解题思路:通过一变量累计乘积,求阶乘,通过另一变量累计乘积,求次方,再通过一变量累计分式的和。本评析仅供参考。ndoublefun(doublex,intn){inti;doublef=1.0,h=x;doubles=1;s=s+h/f;/*求公式中1、2两项的和(即1+x)*/for(i=2;i<=n;i++){f=f*i;/*求公式中每一项分母的阶乘值*/h=h*x;/*求公式中每一项分子的乘方值*/s=s+h/f;}return(s);}第十三套1.本题的考查的是数组的应用。解题思路:在主函数中随机抽取10个正数,并将值赋给数组x。在函数fun的形参中,定义一个指针变量av用来存放平均值,第一个for循环的作用就是计算平均值,所以第一个空填:*av;第二个for循环的作用是将数组中的数与平均值进行比较,求出小于平均值且离平均值最近的数,变量d用来表示到平均值的距离,j可以用来存放符合条件的数值也可以用来表示下标,所以第二个空填:i;如果用来存放数值则第三个空可填:j;如果用来表示下标第三个空可填x[j]。本评析仅供参考。2.本题的考核点是C语言中一些规定的应用。对while条件的说明,其中括号要相应完整,对应整齐。所以题中的第一处错误是while语句的最后缺少一个右括号,应该添加一个右括号,与前面的括号对应完整。C语言规定,每个语句和数据定义的最后必须有一个分号。分号是C语句的必要组成部分。所以,break语句要发挥语句的作用,其后必须要加分号。第二处错误应改为"break;"。本评析仅作参考。3.本题的考核点是删除字符串中字符的算法。解题思路:从原串的尾部开始找到第一个不为*的字符,将从这个字符开始到串首的字符放在另一个字符串数组中,最后将新串中的字符逆序放到原串中覆盖原串。本评析仅供参考。voidfun(char*a){charb[81];inti=0,j,s=0;j=strlen(a)-1;while((j!=-1)&&(a[j]=='*'))j--;/*查找出字符串数组a中尾部第一个不为"*"的字符*/while(j!=-1){b[i]=a[j];j--;i++;}/*将字符串a中尾部不为"*"开始的所有字符全部复制到字符串b中*/b[i]='';j=0;i=0;while(b[i++]!='')s++;i=0;nwhile(b[i]!=''){a[j+s]=b[i];j++;i++;}/*将字符串b中的所有字符复制到a字符串中覆盖原串*/a[s]='';}第十四套1.本题考查的是二维数组名作为实参时,实参和形参之间的数据传递。解题思路:首先定义一个列下标i,外循环for语句用来将指针b指向第一行中的元素,所以第一个空填a[0][i];j用来控制二维数组行的变化,在内循环中的if语句用来对每列的各个元素进行比较,如果b[i]小于第i列的第j个元素,则将a[j][i]的值赋给b[i],即用b[i]记录每列元素中最大的那个元素,所以第二个空填:<;主函数中的fun函数用来定义实参,实参用数组名来表示,所以第三个空填:x,y。本评析仅供参考。2.首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错误的重要前提。程序中的重要思想如下:1、用题中提供的公式求π的近似值,直到最后一项的绝对值小于指定的数(参数num)为止;2、在题中必须使用求分数绝对值的函数。本题的第一个错误:在函数中的while循环中,条件明显不对,应当改为"while((fabs(t))>=num)",这样才能保证循环结束的条件为最后一项的绝对值小于指定的数(参数num);本题的第二个错误:在函数循环中求分数值的语句"t=s%n;"中错误使用了%号,在C语言中%是求余运算符,而我们的目的是为了进行除运算,所以,该语句应当改为"t=s/n;"。本评析仅作参考。3.本题的考核点是删除字符串中字符的算法。解题思路:先将原串中的串首连续的*号字符赋给一字符串数组,再从原串中的第一个非*字符开始,将非*号的字符追加其后,最后将新串覆盖原串。本评析仅供参考。voidfun(char*a){charb[81];inti=0,j=0;while(a[i]&&(a[i]=='*')){b[j]=a[i];j++;i++;}/*将原串中的串首连续的*号字符赋给一字符串数组b*/while(a[i])if(a[i]!='*'){b[j]=a[i];j++;i++;}/*从原串中的第一个非*字符开始,将非*号的字符追加在数组b后*/elsei++;b[j]='';j=0;i=0;while(b[j])/*将字符串b中的所有字符复制到a字符串中覆盖原串*/{a[i]=b[j];i++;j++;}a[i]='';}第十五套1.本题考查的是二维数组名作为实参时,实参和形参之间的数据传递。解题思路:当二维数组名作为实参时,对应的形参必须是一个行指针变量,其fun函数首部可以写成:nvoidfun(int(*a)[N])所以第一个空可以写成:[N]或[7];再根据题面要求最外层元素为1,往内依次递增一个数字,根据for循环语句得知第二个空填:i;第三个空填:i+1或1+i。本评析仅供参考。2.本题考查的是阶乘的运算。n!=1*2*3*……*(n-1)*n,而本题while循环中的"result*=--n;"只能说明此阶乘只乘到了n-1,并没有乘以n,因为"--n"表示先使得n的值减1,再把减1后的值放入表达式中运算,所以此表达式应改为"result*=n--;",但result为double型的,所以,也可以在n--前加上强制类型转型,如果不加也可以,系统会自动进行类型转换。最后算出的result的值为n!,故return后面应填result。3.本题的考核点是删除字符串中字符的算法。解题思路:将从第一个非*字符开始到串尾连续*之前的所有字符赋给另一字符串数组,最后将新串中的字符放到原串中覆盖原串。本评析仅供参考。voidfun(char*a,intn,inth,inte){charb[81],*c,*d;inti=0,j=0;c=a;d=a;c=c+h;d=d+n-e-1;while(c<=d){b[i]=*c;i++;c++;}/*将从第一个非*字符开始到串尾连续*之前的非*字符追加在数组b中*/b[i]='';i=0;while(b[i]){a[j]=b[i];j++;i++;}/*将字符串b中的所有字符复制到a字符串中覆盖原串*/a[j]='';}第十六套1.本题的考查的是循环语句和判断奇偶数的算法。解题思路:定义一个变量t,用于存放变量n取出的任意位上的一个数(从低位到高位依次),根据题目要求取出的数值为偶数,所以第一个空填:0;同时题目要求将低位的数值放在高位,x变量的作用是存放每次循环后求出的倒序偶数,由于每次循环后求出的t的值为个位上的数,所以要使得t的值组合成符合要求的有效数字,就必须使得x的值在前一次循环结果的基础上移位到高位(即x*10),然后再加上个位数t,所以第二个空填:x*10或相同作用的语句;当取出n中数值个位上的数并作处理后,必须使n值各低位上的数用其相对应的比它高一位数进行替换,以便于下一轮循环再次顺利取出其个位上的新数,所以第三个空填:n/10或相同作用的语句。本评析仅供参考。2.本题着重考察考生对C语言中指针数组的定义以及函数返回值的掌握情况。本题中的第一个错误:指针数组定义错误,应将程序中的语句"fun(char(*sq)[N])"改为"char*fun(charsq[N][M])"。本题中的第二个错误:函数返回的应是字符串中最长那个串的地址,这个地址是通过指针sp记录的,所以程序中的语句"returnsq;"应改为"returnsp;"或相同作用的语句。本评析仅作参考。3.本题的考核点是移动字符串中字符的算法。n解题思路:先统计原串串首连续*的个数,再将从第一个非*字符开始至串尾的所有字符赋给一字符串,再通过一循环生成串首连续的*追加其后,最后将新串覆盖原串。本评析仅供参考。voidfun(char*a){charb[81];inti=0,j=0,s=0,k;while(a[i]=='*'){i++;s++;}/*统计原串串首连续星号的个数*/while(a[i])/*将从第一个非星号字符开始至串尾的所有字符赋给字符串b*/{b[j]=a[i];j++;i++;}for(k=0;k。本评析仅作参考。2.本题着重考察考生对C语言中递归算法及函数定义的掌握情况。由主函数中的输出语句可看出,fun函数应返回一个double型值,所以程序中语句"fun(doublea,doublex0)"应改为"doublefun(doublea,doublex0)"。在迭代算法中,两个数据差的绝对值要尽量小,当绝对值不够小时,必须再次递归调用函数。本题中x1与x0差的绝对应在大于0.00001的情况下才继续调用函数fun,所以语句"if(fabs(x1-x0)<0.00001)"应改为"if(fabs(x1-x0)>0.00001)"。本评析仅作参考。3.本题的考核点是找出分数最低的学生数据的算法。解题思路:先从所有的学生数据中找出最低的分值,然后将所有学生分数中与最低分值相等的学生数据放到另一数组中,最后统计分数最低的学生人数并返回。本评析仅供参考。intfun(STREC*a,STREC*b){inti,j=0,min,k,f=0;min=(*a).s;for(i=1;inext;max=c->s;/*假定首结点为最大值*/while(c->next!=0){c=c->next;/*c后移一个结点*/if(maxs)max=c->s;/*找出最大值并将其赋给变量max*/}returnmax;/*返回最大值*/}第二十一套1.本题的考核点是循环语句的应用。从矩阵的第0行第0列开始计算求和,行与列的和首先要初始化为0,所以第一处填:0;若"行的值不等于列的值"或"行的值不等于对角线的值"则不是"幻方"返回0,所以第二处填:||;若是"幻方"则返回1,所以第三处填:1。本评析仅供参考。2.本题着重考察考生对C语言中一些简单算法的掌握情况。本题中的第一个错误:fun函数返回的应为float或double型,所以程序中语句"fun(intn)"应改为"doublefun(intn)"或相同作用的语句。本题中的第二个错误:C语言中关键词应为小写,所以程序中语句"s=s+(Double)a/b;"应改为"s=s+(double)a/b;"或相同作用的语句。本评析仅作参考。3.本题的考核点是C语言中的循环嵌套。解题思路:使用嵌套循环,外循环是列循环,内循环是行循环,这样可以对整个数组中的元素进行符合条件的运算。是对数组上半三角元素中的值乘以n,观察二维数组可以看出,数组上半三角中的元素,行坐标值都小于等于列坐标值。/*该题的关键是在如何表示右上半角,当从上往下到第i行时要从第i列(所以内嵌for()的j从i开始循环)开始替换直到最后一列,本题用外层for()来控制行,而用内嵌的for()来控制在每一行内右边元素乘m,本题采用的是在一行内从最后一列的元素开始往前乘,只有j>=i时才改变。*/voidfun(inta[][N],intm){inti,j;/*定义两个整型变量,用于控制二维数组行、列下标的变化*/for(i=0;i=i;j--)/*内嵌的for()来控制二维数组列的变化*/a[i][j]*=m;/*对数组上半三角元素中的值全部乘以m*/}第二十二套1.本题的考核点是二维数组作为函数参数及循环嵌套。变量p用来记下除第0列外的第k列以内的元素的下标,因此第一处填:k;在满足最外层的for循环下,各列依次进行左移,因此第二处填:N-1;第三处填:temp。本评析仅供参考。2.本题着重考察考生对C语言中一些简单算法的掌握情况。本题中的第一个错误:C语言中,变量是区分大小写的,p和P是不同的两个变量名,所以程序中语句"if(P==n)return-1;"应改为"if(p==n)return-1;"或相同作用的语句。n本题中的第二个错误:由题意可知,要删除符合条件的元素,需将该元素后面的数向前移动一个位置,所以程序中语句"a[i+1]=a[i];"应改为"a[i]=a[i+1];"或相同作用的语句。本评析仅作参考。3.本题的考核点是字符数组、循环语句。解题思路:通过for循环语句以及if语句,判断当前位置上的字符是否为空格(空格的ASCII码值为32),若是空格,再判断下一个字符是否为空格,若下一个字符不是空格,则将当前位置上的字符赋给上一个字符位置上;若下一个字符还是空格,则继续判断该字符的下一个字符,直至其下一个字符为非空格时重复上述赋值操作,最终以字符串结束标志""结束循环。voidfun(char*str){inti,j;for(i=0;*(str+i);i++)if(*(str+i)==32)/*判断当前位置上的字符是否为空格(空格的ASCII码值为32)*/{for(j=i+1;*(str+j);j++)*(str+j-1)=*(str+j);/*删除空格*/*(str+j-1)=0;/*以字符串结束标志""结束循环*/i=0;}}第二十三套1.本题的考核点是字符型指针变量作为函数参数。本题fun()函数有两个字符型指针变量s和t,在函数中通过一个while循环依次取出s所指字符并判断它的ASCII码值是否小于97,如果是,则将其放到另一字符型指针变量t中,所以第一处填:*s;一个字符判断完后指针下移进行下个字符的判断,所以第二处填:s++;变量n用来统计符合条件的字符个数,所以第三处填:n。本评析仅供参考。2.本题的考查点是函数的返回值。由于题目要求a2存放十位数,所以"a2=k%10;"应该改为"a2=k/10;"。程序中通过变量i来记录符合条件值的个数,由题意可知,数的个数作为函数值返回,所以程序中的语句"returnk;"应改为"returni;"或相同作用的语句。本评析仅作参考。3.本题的考核点是二维数组按行转换为一维数组的算法。解题思路:本题提供的参考程序利用内、外循环两层for循环,按行的顺序将第1到3行的数据依次存放到数组中的相应位置上,同时利用形参变量n来统计一维数组中存放的数据的个数,即实现了将M行N列的二维数组中的数据按行的顺序依次放到一维数组中。voidfun(int(*s)[10],int*b,int*n,intmm,intnn){intx,y;/*定义两个整型变量,用于控制数组下标的变化*/for(x=0;xnext;第二空的目的是将p的下个结点赋值给q,故第二空应填:p->next;第三空的目的是判断指针p所指的数值是否大于指针q所指的数值,故第三空应填:>。本评析仅供参考。2、本题的考核点是计算子串在主串中出现的次数。解题思路:将主串中的字符从第一个位置开始逐个与子串中的字符作比较,若子串出现在主串中,次数加1,主串中的指针移动到下一个位置继续与子串比较,反之,主串中的指针也同样移动到下个位置,直至主串中的字符全部比较结束。程序中的第一个错误:指针r指向给定的字符串,即r=t;。程序中的第二个错误:C语言中判断是否相等应当用符号"==","="是赋值符,不用于判断。另外字符串末尾的标志是"",而不是"0",所以第二处改为"if(*r=='')"。本评析仅供参考。3、本题的考核点是统计各年龄段人数的算法。解题思路:本题提供的参考程序,先对数组初始化,再通过for循环和逗号表达式*(a+i)/10>10?10:*(a+i)/10,将年龄整除10后存放到数组d中,具体执行过程是:判断年龄整除10后的值是否大于10,若大于10,则该逗号表达式的值等于10,即实现了将100岁(含100)以上年龄的人数存放在d[10]中;若不大于10,则该逗号表达式的值等于*(a+i)/10的值,即实现了各个年龄段的人数的统计。voidfun(int*a,int*b){inti;for(i=0;i10?10:*(a+i)/10]++;}第三十一套1、本题主要考查了链表的操作。由于函数返回的是一个链表,它应该是一个指向NODE型的指针,故第一空为:NODE;在本题中,由于"q->next=p;"在循环的第二条语句,故在此之前必须要将q->next赋值给某临时变量,所以第二空应为:next;最后,为了保证链表不会断流,必须将r赋值给变量q,故第三空为:r。本评析仅供参考。2、本题的考核点是c语言中循环语句和条件判断语句的使用。解题思路:从本题的要求来看,我们应该采用循环判断的算法。本参考函数使用while循环从头到尾扫描字符串,并在扫描时进行条件判断,对'z','Z'和其它字符进行不同的处理。程序中的第一个错误:循环的条件应当是字符串没有结束,即字符串不为空,在C语言中"@"不表示空。程序中的第二个错误:此处应当是字符指针指向下一个元素,(*s)++;表示字符值加1,没有指向下一个元素,不合题意。n本评析仅供参考。3、本题的考核点是统计字符串中单词个数的算法。解题思路:本题要求统计一行字符串中单词的个数,并作为函数值返回。在给出的参考程序中,若判断出当前字符为非空格,而它前面的字符是空格,则单词数累加1;若当前字符为非空格,而其前面的字符也为非空格,则单词数不累加1,程序细节可以参考程序的注释部分。intfun(char*s){inti=1,j=0;/*i用来记录是否遇到过了空格,j用来记录单词数*/while(*s){if((i==1)&&(*s!=32)){j++;i=0;}/*当i==1且当前s所指向的是字符,则j自增加1,同时将i设为0*/if(*s==32)i=1;/*用i来判断是否遇到了空格,假如遇到了空格则i=1*/s++;/*检测是否是空格,如果是空格则指针变量s向后移动一位*/}returnj;/*返回统计结果*/}第三十二套1、本题的考核点是字符串的应用。本程序将字符串从前向后与从后向前的字母依次比较,在满足各比较字母相等,且比较到或超过字符串长度的二分之一的情况下,说明此字符串是回文。toupper函数的作用是把字符串中所有的小写字母都变成大写字母,而非字母的字符则不改变。程序首先通过调用fun函数将指针变量s指向用户输入的字符串的首地址。在fun函数中,用指针变量lp依次取得字符串中从前向后的各字母,所以lp应指向字符串的首地址,故第一空填"s"或与其等效的形式。指针变量rp依次取得字符串中从后向前的各字母。当满足lp与rp所指向的存储单元的值相等且指针变量lp小于rp的情况下,lp就继续后移,rp继续前移,所以第二空应填"rp--;"或其等效的形式。如果在lpn)/*判断字符串尾连续的*号个数是否大于n*/{for(k=0;kn)/*判断字符串尾连续的星号个数是否大于n*/{a[len-s+n]='';/*将串尾第n个星号的位置赋字符串结束标志*/}}第三十六套1、本题考查的是循环语句及数字组合的算法。本子函数fun中变量s的作用是存放每次循环后,舍去个位上的数之后的数,变量i的作用使得取得的偶数能正确地依次组合成一个数字,所以i的初值为1,这样才能使得找到的第一个偶数(从低位到高位)正确地放到个位上(x=x+t*i;),所以第一空应填1;要使得第二个偶数放到十位上,则应使用i的值乘以10,由于i*10在循环体中,所以每一次循环i的值都在上次的基础上乘以10,这样就可使得第三个偶数正确地放到百位上,依此类推,故第三空应填i*10;while循环体的作用是找到偶数正确地组合成另一个数,所以while循环的条件应该被找那个数"s"各位上的数字是否判断结束,即s/10是否为0,当值不为0,则继续循环,若值为0,则结束循环,所以第二空应填"s!=0"或与其等效的形式。本评析仅供参考。2、本题的考核点是建立链表并为各结点赋值。解题思路:设三个指针变量:h、p、s,它们都指向结构体类型数据。先用malloc函数开辟一个结点,并使h指向它,通过循环再开辟新的结点,并使s指向新开辟的结点,将读入的随机数给s所指的结点,即为s结点赋值。程序中的第一个错误:许多C版本提供的malloc和calloc函数得到的是指向字符型数据的指针。程序中的第二个错误:返回的应该是头结点。本评析仅供参考。3、本题考查的是结构体数组及指针的运用。解题思路:1、从所有的学生数据中找出最高的分值;2、将所有学生分数中与最高分值相等的学生数据放到另一数组中,同时统计分数最高的学生人数并返回。本评析仅供参考。intfun(STREC*a,STREC*b){inti,j=0,max,k,f=0;max=(*a).s;for(i=1;imax)max=a[i].s;/*从所有的学生数据中找出最高的分值*/for(i=0;i成员",所以第一个空填:->sno;strcpy函数的作用是将后一字符串内容(源字符串)拷贝到前一字符串(目的字符串)中,所以第二个空填:->name;主函数中通过fun();语句将结构体数组的首地址传给形参结构体指针b,所以第三个空填:&t。本评析仅供参考。2、本题着重考察考生对C语言中指针的用法与基本概念。C语言中,大写字母和小写字母被认为是两个不同的字符,空值用大写的NULL来表示,所以"a=Null;"要改为"a=NULL;"或"a=0;"或"a='';"。在源程序中,r与p为指针变量,它们各自存放的是指针变量的地址,题意中要求引用这两个地址所指向的内容进行比较,所以须在地址前加上*。源程序中的"if(r==p)"应改为"if(*r==*p)"或具有相同作用的语句。本评析仅作参考3、本题考查点是求一个数的因子之和。判断因子的方法是:能被n整除的数。本评析仅供参考。intfun(intn){inti,s=0;if(n<1000){for(i=2;inext;第二空的目的是判断有没有将当前n链表遍历结束,故应填:q或q!=NULL;第三空的目的是将当前结点指向链表的下一结点,故应填:p->next。本评析仅供参考。2、本题考查的是循环及表达式的运用。本程序通过函数fun中的for循环来计算题面中公式的值,即当变量m的值为几时,就应当有几项值相加,但根据程序中for循环的条件表达式"i100){printf("Inputn(n>1&&n<=100):");scanf("%d",&n);}/*判断n的是否满足大于1但不大于100的要求*/for(i=1;i<=n;i++){p=p*i;/*p作为中间变量,求出累乘值*/m=m+1.0/p;/*求出多项式之和*/}return(m);/*返回结果*/}第四十一套1、本题的考查的是数组的应用及循环变量的控制。解题思路:在主函数中随机抽取10个正数,并将值赋给数组x。变量av用来存放平均值,第一个for循环的作用是求所有数组元素的平均值,所以第一个空填x[i]/N;第二个for循环的作用是将数组中的数与平均值进行比较,将小于平均值的数存入y数组中,并且从y[0]开始依次存放,所以在每次循环时,j的值都必须加1,故第二个空填:j++;在while循环中,用x[i]!=-1来判断元素x[i]是否放入y数组中,如果没有,则表示在此循环中,将大于等于平均值的数据继续放入数组y的后部,同时i的值必须自增才能取得x数组中的所有元素值,所以第三个空填:i++。本评析仅供参考。2、本题考查的是循环及表达式的运用。本程序通过函数fun中的for循环求得题面要求的公式,第一个for用于求得被减数的值,即n个a表示的数据,此数据用变量t存放。程序中t的初值赋为1,那么求得的被减数的值则为1a…a,与题意不符,只有当t的初值为0时,求得的被减数的值才为a…a,所以"longs=0,t=1;"要改为"longs=0,t=0;",或改为与其相同作用的语句。函数fun中的第二个for循环用于求各减数的值并求差值s,由于表达式中后面一个减数的值刚好比紧靠它前面的减数值小一位,即后面一个减数等于它前面的减数除以10,故"t=t%10;"改为"t=t/10;",或改为与其相同作用的语句。本评析仅作参考。3、本题考查的是c语言中的基本算法和简单语句的使用。解题思路:本题要求计算并输出多项式的值,通式为:1/(1*2*……*n),在给出的参考程序中,由于n函数的返回值为双精度型,所以定义sum、tmp为双精度型,再对符合条件的n,使用中间变量tmp求出1到n的累乘值,即题目中每个多项式中分子的值,再通过sum+=1.0/tmp;计算出所有多项式之和,最终返回。本评析仅供参考。doublefun(intn){inti;doublesum=0.0,tmp=1.0;/*定义sum、tmp为双精度型,并给其赋初值*/if(n<=1||n>100){printf("Inputn(n>1&&n<=100):");scanf("%d",&n);}/*判断n的是否满足大于1但不大于100的要求*/for(i=1;i<=n;i++){tmp*=i;/*使用中间变量tmp求出1到n的累乘值*/sum+=1.0/tmp;/*通过sum+=1.0/tmp;计算出所有多项式之和*/}returnsum;/*返回结果*/}第四十二套1、本题的考核点是结构体类型变量的定义和引用。在fun函数中定义了一个结构体类型的变量a作为形参,最终并返回结构体类型变量a的值,所以函数的类型也必须与变量a相同,故第一个空填:structstudent;strcpy函数的作用是将后一字符串内容(源字符串)拷贝到前一字符串(目的字符串)中,所以第二个空的作用是对结构体中姓名的引用,引用结构体变量中成员的方法是"结构体变量名.成员名",故第二空填:a.name;由于本题要求修改的各课程成绩均加1,所以第三空应是对各课程成绩变量的引用,故第三个空填:a.score[i]。本评析仅供参考。2、本题考查的是公式的计算及函数返回值的运用。由于变量n定义为整型,两个整型数相除的结果仍为整型数,所以"(n+1)/n"的计算结果不符题中要求的结果,需要将此表达式的值转换为浮点型,即将"s=s+(n+1)/n;"改为"s=s+(n+1.)/n;"或改为与其相同作用的语句。函数fun中用while循环来判断前n项之和是否满足条件,变量s记录前n项的和,然后判断s是否满足条件"s<=q",如果满足,则将前n项之和s的值记录到t中后再继续前n+1项的和的计算,直到条件"s<=q"不满足为止,最终返回满足条件的值t(而s是不满足条件的值),所以语句"returns;"应改为"returnt;"或改为与其相同作用的语句。本评析仅作参考。3、本题主要考查的是字符串的处理。先定义一个指针变量,指向数组s的首地址,然后逐一比较,只要没遇到结束符就继续比较,如果不是要删除的字符就把其放在数组s中,一直到结束。本评析仅供参考。voidfun(chars[],charc){char*p=s;/*定义指针变量p并指向字符串s*/inti=0;while(*p)/*此循环语句用于查找非指定字符,且将查找到得非指定字符覆盖原字符串*/{nif(*p!=c)s[i++]=*p;p++;}s[i]=0;/*新字符串结束*/}第四十三套1、本题考查的是结构变量的定义以及引用。解题思路:首先对结构体成员变量进行初始化,接着用一个函数来调用结构体中的各成员变量,因此,第一空应该是定义一个临时结构体名,引用结构体变量的方式为:结构体变量名.成员名,因此,此处应该填的是"tt";由于函数的功能是输出学生信息,且学生的成绩是以数组形式存放的,所以在函数fun中用了for循环来输出学生的成绩,每循环一次,输出一个成绩,所以第二空应填写"tt.score[i]";第三个空是函数调用语句,从被调函数中可以看出此处应该是一个结构体数组,所以此处应该填写"std"。本评析仅供参考。2、本题考查的是最大公约数的求法。最大公约数和最小公倍数用辗转相除的方法:用两数中较大数除以较小数,若不能整除,则以除数作为被除数,余数作为除数,继续相除,直到余数为0时,当前除数就是最大公约数。而原来两个数的积除以最大公约数的商就是最小公倍数。本题首先通过if语句实现a中存放较大值,b中存放较小值,即当aa[m])m=k;"。本评析仅供参考。3、本题考核的是取整数相应位上的数值的算法。解题思路:用整除求得两位正整数中高位上的数,求余的方法求得两位正整数中低位上的数。本评析仅供参考。voidfun(inta,intb,long*c){*c=b/10*1000+a%10*100+b%10*10+a/10;/*a数的十位和个位数放在c数的个位和百位上,b数的十位和个位数放在c数的千位和十位上*/}第四十六套1、本题的考核点是二维数组作为函数参数。函数fun中需要定义一个形参变量,用于接收从主函数fun(x,2)中传递的数值,又由"a[k][i]=temp;"可知第一处填:k;变量i用来控制每行元素中的下标,且N表示每行中数组元素的个数,所以第二处填:N;在满足for循环条件下进行第k行的元素与第0行元素交换,所以第三处填:a[k][i]。n本评析仅供参考。2、本题主要考查了通过指针对字符串的操作。这里是判断是否到了一个单词的最后一个字母,所以条件表达式应该是判断指针p所指向的存储单元的内容是不是空字符,因此,这里应该修改为"if(*p=='')"。C语言中,分号是语句的组成部分,各语句间以分号作为分隔。源程序"*(p-1)=toupper(*(p-1))"应改为"*(p-1)=toupper(*(p-1));"。本评析仅供参考。3、本题考核的是取整数相应位上的数值的算法。解题思路:用整除求得两位正整数中高位上的数,求余的方法求得两位正整数中低位上的数。本评析仅供参考。voidfun(inta,intb,long*c){*c=b%10*1000+a%10*100+b/10*10+a/10;/*a数的十位和个位数放在c数的个位和百位上,b数的十位和个位数放在c数的十位和千位上*/}第四十七套1、本题考查的是二维数组名作为实参时,实参和形参之间的数据传递。本题fun函数的最外层while循环用于找出符合条件的元素,其内层循环for用于找出行上最大的元素,且最大元素的下标用变量c来记录,故第一空填:j;内层while循环用于确认前面比较出的行上的最大元素是否是在列上最小的元素,如果不是,则令find的值为0,否则,find的值仍为前面赋的1,故第二空填:0;外层while循环变量i用于表示行,即比较完一行的最大值等操作后,需要使得i的值增加1,即继续比较下一行中符合条件的数据,故第3空填:i++。本评析仅供参考。2、本题的考查点是数据的类型。函数fun的功能是通过一个for循环语句来逐一计算公式的值。双精度变量t存放的是公式的项数为i时公式的值,由题目中公式的规律和for循环的循环变量i可知,此处应修改为t+=1.0/i;。这是函数的返回语句,函数的返回值是通过函数中的return语句获得的。return语句将被调用函数中的一个确定值带回主调函数中去。因此,这里应该是returnt;。本评析仅供参考。3、本题考核的是取整数相应位上的数值的算法。解题思路:用整除求得两位正整数中高位上的数,求余的方法求得两位正整数中低位上的数。本评析仅供参考。voidfun(inta,intb,long*c){*c=a%10*1000+b/10*100+a/10*10+b%10;/*a数的十位和个位数放在c数的十位和千位上,b数的十位和个位数放在c数的百位和个位上*/}第四十八套1、本题考核的是字符串的复制。根据题目要求如果s所指字符串的长度小于设定的长度n,则直接将字符串s复制到t中,strcpy函数的n作用是将后一字符串内容(源字符串)拷贝到前一字符串(目的字符串)中,所以第一个空填:t,s;反之就取s右边的n个字符复制到t中,根据for循环语句得知第二个空填:s[i];字符串的结束标志是'',所以第三个空填:''。本评析仅供参考。2、本题的考查点是数据的类型。函数fun的功能是通过一个for循环语句来逐一计算公式的值。双精度变量t存放的是公式的项数为i时公式的值,由题目中公式的规律可知,此处应修改为t=t-1/i;,又因为语句t=t-1/i;中除法运算符(/)的优先级高于减法运算符(-),因此首先计算1/i,又因为两个整数相除的结果为整数,舍去小数部分,所以1/i的值都为0,并不能输出题目要求的结果,因为t为双精度变量,所以1/i返回的也应该是双精度变量,因此此处应修改为t=t-1.0/i;。这是函数的返回语句,函数的返回值都是通过函数中的return语句获得的。return语句将被调用函数中的一个确定值带回主调函数中去。因此,这里应该是returnt。本评析仅供参考。3、本题的考核点是循环语句和整除算法。解题思路:使用循环语句使循环变量依次从1递增到1000,并将每个值对7和11进行取余,将符合条件的值存入数组中并统计其值的个数。本评析仅供参考。voidfun(int*a,int*n){inti,count=0;for(i=1;i<=1000;i++)if((i%7==0||i%11==0)&&(i%7!=0||i%11!=0))/*判断i是否能被7或11整除,且又不能同时被7和11整除*/a[count++]=i;/*符合条件的数存入a数组,并通过count进行计数*/*n=count;}第四十九套1、本题的考核点是结构体类型变量的定义和引用。在fun函数中定义了一个指向结构体变量的指针变量a作为形参,最终并返回此指针变量的地址,所以函数的类型也必须与变量a相同,故第一个空填:structstudent*;第三个空填:a;由于本题要求修改的各课程成绩均加1,所以第二空应是对各课程成绩变量的引用,故第二个空填:a->score[i]。本评析仅供参考。2、本题的考核点是C语言中的函数的入口参数和for循环控制的格式。函数的参数表是由逗号分隔的变量表,变量表由变量类型和变量名组成,与普通的变量说明不同,函数参数必须同时具有变量类型和变量名;另外,当函数前面的返回数据类型省略时,C语言默认函数返回整型,本题中n是整型数据,由"printf("nTheresultis%lfn",fun(n));"可以看出fun函数应该返回浮点型数据,所以fun函数的返回数据类型不能省略。综上所述,应该把程序中的"fun(intm)"语句改为"doublefun(m)"或相同作用的语句。for循环语句的一般形式为:for(表达式1;表达式2;表达式3)语句各表达式之间用分号间隔。所以,应该把语句"for(i=100,i<=m,i+=100)",改为"for(i=100;i<=m;i+=100)"。本评析仅作参考。n3、本题的考核点是字符和循环语句的应用。解题思路:通过循环语句依次判断数组下标是否为奇数且其元素是否为小写字母,如果是则通过字符运算将其转换为大写字母。本评析仅供参考。voidfun(char*ss){inti=0;for(i=0;ss[i]!=0;i++)/*通过循环,判断是否到了字符串末尾*/if(i%2&&'a'<=ss[i]&&ss[i]<='z')/*判断是否为奇数,且字符是否属于字母*/ss[i]=ss[i]-'a'+'A';/*将符合条件的小写字母转换成大写字母*/}第五十套1、本题的考核点是计算表达式的和。程序的功能是计算各项表达式之和,直到最后一项的绝对值小于10的-6次方为止。程序中用while循环判断最后一项的绝对值是否大于或等于10的-6次方,如果大于等于,则继续求下一项的值,并进行累加,如果小于,则直接返回累加后的值f。由于程序中用t来记录计算出的各项的值,所以第三空填"fabs(t)";题面公式中除前两项之外的其他各项的值都可以拆分成前一项的值乘以-x/n,所以第二空填"n";要使得首次得出的t的值为第三项的值,则t必须初始化为第三项的前一项的值x,所以第一空填"x"。关于程序各语句的具体分析如下:函数doublefun(doublex)的功能是计算f(x)各项之和。f=1.0+x;表示前二项的值。t=x;中的t用来存储各项的项值,此处是对t进行初始化,其值为x。当n=2时,因为t=x,所以t*=(-1.0)*x/n;即t=t*(-1.0)*x/n;等于x*(-1.0)*x/2;得到结果t=-x*x/2。当n=3时,因为t=-x*x/2,所以t*=(-1.0)*x/n;即t=t*(-1.0)*x/n;等于(-x*x/2)*(-1.0)*x/3,结果t=x*x*x/6。依次类推得出以下项的值。f+=t;把每一项得到的值累加起来,得到全部项的和。fabs(t)是取绝对值的函数。本评析仅作参考。2、本题着重考察考生对C语言中函数的定义、引用和参数传递的掌握情况。本题中的第一个错误:由主函数中可知,函数fun返回的应为float或double型的值,所以程序中的语句"intfun(intn)"应改为"floatfun(intn)"或"doublefun(intn)";本题中的第二个错误:由题意可知,程序要求输出An的值,循环的终止值应为n,所以程序中的语句"for(i=2;i
查看更多

相关文章