二级C语言上机试题汇编100套
第01套:
解题思路:
第一处:t是通过取模的方式来得到*n的个位数字,所以应填:10。
第二处:判断是否是奇数,所以应填:0。
第三处:最后通过形参n来返回新数x,所以应填:x。*******************
解题思路:
第一处:条件语句书写格式错误,应改为:if (n==0)。第二处:语句后缺少分号。请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。
解题思路:
本题是将一个数字字符串转换为一个整数。
参考答案:
#include
#include
/* 以下代码仅供参考 */ int i, len, t; /* len为串长,t为正负标识 */ long x=0;
len=strlen(p);
if(p[0]=='-')
{ t=-1; len--; p++; } else t=1;
/* 以下完成数字字符串转换为一个数字 */
while(*p) x = x*10-48+(*p++);
return x*t;
}
main() /* 主函数 */ { char s[6];
long n;
printf("Enter a
string:\n") ;
gets(s);
n = fun(s);
printf("%ld\n",n);
NONO ( );
}
NONO ( )
{/* 本函数用于打开文件,
输入数据,调用函数,输出
数据,关闭文件。 */
FILE *fp, *wf ;
int i ;
char s[20] ;
long n ;
fp =
fopen("c:\\test\\in.dat
","r") ;
wf =
fopen("c:\\test\\out.da
t","w") ;
for(i = 0 ; i < 10 ; i++)
{
fscanf(fp, "%s", s) ;
n = fun(s);
fprintf(wf, "%ld\n",
n) ;
}
fclose(fp) ;
fclose(wf) ;
}
注意:由于NONO( )这个函
数是改卷人用的,与考生没
有什么关系,故下面从第2
套试题开始均省略NONO( )
※※※※※※※※※
第02套:
解题思路:
本题是考察先把给定的数
据写入到文本文件中,再从
该文件读出并显示在屏幕
上。
第一处:定义文本文件类型
变量,所以应填:FILE *。
第二处:判断文件是否结
束,所以应填:fp。
第三处:显示读出的字符,
所以应填:ch。
*******************解题
思路:
第一处: 要求是取出原字
符串中所有数字字符组成
一个新的字符串,程序中是
使用变量j 来控制新字符
串的位置,所以应改为:
s[j++]=s[i];。
第二处: 置新字符串的结
束符,所以应改为:
s[j]='\0';.
*******************
请编写函数fun, 函数的功
能是: 将M行N列的二维数
组中的字符数据, 按列的
顺序依次放到一个字符串
中。
参考答案:
void fun(char s[][N],
char *b)
{
int i,j,n=0;
for(i=0; i < N;i++) /* 请
填写相应语句完成其功能
*/
{
for(j = 0 ; j < M ; j++)
{
b[n] = s[j][i] ;
n = i * M + j + 1;
}
}
b[n]='\0';
}
第03套:
解题思路:
本题是考察如何从文件中
读出数据,再把结构中的数
据写入文件中。
第一处:从指定的文件中读
出数据,所以应填:
filename。
第二处:读取文件fp的最
后一条记录,所以应填:fp。
第三处:再把读出的记录,
写入文件fp指定的位置
上,所以应填:fp。
*******************
解题思路:
第一处: 指向刚分配的结
构指针,所以应改为:
p=(NODE
*)malloc(sizeof(NODE));
第二处: 在动态分配内存
的下一行语句是,使用临时
结构指针变量h保存p指针
的初始位置,最后返回不能
使用p,是因为p的位置已
经发生了变化,所以应改为
返回h。
*******************
请编写函数fun, 函数的功
能是:统计一行字符串中单
词的个数,作为函数值返
回。一行字符串在主函数中
输入, 规定所有单词由小
写字母组成,单词之间由若
干个空格隔开, 一行的开
始没有空格。
参考答案:
int fun( char *s)
{
int k = 1 ;
while(*s) {
if(*s == ' ') k++ ;
s++ ;
}
return k ;
}
第04套:
解题思路:
本题是考察把结构中的数据写入文件。
第一处:建立文件的类型,考虑到是把结构中的数据(结构中的数据包含不打印的字符)从文件中读出,所以应填:"rb"。
第二处:判断当前学号是否大于刚读出的学号进行相比,如果大于,则进行交换,所以应填:>。
第三处:把已排序的结构数据,重新写入文件,所以应填:fwrite。
*******************
解题思路:
第一处: 指针p应指向s,所以应改为:p=s;。
第二处: 死循环,当do while循环执行一次,临时变量p应该指向字符串的下一位置,所以应改为:while(*p++);。
*******************
请编写函数fun,函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中;要求函数把0至9岁年龄段的人数放在d[0] 中,把10至19岁年龄段的人数放在d[1]中,把20至29岁年龄段的人数放在d[2]中, 其余依此类推, 把100岁 (含100)以上年龄的人数都放在d[10]中。结果在主函数中输出。
解题思路:
参考答案:
void fun( int *a, int *b) {
int i, j ; for(i = 0 ; i < M ; i++)
b[i] = 0 ;
for(i = 0 ; i < N ; i++)
{
j = a[i] / 10 ;
if(j > 10) b[M - 1]++ ;
else b[j]++ ;
}
}
double rnd()
{ static
t=29,c=217,m=1024,r=0;
r=(r*t+c)%m;
return((double)r/m);
}
第05套:
解题思路:
本题是考察先把给定的数
据写入到文本文件中,再从
该文件读出并转换成相应
的整数、浮点数显示在屏幕
上。
第一处:定义文本文件类型
变量,所以应填:FILE *。
第二处:关闭刚写入的文
件,所以应填:fclose(fp)。
第三处:从文件中读出数
据,所以应填:fp。
*******************
解题思路:
第一处: 语句最后缺少分
号。
第二处: 应该使用方括号,
而不是圆括号。
像此类,使用编译,即可发
现。
*******************
请编写函数fun, 函数的功
能是: 删去一维数组中所
有相同的数, 使之只剩一
个。数组中的数已按由小到
大的顺序排列,函数返回删
除后数组中数据的个数。
参考答案:
int fun(int a[], int n)
{
int i, j = 1, k = a[0] ;
for(i = 1 ; i < n ; i++)
if(k != a[i]) {
a[j++]=a[i] ;
k = a[i] ;
}
a[j] = 0 ;
return j ;
}
第06套:
解题思路:
本题是根据给定的公式来
计算函数的值。
第一处:程序中使用双精度
double类型进行计算,所
以函数的返回值类型也为
double,所以应填:double。
第二处:当i等于1时,则
返回f1函数的值,所以应
填:f1。
第三处:如果i不等于1,
则返回f2函数的值,所以
应填:f2。
*******************
解题思路:
第一处: 试题要求返回字
符串的首地址,所以应改
为:char *fun(char
*s,char *t)
第二处: 取字符串指针ss
的下一个位置,所以应改
为:ss++;。
第三处:取字符串指针tt
的下一个位置,所以应改
为:tt++;。
*******************
请编写函数fun,函数的功
能是: 移动字符串中的内
容,移动的规则如下: 把第
1到第m个字符, 平移到字
符串的最后, 把第m+1到
最后的字符移到字符串的
前部。
参考答案:
void fun1(char *w) /* 本
函数的功能是将字符串中
字符循环左移一个位置 */
{
int i; char t;
t=w[0];
for(i=0;i ++) w[i]=w[i+1]; w[strlen(w)-1]=t; } void fun(char *w, int m) /* 可调用fun1函数左移 字符 */ { int i; for(i = 0 ; i < m ; i++) fun1(w); } 第07套: 解题思路: 本题是利用结构体变量存 储了一名学生的信息。 第一处:tt变量在函数体 fun已经使用,所以应填: tt。 第二处:利用循环分别输出 学生的成绩数据,所以应 填:tt.score[i]。 第三处:函数的调用,所以 应填:std。 *******************解题 思路: 第一处:外循环每循环一 次,把当前位置i赋值给m, 所以应改为:m=i;。 第二处:通过内循环来找出 最大的一个数的位置k,所 以应改为:if(a[k]>a[m]) m=k;。 ******************* 请编写一个函数 unsigned fun ( unsigned w ),w 是一个大于10的无符号整数,若 w 是 n (n ≥ 2)位的整数,函数求出w的低n-1位的数作为函数值返回。 参考答案: unsigned fun ( unsigned w ) { if(w>10000) w %= 10000 ; else if(w>1000) w %= 1000 ; else if(w>100) w %= 100 ; else if(w>10) w %=10 ; return w ; } 第08套: 解题思路: 本题是利用结构体存储学生记录并由实参ss返回。 第一处:实参ss是一个结构型指针变量,所以应填:STU。 第二处:该学生的各科成绩都乘以一个系数a,所以应填:score[i]。 第三处:函数的调用,由于函数定义时使用的指针结构型变量,所以应填:&std。*******************解题思路: 第一处:条件判断缺少圆括号。 第二处:判断相等的符号是==。 ******************* 程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][N], int n),函数的功 能是:使数组左下三角元素 中的值乘以n 。 参考答案: int fun ( int a[][N], int n ) { int i, j; for(i = 0 ; i < N ; i++) for(j = 0 ; j <= i; j++) a[i][j] *= n ; } 第09套: 解题思路: 本题是考察使用链表方法, 使用两重while循环语句, 对链表的结点数据进行升 序排列。 第一处:由于外循环变量使 用p指针,内循环变量使用 q指针,所以q指向必须指 向p的next 指针,因此应 填写:p.next。 第二处:判断内循环q指针 是否结束,所以应填:q。 第三处:外循环控制变量p 指向自己的next指针,所 以应填:p.next。 ******************* 解题思路: 第一处: 使用while循环 来判断字符串指针s是否 结束,所以应改为: while(*s)。 第二处: 取字符串指针s 的下一个位置,所以应改 为:s++;。 ******************* 请编写函数fun, 函数的功 能是: 移动一维数组中的 内容; 若数组中有n个整 数, 要求把下标从0到 p(含p,p小于等于n-1)的 数组元素平移到数组的最 后。 参考答案: void fun(int *w, int p, int n) { int i, j = 0, b[N] ; for(i = p + 1 ; i < n ; i++) b[j++] = w[i] ; for(i = 0 ; i <= p ; i++) b[j++] = w[i] ; for(i = 0 ; i < n ; i++) w[i]= b[i] ; } 第10套: 解题思路: 第一处:行列变量row和 colum的值初始化为0。 第二处:两个条件只要有一 个不满足就返回0,所以应 填:||。 第三处:如果矩阵是“幻 方”,则返回1。 ******************* 解题思路: 第一处:在除法运算中,如 果除数和被除数都是整数, 所么所除结果也是整数,因 此应改为t-=1./i。 第二处:应是返回公式的 值,函数中公式的值是存放 在临时变量t中,所以应填 return t;。 ******************* 请编写一个函数,函数的功 能是删除字符串中的所有 空格。 参考答案: int fun(char *str) { char *p = str ; int i = 0 ; while(*p) { if(*p != ' ') str[i++] = *p ; p++ ; } str[i] = 0 ; } 第11套: 解题思路: 本题是考察使用链表方法, 对链表的结点数据进行降 序排列。 第一处:使用结构指针p, 来控制链表的结束,p必须 指向h结构指针的next指 针,来定位p 的初始位置。 所以应填写:h->next。 第二处:判断p指针是否结 束,所以应填写:0。 第三处:q指向原q的next 指针,所以应填:r。 ******************* 解题思路: 第一处: 程序中子串是由 变量t来实现的,再根据下 面while循环体中语句可 知,所以应改为:r=t;。 第二处: 是判断相等的条 件,所以应改为: if(*r==0)。 ******************* 请编写函数fun, 函数的功 能是: 将放在字符串数组 中的M个字符串(每串的长 度不超过N), 按顺序合并 组成一个新的字符串。函数 fun中给出的语句仅供参 考。 参考答案: #include #define M 3 #define N 20 void fun(char a[M][N], char *b) { /* 以下代码仅供参考 */ int i; *b=0; for(i = 0 ; i < M ; i++) strcat(b, a[i]) ; } 第12套: 解题思路: 本题是考察使用链表方法,对链表的结点数据进行降序排列,最后通过函数进行返回。 第一处:由于链表中的所有结果要求通过函数进行返回,所以应填:NODE *。 第二处:中间变量r用来保存q的next指针,所以应填:next。 第三处:q指向原q的next 指针,所以应填:r。 ******************* 解题思路: 第一处: 根据试题分析,两个条件之间应该是“或”的关系,而不是“与”的关系,所以应改为:if(i%2 || s[i]%2==0)。 第二处: 当字符串处理结束后,应该补上字符串的结束符,那么字符串t的位置是由i来控制,所以应改为:t[j]=0;。 ******************* 请编写函数fun, 函数的功能是: 将M行N列的二维数组中的数据, 按列的顺序依次放到一维数组中。函数fun中给出的语句仅供参考。 参考答案: void fun(int (*s)[10], int *b, int *n, int mm, int nn) { /* 以下代码仅供参考 */ int i,j,np=0; /* np用作 b数组下标 */ for(i = 0 ; i < nn ; i++) for(j = 0 ; j < mm ; j++) { b[np] = s[j][i] ; np = i * mm + j + 1; } *n=np; } 第13套: 解题思路: 本题是考察使用链表方法, 对链表的结点数据进行升 序排列。 第一处:使用结构指针p, 来控制链表的结束,p必须 指向h结构指针的next指 针,来定位p 的初始位置。 所以应填写:h->next。 第二处:使用while循环, 对链表中结点的数据进行 排序,q必须指向p结构指 针的next指针。所以应填 写:p->next。 第三处:如果当前结点中的 数据大于(大于等于)循环 中的结点数据,那么进行交 换,所以应填写:>(或>=)。 ******************* 解题思路: 程序中是使用while循环 语句和结合结构指针p来 找到数据域中的最大值。 第一处: p指向形参结构指 针h的next指针,所以应 改为:p=h->next;。 第二处: p指向自己的下一 个结点,所以应改为: p=p->next, ******************* 请编写函数fun, 函数的功 能是: 将M行N列的二维数 组中的数据,按行的顺序依 次放到一维数组中, 一维 数组中数据的个数存放在 形参n所指的存储单元中。 参考答案: void fun(int (*s)[10], int *b, int *n, int mm, int nn) { int i, j, k ; for(i = 0 ; i < mm ; i++) for(j = 0 ; j < nn ; j++) { k = i * nn + j ; b[k] = s[i][j] ; } *n = mm * nn ; } main() { int w[10][10] = {{33,33,33,33},{44,44,4 4,44},{55,55,55,55}},i, j ; int a[100] = {0}, n = 0 ; printf("The matrix:\n") ; for(i = 0 ; i < 3 ; i++) { for(j = 0 ; j < 4 ; j++) printf("%3d",w[i][j]) ; printf("\n") ; } fun(w, a, &n, 3, 4) ; printf("The A array:\n") ; for(i = 0 ; i < n ; i++) printf("%3d",a[i]);prin tf("\n\n") ; NONO() ; } 第14套: 解题思路: 本题主要是考察用函数指 针指向要调用的函数。程序 中共有三处要填上适当的 内容,使程序能运行出正确 的结果。 第一处:定义函数指针的类 型,所以应填:double。 第二处:使f指向函数f1, 所以应填:f1。 第三处:使f指向函数f2, 所以应填:f2。 ******************* 解题思路: 本题是考察如何使用单向 链表把数据域的值按条件 进行累加。 第一处:试题要求不计算头 结点,所以应改为: p=h->next; 第二处:指向p的下一个结 点来实现循环,所以应改 为:p=p->next; *******************请编 写函数fun, 函数的功能是: 判断字符串是否为回文?若 是, 函数返回1,主函数中 输出: YES, 否则返回0, 主函数中输出NO。回文是 指顺读和倒读都一样的字 符串。 参考答案: int fun(char *str) { int i, j = strlen(str) ; for(i = 0 ; i < j / 2 ; i++) if(str[i] != str[j - i - 1]) return 0 ; return 1 ; } main() { char s[N] ; printf("Enter a string: ") ; gets(s) ; printf("\n\n") ; puts(s) ; if(fun(s)) printf(" YES\n") ; else printf(" NO\n") ; NONO() ; } 第15套: 解题思路: 本题是考察如何从指定文件中找出指定学号的学生数据,并进行适当的修改,修改后重新写回到文件中该学生的数据上,即用该学生的新数据覆盖原数据。 第一处:判断读文件是否结束,所以应填:fp。 第二处:从读出的数据中判断是否是指定的学号,其中学号是由形参sno来传递的,所以应填:==。 第三处:从已打开文件fp 中重新定位当前读出的结构位置,所以应填:fp。 ******************* 解题思路: 第一处: 函数应该使用圆括号,所以应改为:n=strlen(aa) ;。 第二处: 变量c没有定义,但后面使用的是ch变量,所以应改为:ch=aa[i];。******************* N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,它的功能是:找出学生的最高分,由函数值返回。 参考答案: double fun( STREC *h ) { double max=h->s; STREC *p; p=h->next; while(p) { if(p->s>max ) max=p->s; p=p->next; } return max; } STREC * creat( double *s) { STREC *h,*p,*q; int i=0; h=p=(STREC*)malloc(size of(STREC));p->s=0; while(i { q=(STREC*)malloc(size of(STREC)); q->s=s[i]; i++; p->next=q; p=q; } p->next=0; return h; } outlist( STREC *h) { STREC *p; p=h->next; printf("head"); do { printf("->%2.0f",p->s );p=p->next;} while(p!=0); printf("\n\n"); } 第16套: 解题思路: 第一处:利用for循环语句 取当前字符串的长度,所以 应填:ss[i]。 第二处:在字符串的右边填 字符*,其开始位置是n+j, 其中n是该字符串本身的 长度,j是循环控制变量, 所以应填:n+j。 第三处:字符串处理结束应 置字符串结束符,其位置是 n+j+1,所以应填:1。 ******************* 解题思路: 第一处:关键字int错写成 INT。 第二处:该行括号没有配 对,所以只要加上一个右括 号即可。 ******************* 请编写函数fun, 对长度为 7个字符的字符串, 除首、 尾字符外,将其余5个字 符按ASCII码降序排列。 参考答案: int fun(char *s,int num) { char ch ; int i, j ; for(i = 1 ; i < 6 ; i++) for(j = i + 1 ; j < 6 ; j++) { if(*(s + i) < *(s + j)) { ch = *(s + j) ; *(s + j) = *(s +i) ; *(s + i) = ch ; } } } 第17套: 解题思路: 本题是对结构体数组中的 姓名按升序进行排列。 第一处:t是一个临时变量, 主要是存放学生数据的结 构变量,所以应填:struct student。 第二处:利用两重for循环 进行排序操作,排序的终止 条件应该是总人数减1,所 以应填: n-1。 第三处:对姓名进行比较大 小,所以应填: a[i].name,a[j].name。 ******************* 解题思路: 第一处:在语句后缺少分 号,所应改为:q=p+i;。 第二处:保留字while写 错,所应改为:while(q>p)。 ******************* 学生的记录由学号和成绩 组成,N名学生的数据已在 主函数中放入结构体数组s 中, 请编写函数fun,它的 功能是:把指定分数范围内 的学生数据放在b所指的 数组中,分数范围内的学生 人数由函数值返回。 参考答案: int fun( STREC *a,STREC *b,int l, int h ) { int i,j = 0 ; for(i = 0 ; i < N ; i++) if(a[i].s >= l && a[i].s <= h) b[j++] = a[i] ; return j ; } 第18套: 解题思路: 第一处:函数中申请了两个 内存空间,其p是存放字母 字符串,t是存放非字母字 符串,根据条件可知,p依 次存放字母字符串,其位置 由j来控制,所以应填: s[i]。 第二处:利用for循环再把 t中的内容依次追加到p 中,其中t的长度为k,所 以应填:k。 第三处:字符串处理好后必须添加字符串结束符,所以应填:'\0'。 ******************* 解题思路: 第一处:判断w指针所指的值是否是结束符,应改为:while(*w)。 第二处:if错写成If。 ******************* 函数fun的功能是:将s所指字符串中ASCII值为奇数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。 参考答案: void fun(char *s, char t[]) { int i, j = 0 ; for(i = 0 ; i < strlen(s); i++) if(s[i] % 2==0) t[j++] = s[i] ; t[j] = 0 ; } 第19套: 解题思路: 本题是利用形参对结构体变量中的值进行修改并通过地址把函数值返回。 第一处:必须定义结构指针返回类型,所以应填:struct student *。 第二处:分别对成绩增加1分,所以应填:a->score[i]。 第三处:返回结构指针a,所以应填:a。 ******************* 解题思路: 第一处: 要求返回字符串的首地址,所以应改为:char *fun(char (*sq)[M])。 第二处: 返回一个由变量 sp控制的字符串指针,所 以应改为:return sp;。 ******************* 函数fun的功能是:将a、 b中的两个两位正整数合并 形成一个新的整数放在 c 中。合并的方式是:将a中 的十位和个位数依次放在 变量c的百位和个位上,b 中的十位和个位数依次放 在变量c的十位和千位上。 参考答案: void fun(int a, int b, long *c) { *c = (b%10)*1000+(a/10)*100+ (b/10)*10+a%10; } 第20套: 解题思路: 第一处:求出N个数的平均 值,所以应填:N。 第二处:利用for循环语 句,把数组x中小于平均值 的数,依次存放到数组y 中,其中位置由变量j来控 制,所以应填:j++。 第三处:i是while循环体 的控制变量,每做一次循环 均要加1。 ******************* 解题思路: 第一处:num初始化错误, 应为:num[k]=0;。 第二处:由于s是指针型变 量,所以应改为: switch(*s)。 ******************* 请编写函数 fun,函数的功 能是求出二维数组周边元 素之和,作为函数值返回。 二维数组中的值在主函数 中赋予。 参考答案: int fun ( int a[M][N] ) { int tot = 0, i, j ; for(i = 0 ; i < N ; i++) { tot += a[0][i] ; tot += a[M-1][i] ; } for(i = 1 ; i < M - 1 ; i++) { tot += a[i][0] ; tot += a[i][N-1] ; } return tot ; } 第21套: 解题思路: 第一处:计算N个数的平均 值,所以应填:s/N。 第二处:利用for循环语 句,把数组x中大于平均值 的数,依次存放到数组y 中,同时把数组x上的该数 置为-1,其中位置由变量j 来控制,所以应填:j++。 第三处:再利用循环把不是 -1的数,依次仍存放到数 组y中,所以应填:-1。 ******************** 解 题思路: 第一处:包含头文件的标识 错误,在include前漏写了 #。 第二处:由于传入的参数是 字符串,所以应为 upfst(char *p)。 ******************* 程序定义了N×N的二维数 组,并在主函数中赋值。请 编写函数fun,函数的功能 是:求出数组周边元素的平 均值并作为函数值返给主 函数中的s。 参考答案: double fun ( int w[][N] ) { int i, j, n=0; double sum=0; for ( i =0; i sum+=w[0][i]+w[N-1][i]; n+=2; } for ( i =1; i { sum +=w[i][0]+w[i][N-1]; n+=2; } return sum/n; } 第22套: 解题思路: 本题要求所求出的数写入 到指定的文件中保存。程序 中共有三处要填上适当的 内容,使程序能运行出正确 的结果。 第一处:int fprintf(FILE *stream, const char *format [,argument, …]); 因此 本处只能填写文件流的变 量fp。 第二处:由于文件打开写操 作,所以必须要关闭,因此, 只能填写关闭文件的函数 fclose(fp)。 第三处:由于本题要把刚写 入文件中的数据重新显示出来,读方式已经给出,但没有给出文件名,所以本处只能写文件名变量fname 或者直接给出文件名"myfile3.dat"。 ******************* 第一处:for循环的终止值应该 第二处:使用临时变量p来保存最小值位置i,所以应改为:p=i;。 ******************* 函数fun的功能是: 将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是: 将a数的十位和个位数依次放在c 数的个位和百位上, b数的十位和个位数依次放在c 数的十位和千位上。 参考答案: void fun(int a, int b, long *c) { *c=(b%10)*1000+(a%10)*1 00+(b/10)*10+(a/10); } 第23套: 解题思路: 第一处:把每列的第1值赋值给b[i],所以应填:a[0][i]。 第二处:如果b[i]值小于a[j][i]的值,则把a[j][i]重新赋值给b[i]中,保存最大的值,所以应填:<。 第三处:在主函数中,x是存放矩阵数据,y是存放每列的最大值,所以应填:x,y。 ******************* 解题思路:第一处:函数形参定义不正 确,在定义第2个形参时, 也应加上int。由于通过该 函数实现两数交换,在C语 言中,必须交换地址中的 值,所以应定义为int *x,int *y。 第二处:要交换地址中的值, 不能交换地址,必须指定地 址中的值,因此应改为 t=*x;*x=*y;*y=t;。 ******************* 编写函数fun, 函数的功能 是求出小于或等于lim的 所有素数并放在aa数组中, 函数返回所求出的素数的 个数。 参考答案: int fun(int lim, int aa[MAX]) { /* 以下代码仅供参考 */ int i,j,k=0; /* 其中变量k用于统计素 数个数 */ for(i=2;i<=lim;i++) { /* 以下完成判断aa数组 中小于或等于lim的素数 并统计个数 */ for(j = 2 ; j <= (i/2) ; j++) if(i % j == 0) break; if(j > (i/2)) aa[k++] = i; } return k; } 第24套: 解题思路: 本题是对结构体变量中的 值进行修改并通过函数值 返回。 第一处:必须定义结构返回 类型,所以应填:struct student。 第二处:对姓名进行修改, 所以应填:https://www.wendangku.net/doc/ee4285735.html,。 第三处:分别对成绩增加1 分,所以应填:a.score[i]。 ******************* 解题思路: 第一处: 条件语句中的小 写p错写成大写P了。 第二处: 删除元素,应该是 后面位置的元素值赋值给 前面的位置上,所以应改 为: a[i]=a[i+1];。 ******************* 学生的记录由学号和成绩 组成,N名学生的数据已在 主函数中放入结构体数组s 中, 请编写函数fun,它的 功能是:把分数最低的学生 数据放在b所指的数组中, 注意:分数最低的学生可能 不止一个,函数返回分数最 低的学生的人数。 参考答案: int fun( STREC *a, STREC *b ) { int i, j = 0, min=a[0].s ; for(i = 0 ; i < N; i++) { if(min > a[i].s) { j = 0 ; b[j++] = a[i] ; min = a[i].s ; } else if(min == a[i].s) b[j++] = a[i] ; } return j ; } 第25套: 解题思路: 本题是要求从给定的人员 数据中找出编号相同的记 录数据。 第一处:从返回值来看,是 返回一个结构型的值,所以 应填:STU。 第二处:判断结构变量中的 编号num是否相等,所以应 填:stu[i].num。 第三处:返回编号相等的记 录值,所以应填:std[i]。 ******************** 解题思路: 第一处:语句后缺少分号。 第二处:判断r的当前字符 是否是字符串结束符,所以 应改为:if(*r==0)。 *******************参考 答案: void fun(char *s, char t[]) { int i, j = 0 ; for(i = 0 ; i < strlen(s); i++) if(s[i] % 2) t[j++] = s[i] ; t[j] = 0 ; } 第26套: 解题思路: 第一处:释放q指针所指的 内存空间,应填q。 第二处:q指针指向p的 next指针,重新完成链接, 应填next。 第三处:两个结点的值不相 同,那么q就指向q的next 指针,应填next。 ******************* 解题思路: 第一处:语句后缺少分号。 第二处:保存最小值的位置,所以应改为:p = i;。******************* 请编写一个函数fun,它的功能是:求出1到m之间(含m)能被7或11整除的所有整数放在数组a中,通过n 返回这些数的个数 参考答案: #include #define M 100 void fun ( int m, int *a , int *n ) { int i ; *n=0 ; for(i=7 ; i<=m; i++) if((i % 7 == 0) || (i % 11 == 0)) a[(*n)++]=i ; } 第27套: 解题思路: 第一处:根据公式可知,累加和变量s,应置0。 第二处:for循环的终止值应为形参n。 第三处:根据公式以及函数体中t变量内容,所以应填:t*t。 *******************解题思路: 第一处:循环for语句中应有分号。 第二处:if错写成If。 ******************* 请编写一个函数fun,它的功能是:根据以下公式求π 的值(要求满足精度0.0005, 即某项小于0.0005时停止迭代): π 1 1×2 1×2×3 1×2×3×4 1×2×…×n ─ = 1+─+─—+────+──────+……+── ────── 2 3 3×5 3×5×7 3×5×7×9 3×5×…×(2n+1) 程序运行后,如果输入精度 0.0005,则程序输出为 3.14…。 参考答案: double fun ( double eps) { double s=1,t=1./3; int n=1; while(t>=eps){ s+=t; n++; t=t*n/(2.0*n+1); } return (s*2.0); } main( ) { double x; printf("Input eps:") ; scanf("%lf",&x); printf("\neps = %lf, PI=%lf\n", x, fun(x)); NONO(); } 第28套: 解题思路: 第一处:在for循环中终止 值要判断字符串是否结束 符,所以应填:s[i]。 第二处:判断是否是数字, 所以应填:'9'。 第三处:字符串中数字字符 出现的次数n,并存放在形 参t所指的变量中,所以应 填:*t=n。 ******************* 解题思路: 第一处:由于x是整型指针 变量,所以地址不能赋值给 整型变量,因此必须取x地 址上的值,所以应改为 t=*x;*x=y;。 第二处:已交换后的值存放 在t中,所以返回值应为 return(t);。 *******************请编 写函数fun,它的功能是: 求出 1 到 1000 之间能被 7 或11整除、但不能同时 被 7 和 11 整除的所有整 数并将它们放在a所指的 数组中,通过 n 返回这些 数的个数。 参考答案: void fun (int *a, int *n) { int i ; *n = 0 ; for(i = 7 ; i < 1000 ; i++) if(((i % 7) == 0 || (i % 11) == 0) && (i % 77) != 0) a[(*n)++] = i ; } 第29套: 解题思路: 本题是对结构体变量中的 值进行修改并通过函数中 的参数进行返回。 第一处:对学号进行更改, 所以应填:->no。 第二处:对姓名进行更改, 所以应填:->name。 第三处:对函数的调用,所 以应填:&t。 ******************* 解题思路: 第一处: 第二个变量定义 的保留字double写错。 第二处: 变量x0错写成xo 了。 ******************* 学生的记录由学号和成绩 组成,N名学生的数据已在 主函数中放入结构体数组s 中, 请编写函数fun,它的 功能是:把高于等于平均分 的学生数据放在b所指的 数组中,高于等于平均分的 学生人数通过形参n传回, 平均分通过函数值返回。 参考答案: double fun( STREC *a, STREC *b, int *n ) { double t=0 ; int i ; *n = 0 ; for(i = 0 ; i < N ; i++) t = t + a[i].s ; t = t / N ; for(i = 0 ; i < N ; i++) if(a[i].s > t) b[(*n)++] = a[i] ; return t ; } 第30套: 解题思路: 本题是对结构体变量中的 值进行修改。 第一处:要修改的结构体变 量是由形参a来传递的,所 以应填:a。 第二处:对结构体中的成员 name进行替换,所以应填: https://www.wendangku.net/doc/ee4285735.html,。 第三处:分别输出结构体中 的成绩,所以应填: score[i]。 *******************解题 思路: 第一处: 新字符串的位置 值是由变量j来控制的,但 程序中字符赋值后没有对j 进行增量的语句,所以应改 为:s[j++]=s[i];。 第二处: 对新字符串添加 字符串结束符,由于程序中 使用变量j对新字符串来控制的,所以应改为:s[j]=0;。 ******************* 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中的前导*号全部移到字符串的尾部。 参考答案: void fun( char *a ) { /* 以下代码仅供参考 */ char *p,*q; int n=0; p=a; while(*p=='*') /* 统计串头'*'个数n */ {n++; p++;} q=a; /* 向前复制字符串,请填写相应的语句完成其功能*/ while(*p) { *q=*p; p++;q++; } for(;n>0;n--) /* 在串尾补n个'*' */ *q++='*'; *q='\0'; } 第31套: 解题思路: 第一处:取外循环的控制变量,所以应填:t=i。 第二处:内循环的起始变量,应该是i+2,所以应填:i。 第三处:新字符串处理完后应添加字符串结束符,所以应填:'\0'。 ******************* 给定程序MODI1.C中函数 fun 的功能是:用下面的公 式求π的近似值,直到最后 一项的绝对值小于指定的 数(参数num )为止: π 1 1 1 ┄┄≈1 - ┄┄ + ┄┄ - ┄┄ + ... 4 3 5 7 解题思路: 第一处:要判断t的最后一 项绝对小于指定的数,由于 t是实数,那么应改为 while(fabs(t)>=num)。 第二处:t是s除以n的值, 而不是取余数,所以应改 t=s/n;。 *******************请编 写一个函数void fun (char a[],char b[],int n),其 功能是:删除一个字符串中 指定下标的字符。其中, a 指向原字符串, 删除指定 字符后的字符串存放在b 所指的数组中,n中存放指 定的下标。 参考答案: void fun (char a[], char b[], int n) { strncpy(b, a, n) ; b[n] = 0 ; strcat(b, a + n + 1) ; } 第32套: 解题思路: 本题是根据给定的字符串 数组中删除串长大于某个 值的右边字符串。 第一处:函数的定义,试题 中已用M作为字符串的长 度,所以应填:M。 第二处:利用while循环, 分别对字符串数组中的每 个字符串置字符串结束符, 程序中已经给定了N个字 符串,所以应填:N。 第三处:置字符串结束符, 所以应填:0(或'\0')。 *******************解题 思路: 第一处: 初始化t的值,根 据程序中的计算程序和试 题的要求得出,t应为1。 第二处: 根据公式π/2得 出,所以返回时应原有s的 基础上乘以2作为返回值。 ******************* 假定输入的字符串中只包 含字母和*号。请编写函数 fun,它的功能是:使字符 串的前导*号不得多于n个; 若多于n个,则删除多余的 *号; 若少于或等于n个, 则什么也不做,字符串中间 和尾部的*号不删除。 参考答案: void fun( char *a, int n ) { /* 以下代码仅供参考 */ int i=0,j,k=0; while(a[k]=='*') k++; /* k为统计*字符个数 */ if(k>n) { i=n;j=k; /* 以下完成将下标为k至 串尾的字符前移k-n个位 置 */ for(; a[j] !=0 ; j++) a[i++]=a[j]; a[i] = 0; } } 第33套: 解题思路: 本题要求是把一个文件中 的内容复制到另一个文件 中。程序中共有三处要填上 适当的内容,使程序能运行 出正确的结果。 第一处:要求打开一个读方 式的源文件,因此可以填上 "r"或"r+"。打开读文件操 作的流是fs。 第二处:用while循环来判 断源文件是否已读到文件 结束符,int feof(FILE *stream),因此,此处只能 填写fs。 第三处:把已经读取的字符 写入目标文件中,打开写文 件操作的流是ft,因此, 此处只能填写ft。 *******************解题 思路: 第一处:判断相等的条件是 ==。 第二处:整除的符号是/。 *******************函数 fun的功能是:将两个两位 数的正整数a、b合并形成 一个整数放在c中。 合并的方式是:将a数的十 位和个位数依次放在c数 的十位和千位上,b数的十 位和个位数依次放在c数 的百位和个位上。 参考答案: void fun(int a, int b, long *c) { *c=(a%10)*1000+(b/10)*1 00+(a/10)*10+(b%10); } 第34套: 解题思路: 第一处:所有2的倍数的数 从数表中删去,所以应填:a[i]。 第二处:找出下一个不是的a[i],所以应填:a[i]。 第三处:输出素数,只要判断a[i]不是0就是素数,所以应填:0。 *******************解题思路: 第一处:变量y错写成Y。第二处:给变量d进行赋值,所以应改为:d=a-i;。************* 请编写函数fun, 它的功能是:计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和。 参考答案: double fun(int n) { int i; double sum=0.0; for(i=1; i<=n; i++) if(i%5 == 0 || i%9 == 0) /* 被5或9整除 */ sum+=1.0/i; return sum; } 第35套: 解题思路: 第一处:建立一个N×N的矩阵,所以应填:[N]。 第二处:j的起始变量值应i。 第三处:也应该填写i+1。*******************解题思路: 第一处:应该取模而不是整除,所以应为:aa[i]=m%k;。第二处:输出aa的位置不正确,所以应为:printf("%d",aa[i-1]);。*******************编写一个函数,从num个字符串 中找出最长的一个字符串, 并通过形参指针max传回 该串地址。(注意: 主函数 中用****作为结束输入的 标志,函数fun中给出的语 句仅供参考。) 参考答案: fun(char(*a)[81],int num,char **max) { /* 以下代码仅供参考 */ int i,k=0,maxlen; /* k 为a数组中最长串所在元 素的下标,初始为0,maxlen 为其串长 */ maxlen=strlen(a[k]); for(i=1;i { /* 以下完成查找最长串 */ if(strlen(a[i]) > maxlen) { maxlen = strlen(a[i]) ; k = i ; } } *max=a[k]; } 第36套: 解题思路: 本题是要求统计出带有头 结点的单向链表中结点的 个数。 第一处:对n所指的存储单 元进行初始化,所以应填: *n。 第二处:指向p的下一个结 点,所以应填:next。 第三处:函数调用,在主函 数中已经给出了head,所 以应填:head。 *******************解题 思路: 第一处:指向空指针错误, Null应NULL。 第二处:比较指针位置的值 是否相等,所以应改为: if(*r==*p)。 *******************函数 fun的功能是:将s所指 字符串中除了下标为偶数、 同时ASCII值也为偶数的 字符外,其余的全都删除; 串中剩余字符所形成的一 个新串放在t所指的数组 中。 参考答案: void fun(char *s, char t[]) { int i, j = 0 ; for(i = 0 ; i < strlen(s) ; i += 2) if(s[i] % 2 == 0) t[j++] = s[i] ; t[j] = 0 ; } 第37套: 解题思路: 本题是根据给定的字符串 数组中查找指定的字符串, 如果存在,则显示。 第一处:利用for循环,从 几个字符串中进行查找,程 序中已经给定了N个字符 串,所以应填:N。 第二处:查找子串,子串由 形参substr传递,所以应 填:substr。 第三处:试题要求,若没有 找到,函数值为0,所以应 填:0。 *******************解题 思路: 第一处: 函数中形参的定 义不正确,应改为:fun(int x,int y, int z)。 第二处: 程序中三个数的 最小公倍数是用j处理的, 所以应返回j的值。 *******************假定 输入的字符串中只包含字 母和*号。请编写函数fun, 它的功能是:只删除字符串 前导和尾部的*号,串中字 母之间的*号都不删除。形 参n给出了字符串的长度, 形参h给出了字符串中前 导*号的个数,形参e给出 了字符串中最后*号的个 数。在编写函数时,不得使 用C语言提供的字符串函 数。 参考答案: void fun( char *a, int n,int h,int e ) { char *p=a ; int j=0,len=0; while(*p) {p++; len++;} while(j a[j]=a[h+j]; j++; } a[j]=0; } 第38套: 解题思路: 第一处:判断a[i]是否是 奇数,若是,则仍保留在原 数组中a[j],所以应填:1。 第二处:数组a中的元素位 置由j来控制,每增加一个 元素,则j加1,所以应填: j++。 第三处:返回删除偶数后a 所指数组中数据的元素j, 所以应填:j。 ******************* 解题思路: 第一处:交换值的次序有问题,所以应改为:t=a;a=b;b=t;。 第二处:返回值错误,应改为:return(b);。 ******************* 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。 参考答案: void fun( char *a ) { int j =0 ; char *p=a; while(*p) { if(*p != '*') a[j++]=*p ; p++ ; } a[j]=0; } 第39套: 解题思路: 本题是根据给定的字符串数组中删除串长大于某个值的字符串。 第一处:利用for循环,从几个字符串中进行查找,程序中已经给定了N个字符串,所以应填:N。 第二处:串长由形参k来传递,所以应填:k。 第三处:如果字符串ss[i]的串长小于k,则该字符串仍存在原字符串数组中,位置由变量j 来控制,所以应填:ss[i]。 ******************* 解题思路: 第一处: 存放字符串初始 位置也是从0开始存放的, 由于k是控制c字符串的位 置值,所以k应为0。 第二处: 判断两个字符串 中是否有字符串结束符产 生,所以应改为:while( *p || *q ),而不是两字符串 中对应位置的值不相等。 ******************* 假定输入的字符串中只包 含字母和*号。请编写函数 fun,它的功能是:除了字符 串前导的*号之外,将串中 其它*号全部删除。在编写 函数时,不得使用C语言提 供的字符串函数。函数fun 中给出的语句仅供参考。 参考答案: void fun( char *a ) { /* 以下代码仅供参考 */ int i=0,k; while(a[i]=='*') i++; k=i; while(a[i]!='\0') /* 以 下程序段实现非*字符前移 */ { if(a[i] != '*') a[k++]=a[i]; i++; } a[k]='\0'; } 第40套: 解题思路: 本题是要求在一个有序的 链表中插入一个数,插入后 各结点仍然是有序的。程序 中共有三处要填上适当的 内容,使程序能运行出正确 的结果。 第一处:因此应填x。 第二处:因此,此处应填s。 ******************* 解题思路: 第一处:由于在k定义时没 有赋初值,所以k是一个随 机数,根据试题要求,k应 赋值为1。 第二处:整除的符号是/。 ******************* 请编写一个函数fun,它的 功能是:计算n门课程的平 均分,计算结果作为函数值 返回。 参考答案: float fun ( float *a , int n ) { int i; float ave=0.0; for(i=0; i ave=ave+a[i] ; ave=ave/n; return ave; } 第41套: 解题思路: 第一处:计算好的平均值通 过形参av返回,所以应填: *av。 第二处:计算小于平均值且 最接近平均值的位置j,所 以应填:i。 第三处:返回该数,所以应 填:x[j]。 ******************* 解题思路: 第一处:函数的返回是浮点 型数,所以应改为:float fun(int n)。 第二处:for的终止条件应 是i<=n。 ******************* 程序定义了N×N的二维数 组,并在主函数中自动赋 值。请编写函数fun,函数 的功能是:使数组右上三角 元素中的值乘以m 。 参考答案: int fun ( int a[][N], int m ) { int i, j; for(i = 0 ; i < N ; i++) for(j = i ; j < N ; j++) a[i][j] *= m ; } 第42套: 解题思路: t2是存放数字字符串,t1 是存放非数字字符串。 第一处:t2存放数字字符 串的位置是由j来控制的, 每添加一个,j必须加1, 所以应填:j++。 第二处:利用for循环把 t1字符串添加到原字符串 s中,所以应填: s[i]=t1[i]。 第三处:利用for循环把 t2字符串添加到原字符串 s的尾部,其中数字字符串 的长度为j,所以应填:j。 ******************* 解题思路: 第一处:for循环语句中缺 少分号。 第二处:应该把pstr+j位 置上的值赋值给*(pstr+i) 上,所以应改为: *(pstr+i)=*(pstr+j);。 ******************* 请 编写函数fun,它的功能是: 求出ss所指字符串中指定 字符的个数,并返回此值。 参考答案: int fun(char *ss, char c) { int cnt = 0 ; char *p = ss ; while(*p) { if(*p == c) cnt++ ; p++ ; } return cnt ; } 第43套:解题 思路:本题是考察在字符 串查找指定的子串。第一处:利用for循环,从几个 字符串中进行查找,程序中 已经给定了N个字符串,所 以应填:N。第二处:在字 符串已经找到,则返回字符 串数组中的位置(下标值),所以应填:i。第三处:如 果没有发现,则显示没有找 到信息,所以应填:-1。 *******************解题 思路:第一处: 取当前变 量k的十位数字上的数,所 以应改为:a2=k/10;。第 二处: 要求统计个数并存 入变量i中,最后返回i, 所以应改为:return i;。 *******************假定 输入的字符串中只包含字 母和*号。请编写函数fun,它的功能是:将字符串尾部 的*号全部删除,前面和中 间的*号不删除。参考答案: void fun( char *a ) { char *p = a ; while(*p) p++ ; p-- ; while(*p == '*') p-- ; p++ ; *p = 0 ; } 第44套:函数fun的功能 是进行数字字符转换。若形 参ch中是数字字符'0'~ '9', 则'0'转换成'9','1' 转换解题思路:第一处: 要求返回处理好的字符,所 以应填:char。第二处: 判断该字符是否是数字,所 以应填:ch<='9'。第三处:只要减去'0'的ASCII值,即可得到要求的结果,所以 应填:'0'。 ******************* 解 题思路:第一处:把指针 p所指的值赋值给b[k]中。 第二处:把空格字符赋值给 b[k++]中,而不是一个空格 的字符串。 ******************* N名 学生的成绩已在主函数中 放入一个带头节点的链表 结构中,h指向链表的头节 点。请编写函数fun,它的 功能是:求出平均分,由函 数值返回。参考答案: #include #include double fun( STREC *h ) { STREC *p=h->next; /* 由于头结点中没有存放数 据 */ double av=0.0; /* 对计算成绩平均值的变量 进行初始化 */ int n = 0 ; while(p!=NULL) { /* 判断 链表是否结束 */ av = av + p->s ; /* 对成绩进行累加 */ p=p->next; /* 到下一 个结点位置 */ n++; /* 人 数加1 */ } av /= n ; /* 计算成绩平均值*/ return av ; /* 返回成绩 平均值 */ } 第45套: 解题思路:第一处:判断 a[i]是否是偶数,若是,则 仍保留在原数组中a[j], 所以应填:a[i] % 2。第 二处:数组a中的元素位置 由j来控制,每增加一个元 素,则j加1,所以应填: a[j]。第三处:返回删除 奇数后a所指数组中数据 的元素j,所以应填:j。 ******************* 解 题思路:第一处:形参n 没有定义类型,所以应改 为:fun (int n)。第二处: 判断相等的符号是==。 ******************* 假 定输入的字符串中只包含 字母和*号。请编写函数 fun,它的功能是:使字符 串中尾部的*号不得多于n 个;若多于n个,则删除多 余的*号;若少于或等于n 个,则什么也不做, 字符串 中间和前面的*号不删除。 参考答案: void fun( char *a,int n ) { char *p=a ; int j=0; while(*p) p++; p--; /* 字符串的长度 */ while(*p == '*') p--; /* 字符串右的'*' */ p++; while(j j++; } *p = 0 ; } 第 46套:解题思路:本题 是按字符串的长短进行排 序。第一处:外循环每循 环一次,k应保存当前的i 值,所以应填:i。第二处: 使用内循环对i+1后面的 字符串长度进行比较,所以 应填:ps[j]。第三处:交 换内容,所以应填:tp。 ******************* 解 题思路:第一处:由于函 数返回是实数,所以必须定 义返回的类型,只有整型或 无结果返回可以忽略,其他 必须定义返回的类型,所以 要在此行前加上double或 float。第二处:该行缺少 分号。 *******************编写 函数fun,它的功能是计算 下列级数和,和值由函数值 返回。参考答案: #include #include jc(int n) { long s = 1 ; int i ; for(i = 1 ; i <= n ; i++) s *= i ; return s ; } double fun(double x , int n) { double s = 1.0, y = x ; int i ; for(i = 1 ; i <= n ; i++) { s += y / (double)jc(i) ; y *= x ; } return s ; } 第47套: 解题思路:本题是找出字 符串中出现频率最高的字 母并统计出其次数。第一 处:将当前字母转换为小写 字母,所以应填:*s。第 二处:把该字母出现的个数 累加到指定的数组中,所以 应填:1。第三处:如果当 前该字母出现次数大于最 大次数max,那么把该次数 赋值给max,所以应填: k[n]。 ******************* 解 题思路:第一处:由于函 数返回是实数,所以必须定 义返回的类型,只有整型或 无结果返回可以忽略,其他 必须定义返回的类型,所以 要在此行前加上double或 float。第二处:缺少分号。 *******************编写 函数fun,它的功能是:计 算并输出下列级数和: 1 1 1 S = ── + ── + … + ───1×2 2×3 n(n+1) 参考答案:double fun( int n ) { double s = 0.0 ; int i ; for(i = 1 ; i <= n ; i++) s = s + 1.0 / (i * (i + 1)) ; return s ; } 第48套:解题思 路:本题是把字符串中是 数字字符转换成对应的数 值并进行累加。第一处: '0'字符对应的ASCII值是 48,因此数字字符转换成对 应数值时只要减去48,即 是该数字字符对应的数值, 所以应填:48。第二处: 到字符串下一个位置,所以 应填:s++。第三处:返回 累加和sum,所以应填:sum。******************* 解 题思路:第一处:判断相 等的条件是==,而不是=, 所以只能在比较处再添加 一个=。第二处:经过编译 可知,"{"和"}"没有配对, 所以在横线处加上"}"。 ******************* 编 写函数fun,它的功能是: 求小于形参n同时能被3与 7整除的所有自然数之和的 平方根,并作为函数值返回。参考答案: double fun( int n) { double sum=0.0; int i; for(i=21; i<=n; i++) if((i % 3==0) && (i % 7==0)) sum+=i; return sqrt(sum) ; } 第49套:解题思路:本 题是根据条件组成新的字 符串并统计出符合条件的 个数n。第一处:把符合 条件的当前字符存放到t 字符串中,所以应填:*s。 第二处:到字符串下一个位置,所以应填:s++。第三处:返回符合条件的字符个 数n,所以应填:n。 *******************解题 思路:第一处:两种类型 变量定义之间应该用分号, 所以应改为:int j, c=0; float xa=0.;。第二处: 在C语言中,大于等于应表 达为>=。 *******************编写 函数fun,其功能是:根据以下公式求P的值,结果由 函数值带回。m与n 为两个 正整数且要求m > n。 m! P = ─── n!(m-n)! 参考 答案:#include { long s=1; int i ; for(i=1;i<=m;i++) s=s*i ; return s; } float fun(int m, int n) { float p; p=1.0*jc(m)/jc(n)/jc(m- n) ; return p; } 第50 套:解题思路:第一处: 形参t的定义,整数数组其 宽度为N,所以应填:[N]。 第二处:对称元素相加,其 结果仍存放在左下三角元 素中,所以应填:t[i][j]。 第三处:右上三角元素置为 0,所以应填:t[j][i]。 *******************解题 思路:第一处:define定 义错误,所以应改为: #define FU(m,n) ((m)/(n))。第二处: return错写成Return,变 量value错写成Value。 *******************规定 输入的字符串中只包含字 母和*号。请编写函数fun, 它的功能是:将字符串中的 前导*号全部删除,中间和 尾部的*号不删除。参考答 案: void fun( char *a ) { int j=0; char *p = a ; while(*p == '*') p++ ; while(*p) { a[j++] = *p ; p++; } a[j]=0 ; } 第 51套:解题思路:本题 是统计字符串中包含的单 词个数。第一处:单词个 数用变量n来统计,当当前 字母不是空格且flag状态 标志为0时,则单词数就加 1,将状态标志flag置为1, 所以应填:n++。第二处: 当当前字符是空格时,flag 状态标志置0,所以应填: 0。第三处:到字符串下一 个位置,所以应填:s++。 ******************* 解 题思路:第一处:应求累 加和,而不赋值,所以应改 为t+=s[k];。第二处:ave 不需要取地址,直接赋给 *aver就可以了。 *******************请编 写函数fun,其功能是求出 数组的最大元素在数组中 的下标并存放在k所指的 存储单元中。参考答案: int fun(int *s, int t, int *k) { int i, pos = 0, max = *s ; for(i = 1 ; i < t ; i++) { if(max < *(s + i)) { max = *(s + i) ; pos = i ; } } *k = pos ; } 第52套:解题思路:第 一处:函数fun是对N×N 矩阵进行操作,for循环的 终止值为N。第二处:把 最后一列的元素值赋值给 临时变量x保存用来交换, 所以应填:N-1。第三处: 第1列元素值使用x替换, 由于C语言的下标是从0开 始的,所以应填:0。 ******************* 解 题思路:第一处:如果两 个整数类型相除,结果仍为 整数,所以必须转换其中一 个数的类型,所以应改为: s+=(float)(n+1)/n;。第 二处:返回结果错误,应改 为:return t;。 ******************* 编 写函数fun,它的功能是: 求Fibonacci数列中大于t 的最小的一个数,结果由函 数返回。其中Fibonacci数 列F(n)的定义为: F(0)= 0,F(1)=1 F(n)=F(n-1) +F(n-2) 参考答案: int fun( int t) { int f0 = 0, f1 = 1, f ; do { f = f0 + f1 ; f0 = f1 ; f1 = f ; } while(f < t) ; return f ; } 第53套:解题思路:第 一处:根据公式可知,变量 t的值为x。第二处:根据 公式可知,此处应该除以n, 所以应填:n。第三处:根 据试题中条件的要求,所以 应填:fabs(t)。 ******************* 解 题思路:第一处:错误在 for循环语句上,根据试题 要求,终止条件应该是 i<=y。第二处:要取低3 位的值时,应模1000取余 数,而不是整除1000取商。 ******************** 例 如, 在主函数中从键盘给x 输入0.21后,输出 为:s=1.100000。double fun(double x) { int n=1; /* 循环计数*/ double sn=1; /* 累计数*/ double xn=1,xn1=0; /*x的n值, 以及x的n-1值;*/ while(fabs(xn-xn1)>=0.0 00001)/*绝对值是否满足 条件*/ { xn=xn*x*(0.5-n+1)/n; /*表达式分解以后 xn=(xn-1)*x*(0.5-n+1)/n */ n+=1; sn+=xn; /*sn累 加上xn*/ } return(sn); } 第54套:解题思路:本 题是计算出带有头结点的 单向链表中各结点数据域 中值之和。第一处:累加 数据域中的值,所以应填:data。第二处:指定p的下一个指针,所以应填:next。第三处:函数调用,在主函数中已经给出了head,所以应填:head。*******************解题思路:第一处:判断字符串当前字符是否是字符串结束符,所以应改为:while(*r)。第二处:语句后缺少分号。******************* 函数fun的功能是:将s所指字符串中下标为偶数的字符删除,串中剩余字符形成的新串放在t所指数组中。参考答案: void fun(char *s, char t[]) { int i, j = 0 ; for(i = 1 ; i < strlen(s); i+=2) t[j++] = s[i] ; t[j] = 0 ; } 第55套:解题思路:本题是判断字符串是否是“回文”。第一处:根据函数体fun中,对变量lp的使用可知,lp应指向形参s,所以应填:s。第二处:rp 是指向字符串的尾指针,当每做一次循环rp指向就要指向前一个字符,所以应填:--。第三处:当lp和rp相等时,则表示字符串是回文并返回1,否则就返回0,所以应填:return 0。******************* 解题思路:第一处:由于计算的实型值要通过函数返回,所以必须定义函数的返回类型,只要int或void 可以省略,其他都要定义类型。由于返回是实型值,所以应在数名前加上double 或float等定义。第二处:根据公式可知,在for循环 内b的值应是c。 ******************* 请 编写函数fun,函数的功能 是:将大于形参m且紧靠m 的k个素数存入xx所指的 数组中。参考答案: void fun(int m, int k, int xx[]) { /* 以下代码仅供 参考 */ int i, j=1, t=m+1; while(j<=k) { /* 以下完 成判断素数,并存放到数组 xx中 */ for(i = 2 ; i < t; i++) if(t % i==0) break; if(i==t) { xx[j-1] = i; j++; } t++; } } } 第56套:解题思路:本 题要求是把键盘上输入的 内容写到指定的文件中。程 序中共有三处要填上适当 的内容,使程序能运行出正 确的结果。第一处:要求 填写文件流的自变量名,在 这个函数中,已有的语句 fputs("\n",fw);分析可 知:由于文件流变量fw在 函数体没有定义过,所以本 处应填*fw或fw[]。第二 处:通过while循环语句, 把键盘上输入的内容,要写 入到指定的文件中,键盘上 输入的内容已存入字符串 str变量中,因此,本处应 填写str。第三处:要把 已存入文件中的内容,再从 文件中读出且已存入字符 串变量str中,最后在屏幕 显示出来,因此,此处应填 写str。 ******************* 解 题思路:第一处:在函数 fun中使用了*t,但在函数 定义时没有使用*t,所以应 改为:void fun(long s,long *t)。第二处:每 循环一次,sl的值就乘以 10,所以应改为: sl=sl*10;。************* 函数fun的功能是:将两个 两位数的正整数a、b合并 形成一个整数放在c中。 合并的方式是:将a数的十 位和个位数依次放在c数 的个位和百位上, b数的 十位和个位数依次放在c 数的千位和十位上。参考 答案: void fun(int a, int b, long *c) { *c=(b/10)*1000+(a%10) *100+(b%10)*10+(a/10); } 第57套:解题思路:第 一处:外循环每循环一次均 把数组a当前位置的值,分 别赋值给max和min变量, 所以应填: a[i]。第二处: 判断max是否小于a[j], 若小于,则把a[j]赋值给 max,所以应填:a[j]。第 三处:判断min是否大于 a[j],若大于,则把a[j] 赋值给min,所以应填: a[j]。************* 解题 思路:第一处:switch后 有多余的分号。第二处: case 1后没有返回语句, 也应该为return 1;。所以 应改为:case 1: return 1; case 2:return 1;。 ************* 某学生的 记录由学号、8门课程成绩 和平均分组成,学号和8门 课程的成绩已在主函数中 给出。请编写函数fun,它 的功能是:求出该学生的平 均分放在记录的ave成员 中。参考答案:void fun(STREC *a) { int i ; for(i = 0 ; i < N ; i++) a->ave = a->ave + a->s[i] ; a->ave /= N ; } 第58套:解题思路:本 题是根据要求来复制字符 串。第一处:当给定的长 度n大于该字符串s的长 度,那么把该字符串直接拷 贝到t就可以了,所以应 填:t,s。第二处:使用 for循环语句,把最右边n 个字符依次添加到t中,所 以应填:s[i]。第三处: 字符串操作结束,需要到t 加一个字符串结束符,所以 应填:'\0'。************* 解题思路:第一处:判断 素数的条件是一个数i除 自身或1除外不被任何数k 整除的数,如果一个数i被 另一个数k取模,模值等于 零,那么这个不是素数并退 出循环体,所以应改为 if(i%k==0)。第二处:如 果i不被循环中任一个k值 不整除,那么循环结束后k 的值应该等于i,所以应改 为if(k==i)或if(k>=i)也 可以。************* 请编 写函数fun,它的功能是: 求出能整除形参x且不是 偶数的各整数,并按从小到 大的顺序放在pp所指的数 组中,这些除数的个数通过 形参n返回。参考答案: void fun ( int x, int pp[], int *n ) { int i; *n=0; for(i=1; i <= x; i++) if((x % i== 0) && (i % 2)) pp[(*n)++]=i; } 第59 套:解题思路:本题是在 矩阵中找出在行上最大、在 列上最小的那个元素。第 一处:找出行上最大的数, 并该位置j(列)保存在c 中,所以应填:j。第二处:使用while循环语句和控制变量find,如果该数不是列是最小数,那么把find 置0,所以应填:0。第三处:i是while的控制变量,所以每做一次循环,该数均要加1,所以应填:i++。 ************ 解题思路:第一处:使用for循环计算公式,必须计算到m,所以应改为for(i=2; i<=m; i++)。第二处:在除法运算中,如果除数和被除数都是整数,所么所除结果也是整数,因此应改为y-=1./(i*i)。*********************** m个人的成绩存放在score 数组中,请编写函数fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。参考答案:int fun(int score[], int m, int below[]) { float av=0.0 ; int i, j=0 ; for(i=0; i below[j++]=score[i]; return j; } 第60套:解题思路:本题是要求对结构体数组中的三个元素按num成员升序排列。第一处:由于在函数体fun 中,已经使用了std变量,所以应填:*std。第二处:由于temp是存放交换记录的中间变量,所以应填:PERSON。第三处:函数的调用,所以应填:std。*******************解题思路:第一处:保留字int 错写成Int。第二处:字 符数组的字符串书写格式 错误。 ******************* 程 序定义了N×N的二维数 组,并在主函数中自动赋 值。请编写函数fun( int a[][N]),函数的功能是: 使数组左下三角元素中的 值全部置成0 。参考答案: int fun ( int a[][N] ) { int i, j; for(i = 0 ; i < N ; i++) for(j = 0 ; j <= i; j++) a[i][j] = 0 ; } 第61套:解题思路:第 一处:判断形参ch是否是 小写字母,所以应填:&&。 第二处:小写字母与大写字 母的ASCII值相差为32, 所以应填:'A'或65。第 三处:返回处理后的形参 ch,所以应填:ch。 ******************* 解 题思路:第一处:在函数 fun体中,a是一个整型数 组,所以形参a应定义为指 针型整数变量。第二处: 变量书写错误,aa应为a。 *******************请编 写一个函数fun, 它的功能 是: 计算并输出给定整数n 的所有因子(不包括1与n 自身)之和。规定n的值不 大于1000。参考答案: int fun(int n) { int s = 0, i ; for(i = 2 ; i < n ; i++) if(n % i == 0) s +=i ; return s ; } 第62套: 解题思路:第一处:首先 判断字符串的长度是奇数 还是偶数,如果是奇数,则 k=n-1,所以应填:1。第 二处:取字符串最后一个奇 数位的字符,并由变量c保 存,所以应填:s[k]。第 三处:第1位奇数位用最一 个奇数位字符替换,所以应 填:c。 ************* 解题思路: 第一处:根据for循环计算 t的值可知,变量t的初值 不正确,应为0。第二处: 每次循环都是取t除以10 的值,而不是取余数,所以 应改t=t/10;。 ******************* 请 编写一个函数void fun(char *tt, int pp[]), 统计在tt所指字符串中 'a' 到 'z' 26个小写字母 各自出现的次数,并依次放 在pp所指数组中。参考答 案: void fun(char *tt, int pp[]) { char *p = tt ; int i ; for(i = 0 ; i < 26 ; i++) pp[i] = 0 ; while(*p) { if(*p >= 'a' && *p <= 'z') pp[*p - 'a'] += 1 ; p++ ; } } 第63套:解 题思路:第一处:for循 环变量的增量,所以应填: i++。第二处:由于右移m 个位置,所以应填:m。第 三处:左边m列均置于0, 所以for循环的终止值应 为m。************* 解题 思路:第一处:括号没有 匹配。Error: While statement missing ) in function fun 在函数fun 中While语句缺少)。第二 处:缺少分号。Error: Break statement missing ; in function fun 在函数 fun中break语句缺少;。 这种题型只要通过编译即 可发现程序的错误所在。 ************* 编写函数 fun,它的功能是:利用以 下所示的简单迭代方法求 方程:cos(x)-x=0 的一个 实根。迭代步骤如下:(1) 取 x1 初值为0.0;(2) x0 = x1,把x1的值赋给 x0;(3)x1 = cos(x0), 求出一个新的x1;(4) 若x0 - x1的绝对值小于 0.000001,执行步骤(5), 否则执行步骤(2);(5) 所求x1就是方程 cos(x)-x=0 的一个实根, 作为函数值返回。程序将 输出结果Root=0.739085。 参考答案: float fun() { float x0, x1=0.0; do { x0=x1; x1=cos(x0); } while(fabs(x0-x1)>0.000 001); return x1; } 第 64套:解题思路:第一 处:外循环p的终止变量的 值,试题要求第k列左移, 所以应填:k。第二处:矩 阵共N列,所以应填:N-1。 第三处:把存放在临时变量 temp中的值,放到 a[i][N-1]中,所以应填: temp。 *******************解题 思路:第一处:在函数体 fun中可知,a是一个字符 串数组型变量,所以应改 为:fun(int a[][M], int m)。第二处:根据输出的 结果可知,应改为: a[j][k]=(k+1)*(j+1);。 *******************函数 fun的功能是:将a、b中 的两个两位正整数合并形 成一个新的整数放在c 中。 合并的方式是:将a中的十 位和个位数依次放在变量c 的十位和千位上,b中的十 位和个位数依次放在变量c 的个位和百位上。参考答案: void fun(int a, int b, long *c) { *c=(a%10)*1000+(b%10) *100+(a/10)*10+(b/10); } 第65套:解题思路:第 一处:变量k在函数体fun 中已经使用,所以应填:k。 第二处:共N行,所以应填:N。第三处:变量值交换, 所以应填:a[k][i]。 *******************解题 思路:第一处:外for循 环的初始值应是strlen(t)-1。第二处:由 于是按升序排序,所以应 if(t[j]>t[j+1])。 ******************* 请 编写一个函数fun, 其功能是: 将ss所指字符串中所 有下标为奇数位置上的字 母转换为大写(若该位置上 不是字母, 则不转换)。void fun( char *ss ) { char *p = ss ; int i = 0 ; while(*p) { if((i % 2) && (*p >= 'a' && *p <= 'z')) *p -= 32 ; p++ ; i++ ; } return ss ; } 第 66套:解题思路:本题 是从结构体中找出年龄最 大的记录。第一处:给存 放最大者max赋初值,所以 应填:*std。第二处:当 前最大者的年龄和结构中 所有的年龄进行比较,所以 应填:std[i].age。第三处:输出最大者的姓名和年龄,所以应填:https://www.wendangku.net/doc/ee4285735.html,。 ******************* 解 题思路:第一处:函数形 参定义不正确,在定义第2个形参时,也应加上int。 由于通过该函数实现两数 交换,在C语言中,必须交 换地址中的值,所以应定义 为int *a,int *b。第二 处:要交换地址中的值,不 能交换地址,必须指定地址 中的值,因此应改为 t=*b;*b=*a;*a=t;。 ******************* 请 编一个函数void fun(int tt[M][N ], int pp[N]), tt指向一个M行N列的二 维数组,求出二维数组每列 中最小元素,并依次放入 pp所指一维数组中。二维 数组中的数已在主函数中 赋予。参考答案: void fun ( int tt[M][N], int pp[N] ) { int i,j, min, k ; for(i = 0 ; i < N ; i++) { min = tt[0][i] ; k = 0 ; for(j = 1 ; j < M ; j++) if(min > tt[j][i]) { \TAB min=tt[j][i] ; k = j ; } pp[i] = tt[k][i] ; } } 第67套:解题思路:第 一处:一共产生20个随机 数,所以应填:N。第二处: 要求产生不同的20个整 数,所以采用for循环对已 产生的随机数进行比较,是 否有相同数,如果有相同, 则退出循环体,所以应填: break。第三处:当退出循 环体还是进行判断,i和n 的值是否相等,如果相等, 则表示该随机整数不重复, 可以存放到指定的数组中, 所以应填:n。 *******************解题 思路:第一处:变量sum 进行初始化,由于计算累加 和,所以应为:sum=0;。第 二处:读入整型数,应使用 地址读入,所以应为: scanf("%d",&a[i][j]);。 ******************* 编 写程序, 实现矩阵(3行3 列)的转置(即行列互换) 参考答案: int fun(int array[3][3]) { int i,j,arr[3][3] ; memcpy(arr, array, 9*sizeof(int)) ; for(i = 0 ; i < 3 ; i++) for(j = 0 ; j < 3 ; j++) array[i][j] = arr[j][i] ; } 第68套: 解题思路:第一处:形参 ss的定义,它是一个字符 串数组的定义,其宽度为N, 所以应填:N。第二处:取 第一个字符串的长度赋值 给变量*n,所以应填:len。 第三处:每循环一次,判断 当前字符串的长度是否大 于*n,如果大于,则*n=len。 *******************解题 思路:第一处:在此变量 k没有定义过,再根据公式 和for循环语句中所用的 变量可知,这里的k实际上 是i。第二处:应是返回 公式的值,函数中公式的值 是存放在临时变量t中,所 以应填return t;。 *******************编写 一个函数,该函数可以统计 一个长度为2的字符串在 另一个字符串中出现的次 数。例如,假定输入的字符 串为: asd asasdfg asd as zx67 asd mklo,子字符串 为:as,则应输出6。参考 答案:int fun(char *str,char *substr) { int cnt = 0 ; char *p = str, *q ; while(*p) { q = strstr(p, substr) ; if(q == NULL) break; p = q + strlen(substr) ; cnt++ ; } return cnt ; } main() { char str[81],substr[3]; int n; printf("输入主字 符串: "); gets(str); printf("输入子字符串: "); gets(substr); puts(str); puts(substr); n=fun(str,substr); printf("n=%d\n",n); NONO(); } 第69套:解 题思路:第一处:数字字 符与其对应的数值相差48, 所以应填:48。第二处: 到字符串下一个位置,所以 应填:s++。第三处:返回 两个数字字符串经转换成 数值的和,所以应填: ctod(a)+ctod(b)。 *******************解题 思路:第一处:在等式右 边应写*a。第二处:在等 式右边应写*b。 *******************请编 一个函数fun,函数的功能 是使实型数保留2位小数, 并对第三位进行四舍五入 (规定实型数为正数)。参 考答案:float fun ( float h ) { long w ; w = h * 100 + 0.5 ; return (float) w / 100 ; } 第 70套:解题思路:第一 处:计算平均值时,需对变 量av进行初始化为0。第 二处:利用for循环计算其 平均值,所以应填:x[i]/N。 第三处:把数组x中元素值 大于平均值的数依次存放 到形参y所指的数组中其 中位置由变量j 来控制, 所以应填:j++。 *******************解题 思路:第一处:由于计算 的实型值要通过函数返回, 所以必须定义函数的返回 类型,只要int或void 可 以省略,其他都要定义类型。由于返回是实型值,所 以应在数名前加上double 等定义。如果使用float则 精度不够,所以在这里不能 使用float定义。第二处:在for循环中,两个“;” 不可省略,在此把“;”错 写成“,”。 *******************已知 学生的记录由学号和学习 成绩构成,N名学生的数据 已存入a结构体数组中。请 编写函数 fun,函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。 参考答案: fun( STU a[], STU *s ) { int i, min = a[0].s, j = 0; for(i = 1 ; i < N ; i++) if(min > a[i].s) { /* 如果最低分min仍大于当前分 */ j = i ; /* 记住位置*/ min = a[i].s ; /* 把当前分赋值 给min */ } *s = a[j] ; } 第71套:解题思路:第 一处:函数中申请了两个内 存空间,其p是存放数字字 符串,t是存放非数字字符串,根据条件可知,p依次 存放数字字符串,其位置由 j来控制,所以应填:j。第 二处:利用for循环再把t 中的内容依次追加到p中, 其中t的长度为k,所以应填:k。第三处:最后返回 p的首地址即可,所以应填:p。 ******************* 解题思路:第一处:应该 判断i是否小于j,所以应