请问横线怎么打这题C语言中,第一个横线和第二个横线分别填什么?

国家计算机等级考试二级c语言-南开100套题(C语言)
第一套填空3:函数的实际参数是圆的半径x。 下列给定程 序中 ,函 数 fun 的功能是:计算 S=f(-n)+f(-n+1)+…+f(0)+f(1)+f(2)+…f(n)的值。 例如,当n为5时,函数值应为10.407143。f(x) 函数定义如下:(1) (2)1错误:f(double x) 错误:return s正确:double f(double x) 正确: }/*****************************/ 【参考答案】 float fun(int n) { int i,s1=0; float s=0.0; 项*/ for(i=1;i&=n;i++) { s1=s1+i; /*求每一项的分母*/ s=s+1.0/s1; } } 【考点分析】 本题考查:计算给定表达式的值,根据题意判断表 达式为1到n累加倒数之和。变量数据类型及强制 转换操作。for循环语句,一般情况需要确定循环 变量的取值范围。使用return语句完成函数值的 返回。 【解题思路】 本题可以通过for循环语句来实现第1项到第n项 的变化,然后计算各项的累加和。 方法是先根据题 目要求定义变量(注意该变量的数据类型),然后 对其进行初始化操作,因为该变量用作累加器,所 以初始值应为0(或0.0,根据变量数据类型来确定), 再通过for循环语句来完成累加过程。 本题中s1用来表示式中每一项的分母,它可以由 前一项的分母加项数得到。 注意:由于s1定义成一 个整型,所以在s=s+1.0/s1中不能把1.0写成1。 【解题宝典】 此类计算表达式值的程序,首先需要根据题意分 析表达式的规律,得出通项,然后再完成程序语 句。 第二套 请补充main函数,该函数的功能是:计算两 个自然数n和m(m&10000)之间所有数的和(n和m 从键盘输入)。 例 如 , 当 n=1,m=100 时 ,sum=5050; 当 n=100,m=1000时,sum=495550。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 /*求多项式的值*/给定程序的功能是:求二分 之一的圆面积,函数通过形 参得到圆的半径,函数返回 二分之一的圆面积(注:圆 面积公式为: S ? ? r 2,在程序 中定义的变量名要与公式 的变量相同)。例 如 , 输 入 圆 的 半 径 值 :19.527, 输 出 为:s=598.949991。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在横线上填入所编写的若干表达式或语句。 试题程序: #include &stdio.h& double fun( double r) { return 3.14159*【1】/2.0; } void main() { printf(&Enter x: &); scanf(&%lf&,【2】); printf(&s=%lf\n&,fun(【3】)); } 【参考答案】 (1)r*r (2)&x (3)x 【考点分析】 本题考查:圆面积计算公式【考点分析】 本题考查:函数的定义,其一般形式 为&类型标识符 函数名(形式参数表列)&,其中类 型标识符指明了本函数的类型,函数的类型实际 上是函数返回值的类型。 【解题思路】 该程序的流程是,fun( )程序对f(n)项循环累加,并 且采用条件选择语句计算函数f(x)的值。本题的 错误在于未定义函数f(double x)的返回值类型。 C 语言规定,在未显式声明的情况下,函数返回值默 认为int型。 编写函数fun,函数的功能是:根据以下公式 计算s,计算结果作为函数值返回;n通过形参传 入。 S=1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n ) 例如,若n的值为11时,函数的值为1.833333。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &conio.h& #include &stdio.h& #include &string.h& #include &stdlib.h& float fun(int n) { } void main() { FILE * system(&CLS&); printf(&\nPlease enter N: &); scanf(&%d&,&n); s=fun(n); printf(&The result is:%f\n & , s); /******************************/ wf=fopen(&out.dat&,&w&); fprintf (wf,&%f&,fun(11)); fclose(wf);/*定义整型变量s1,表示分母*/ /*定义单精度变量s,表示每一f(x)=?( x ? 1) ? ( x ? 2) ? ?0 ? ( x ? 1) ? ( x ? 2) ? x?0 x ? 0或x ? 2 x?0请改正程序中的错误,使它能得出正确的结 果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdlib.h& #include &conio.h& #include &stdio.h& #include &math.h& /*************found**************/ f(double x) { if(x==0.0||x==2.0) return 0.0; else if(x&0.0) return(x-1)/(x-2); else return(x+1)/(x-2); } double fun(int n) { double s=0.0,y; for(i=-n; i&=n;i++) { y=f(1.0*i); s+=y;} /*************found**************/ return s } void main() { system(&CLS&); printf(&%f\n&, fun(5)); } 【参考答案】S ??*r*r;scanf( )函数的形式,其一般形式为&scanf(&格式控制字符串&,地址表列);&,注意地址 是由地址运算符&&&后跟变量名组成的;printf( ) 函数的形式,其一般形式为&printf(&格式控制字符 串&,输出表列);&;函数实参调用,函数作为另一个 函数调用的实际参数出现。 【解题思路】 填空1:计算圆的面积,公式为: s ? ? r *r。 填空2:scanf( )函数一般形式为scanf(格式控制,地 址表列),因此填入&x。 容,仅在main函数的横线上填入所编写的若干表 达式或语句。 试题程序: #include &stdlib.h& #include &stdio.h& #include &conio.h& void main() { int n,m; 【1】; system(&CLS&); printf(&\nInput n,m\n&); scanf(&%d,%d&,&n,&m); while(n&=m) { 【2】; n++; } printf(&sum=%【3】\n&,sum); } 【参考答案】 (1) sum=0 (2) sum+=n (3) ld 【考点分析】 本题考查:变量初始化,需要注意该 变量是累加器还是累乘器:printf( )函数,其一般形 式为&printf(&格式控制符&,输出表列)&。其中,格式 控制符用于指定输出格式,可由格式字符串和非 格式字符串两种组成,格式字符串是以%开头的 字符串,在%后面跟有各种格式字符,以说明输出 数据的类型、形式、长度、小数位数等,如&%ld& 表示按十进制长整型输出,非格式字符串在输出 时原样照印,在显示中起提示作用。 【解题思路】 填空1:变量sum进行了类型声明,但没有进行初始 化,而后面的程序用sum来存放最后的结果,所以 要在使用前将sum初始化为0。 填空2:通过while循环将自然数n和m之间的数进 行累加,结果存于sum中。 填 空 3: 由 于 sum 为 长 整 型 , 所 以 标 准 输 出 函 数 printf( )中的格式控制符为&%ld&。 下列给定程序中,fun函数的功能是:根据形 参m,计算下列公式的值: t=1+1/2+1/3+1/4+…+1/m 例如,若输入5,则应输出2.283333。请改正程序中的错误,使它能计算出正确的结果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdlib.h& #include &conio.h& #include &stdio.h& double fun(int m) { double t=1.0; int I; for(I=2;I&=m;I++) /*************found**************/ t+=1.0/k; /*************found**************/ return I; } void main() { system(&CLS&); printf(&\nPlease enter 1integer number: &); scanf(&%d&,&m); printf(&\nThe result is %1f\n&, fun(m)); } 【参考答案】 (1)错误:t+=1.0/k; (2)错误:return I; 【考点分析】 本题考查:for循环语句的循环条件,这类题目的一 般解法是根据题意确定循环变量的取值范围;函 数返回值,其一般形式为&return 表达式;&,该语句 的功能是计算表达式的值,并返回给主调函数。 【解题思路】 (1)该题目考查分母成等差数列递增的一个数学 公式,我们先看循环条件for(I=2;I&=m;I++),i从2开 始递增到m,所以t的值应该是由1.0/i的值逐步循 环叠加后的结果,而不是t+=1.0/k;。 (2)return I;考查对程序的解读能力,当循环结束后 (由输入m的值决定),函数返回当前t的值。 请编写一个函数 void fun(char *tt,int pp[]), 统计在tt字符串中&a&到&z&26个字母各自出现的 次数,并依次放在pp所指数组中。 正确:t+=1.0/I; 正确:2例如,当输入字符串abcdefghabcdeabc后,程 序的输出结果应该是:3 3 3 2 2 1 1 1 0 0 0 0 0 0 0
注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &conio.h& #include &stdio.h& #include &stdlib.h& void fun(char *tt,int pp[] ) { } void main( ) { FILE * char aa[1000]; int bb[26], system(&CLS&); printf(&\nPlease enter a char string : &) ; scanf(&%s&,aa); fun(aa,bb); for (k=0 ;k&26 ; k++) printf(&%d &,bb[k]) ; printf(&\n &); /******************************/ wf=fopen(&out.dat&,&w&); fun (&abcdefgabcdeabc&,bb) ; for (k=0 ;k&26 ; k++) fprintf(wf,&%d &,bb[k]) ; fclose(wf); /*****************************/ } 【参考答案】 void fun(char*tt,int pp[]) { for(i=0;i&26;i++) pp[i]=0; /*初始化pp数组各元素为0*/ for(;*tt!=' \0';tt++) if(*tt&='a'&&*tt&='z') pp[*tt-'a']++;/*将tt字符串中'a'到'z'26个字母各自出现的 次数,依次放在pp数组中,任一个小写字母减去'a' 后所得结果正好是它对应的下标*/ } 【考点分析】 本题考查:统计小写字母在指定字符串中出现次 数。for循环语句,需要注意循环变量的取值范围。 if条件语句要注意条件表达式的判定。 【解题思路】 第1个循环的作用是初始化数组pp,未经赋值变量 的量为一个不确定数字。由于它要将'a'到'z'26个 字母的个数依次放到数组pp中,即'a'的个数存于 pp[0]中,'b'的个数存于pp[1]中,'c'的个数存于pp[2] 中,…,依此类推,而'a'-'a'的值正好为0,'b'-'a'的值为 1,'c'- 'a' 的值为2,…,依此类推。任一个小写字母 减去'a'后所得结果正好是它对应的下标,所以就 有了pp[*tt-'a']++,但*tt必须是小写字母,即if( )不 应省略。 。 第三套 给定程序的功能是:判断字符ch是否与串str 中的某个字符相同,若相同什么也不做,若不同则 插在串的最后。 注意:部分源程序给出如下。 请勿改动函数main和其他函数中的任何内 容,仅在横线上填入所编写的若干表达式或语句。 试题程序: #include &stdio.h& #include &string.h& void fun (char *str,char ch) { while (*str &&*str !=ch) str++; if(*str【1】ch) { str[0]= 【2】=0; } } void main() {char s[81],c; system(&CLS&); printf(&\nPlease enter a string : &); gets(s); printf(&\n Please enter the character to search : &); c=getchar(); fun(【3】); printf(&\nThe result is %s\n&,s); } 【参考答案】 (1) != (2) str[1]或*(str+1) (3) s,c 【考点分析】 本题考查:if语句,一般掌握条件表 (实际参数表)&。 【解题思路】 填空1:根据题意&若相同什么也不做&,则应填入 ?!=?。 填空2:若不同则插在串的最后,那么0就在字符串 的倒数第二了。 填空3:函数传递的参数为输入的两个字符串,则 填入s,c。 下列给定程序中,函数fun的功能是:分别统 计字符串中大写字母和小写字母的个数。例如, 给字符串s输入:AaaaBBb123CCccccd,则应输出 结果:upper=5,lower=9。 请改正程序中的错误,使它能计算出正确的 结果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include&conio.h& #include&stdio.h& /*********found***********/ void fun(char *s,int a,int b) { while(*s) { /*********found***********/ if(*s&='A' && *s&='Z') a++; /*********found***********/ if(*s&='a' && *s&='z') b++; s++; } } main() { char s[100]; int upper=0,lower=0; printf(&\nplease a string :&); gets(s); 正fun(s,&upper,&lower); printf(&\n lower=%d\n&,upper,lower); } 【参考答案】 确:void fun(char *s, int *a, int *b) (2)错误:a++; (3)错误:b++; 【考点分析】upper=%d3达式的判定。函数的调用,其一般形式为&函数名 (1) 错误:void fun(char *s, int a, int b) 正确:(*a)++; 正确:(*b)++;printf(&\nPlease enter a string: &); gets(a); printf(&\nPlease enter a char: &); ch=getchar(); printf(&\nThe number of the char is: %d\n&, fun(a,ch)); /******************************/ wf=fopen(&out.dat&,&w&); fprintf(wf,&%d&,fun(&&,'1')); fclose(wf); /*****************************/ } 【参考答案】 int fun(char *ss, char c) { int i=0; for(;*ss!='\0';ss++) if(*ss==c) i++; /*求出ss所指字符串中指定字符的个数*/ } 【考点分析】 本题考查:字符串结束标识'\0';for循环语句, 如何 遍历字符串;通过if条件语句,判断是否相同。 【解题思路】 从字符串ss中找出子字符串的方法是:从第1个字 符开始,对字符串进行遍历;若ss串的当前字符等 于t串的第1个字符,两字符串的指针自动加1,继续 比较下一个字符;若比较至字符串的结尾,则跳出 循环;若ss串的字符和c串的字符不对应相同,则继 续对ss串的下一个字符进行处理。本程序是采用 逐一比较的方式找出出现的次数。循环的作用是 在串中从左到右逐一走动,if( )的作用是进行判断 是否相同,若与c相同,则表示又出现一次。 第四套 请补充函数fun,该函数的功能是:把ASCII码 为偶数的字符从字符串str中删除,结果仍然保存 在字符串str中,字符串str从键盘输入,其长度作为 参数传入函数fun。 例如,输入&abcdef&,输出&ace&。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内本题考查:函数的参数传递和指针变量,理解指针 变量作为函数的参数,函数的参数不仅可以是整 型、实型、字符型等数据,还可以是指针类型,它 的作用是将一个变量的地址传送到另一个函数 中。 【解题思路】 (1)根据题中程序可以看出,函数fun传递的是地址, 那么,在函数中就应该出现指针,所以改为void fun (char *s ,int *a, int *b)。 (2)和(3)很明显,这里是要累加数值,因为a、b是指 针变量,所以是错误的。 请编写函数fun,它的功能是:求出ss所指字 符串中指定字符的个数,并返回此值。 例如,若输入字符串,输入字符1, 则输出3。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &conio.h& #include &stdio.h& #include &stdlib.h& #define M 81 int fun(char *ss, char c) { } void main() { FILE * char a[M], system(&CLS&);容,仅在函数fun的横线上填入所编写的若干表达 式或语句。 试题程序: #include &stdlib.h& #include &stdio.h& #define N 80 【1】 { int i, 【2】; for (i=0;i&n;i++) { if(s[i]%2!=0) s[j++]=s[i]; } 【3】; } void main() { int i=0, strlen=0; char str[N]; system(&CLS&); printf(&\nInput a string:\n&); gets(str); while(str[i]!='\0') { strlen++; i++; } fun(str, strlen); printf(&\n*** display string ***\n&); puts (str); } 【参考答案】 (1) void fun(char s[],int n) (2) j=0 (3) s[j]='\0' 【考点分析】 本题考查:函数定义,需要确定类型标识符、函数 名和形式参数。变量初始化,变量声明后,要进行 初始化赋值,我们对变量进行初始化时,必须确定 好变量的作用。字符串结束标识'\0',用来结束 字符串,是经常考查的知识点。 【解题思路】 填空1:由main函数调用函数fun的格式可以知道, 函数fun没有返回值,第一个参数是字符数组,第二 个参数是整型变量。 填空2:变量j声明时,没有初始化,所以在使用j之前 要将它初始化为0。 填空3:当把所有ASCII码为偶数的字符都存入字 符串s中后,要在最后加上'\0',表示字符串的结 束。 下列给定程序中函数fun的功能是:计算正 整数num各位上的数字之积。例如,若输入252,则 输出应该是20。若输入202,则输出应该是0。 请改正程序中的错误,使它能得出正确的结 果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdio.h& #include &conio.h& long fun(long num) { /*************found**************/ do { k *=num%10; /*************found************* */ num \=10; }while(num); return(k); } main() { printf(&\Please enter a number: &); scanf(&%ld&,&n); printf(&\n%ld\n&,fun(n)); } 【参考答案】 (1)错误: (2)错误:num\=10; 【考点分析】 变量初始化,保存乘积的变量初始化为1。 【解题思路】 正确:long k=1; 正确:num/ =10;(1)k用来存放各位数字的积,初值应为1。 (2)这里是一个符号错误,除号使用&/&来表示的。 请编写一个函数fun,它的功能是:求出1到 m(含m)之内能被7或11整除的所有整数放在数组 a中,通过n返回这些数的个数。 例如,若传给m的值为50,则程序输出: 7 11 14 21 22 28 33 35 42 44 49 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include&conio.h& #include&stdio.h& #include&stdlib.h& #define M 100 void fun(int m, int *a, int *n) { } void main() { FILE * int aa[M],n,k; system(&CLS&); fun(50,aa,&n); for(k=0;k&n;k++) if((k+1)%20==0) /*每行输出 20个数*/ {printf(&%4d&,aa[k]); printf(&\n&); } else printf(&%4d&,aa[k]); printf(&\n&); /******************************/ wf=fopen(&out.dat&,&w&); for(k=0;k&n;k++) fprintf(wf,&%4d&,aa[k]); fclose(wf); /*****************************/ } 【参考答案】 void fun(int m, int *a, int *n) { int i,j=0;4for(i=1;i&=m;i++) if(i%7==0||i%11==0) /*求出1到m(含m)之内能被7或11整除的所有整 数放在数组a中*/ a[j++]=i; *n=j; /*返回这些数的个数*/ } 【考点分析】 本题考查:整除的判断方法,用%对除数求余,若余 数为0,表示能被整除。if语句条件表达式,注意&逻 辑与&和&逻辑或&的区别。for循环语句,注意循环 变量的取值范围。一维数组的定义与引用。 【解题思路】 本题要找出能被7或11整除的所有整数,注意数学 中的&或&和C语言中的&或&的区别,在此处,if条件 语句中用&||&运算符,若要找能同时被7和11整除 的所有整数,则在if( )中,应用&&&&运算符。 第五套 请补充函数fun,该函数的功能是:判断某一 个年份是否为闰年。 例如,1900年不是闰年,2004是闰年。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的横线上填入所编写的若干表达 式或语句。 试题程序: #include &stdlib.h& #include &stdio.h& #include &conio.h& int fun(int n) { int flag=0; if(n%4==0) { if (【1】) flag=1; } if (【2】) flag=1; return【3】; } void main() { system(&CLS&); \n&,year);printf(&Input the year:&); scanf(&%d&,&year); if (fun(year)) printf(&%d is a leap year. else printf(&%d is not a leap year.\n&,year); } 【参考答案】 (1) n%100!=0或n%100 (2) n%400==0 (3) flag 【考点分析】 本题考查:判断闰年的算法,年份能被4整除但不 能被100整除,或者年份能被400整除。return语句, 负责将函数值返回给主调函数。一般情况下,flag 在C语言中作为一种标志来使用,本书中有多个 题目都使用了flag标志。 【解题思路】 填空1:判断闰年的方法是,年份能被4整除但不能 被100整除,或者年份能被400整除。n不能被100 整除,即对100取余非零。 填空2:能被400整除的年份也是闰年,n能被400整 除,即对400取余为零。 填空3:flag标记年份n是否为闰年,当flag为1时,是 闰年,当flag为0时,不是闰年。 下列给定程序中函数fun的功能是:计算n!。 例如,给n输入5,则输出120.000000。 请改正程序中的错误,使程序能输出正确的 结果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdio.h& #include &conio.h& double fun(int n) { double result =1.0; /*************found**************/ if n==0 return 1.0; while(n&1&&n&170) /*************found**************/ result=n--; } void main() { printf(&Input N:&); scanf(&%d&,&n); printf(&\n\n%d!=%lf\n&,n,fun(n)); } 【参考答案】 (1)错误:if n==0 (2)错误:result =n--; 【考点分析】 本题考查:if语句,一般情况下,需要根据题目要求 确定条件表达式的内容,同时需要注意其格式。 计 算阶乘的方法,n!=n*(n-1)!。 请编写函数fun,其功能是:将两个两位数的 正整数a、b合并成一个整数放在c中。合并的方 式是:将a数的十位和个位数依次放在c数的十位 和千位上,b数的十位和个位数依次放在c数的个 位和百位上。 例如,当a=45,b=12,调用该函数后,c=5241。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &stdio.h& #include &conio.h& void fun(int a ,int b,long *c) { } void main() { int a,b; FILE * printf(&Input a ,b: &); scanf(&%d%d&,&a,&b); fun(a,b,&c); printf(&The result is :%ld\n&,c); /******************************/ out=fopen(&out.dat&,&w&); fun(a+11,b+22,&c); 正确:if(n==0) 正确:result *=n--;fprintf(out,&%ld\n&,c); fclose(out); /******************************/ } 【参考答案】 void fun(int a,int b,long *c) { *c=(a%10)*1000+(b%10)*100+(a/10)*10+b/10; } 【考点分析】 本题考查:如何取出数值n的各个位,主要是考查 '%'和'/'的交换使用。两个整型数相除,'/'用来求得 数的整数部分,'%'用来求余数。 【解题思路】 本题中主要的问题是怎么取出a和b的个位数和 十位数,取出后怎么表示成c中相应的位数。 由于a 和b都是只有两位的整数,所以分别对它们除10可 得到它们的十位数,分别用10对它们求余可得到 它们的个位数。得到后对应乘以、10、 1就可得到c的千位数、 百位数、 十位数和个位数。 注意:使用c时要进行指针运算。 第六套 请补充函数fun,函数fun的功能是求n的阶 乘。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的横线上填入所编写的若干表达 式或语句。 试题程序: #include &stdio.h& long fun(int n) { if (【1】) return(n*fun(【2】)); return【3】; } void main() { printf(&10!=%ld\n&,fun(10)); } 【参考答案】 (1)n&1或1&n (2)n-1 (3)15【考点分析】 本题考查:if语句条件表达式,这类题目一般解法 是根据题意确定表达式的值,如果表达式的值为 真,则执行下面的语句;如果值为假,则不执行该语 句。递归算法的掌握,递归是指函数/过程/子程序 在运行过程序中直接或间接调用自身而产生的 重入现象。 【解题思路】 填空1:求阶乘时,采用递归的算法,n&1和n==1这 两种情况的处理方法不同,需要分开考虑。 填 空 2: 阶 乘 的 算 法 是 , 当 n&1 时 ,n!=n*(n-1)!, 即 fun(n)=n*fun(n-1)。 填空3:n==1是递归的终止条件,返回值为1。 下列给定的程序中,函数fun的功能是:计算 并输出k以内最大的10个能被13或17整除的自然 数之和。k的值由主函数传入,若k的值为500,则函 数的值为4622。 请改正程序中的错误,使它能得出正确的结 果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdio.h& #include &conio.h& #include &stdlib.h& int fun(int k) { int m=0,mc=0, while((k&=2)&&(mc&10)) { /*************found**************/ if((k%13=0)||(k%17=0)) { m=m+k;mc++;} k--; /*************found**************/ } void main() {system(&CLS&); printf(&%d\n &,fun(500)); } 【参考答案】(2)错误:缺少大括号 【考点分析】正确:加 }本题考查:if语句,这类题目的一般解法是根据题 意确定if语句的条件表达式,区别逻辑表达式和 算术表达式。同时注意c语言书写程序应遵守的 规则。 【解题思路】 (1)x能被y整除的表示方法是x%y==0,而并非像 题 目 中 所 表 示 的 答案所示信息。 (2)缺少程序完整所需的&}&,此类信息在做题时一 定要注意,我们可以在做题前先运行一下程序,这 样明显的错误一般都会有错误信息显示出来,比 如 丢 失 &}& 的 错 误 信 息 是 &Compound statement missing } in function fun&,并在当前错误处停止光 标,我们只要按回车键进行编辑就可以了。 请编写函数fun,它的功能是计算: s=(ln(1)+ln(2)+ln(3)+…+ln(m))? ? 0.5? 在C语言中可调用log(n)函数求ln(n)。 例 如 , 若 m 的 值 为 20, 则 fun 函 数 值 为 6.506583。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &conio.h& #include &stdio.h& #include &math.h& #include &stdlib.h& double fun(int m) { } void main() { FILE * system(&CLS&); printf(&%f\n &,fun(20)); /******************************/ wf=fopen(&out.dat&,&w&); fprintf(wf,&%f&,fun(20)); fclose(wf); x%y=0 。 所 以,if((k%13=0)||(k%17=0))修改后的结果应该是(1 )错误:if((k%13=0)||(k%17=0)) 正 确:if((k%13==0)||(k%17==0)) /*****************************/ } 【参考答案】 double fun(int m) { double s=0.0; for(i=1;i&=m;i++) s=s+log(i); return sqrt(s); /*计算s=ln(1)+ln(2)+ln(3)+…+ln(m)*/ /*对s求平方根并返回*/ } 【考点分析】 计算表达式的值,一般都要定义一个变量sum作 为累加(乘器),加法运算时赋初值为0,乘法运算时, 赋初值为1,然后利用循环语句,使sum进行累加或 累乘。 【解题思路】 题目要求计算从1到m的对数的和,可用从1到m的 循环,每次循环都累加求和。该题需要注意之处 是,log( )函数的形式参数应当为double型变量,而 用于循环的基数变量为整数,需要进行强制转换, 在返回的时候求出平方根。 第七套 请补充函数fun,该函数的功能是:整除x且是 偶数的数,把这些数保存在数组bb中,并按从大到 小的顺序输出。 例如当x=20时,依次输出:20 10 4 2。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的横线上填入所编写的若干表达 式或语句。 试题程序: #include &stdlib.h& #include &conio.h& #include &stdio.h& void fun(int k,int bb[]) { int I; int j=0; for(【1】;I&=k;I++) { if(【2】)bb[j++]=I; } printf(&\n\n&); for(I=【3】;I&=0;I--) printf(&%d &,bb[I]); } void main() { int k=1; int bb[100]; system(&CLS&); printf(&\nPlease input X=&); scanf(&%d&,&k); fun(k,bb); } 【参考答案】(1)i=1 (2)k%i==0&&i%2==0 (3)--j 或j-16#include &stdio.h& double fun(int m) {double y=1.0; int I; /*************found**************/ for(I=2;I&m;I++) /*************found**************/ y-=1/(I*I); return(y); } void main() {int n=5; system(&CLS&); printf(&\nThe result is %1f\n&, fun(n)); } 【参考答案】容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &conio.h& #include &math.h& #include &stdio.h& #include &stdlib.h& double fun(int n) { } void main() { FILE * system(&CLS&); printf(&s=%f\n&, fun(1000)); /******************************/ wf=fopen(&out.dat&,&w&); fprintf(wf,&%f&,fun(1000)); fclose(wf); /*****************************/ } 【参考答案】 double fun(int n) {double s=0.0; for(i=0;i&n;i++) /*从0 n中找到既能被5整除同时又能被11整除的 数,并将这些数求和*/ if(i%5==0&&i%11==0) s=s+i; s=sqrt(s); /*对s求平方根*/ } 【考点分析】 本题考查:整除判定后求和、 再对求和结果求平方 根运算;变量数据类型,求和时变量如何初始化;整 除的方法;if条件语句及&逻辑与&运算;sqrt( )平方 根函数的应用。 【解题思路】 本题的解题思路是逐个取得从0到n之间的数,对 每次取得的数进行条件判断,条件是既能被5整除 又能被11整除,注意这两个条件要求同时成立,因 此用到了&&&&运算符。若满足条件,该数就被累(1)错误:for(i=2;i&m;i++)【考点分析】 本题考查:for循环语句的循环初值, 正确:for(i=2;i&=m;i++) 根据题意确定循环变量取值范围。if语句的条件 (2)错误:y-=1/(i*i); 表达式,根据题意确定条件表达式,本题的条件表 正确:y-=1.0/(i*i); 达式应该既满足整除又满足偶数的条件。 【解题思路】 填空1:为了求出能整除k,且是偶数的数,寻找范围 是从1到k。 填空2:如果i能整除k,则k对i求余为0,如果i为偶数, 则i对2求余为0,由于这两个条件要同时满足,所以 要使用&与&运算符&&&&。 填空3:由于数组bb[]中的数是按从小到大的顺序 排列的,而题目要求按从大到小输出,所以从数组 的最后一个元素开始,依次输出。因为在for循环 中,变量j多加了一次,所以这里要将j减1,得到数组 最后一个元素的下标。 下列给定程序中,函数fun()的功能是:根据 整型形参m的值,计算如下公式的值: 【考点分析】 本题考查:for循环语句的循环条件,这类题目的一 般解法是根据题意确定循环变量的取值范围。变 量数据类型的强制转换,是通过类型转换运算来 实现的。一般形式为:&(类型说明符) (表达式)&,其 功能是把表达式的运算结果强制转换成类型说 明符所表示的类型。 【解题思路】 该题是一道简单的计算题,循环条件 for(i=2;i&m;i++)中忽略了i=m时的一种情况,因为 题目中i是从2到m的一个计算公式。y-=1/(i*i);的 错误很明显,是语法错误,由定义double y=1.0可知, 应该是y-=1.0/? (i*i)? ;, 而非y-=1/(i*i);。 例如: (float) a (int)(x+y) 把a转换为实型 把x+y的结果转换为整型t=1-1/(2 ? 2) ?1/(3 ? 3) ? ... ?1/(m ? m)请改正函数fun()中的错误,使它能得出正确的结 果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdlib.h& #include &conio.h&编写函数fun,它的功能是:求n以内(不包括n) 同时能被5与11整除的所有自然数之和的平方根 s,并作为函数值返回。 例如,n为1000时,函数值应为s=96.979379。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 加到s中去,求出所有符合条件的数后,用sqrt( )函 数(包含于头文件&math.h&中)对s求平方根。 第八套 请 补 充 函 数 fun, 它 的功 能 是:计 算 并 输 出 n(包括n)以内所有能被3或7整除的自然数的倒数 之和。 例如,在主函数中从键盘给n输入30后,输出 为:s=1.226323。? 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的横线上填入所编写的若干表达 式或语句。 试题程序: #include &stdio.h& double fun(int n) { int I; double sum=0.0; for(I=1;【1】;I++) if(I%3==0【2】I%7==0) sum+=【3】/I; } void main() { printf(&\nInput n:&); scanf(&%d&,&n); s=fun(n); printf(&\n\ns=%f\n&,s); } 【参考答案】 (1)i&=n 【考点分析】 本题考查:for循环语句的循环条件,这类题目的一 般解法是根据题意确定循环变量的取值范围。if 语句的条件表达式,这类题目的一般解法是确定 条件表达式的内容。变量数据类型的强制转换, 由强制转换运算符完成该转换操作。 【解题思路】 填空1:本题要求找出n(包括n)以内满足条件的自 然数,所以,i的取值范围是从1到n。 填空2:i能被3整除,也就是指,i除以3的余数为0。 题 中的条件是能被3或7整除,所以使用逻辑或运算 (2)|| (3)1.0或(double)1符 ? &||& 。? 填空3:需要注意,如果&/&运算符两边都是整型数, 则结果也是整型数。因为i为整型数,如果将i的倒 数写为1/i,则结果为0,所以在求倒数时,要使用1.0, 而不是1,或者将变量i强制类型转化为double型。 在主函数中从键盘输入若干个数放入数组 中,用0结束输入并放在最后一个元素中。下列给 定程序中,函数fun的功能是:计算数组元素中值 为正数的平均值(不包括0)。例如,数组中元素的 值依次为39,-47,21,2,-8,15,0,则程序的运行结果 为19.250000。 请改正程序中的错误,使它能得出正确的结 果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &conio.h& #include &stdio.h& double fun(int x[]) { /*************found**************/ int sum=0.0; int c=0, I=0; while(x[I]!=0) { if(x[I]&0) { sum+=x[I]; c++; } I++; } /*************found**************/ sum=sum\c; } void main() { int x[1000]; int i=0; system(&CLS&); printf(&\nPlease enter some data(end with 0) :&); do {7}scanf(&%d&,&x[i]); }while(x[i++]!=0); printf(&%f\n&,fun(x)); 【参考答案】fun(17,&m,zz); for(n=0;n&m;n++) fprintf(wf,&%4d&,zz[n]); fclose(wf); /*****************************/ } 【参考答案】 void fun(int m, int *k, int xx[]) { int i,j,n=0; for(i=4;i&m;i++) /*找出大于1小于整数m的非素数*/ {for(j=2;j&i;j++) if(i%j==0) if(j&i)xx[n++]=i; } *k=n; /*返回非素数的个数*/ } 【考点分析】 本题考查:素数的判断,是对整除算 法和循环判断结构的考查。 【解题思路】 这道题是考查一个数是否为素数的简单延伸,只 要掌握了判断素数的方法,问题便能顺利解决,请 学习者以此题为例,搞清楚判断素数的方法。 第九套 请补充main函数,该函数的功能是:计算每 个学生成绩的平均分,并把结果保存在数组bb中。 例 如 , 当 score[N][M]={{83.5,82,86,65,67},{80,? 91.5? ,84 ,99,95},{90.5,95,86,95,97}}时,三个学生的平均分 为76.7,89.9,92.7。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在main函数的横线上填入所编写的若干表 达式或语句。 试题程序: #include &stdio.h& #define N 3 #define M 5 void main() { int I,j; static float score[N][M]={{83.5,82,86,65,67},{80,91.5, 84,99,95},{90.5,95,86,95,97}}; float bb[N];(1)错误:int sum=0.0; (2)错误:sum\=c; 【考点分析】正确:double sum=0.0; 正确: sum/=c;本题考查:变量的数据类型,区别int整型和double 双精度型;除法运算符&/&。 【解题思路】 (1)定义变量错误。(2)C语言中的除法运算符是 &/&。 请编写函数fun,其功能是:将所有大于1小于 整数m的非素数存入xx所指数组中,非素数的个 数通过k传回。 例如,输入17,则应输出4 6 8 9 10 12 14 15 16。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include&conio.h& #include&stdio.h& #include&stdlib.h& void fun(int m, int *k, int xx[]) { } void main() { FILE * int m, n, zz[100]; system(&CLS&); printf(&\nPlease enter an integer number between 10 and 100: &); scanf(&%d&,&n); fun(n,&m,zz); printf(&\n\nThere are %d non-prime numbers less than %d: &,m,n); for(n=0;n&m;n++) printf(&\n %4d&,zz[n]); /******************************/ wf=fopen(&out.dat&,&w&); system(&CLS&); for(I=0;I&N;I++) 【1】; for(I=0;I&N;I++) { for(j=0;j&M;j++) 【2】; bb[I]/=M; } for(I=0;I&N;I++) printf(&\nstudent%d\taverage=%5.1f&,I +1,bb[I]); } 【参考答案】 (1) bb[i]=0 值。 【解题思路】 填空1:每个人的平均分都保存在数组bb[N]中,所 以在使用前要对数组bb的各元素赋初值0。 填空2:为了求出平均分,首先要求出每个学生的 总分,并存于数组bb中。 下列给定程序中,函数fun的功能是:判断一 个整数m是否是素数,若是返回1,否则返回0。在 main函数中,若fun()返回1则输出&YES&,若fun()返 回0则输出&NO!&。 请改正程序中的错误,使它能得出正确的结 果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdlib.h& #include &conio.h& #include &stdio.h& int fun(int m) { int k=2; while (k&=m&&(m%k)) /*************found**************/ k++ /*************found**************/ if(m=k) return 1; else return 0; } void main() (2) bb[i]+=score[i][j] 考点分析 本题考:数组的引用以及数组元素赋{ system(&CLS&); printf(&\nPlease enter n: &); scanf(&%d&,&n); if(fun(n)) printf(&YES\n&); else printf(&NO!\n&); } 【 参 考 答 案 】 (1) 错 误 :k++ 正 确 :k++; (2) 错 误:if(m=k) 正确:if(m==k) 【考点分析】 本题考查:C程序的基本格式,每个 语句后面要以&;&结尾。if语句,其中多数考查条件 表达式,注意赋值表达式与逻辑表达式的区别。 【解题思路】 函数fun的功能是判断m是否为素 数:m从2开始作为除数,并对m取余,若不存在一个 数 使 得 余 数 为 0, 则 m为 素 数 , 程 序 的 错 误 在 于 if(m=k)语句中的逻辑表达式写成了赋值表达式。 编写函数fun,它的功能是:根据以下公式求p 的值,结果由函数值带回。m与n为两个正数且要 求m&n。P=m!/(n!(m-n)!),例如,m=12,n=8时,运行 结果为495.000000。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &conio.h& #include &stdio.h& #include &stdlib.h& float fun (int m, int n) { } void main () { FILE * system(&CLS&); printf (&p=%f\n&,fun (12,8) ) ; /******************************/ wf=fopen(&out.dat&,&w&); fprintf (wf,&%f&,fun(12,8)); fclose(wf); /*****************************/ } 【参考答案】8float fun (int m, int n) { double p=1.0; for(i=1;i&=m;i++) p=p*i; /*求m!*/ for(i=1;i&=n;i++) p=p/i; /*求m!/n!*/ for(i=1;i&=m-n;i++) p=p/i;/*求m!/(n!(m-n)!)*/ } 【考点分析】 本题考查:for循环语句,根据题意确定循环变量的 取值范围。return语句,返回函数的值,注意返回变 量的类型。 【解题思路】 本题中,欲求P的值,需要先求m、 n和m-n的阶乘值, 可用循环语句实现。注意:阶乘值应当是double类 型,若定义x、y、z为整型变量,则p=x/(y*z)中的除 法为整数除法。 第十套 请补充函数fun(char*s),该函数的功能是:把 字符串中的内容逆置。 例如,字符串中原有的字符串为abcde,则调 用该函数后,串中的内容为edcba。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的横线上填入所编写的若干表达 式或语句。 试题程序: #include &string.h& #include &conio.h& #include &stdio.h& #define N 81 void fun(char *s) { int i,n=strlen(s)-1; for(i=0;i&n;i++,【1】) { t=s[i]; 【2】; 【3】; }} main() { char a[N]; system(&CLS&); printf(&Enter a string:&); gets(a); printf(&The original string is:&); puts(a); fun(a); printf(&\n&); printf(&The string after modified:&); puts(a); } 【参考答案】 (1) n--或--n或n-=1或n=n-1 (2) s[i]=s[N]或*(s+i)=*(s+n) (3) s[N]=t或*(s+n)=t 【考点分析】 本题考查:变量交换算法,注意需借 助第三个变量来完成。 【解题思路】 填空1:将字符串的内容逆置,实际上就是将第一 个字符和最后一个字符交换,再将第二个字符与 倒数第二个字符交换,依此类推,直到中间的字符 为止,所以需要i加1的同时,n要减1。 填空2和填空3:数据的交换程序。 下列给定程序中,函数fun的功能是:按如下 递归公式求函数值。?10 fun(n)= ? ? fun(n ? 1) ? 2(n ? 1) (n ? 1)例如,当给n输入5时,函数值为18;当给n输入 3时,函数值为14。 请改正程序中的错误,使它能得出正确的结 果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdio.h& /*************found**************/ int fun(n) { /*************found**************/ if(n=1) c=10; else c=fun(n-1)+2; return(c); } void main() { printf(&Enter n: &); scanf(&%d&,&n); printf(&The result: %d\n\n& ,fun(n)); } 【参考答案】 (1)错误:int fun(n) (int n) (2)错误:if (n=1) (n==1) 【考点分析】 有参函数定义,其一般形式为: 类型标识符 函数名(形式参数列表) { 声明部分 语句 } 在形参列表中给出的参数称为形式参数,它们可 以是各种类型的变量,各参数之间用逗号间隔。 在 进行函数调用时,主调函数将赋予这些形式参数 实际的值。 形参既然是变量,必须在形参表中给出 形参列的类型说明。 【解题思路】 (1)主函数中已经定义了变量n的类型,在子函数 中也要定义。 (2)if后面应该紧跟一个条件判断表达式,而n=1是 赋值表达式,表达式的值永远为真,也就是说这个 条件永远成立,没有递归执行。 请编一个函数 float fun(double h),函数的功 能是:对变量h中的值保留两位小数,并对第三位 正 确 :int fun 正 确 :if进行四舍五入(规定h中的值为正数)。 例如,若h 值为8.32433,则函数返回8.32;若h 值为8.32533,?则函数返回8.33。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &stdio.h& #include &conio.h& #include &stdlib.h& float fun (float h ) { } void main() { FILE * system(&CLS&); printf(&Enter a: &); scanf (&%f&,&a); printf(&The original data is : &); printf(&%f\n\n&, a); printf(&The result : %f\n&, fun(a)); /******************************/ wf=fopen(&out.dat&,&w&); fprintf(wf,&%f&,fun(8.32533)); fclose(wf); /*****************************/ } 【参考答案】 float fun (float h) { t=(h*; /*单精度数h乘以1000后再加5,相当于对h中的第 三位小数进行四舍五入,除以10后将其赋给一个 长整型数时,把第三位小数后的数全部截去*/ return (float)t/100; /*除以100,保留2位小数*/ } 【考点分析】 本题考查:四舍五入方法的考查;数据类型强制转 换。9【解题思路】 注意:本题要求h的值真正发生了四舍五入,而不 是为了输出,即不能用printf(&%7.2f&,h)直接得到 结果。 由于单精度数h乘以1000后再加5,此时相当 于对h中的第三位小数进行四舍五入,在将其赋给 一个长整型数时,把第三位小数后的数全部截去。 在return中要将其中一个数转成浮点型数。 第十一套 请补充main函数,该函数的功能是:输出一本题考查:if条件语句,一般需根据题意确定条件 表达式。 数组元素下标及其赋值语句,通过二维数 组的下标如何表示其周边元素和非周边元素。 【解题思路】 填空1:用二维数组表示 n ? n 矩阵时,周边元素是 行下标为0或n-1,列下标为0或n-1的元素,判断时 四个条件中只要有一个条件满足,那么该元素就 是周边元素,所以用&||&运算符。填 空 2: 题 目 要 求 将 非 周 边 元 素 赋 值 为 0, 所 以 个 N ? N 矩阵,要求非周边元素赋值0,周边元素 b[i][j]=0。 赋值1。 注意:部分源程序给出如下。 下列给定程序中,函数fun的功能是:用递归 请勿改动main函数和其他函数中的任何内 算法计算斐波拉契级数列中第n项的值。从第一 容,仅在main函数的横线上填入所编写的若干表 项起,斐波拉契级数序列为1,1,2,3,5,8,13,21,…例 达式或语句。 如,若给n输入7,该项的斐波拉契级数值为13。 试题程序: 请改正程序中的错误,使它能得出正确的结 #include &stdlib.h& 果。 #include &stdio.h& 注意:不要改动main函数,不得增行或删行, #define N 10 也不得更改程序的结构。 void main() 试题程序: { #include &stdio.h& int bb[N][N]; long fun(int g) int I,j,n; { system(&CLS&); /*************found**************/ printf(& \nInput n:\n&); switch(g); scanf(&%d&,&n); {case 0:return 0; for(I=0;I&n;I++) /*************found**************/ for(j=0;j&n;j++) case 1; case 2:return 1; { } if(【1】) return (fun(g-1)+fun(g-2)); bb[I][j]=1; } else void main() 【2】; { } printf(& \n*** the result *** printf(&Input n:&);scanf(&%d&,&n); \n&); printf(&n=%d\n&,n); for(I=0;I&n;I++) fib=fun(n); { printf(&fib=%d\n\n&,fib); printf(& \n\n&); } for(j=0;j&n;j++) 【参考答案】 printf(&%4d&,bb[I][j]); (1)错误:switch(g); 正确:去掉分号 } (2)错误:case 1;case 2: return 1; } 正确:case 1:case 2:return 1; 【参考答案】 (1)i==0||i==n-1||j==0||j==n-1 (2) bb[i][j]=0【考点分析】 【考点分析】 switch语句,其一般形式为: switch(表达式) { case常量表达式1: 语句1; case常量表达式2: 语句2; … case常量表达式n: 语句n; default : 语句n+1; }& 其中,switch(表达式)后不带有&;&,同时case语句常 量后应该是&:&。 【解题思路】 C语言中,switch语句之后不能有分号,并且case语 句常量后该用是冒号。 请编写函数fun,函数的功能是:求出二维数 组周边元素之和,作为函数值返回。 二维数组中的 值在主函数中赋予。 例如,若二维数组中的值为 1 3 5 7 9 2 9 9 9 4 6 9 9 9 8 1 3 5 7 0 则函数值为61。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include&conio.h& #include&stdio.h& #include&stdlib.h& #define M 4 #define N 5 int fun( int a [M][N]) { } void main() { FILE * int aa[M][N]={{1,3,5,7,9},{2,9,9,9,4},{6,9,9, 9,8},{1,3,5,7,0}}; int i, j, system(&CLS&); printf (&The original data is :\n &); }for(i=0; i&M;i++) {for (j=0; j&N;j++) printf(&%6d &,aa[i][j]); printf(&\n &); } y=fun(aa); printf(&\nThe sun: %d\n &,y); printf(&\n &); /******************************/ wf=fopen(&out.dat&,&w&); fprintf (wf,&%d&,y); fclose(wf); /*****************************/ 【参考答案】 int fun(int a[M][N]) { int i,j,sum=0; for(i=0;i&M;i++) for(j=0;j&N;j++) if(i==0||i==M-1||j==0||j==N-1) /*只 要下标中有一个为0或M-1或N-1,则它一定是周 边元素*/ sum=sum+a[i][j]; /* 将 周 边元素相加*/ } 【考点分析】 本题考查:二维数组,其元素也称为双下标变 量;for循环语句根据数组元素的下标进行循环操 作;if语句确定周边元素是否符合题目要求。 【解题思路】 本题采用逐一判断的方式,周边元素的下标一定 有一个是0或M-1或N-1,且只要下标中有一个为0 或M-1或N-1,则它一定是周边元素。 第十二套 请补充main函数,该函数的功能是:从键盘 输入一个字符串及一个指定字符,然后把这个字 符及其后面的所有字符全部删除。结果仍然保存 在原串中。 例如,输入&abcdef&,指定字符为&e&,则输出 &abcd&。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内10容,仅在main函数的横线上填入所编写的若干表 达式或语句。试题程序: #include &stdlib.h& #include &stdio.h& #define N 80 void main() { int I=0; char str[N]; system(&CLS&); printf(&\n Input a string:\n&); gets(str); printf(&\n I\n&); scanf(&%c&, &ch); while(str[I]!='\0') { if(str[I]==ch) 【1】 【2】; } str[I]=【3】; printf(&\n*** display string ***\n&); puts(str); } 【参考答案】 (1) (2) i++或++i或i+=1或i=i+1 (3)'\0' 【考点分析】 本题考查:break语句,通常用在循环语句和开关语 句中。 当break用于开关语句switch中时,可使程序 跳出switch而执行以后的语句。当break语句用于注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &conio.h& #include &stdio.h& #define N 20 /*************found**************/ void fun(int *a,int n); { int I, m, t, for(I=0; I&n;I++) { /*************found**************/ m=0; for(k=I+1; k&n; k++) if(a[k]&a[m]) m=k; t=a[I]; a[I]=a[m]; a[m]=t; } } main() { int b[N]={11,5,12,0,3,6,9,7,10,8},n=10,i; system(&CLS&); for(i=0; i&n; i++) printf(&%d &,b[i]); printf(&\n&); fun(b,n); for(i=0; i&n; i++) printf(&%d &, b[i]); printf(&\n&); } 【参考答案】for、while、do-while循环语句时,可使程序终止循 (1)错误:void fun(int *a, int n); 环而执行循环后面的语句,通常break语句总是与 正确:void fun(int *a, int n) 正确:m=i; if语句一起使用,即满足条件时便跳出循环;字符 (2)错误:m=0; 【考点分析】 本题考查:函数定义的一般形式, 串结束标识'\0',上机考试时经常考查。 下列给定程序中,函数fun的功能是:求出数 组中最大数和次最大数,并把最大数和a[0]中的 数对调、次最大数和 a[1] 中的数对调。 请改正程序中的错误,使它能得出正确的结 果。 定义函数时不应该带有&;&。 【解题思路】 (1)简单的语法错误。 (2)这是一段简单的比较程序,m作为一个比较数 的下标。从下面的程序可以看出,m=i。 【考点分析】 编写函数fun,它的功能是:利用以下所示的 简单迭代方法求方程cos(x)-x=0 的一个实根。 xn+1=cos(xn) 迭代步骤如下: (1)取x1初值为0.0; (2)x0=x1,把x1的值赋给x0; (3)x1=cos(x0),求出一个新的 (4)若x0-x1,的绝对值小于0.000001,则执行 步骤 (5),否则执行步骤(2); (5)所求x1就是方程cos(x)-x=0的一个实根, 作为函数值返回。 程序将输出结果Root=0.739085。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &stdio.h& #include &conio.h& #include &math.h& float fun() { } main( ) { FILE * float f=fun(); printf(&Root=%f\n&,f); /******************************/ out =fopen(&out.dat&,&w&); fprintf(out,&%f&,f); fclose(out); /******************************/ } 【参考答案】 float fun( ) { float x1=0.0,x0; do { x0=x1; x1=cos(x0); }while (fabs(x0-x1)&=1e-6); return x1; } do……while循环语句,其形式为: do{ 语句 }while(表达式); 这个循环与while循环的不同在于:它先执行循环 中的语句,然后再判断表达式是否为真。 如果为真 则继续循环,如果为假, 则终止循环。因此, do-while循环至少要执行一次循环语句。 第十三套 请补充main函数,该函数的功能是:从键盘 输入3个整数,然后找出最大的数并输出。 例如,输入12,45,43,最大值为45。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在main函数的横线上填入所编写的若干表 达式或语句。 试题程序: #include &stdlib.h& #include &stdio.h& #include &conio.h& void main() { int a, b, c, system(&CLS&); printf(&\nInput three numbers:\n&); scanf(&%d,%d,%d&,&a,&b,&c); printf(&The three numbers are:%d,%d,%d\n&,a,b,c); if(a&b) 【1】; else 【2】; if(max&c) 【3】; printf(&max=%d\n&,max); } 【参考答案】 (1) max=a 【考点分析】 (2) max=b (3) max=c11填空1:如果a&b,则a为a和b中的最大值,将a赋给max。 max。 c更大,则c为3个数中的最大数,将c赋给max,否则 最大数max不变。 下列给定程序中,函数fun的功能是:将十进 制正整数m转换成 进制数,并按位 输出。例如,若输入8和2,则应输出1000(即十进制 数8转换成二进制表示是1000)。 请改正函数fun中的错误,使它能得出正确 的结果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdio.h& #include &conio.h& /*************found**************/ void fun(int m,int k); { int aa[20], for(i=0;m;i++) { /*************found************* */ aa[i]=m/k; m/=k; } for(;i;i--) /*************found************* */ printf(&%d&,aa[i]); } main() { int b,n; printf(&\nPlease enter a number and a base:\n&); scanf(&%d%d&,&n,&b); fun(n,b); printf(&\n &); } 【参考答案】 (1)错误:void fun(int m, int k);正确:void fun(int m, int k) (2)错误:aa[i]=m/ (3)错误:printf(&%d&, aa[i]) ; 【考点分析】 本题考查:函数定义的一般形式,定义函数时不应 该带有&;&;求余运算,注意求余运算与整除运算的 区别。 【解题思路】 (1)简单的语法错误。 (2)将十进制正整数转换成任意进制的数和十进 制正整数转换成二进制的数的方法是一样的。从 整数n译出它的各位k进制数值,需采用除k取余的 方法,即求n除k的余数,得到它的k进制的个位数, 接着将n除以k。 在n不等于0的状况下循环,按顺序 求出n的k进制的各个位上的数。 (3)在进行for(i=0;m;i++)循环结束时,i已经多加了 一个1,所以这里要减去1。 假定输入的字符串中只包含字母和*号。请 编写函数fun,它的功能是:将字符串中的前导*号 全部删除,中间和后面的*号不删除。 例 如 , 若 字 符 串 中 的 内 容 为 ****A*BC*DEF*G*******,删除后,字符串中的 内容则应当是A*BC*DEF*G*******。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &stdio.h& #include &conio.h& void fun (char *a) { } void main() { FILE * char s[81],t[81]=&****A*BC*DEF*G*******&; printf(&Enter a string :\n&); gets(s);填空2:如果a&b,则b为a和b中的最大值,将b赋给 正确:aa[i]=m%k; 填空3:最后将a和b中的最大值与c进行比较,如果 正确:printf(&%d&, aa[i-1]);k (2 ? k ? 9)本题考查:求最大数算法,通过if语句,进行条件比 较,判断两数中的较大数,再用比较大数与第三数 比较,得到三数中的最大数。 【解题思路】 fun(s); printf(&The string after deleted:\n&);puts(s); /******************************/ wf=fopen(&out.dat&,&w&); fun(t); fprintf(wf,&%s&,t); fclose(wf); /*****************************/ } 【参考答案】 void fun (char *a) { char *p=a; while(*p=='*') p++; /*指针p指向字符串第一个字母*/ for(;*p!='\0';p++,a++) *a=*p; /*从第一个字母开始,其后的字符都放入指针a所 指的字符串中*/ *a='\0'; /*在字符串最后加上结束标记符*/ } 【考点分析】 本题考查:将字符串的前导*号删除,即可以通过 while循环语句、for循环语句进行循环操作,将前 导*号后面字符重新储存。字符串结束标识'\0'。 【解题思路】 根据题意需删除给定字符串中的前导*号,那么需 要使用指针型变量来完成该操作,当指针指向第 一个非*号,即可把后面的所有字符都存到一个新 串中。我们在此提供另一种解答方法。 #include&string.h& void fun(char *a) { char *p=a; while(*p=='*') p++; strcpy(a,p); } 第十四套 函数fun的功能是:从三个形参a、 c中找出 b、 中间的数,作为函数值返回。例如,当a=3,b=5,c=4时,中间的数为4。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的横线上填入所编写的若干表达 式或语句。 试题程序: #include &stdio.h& int fun(int a,int b,int c) { t=(a&b)?(b&c?b:(a&c?c:【1】)) :((a&c)?【2】 :((b&c)?c:【3】)); } main() { int a1=3,a2=5,a3=4,r; r=fun(a1,a2,a3); printf(&\nThe middle number is: %d\n &,r); } 【参考答案】 (1) a 【考点分析】 (2) a (3) b12#include &math.h& /*************found**************/ #define FU(m,n) (m/n) float fun(float a,float b,float c) { value=FU(a+b,a-b)+FU(c+b,c-b); /*************found**************/ return(Value); } void main() { float x,y,z, printf(&Input x y z:: &); scanf(&%f%f%f&,&x,&y,&z); printf(&x=%f,y=%f,z=%f\n &,x,y,z); if(x==y||y==z) { printf(&Data error! \n &); exit(0);} sum=fun(x,y,z); printf(&The result is:%5.2f\n &,sum); } 【参考答案】容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &stdio.h& #define N 80 int fun(char *str) { } main() { char s[N]; FILE * char *test[]={&1234321&,&123421&,&123321&,&abc dCBA&}; printf(&Enter a string : &); gets(s); printf(&\n\n&); puts(s); if(fun(s)) printf(&YES\n&); else printf(&NO\n&); /************************************/ out=fopen(&out.dat&,&w&); for(i=0;i&4;i++) if(fun(test[i])) fprintf(out,&YES\n&); else fprintf(out,&NO\n&); fclose(out); /************************************/ } 【参考答案】 int fun(char *str) { int i,n=0,fg=1; char *p= while (*p) /*将指针p置位到字符串末尾,并统计字符数*/ { n++; p++;(1)错误:#define FU(m,n) (m/n)本题考查:条件表达式,其一般形式为&表达式1? 正确:#define FU(m,n) (m)/(n) 表达式2: 表达式3&。其求值规则为:如果表达式1 (2)错误:return(Value); 的值为真,则以表达式2 的值作为条件表达式的 正确:return (value); 值,否则以表达式3的值作为整个条件表达式的 值。 【解题思路】 该题目给定语句没有使用if语句,而是直接使用 条件表达式,如&max=(a&b)?a:b;&,执行该语句的语 义是:如a&b为真,则把a赋予max,否则把b 赋予 max。 下列给定程序中,函数fun的功能是:计算函 数F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)的值。 其中x和y 不相等,z和y不等。例如,当x的值为9,y的值为11,z 的值为15时,函数值为-3.50。 请改正程序中的错误,使它能得出正确的结 果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdlib.h& #include &stdio.h& 【考点分析】 本题考查:C语言宏定义;函数返回 值。 【解题思路】 如果从数学思路来说,这是一道简 单的数学题,当然,用C语言的办法实现的话,也用 不了两三句的程序。但是,这道题的考查点在C语 言的宏定义上(这样的问题比较隐蔽),它的格式 为&#define 标识符 字符串&,中间要用空格分开。 在该题中,标识符为FU(m,n),而字符串则是(m/n), 由 题 干 信 息 易 知 , 应 该 是 &#define FU(m,n) (m)/(n)&。 请编写函数fun,该函数的功能是:判断字符串是 否为回文,若是则函数返回1,主函数中输出&YES&, 否则返回0,主函数中输出&NO&。回文是指顺读和 倒读都一样的字符串。 例 如 , 字 符 串 LEVEL 是 回 文 , 而 字 符 串 123312就不是回文。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 } for(i=0;i&n/2;i++) /*循环比较字符*/ if(str[i]==str[n-1-i]); /*相同,什么都不作*/ else /*不同,直接跳出循环*/ { fg=0; } } 【考点分析】 本题考查:判断回文算法,针对于遍历字符串的操 作,需要循环语句的操作,指针型变量的帮助,同时 如果有判断,则应该有if语句的配合。 【解题思路】 判断回文数就是将第一个字符与最后一个字符 比较,第二个字符与倒数第二个字符进行比较,依 此类推,直到中间的字符,如果比较的结果都相同, 那么这个字符串就是回文,否则不是。 第十五套 函数fun的功能是:统计长整数n的各位上出 现数字1、 3的次数,并用外部(全局)变量c1、 2、 c2、 c3返回主函数。 例如,当n= 时,结果应该为:c1=3 c2=1 c3=2。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的横线上填入所编写的若干表达 式或语句。 试题程序: #include &stdio.h& int c1,c2,c3; void fun(long n) { c1=c2=c3=0; while(n) { switch(【1】) { case 1: c1++;【2】; case 2:c2++;【3】; case 3: c3++; } n/=10; } } main() { long n=L; fun(n); printf(&\nThe result: \n&); printf(&n=%ld c1=%d c2=%d c3=%d\n&,n,c1,c2,c3); } 【参考答案】 (1) n%10 break 【考点分析】 (2) break (3)13void fun (char *s, char *t ) { int I,s1; s1=strlen(s); for (I=0;I&s1;I++) /*************found**************/ t[I]=s[s1-1]; for (I=0;I&s1;I++) t[s1+I]=s[I]; t[2*s1]='\0'; } void main() {char s[100], t[100]; system(&CLS&); printf(&\nPlease enter string s: &); scanf(&%s&,s); fun(s,t); printf (&The result is: %s\n&,t);main() { char a[N]; FILE * printf(&Enter a string:&); gets(a); printf(&The original string is:&); puts(a); fun(a); printf(&\n&); printf(&The string after modified:&); puts(a); strcpy(a,&Hello World!&); fun(a); /******************************/ out=fopen(&out.dat&,&w&); fprintf(out,&%s&,a); fclose(out); /******************************/ } 【参考答案】 void fun(char *s) { int i,m,n; i=0; m=n=strlen(s)-1; while(i&(n+1)/2) { ch=s[i]; s[i]=s[m]; s[m]= i++; m--; } } 【考点分析】 本题考查:变量交换,需借助第三方变量来完成。 While循环语句,一般需根据题意确定循环条件。 【解题思路】 将字符串中的内容逆置,实际上就是将第一个字 符和最后一个字符交换,再将第二个字符与倒数} 【参考答案】 (1)错误:t[i]=s[s1-1]; 【考点分析】 本题考查:变量的赋值语句。 【解题思路】 该题也是几个循环语句的嵌套使用,难度并不大, 重要的是要读懂程序,题目中赋值语句t[i]=s[s1-1]; 并不能完成累计循环,所以正确的应该是 t[i]=s[s1-1-i];。 请编一个函数fun(char *s),该函数的功能是 把字符串中的内容逆置。 例如,字符串中原有的字符串为abcdefg,则 调用该函数后,串中的内容为gfedcba。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &string.h& #include &conio.h& #include &stdio.h& #define N 81 void fun(char*s) { } 正确:t[i]=s[s1-1-i];本题考查:switch语句,注意该语句的一般形式。 如 何提取数值n某一位上的数。break语句的使用。 【解题思路】 填空1:要统计长整数n的各位上出现数字1、2、3 的次数,就需要判断各位上的数是多少。那么,通 过n 除以10 求余,可得到个位上的数 ,所以填入 n%10。 填空2和填空3:switch语句是多分支选择语句,在 每个分支中要加入break,不然会依次执行后面的 分支。continue是结束当前分支的运行,而break结 束整个switch语句的运行。 下列给定程序中函数fun的功能是:先将在 字符串s中的字符按逆序存放到t串中,然后把s中 的字符按正序连接到t串的后面。例如,当s中的字 符 串 为 ABCDE 时 , 则 t 中 的 字 符 串 应 为 EDCBAABCDE。 请改正程序中的错误,使它能得出正确的结 果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdlib.h& #include &conio.h& #include &stdio.h& #include &string.h& 第二个字符交换,依此类推,直到中间的字符为 止。所以,长度为n的字符串需要交换的次数为 n/2。 第十六套 请补充main函数,该函数的功能是:打印出1 1000中满足个位数字的立方等于其本身所有数。 本题的结果为:1 64 125 216 729 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数main的横线上填入所编写的若干表 达式或语句。 试题程序: #include &stdlib.h& #include &stdio.h& void main() { int I,g; system(&CLS&); for(I=1;I&1000;I++) { g=【1】; if(【2】) printf(&%4d&,I); } } 【参考答案】 (1) i%10 (2) g*g*g==i 【考点分析】 本题考查: 如何提取数值n的各个位的数值;if语 句,该类题主要判断条件表达式的内容。 【解题思路】 填空1:将一个整数对10求余,就得到这个数的个 位数字,并存于变量g中。 填空2:如果个位数字的立方等于这个数本身,则 将这个数输出。 下列给定程序中,函数fun的功能是:求三个 数的最小公倍数。例如,给变量x1、x2、x3分别输 入15、11、2,则输出结果应当是330。 请改正程序中的错误,使它能得出正确的结 果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdio.h&int fun(int x,int y,int z) { int j,t,n,m; /*************found**************/ j=1; t=m=n=1; /*************found**************/ while (t!=0 && m!=0 && n!=0) { j=j+1; t=j%x; m=j%y; n=j%z; } } void main() { int x1,x2,x3,j; printf(&Input x1 x2 x3: &); scanf(&%d%d%d&,&x1,&x2,&x3); printf(&x1=%d,x2=%d,x3=%d \n&,x1,x2,x3); j=fun(x1,x2,x3); printf(&The minimal common multiple is: %d\n&,j); } 【参考答案】 (1)错误:j=1; 正确:j=0; (2)错误:while (t!=0 && m!=0 && n!=0) 正确:while (t!=0 || m!=0 || n!=0) 【考点分析】 本题考查:变量初始化,根据题目内容,确定变量含 义;while循环条件及&逻辑或&运算。 【解题思路】 (1)j 通过循环加1求出三个数的最小公倍数,当三 个数都为1时,则最小公倍数为1。然而,如果j初始 为1时,那么计算最小公倍数时就从2开始了,所以 改为j=0。 (2)不需要同时都不为0,只要有一个不为0,就有最 小公倍数。 请编写一个函数fun,它的功能是:将一个数 字字符串转换为一个整数(不得调用C语言提供 的将字符串转为整数的函数)。 例如,若输入字符串&-1234&,则函数把它转14换为整数值-1234。 注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &stdio.h& #include &string.h& long fun(char *p) { } void main() { FILE * char s[6]; printf(&Enter a string:\n&); gets(s); n=fun(s); printf(&%ld\n&,n); /******************************/ wf=fopen(&out.dat&,&w&); fprintf (wf,&%ld&,fun(&-1234&)); fclose(wf); /*****************************/ } 【参考答案】 long fun(char *p) { long n=0; int flag=1; if(*p=='-') /*负数时置flag为-1*/ {p++;flag= -1;} else if(*p=='+') /*正数时置flag为1*/ p++; while(*p!='\0' { 整数*/ p++; } return n* } 【考点分析】 本题考查:字符串转整数算法。 【解题思路】 n=n*10+*p-'0';/*将字符串转成相应的if( )的作用是判断它是正数还是负数。while( )循 环的作用是将字符串转成相应的整数。注意:*p 是一个字符(如'9'、'4'),并不是一个数,要将其转成 相应的数字必须令其减去'0'(不是'\0'),即*p-'0' 就 得 到 *p 这 个 字 符 的 相 应 数 字 , 如 '0'-'0'=0 、 '8'-'0'=8等。在程序的前面加#include&stdlib.h&, 函数atol( )的作用是将字符串p转成长整型数,它 是一个库函数。 第十七套 请补充main函数,该函数的功能是:打印出 满足个位的数字、十位上的数字和百位上的数字 都相等的所有三位数。 本题的结果为: 111 222 333 444 555 666 777 888 999。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在main函数的横线上填入所编写的若干表 达式或语句。 试题程序: #include &stdlib.h& #include &stdio.h& void main() { int g, s, system(&CLS&); for(g=1; g&10; g++) for (s=1; s&10; s++) for(b=1; b&10; b++) { if(【1】) printf(&%5d&, 【2】); } } 【参考答案】 (1) g==s&&s==b 或 者 g==b&&s==b 或 者 g==s&&g==b (2) g+s*10+b*100 【考点分析】 本题考查: if语句,此类题目基本都 是根据题意确定条件表达式的内容;如何表示百 位数n的个位、十位和百位数,反过来,如果知道个 位、十位、百位,如何表示这个数值n。 【解题思路】 填空1:变量g表示三位数的个位数字,变量s表示 三位数的十位数字,变量b表示三位数的百位数 字。注意,表示三个数字都相等时,不能写成 &g==s==b&, 而 要 写 成 &g==s&&s==b& 、 &g==b&&s==b&或者&g==s&&g==b&。 }printf(&Ave=%f\n&,aver); 【参考答案】 (1)错误:t=s[k]; 正确:t+=s[k]; 正确:*aver=strcpy(tt,&After 15string&);changingthe填空2:一个三位数可以表示为:百位数字乘以100 (2)错误:*aver=& 【考点分析】 加上十位数字乘以10,再加上个位数字。 下列给定程序中,函数fun的功能是:从n个学 生的成绩中统计出低于平均分的学生人数,此人 数由函数值返回,平均分存放在形参aver所指的 存储单元中。例如输入8名学生的成绩: 80.5 60 72 90.5 98 51.5 88 64 则 低 于 平 均 分 的 学 生 人 数为4( 平 均 分 为 75.5625)。 请改正程序中的错误,使它能得出正确的结 果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdlib.h& #include &stdio.h& #include &conio.h& #define N 20 int fun(float *s, int n,float *aver) { float ave ,t=0.0; int count=0,k,i; for(k=0;k&n;k++) /*************found**************/ t=s[k]; ave=t/n; for(i=0;i&n;i++) if(s[i]&ave) count++; /*************found**************/ *aver=& } void main() { float s[30], int m,i; system(&CLS&); printf(&\nPlease enter m: &); scanf(&%d&,&m); printf(&\nPlease enter %d mark :\n&,m); for(i=0;i&m;i++) scanf(&%f&,s+i); printf(&\nThe number of students :%d\n&,fun(s,m,&aver)); 运算符。 【解题思路】fun(tt); fprintf(out,&%s&,tt); fclose(out); /******************************/ } 【参考答案】 void fun(char *ss) { int i,n=0; char *p= while(*p) { n++; p++; } for(i=0;i&n;i++) if((ss[i]&='a'&&ss[i]&='z')&&i%2!=0) /*将下标为奇数位置的字母转换成大写*/ ss[i]=ss[i]-32; ss[i]='\0'; } 【考点分析】 本题考查:奇数位的判定方法,通过对2求余判断; 小写字母转大写字母,根据ASCⅡ码,小写字母减 去32得到其对应的大写字母。 【解题思路】 首先得到字符串的长度,然后利用循环结构,判断 每一位是否为偶数位,字符是否为小写,若满足条 件,则将其轻换为大写字母。 第十八套 请 补 充 main 函 数 。 该 函 数 的 功 能 是 : 求 1 100(不包括100)以内所有素数的平均值。 程序运行后的结果为42.40。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在main函数的横线上填入所编写的若干表 达式或语句。 试题程序: #include &stdlib.h& #include &stdio.h& void main() { int I, j, n=0,本题考查:数值累加运算;指针型变量,&&&取地址根据题目要求,可利用循环语句,累计计算n个学 生的总分;求得平均成绩后,再利用循环语句和条 件选择语句。若小于平均值,则将该值存放于aver 存储单元中。 t=s[k];是循环叠加错误,*aver=& 中为语法错误。 请编写一个函数void fun(char *ss),其功能 是:将字符串ss中所有下标为奇数位置上的字母 转换为大写(若该位置上不是字母,则不转换)。 例如,若输入abc4EFg,则应输出aBc4EFg。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &conio.h& #include &stdio.h& #include &string.h& void fun ( char *ss) { } void main() { char tt[51]; FILE * printf(&Please enter an character string within 50 characters:\n&); gets(tt); printf(&\n\nAfter changing,the string\n%s&,tt); fun(tt); printf(&\nbecomes\n %s&,tt); /******************************/ out=fopen(&out.dat&,&w&);float aver=0; system(&CLS&); for(j=2; j&100; j++) { flag=1; for(I=2; I&j; I++) if(【1】) { flag=0; } if(【2】) { n++; aver+=j; } } printf(&\n\n average=%4.2f\n&, 【3】); } 【参考答案】 (1) j%i==0 (2) flag==1 【考点分析】 (3) aver/n本 题 考 查 : 判 定 素 数 的 算 法 ;flag 标 记 的 使 用;printf( )函数的输出表列;计算平均值的方法。 【解题思路】 填空1:如果一个数能被除了1和其自身之外的数 整除,即余数为0,则这个数不是素数,将标记flag置 0。 填空2:flag用来标记当前数是否为素数,当flag为0 时表示非素数, flag为1时表示素数。如果flag为1, 说明当前数是素数,则将这个数累加到aver中。 填空3:变量n记录100以内所有素数的个数,变量 aver保存这些素数的总和,所以平均值等于总和 除以个数。 下列给定程序中,函数fun的功能是:在字符 串的最前端加入n个*号,形成新串,并且覆盖原 串。 注意:字符串的长度最长允许为79。 请改正函数fun中的错误,使它能得出正确 的结果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdio.h& #include &string.h& #include &conio.h& void fun(char s[],int n) { char a[80],*p; int I; /*************found**************/ s=p; for(I=0;I&n;I++) a[I]= '*'; do {a[I]=*p; /*************found**************/ ___填空___ }while(*p); /*************found**************/ a[I]='0'; strcpy(s,a); } void main() {char s[80]; system(&CLS&); printf(&\nEnter a string: &);gets(s); printf(&\nThe string:%s\n&,s); printf(&\nEnter n (number of*):&); scanf(&%d&,&n); fun(s,n); printf(&\nThe string after inster:%s\n&,s); } 【参考答案】 (1)错误:s=p; 正确:p=s; (2)应填p++;或++p;或p+=1;或p=p+1; (3)错误:a[i]='0';正确:a[i]='\0';或a[i]=0 【考点分析】 本题考查:常量;指针型变量;字符串结束标识;数 组的操作。 【解题思路】 (1)在本题中,s是数组名,代表数组首地址,在编译 时对s数组分配了一段内存单元,因此在程序运行 期间s是一个常量,不能被赋值。 因此s=p是错误的, 应改为p=s,它将字符串的首地址赋给指针变量p, 应当弄清楚字符数组与字符指针变量用法的区 别。 (2)指针的地址也要变化,因此填入p++。(3)字符串最后的结束符是\0。 编写一个函数,该函数可以统计一个长度为 2的字符串在另一个字符串中出现的次数。例如, 假定输入的字符串为asd asasdfg asd as zx67 asd mklo,子字符串为as,则应当输出6。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include &conio.h& #include &stdio.h& #include &string.h& #include &stdlib.h& int fun(char *str, char *substr) { } void main() { FILE * char str[81],substr[3]; system(&CLS&); printf(&输入主字符串: &); gets(str); printf(&输入子字符串: &); gets(substr); puts(str); puts(substr); n=fun(str,substr); printf(&n=%d\n &,n); /******************************/ wf=fopen(&out.dat&,&w&); n=fun(&asd asasdfg asd as zx67 asd mklo&,&as&); fprintf(wf,&%d&,n); fclose(wf); /*****************************/ } 【参考答案】 int fun(char *str, char *substr) { int i,j=0; for(i=0;str[i+1]!='\0';i++) /*如果一个长度为2的子字符串在主字符串中出16现一次,则j+1,如此循环*/ if(str[i]==substr[0]&&str[i+1]==substr[1])j++; /*返回子字符串在主字符串中出现的次数*/ } 【考点分析】 本题考查:遍历字符串实现字符串比较运算。 【解题思路】 该题中substr只有两个字符,所以可以用if语句直 接进行判断。注意if( )中str数组的下标为i和i+1, 即比较当前字符及其后面的一个字符是否分别 与substr中的字符对应相同,若都相同则表示出现 了一次。 第十九套 请补充函数fun,该函数的功能是:求一维数 组x[N]的平均值,并对所得结果进行四舍五入(保 留两位小数)。 例 如 , 当 x[10]={15.6,19.9,16.7,15.2,18.3,12.1,15.5,11.0,10. 0,16.0},结果为:avg=15.030000。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的横线上填入所编写的若干表达 式或语句。 试题程序: #include &stdlib.h& #include &stdio.h& #include &conio.h& double fun(double x[10]) { int I; double avg=0.0; double sum=0.0; for(I=0;I&10;I++) 【1】; avg=sum/10; avg=【2】; t=【3】; avg=(double)t/100; } void main() {double avg,x[10]={15.6,19.9,16.7,15.2,18.3,12.1, 15.5,11.0,10.0,16.0}; system(&CLS&); printf(&\nThe original data is :\n&); for(i=0;i&10;i++) printf(&%6.1f&,x[i]); printf(&\n\n&); avg=fun(x); printf(&average=%f\n\n&,avg); } 【参考答案】 (1) sum+=x[i] (2) avg*1000 【考点分析】 现。 【解题思路】 填空1:通过for循环,求出10个数的累加和,存于变 量sum中。 填空2:为了实现四舍五入保留两位小数的功能, 应将平均值先扩大1000倍。 填空3:将平均值加上5,再除以10,实现四舍五入的 功能。 下列给定程序中,函数fun的功能是:删除字 符串s中所有空白字符(包括Tab符、 回车符及换行 符)。输入字符串时用&#&结束输入。 请改正程序中的错误,使它能得出正确的结 果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &string.h& #include &stdio.h& #include &ctype.h& fun(char *p) { int i, char c[80]; for(i=0,t=0;p[i];i++) if(!isspace(*(p+i))) c[t++]=p[i]; /*************found**************/ c[t]=&\0&; strcpy(p,c); } (3) (avg+5)/10本题考查:如何计算平均值;四舍五入方法的实 void main() {char c,s[80]; int i=0; printf(&Input a string: &); c=getchar(); while(c!='#') { s[i]=c;i++;c=getchar();} s[i]='\0'; fun(s); puts(s); } 【参考答案】 (1)错误:c[t]=&\0&; 【考点分析】 字符串结束标识'\0', '\0'属于一个字符,其ASCII 码为0。 【解题思路】 该程序的if条件中应用了isspace函数,该函数的功 能是检查ch是否空格、 跳格符(制表符)或换行符。 字符串常量占的内存字节数等于字符串中字节 数加1。增加的一个字节中存放字符'\0'(ASCII码 为0),这是字符串结束的标志。 编写一个函数,从传入的num个字符中找出 最长的一个字符串,并通过形参指针max传回该 串地址(用****作为结束输入的标志)。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include&conio.h& #include&stdio.h& #include&string.h& #include&stdlib.h& char *fun(char (*a)[81], int num, char *max) { } void main() { FILE * char ss[10][81],*ps=NULL; char 正确:c[t]='\0';s[3][81]={&abcd&,&deg&,&diegns&},*p=NULL; int i=0,n; system(&CLS&); printf(&输入若干个字符串:&); gets(ss[i]); puts(ss[i]); while(!strcmp(ss[i], &****&)==0) /*用4个星号作为结束输入的标志*/ { i++; gets(ss[i]); puts(ss[i]); } n=i; ps=fun(ss,n,ps); printf(&\nmax=%s\n&,ps); /******************************/ wf=fopen(&out.dat&,&w&); p=fun(s,3,p); fprintf(wf,&%s&,p); fclose(wf); /*****************************/ } 【参考答案】 char *fun(char (*a)[81], int num, char *max) { int i=0; max=a[0]; /*找出最长的一个字符串*/ for(i=0;i&i++) if(strlen(max)&strlen(a[i])) max=a[i]; /*传回最长字符串的地址*/ } 【考点分析】 本题考查:指针型变量,明确指向数组的指针变量 和指向指针的指针变量;如果一个指针变量存放 的是另一个指针变量的地址,则称这个指针变量 为指向指针的指针变量。数组定义及引用。 【解题思路】 解答本题之前,我们应该先明白ss是一个指向一 维数组的指针变量,max是指向指针变量的指针 变量,所以引用时要注意加上*。我们不可能只用 max,因为ss[0]是一个数组地址而不是一个指针 的地址。17第二十套 请补充函数fun,该函数的功能是:把一个整 数转换成字符串,并倒序保存在字符数组str中。 例 如,当n=时,str=&&。 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的横线上填入所编写的若干表达 式或语句。 试题程序: #include &stdlib.h& #include &stdio.h& #include &conio.h& #define N 80 char str[N]; void fun(long int n) { int I=0; while(【1】) { str[I]=【2】; n/=10; I++; } 【3】; } void main() { long int n=; system(&CLS&); printf(&*** the origial data ***\n&); printf(&n=%ld&,n); fun(n); printf(&\n%s&,str); } 【参考答案】 (1) n&0 (2) n%10+'0' 【考点分析】 本题考查:while循环语句,一般需按照题意确定循 环条件;如何取出数值的各个位;字符串结束标识 '\0'。 【解题思路】 填空1:while循环的执行条件是n&0,当n=0时,说明 已经将整数的各位数字都转换为数字字符,并存 入字符串中。 (3) str[i]='\0'填空2:n对10求余,得到整数n的个位数字,再加上 字符'0'的ASCII码,得到对应的数字字符,并存入 字符串str中。 填空3:将整数转换为字符串并倒序存入字符数组 str中后,还要在str最后加上字符串结束标记符 '\0'。 下列给定程序中,函数fun的功能是:先从键 盘上输入一个3行、3列的矩阵的各个元素的值, 然后输出主对角线元素之和。 请改正函数fun中的错误,使它能得出正确 的结果。 注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构。 试题程序: #include &stdio.h& void fun() { int a[3][3], int i,j; /*************found**************/ sum=1; for (i=0;i&3;i++) { for (j=0;j&3;j++) /*************found**************/ scanf(&%d&,a[i][j]); } for(i=0;i&3;i++) sum=sum+a[i][i]; printf(&Sum=%d\n&,sum); } void main() { fun(); } 【参考答案】 (1)错误:sum=1; 正确:sum=0; (2)错误:scanf(&%d&,a[i][j]); 正确:scanf(&%d&,&a[i][j]); 【考点分析】 本题考查:变量初始化操作,首先要明确题目中 变量的含义和作用。scanf( )函数的一般形式,其 形式为:scanf(&格式控制字符串&,地址表列); , 其中地址表列前需加&&&;矩阵主对角线上元素 的表示方法。 【解题思路】 该题依然考查对循环语句的掌握和对数组概念 的理解,根据题干主线,我们可以看清这样的一 个解题思路:先从键盘输入一个3×3矩阵,然后 再循环累加, 执行循环语句中的sum=sum+a[i][i], 所以sum=0。 编写一个函数fun,它的功能是:实现两个字 符串的连接(不使用库函数strcat),即把p2所指的 字符串连接到p1所指的字符串后。 例如,分别输入下面两个字符串: FirstString SecondString 则程序输出: FirstStringSecondString 注意:部分源程序给出如下。 请勿改动main函数和其他函数中的任何内 容,仅在函数fun的花括号中填入所编写的若干语 句。 试题程序: #include&stdio.h& #include&conio.h& #include&stdlib.h& void fun(char p1[],char p2[]) { } void main() { FILE * char s1[80],s2[40]; char p1[80]=&FirstString&,p2[40]=&SecondString &; system(&CLS&); printf(&Enter s1 and s2:\n&) ; scanf(&%

我要回帖

更多关于 路飞的第二个果实 的文章

 

随机推荐