fun( char *p )
{ char max,*q; int i=0;
max=p[i];
while( p[i]!=0 )
{ if( maxp )
{ *q=*(q-1);
q--;
}
p[0]=max;
}
main()
{ char str[80];
printf("Enter a string: "); gets(str);
printf("\nThe original string: "); puts(str);
fun(str);
printf("\nThe string after moving: "); puts(str); printf("\n\n");
}
解题思路:
第一处:在语句后缺少分号,所应改为:q=p+i;。
第二处:保留字while写错,所应改为:while(q>p)。
***************************************************
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组 s中, 请编写函数fun,它的功能是:把指定分数范围内的学生数据放在b所指的数 组中,分数范围内的学生人数由函数值返回。
例如,输入的分数是60 69, 则应当把分数在60到69的学生数据进行输出,
包含60分和69分的学生数据。主函数中将把60放在low中,把69放在heigh中。 注意: 部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
int fun( STREC *a,STREC *b,int l, int h )
{
}
main()
{ STREC
s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85}, {"GA001",96},{"GA007",72},{"GA008",64},{"GA006",87},
{"GA015",85},{"GA013",94},{"GA012",64},{"GA014",91},
{"GA011",90},{"GA017",64},{"GA018",64},{"GA016",72}};
STREC h[N],tt;FILE *out ;
int i,j,n,low,heigh,t;
printf("Enter 2 integer number low & heigh : ");
scanf("%d%d", &low,&heigh);
if ( heigh< low ){ t=heigh;heigh=low;low=t; }
n=fun( s,h,low,heigh );
printf("The student's data between %d--%d :\n",low,heigh);
for(i=0;ih[j].s) {tt=h[i] ;h[i]=h[j]; h[j]=tt;}
for(i=0;i= l && a[i].s <= h) b[j++] = a[i] ;
return j ;
}
※※※※※※※※※※※※※※※※※※※※※※※※※
第18套:
给定程序中,函数fun的功能是:将形参s所指字符串中的所有字母字符顺序
前移,其他字符顺序后移,处理后新字符串的首地址作为函数值返回。
例如,s所指字符串为:asd123fgh543df,处理后新字符串
为:asdfghdf123543。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
#include
char *fun(char *s)
{ int i, j, k, n; char *p, *t;
n=strlen(s)+1;
t=(char*)malloc(n*sizeof(char));
p=(char*)malloc(n*sizeof(char));
j=0; k=0;
for(i=0; i='a')&&(s[i]<='z'))||((s[i]>='A')&&(s[i]<='Z'))) {
/**********found**********/
t[j]=__1__; j++;}
else
{ p[k]=s[i]; k++; }
}
/**********found**********/
for(i=0; i<__2__; i++) t[j+i]=p[i];
/**********found**********/
t[j+k]= __3__;
return t;
}
main()
{ char s[80];
printf("Please input: "); scanf("%s",s);
printf("\nThe result is: %s\n",fun(s));
}
解题思路:
第一处:函数中申请了两个内存空间,其p是存放字母字符串,t是存放非字母字符串,根 据条件可知,p依次存放字母字符串,其位置由j来控制,所以应填:s[i]。
第二处:利用for循环再把t中的内容依次追加到p中,其中t的长度为k,所以应填:k。 第三处:字符串处理好后必须添加字符串结束符,所以应填:'\0'。
***************************************************
给定程序MODI1.C中函数 fun 的功能是:将s所指字符串中最后一次出现的与 t1所指字符串相同的子串替换成t2所指字符串,所形成的新串放在w所指的数组中。 在此处,要求t1和t2所指字符串的长度相同。
例如,当s所指字符串中的内容为:"abcdabfabc",t1所指子串中的内容为:
"ab",t2所指子串中的内容为:"99"时, 结果,在w所指的数组中的内容应为: "abcdabf99c"。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
int fun (char *s, char *t1, char *t2 , char *w)
{
int i; char *p , *r, *a;
strcpy( w, s );
/************found************/
while ( w )
{ p = w; r = t1;
while ( *r )
/************found************/
IF ( *r == *p )
{ r++; p++; }
else break;
if ( *r == '\0' ) a = w;
w++;
}
r = t2;
while ( *r ){ *a = *r; a++; r++; }
}
main()
{
char s[100], t1[100], t2[100], w[100];
printf("\nPlease enter string S:"); scanf("%s", s);
printf("\nPlease enter substring t1:"); scanf("%s", t1);
printf("\nPlease enter substring t2:"); scanf("%s", t2);
if ( strlen(t1)==strlen(t2) )
{ fun( s, t1, t2, w);
printf("\nThe result is : %s\n", w);
}
else printf("\nError : strlen(t1) != strlen(t2)\n");
}
解题思路:
第一处:判断w指针所指的值是否是结束符,应改为:while(*w)。
第二处:if错写成If。
***************************************************
函数fun的功能是:将s所指字符串中ASCII值为奇数的字符删除,串中
剩余字 符形成一个新串放在t所指的数组中。
例如,若s所指字符串中的内容为:"ABCDEFG12345",其中字符A的
ASCII码值 为奇数、,、字符1的ASCII码值也为奇数、, 都应当删除,其
它依此类推。最后
t所指的数组中的内容应是:"BDF24"。
注意: 部分源程序存在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
#include
void fun(char *s, char t[])
{
}
main()
{
char s[100], t[100];
printf("\nPlease enter string S:"); scanf("%s", s);
fun(s, t);
printf("\nThe result is: %s\n", t);
NONO();
}
解题思路:
本题是从一个字符串按要求生成另一个新的字符串。我们使用for循环语句来解决这个问 题。
参考答案:
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套:
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函
数fun的功能是将形参a所指结构体变量s中的数据进行修改,并把a中地址作为函数 值返回主函数,在主函数中输出修改后的数据。
例如:a所指变量s中的学号、姓名、和三门课的成绩依次是:10001、
" ZhangSan "、95、80、88,修改后输出t中的数据应为:10002、"LiSi "、96、
81、89。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
struct student {
long sno;
char name[10];
float score[3];
};
/**********found**********/
__1__ fun(struct student *a)
{ int i;
a->sno = 10002;
strcpy(a->name, "LiSi");
/**********found**********/
for (i=0; i<3; i++) __2__ += 1;
/**********found**********/
return __3__ ;
}
main()
{ struct student s={10001,"ZhangSan", 95, 80, 88}, *t;
int i;
printf("\n\nThe original data :\n");
printf("\nNo: %ld Name: %s\nScores: ",s.sno, s.name);
for (i=0; i<3; i++) printf("%6.2f ", s.score[i]);
printf("\n");
t = fun(&s);
printf("\nThe data after modified :\n");
printf("\nNo: %ld Name: %s\nScores: ",t->sno, t->name);
for (i=0; i<3; i++) printf("%6.2f ", t->score[i]);
printf("\n");
}
解题思路:
本题是利用形参对结构体变量中的值进行修改并通过地址把函数值返回。
第一处:必须定义结构指针返回类型,所以应填:struct student *。
第二处:分别对成绩增加1分,所以应填:a->score[i]。
第三处:返回结构指针a,所以应填:a。
***************************************************
给定程序MODI1.C中函数fun的功能是:从N个字符串中找出最长的那个
串,并 将其地址作为函数值返回。各字符串在主函数中输入,并放入一个字
符串数组中。 请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 给定源程序:
#include
#include
#define N 5
#define M 81
/**********found**********/
fun(char (*sq)[M])
{ int i; char *sp;
sp=sq[0];
for(i=0;i
void fun(int a, int b, long *c)
{
}
main()
{ int a,b; long c;
printf("Input a, b:");
scanf("%d%d", &a, &b);
fun(a, b, &c);
printf("The result is: %ld\n", c);
NONO();
}
解题思路:
本题是给出两个两位数的正整数分别取出各位上的数字,再按条件组成一个新数。 取a十位数字的方法:a/10
取a个位数字的方法:a%10
参考答案:
void fun(int a, int b, long *c)
{
*c = (b%10)*1000+(a/10)*100+(b/10)*10+a%10;
}
※※※※※※※※※※※※※※※※※※※※※※※※※
※※※※※※※※※※※※※※※※※※※※※※※※※
第23套:
给定程序中,函数fun的功能是:找出N×N矩阵中每列元素中的最大值,并按 顺序依次存放于形参b所指的一维数组中。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#define N 4
void fun(int (*a)[N], int *b)
{ int i,j;
for(i=0; i
/*********found**********/
int fun(int x,int y)
{
int t;
/*********found**********/
t=x;x=y;y=t;
}
main()
{
int a,b;
a=8;b=3;
fun(&a,&b);
printf("%d, %d\n",a,b);
}
解题思路:
第一处:函数形参定义不正确,在定义第2个形参时,也应加上int。由于通过该函数实现 两数交换,在C语言中,必须交换地址中的值,所以应定义为int *x,int *y。
第二处:要交换地址中的值,不能交换地址,必须指定地址中的值,因此应改为 t=*x;*x=*y;*y=t;。
***************************************************
编写函数fun, 函数的功能是求出小于或等于lim的所有素数并放在aa数组中, 函数返回所求出的素数的个数。函数fun中给出的语句仅供参考。
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
#define MAX 100
int fun(int lim, int aa[MAX])
{
/* 以下代码仅供参考 */
int i,j,k=0;
/* 其中变量k用于统计素数个数 */
for(i=2;i<=lim;i++)
{
/* 以下完成判断aa数组中小于或等于lim的素数并统计个数 */
}
return k;
}
main()
{
int limit, i, sum;
int aa[MAX] ;
printf("输入一个整数");
scanf("%d", &limit);
sum=fun(limit, aa);
for(i=0 ; i < sum ; i++) {
if(i % 10 == 0 && i != 0) printf("\n") ;
printf("%5d", aa[i]) ;
}
NONO();
}
解题思路:
本题是考察考生如何判断一个数是素数,再求出所有小于lim数的素数并存入数组aa中保 存,最后由形参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套:
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函 数fun的功能是将形参a中的数据进行修改,把修改后的数据作为函数值返回主函数 进行输出。
例如:传给形参a的数据中,学号、姓名、和三门课的成绩依次是:10001、 "ZhangSan"、95、80、88,修改后的数据应为:10002、"LiSi"、96、81、89。 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
struct student {
long sno;
char name[10];
float score[3];
};
/**********found**********/
__1__ fun(struct student a)
{ int i;
a.sno = 10002;
/**********found**********/
strcpy(__2__, "LiSi");
/**********found**********/
for (i=0; i<3; i++) __3__+= 1;
return a;
}
main()
{ struct student s={10001,"ZhangSan", 95, 80, 88}, t;
int i;
printf("\n\nThe original data :\n");
printf("\nNo: %ld Name: %s\nScores: ",s.sno, s.name);
for (i=0; i<3; i++) printf("%6.2f ", s.score[i]);
printf("\n");
t = fun(s);
printf("\nThe data after modified :\n");
printf("\nNo: %ld Name: %s\nScores: ",t.sno, t.name);
for (i=0; i<3; i++) printf("%6.2f ", t.score[i]);
printf("\n");
}
解题思路:
本题是对结构体变量中的值进行修改并通过函数值返回。
第一处:必须定义结构返回类型,所以应填:struct student。
第二处:对姓名进行修改,所以应填:a.name。
第三处:分别对成绩增加1分,所以应填:a.score[i]。
***************************************************
假定整数数列中的数不重复,并存放在数组中。给定程序MODI1.C中函数fun 的功能是:删除数列中值为x的元素。n中存放的是数列中元素的个数。 请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 给定源程序:
#include
#define N 20
fun(int *a,int n,int x)
{ int p=0,i;
a[n]=x;
while( x!=a[p] )
\TAB p=p+1;
/**********found**********/
if(P==n) return -1;
else
{ for(i=p;i
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
int fun( STREC *a, STREC *b )
{
}
main()
{ STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},
\TAB \TAB {"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},
\TAB \TAB {"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
\TAB \TAB {"GA011",91},{"GA017",64},{"GA018",64},{"GA016",72}};
STREC h[N];
int i,n;FILE *out ;
n=fun( s,h );
printf("The %d lowest score :\n",n);
for(i=0;i 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套:
人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入
结构体数组std中,且编号唯一。函数fun的功能是:找出指定编号人员的数据, 作为函数值返回,由主函数输出,若指定编号不存在,返回数据中的编号为空串。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
#define N 8
typedef struct
{ char num[10];
int year,month,day ;
}STU;
/**********found**********/
___1___ fun(STU *std, char *num)
{ int i; STU a={"",9999,99,99};
for (i=0; i
#include
int fun (char *s, char *t)
{
int n; char *p , *r;
n = 0;
while ( *s )
{ p = s; r = t;
while ( *r )
if ( *r == *p ) {
/************found************/
r++; p++
}
else break;
/************found************/
if ( r == '\0' )
n++;
s++;
}
return n;
}
main()
{
char s[100], t[100]; int m;
printf("\nPlease enter string S:"); scanf("%s", s);
printf("\nPlease enter substring t:"); scanf("%s", t);
m = fun( s, t);
printf("\nThe result is: m = %d\n", m);
}
解题思路:
第一处:语句后缺少分号。
第二处:判断r的当前字符是否是字符串结束符,所以应改为:if(*r==0)。 ***************************************************
函数fun的功能是:将s所指字符串中ASCII值为偶数的字符删除,串中剩余字 符形成一个新串放在t所指的数组中。
例如,若s所指字符串中的内容为:"ABCDEFG12345",其中字符B的ASCII码值 为偶数、,、字符2的ASCII码值为偶数、, 都应当删除,其它依此类推。最后t所
指的数组中的内容应是:"ACEG135"。
注意: 部分源程序存在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
#include
void fun(char *s, char t[])
{
}
main()
{
char s[100], t[100];
printf("\nPlease enter string S:"); scanf("%s", s);
fun(s, t);
printf("\nThe result is: %s\n", t);
NONO();
}
解题思路:
本题是从一个字符串按要求生成另一个新的字符串。我们使用for循环语句来解决这个问 题。
参考答案:
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套:
给定程序中已建立一个带有头结点的单向链表,链表中的各结点按数据域递
增有序链接。函数fun的功能是:删除链表中数据域值相同的结点,使之只保留一 个。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的
结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
#define N 8
typedef struct list
{ int data;
struct list *next;
} SLIST;
void fun( SLIST *h)
{ SLIST *p, *q;
p=h->next;
if (p!=NULL)
{ q=p->next;
while(q!=NULL)
{ if (p->data==q->data)
{ p->next=q->next;
/**********found**********/
free(___1___);
/**********found**********/
q=p->___2___;
}
else
{ p=q;
/**********found**********/
q=q->___3___;
}
}
}
}
SLIST *creatlist(int *a)
{ SLIST *h,*p,*q; int i;
h=p=(SLIST *)malloc(sizeof(SLIST));
for(i=0; idata=a[i]; p->next=q; p=q;
}
p->next=0;
return h;
}
void outlist(SLIST *h)
{ SLIST *p;
p=h->next;
if (p==NULL) printf("\nThe list is NULL!\n");
else
{ printf("\nHead");
do { printf("->%d",p->data); p=p->next; } while(p!=NULL);
printf("->End\n");
}
}
main( )
{ SLIST *head; int a[N]={1,2,2,3,4,4,4,5};
head=creatlist(a);
printf("\nThe list before deleting :\n"); outlist(head);
fun(head);
printf("\nThe list after deleting :\n"); outlist(head);
}
解题思路:
本题是考察考生对链表的操作,主要是解决删除链表中数据域值相同的结点。程序中共有 三处要填上适当的内容,使程序能运行出正确的结果。
函数fun中使用两个临时结构指针变量p和q对链表进行操作。首先p指向链表开始的next指
针,q指向p的next指针,再利用while循环语句来判断指针q是否NULL,如果q指针是指向NULL,
那么函数结束返回。如果不是NULL,那么就要判断p和q中data值是否相同,如果值相同,则要
删除该结点,然后继续判断下一结点值是相同,如果还相同,那么继续删除结点,直至不相同
为止。如果两个结点的值不相同,那么p就指向q,q指向q的next指针再继续操作上述过
程。
删除结点的方法是:先将p的next指针指向q的next指针,再释放q指针指向的内存,最后把
q指针再指向p的next指针就可以删除一个链表中的结点了。
第一处:释放q指针所指的内存空间,应填q。
第二处:q指针指向p的next指针,重新完成链接,应填next。
第三处:两个结点的值不相同,那么q就指向q的next指针,应填next。
***************************************************
给定程序MODI1.C中函数fun的功能是:用选择法对数组中的n个元素按从小到 大的顺序进行排序。
请修改程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行和删行,也不得更改程序的结构~
给定源程序:
#include
#define N 20
void fun(int a[], int n)
{ int i, j, t, p;
for (j = 0 ;j < n-1 ;j++) {
/************found************/
p = j
for (i = j;i < n; i++)
if(a[i] < a[p])
/************found************/
p = j;
t = a[p] ; a[p] = a[j] ; a[j] = t;
}
}
main()
{
int a[N]={9,6,8,3,-1},i, m = 5;
printf("排序前的数据:") ;
for(i = 0;i < m;i++) printf("%d ",a[i]); printf("\n");
fun(a,m);
printf("排序后的数据:") ;
for(i = 0;i < m;i++) printf("%d ",a[i]); printf("\n");
}
解题思路:
第一处:语句后缺少分号。
第二处:保存最小值的位置,所以应改为:p = i;。
***************************************************
请编写一个函数fun,它的功能是:求出1到m之间(含m)能被7或11整除的所有 整数放在数组a中,通过n返回这些数的个数。例如,若传送给m的值为50,则程序 输出:
7 11 14 21 22 28 33 35 42 44 49
注意: 部分源程序存在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
#define M 100
void fun ( int m, int *a , int *n )
{
}
main( )
{ int aa[M], n, k;
fun ( 50, aa, &n );
for ( k = 0; k < n; k++ )
if((k+1)%20==0) printf("\n");
else printf( "%4d", aa[k] );
printf("\n") ;
NONO( );
}
解题思路:
本题是考察考生对某个数能被其他的数整除方式,并把符合条件的数存放在数组a中。 我们给出的程序是使用for循环语句以及取模的方式来解决这个问题的。
参考答案:
#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套:
给定程序中,函数fun的功能是:计算下式前n项的和作为函数值返回。 例如,当形参n的值为10时,函数返回:9.612558。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
double fun(int n)
{ int i; double s, t;
/**********found**********/
s=__1__;
/**********found**********/
for(i=1; i<=__2__; i++)
{ t=2.0*i;
/**********found**********/
s=s+(2.0*i-1)*(2.0*i+1)/__3__;
}
return s;
}
main()
{ int n=-1;
while(n<0)
{ printf("Please input(n>0): "); scanf("%d",&n); }
printf("\nThe result is: %f\n",fun(n));
}
解题思路:
第一处:根据公式可知,累加和变量s,应置0。
第二处:for循环的终止值应为形参n。
第三处:根据公式以及函数体中t变量内容,所以应填:t*t。
***************************************************
给定程序MODI1.C中函数 fun 的功能是:统计substr所指子字符串在str所指 字符串中出现的次数。
例如,若字符串为aaas lkaaas,子字符串为as,则应输出2。
请改正程序中的错误,使它能计算出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构~ 给定源程序:
#include
fun (char *str,char *substr)
{ int i,j,k,num=0;
/************found************/
for(i = 0, str[i], i++)
for(j=i,k=0;substr[k]==str[j];k++,j++)
/************found************/
If(substr[k+1]=='\0')
{ num++;
break;
}
return num;
}
main()
{
char str[80],substr[80];
printf("Input a string:") ;
gets(str);
printf("Input a substring:") ;
gets(substr);
printf("%d\n",fun(str,substr));
}
解题思路:
第一处:循环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,。
注意: 部分源程序存在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填 入你编写的若干语句。
给定源程序:
#include
#include
double fun ( double eps)
{
}
main( )
{ double x;
printf("Input eps:") ;
scanf("%lf",&x); printf("\neps = %lf, PI=%lf\n", x, fun(x));
NONO();
}
解题思路:
本题是根据公式进行计算。
参考答案:
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套:
给定程序中,函数fun的功能是:统计形参s所指字符串中数字字符出现的次
数,并存放在形参t所指的变量中,最后在主函数中输出。例如,形参s所指的字 符串为:abcdef35adgh3kjsdf7。输出结果为:4。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
void fun(char *s, int *t)
{ int i, n;
n=0;
/**********found**********/
for(i=0; ___1___ !=NULL; i++)
/**********found**********/
if(s[i]>='0'&&s[i]<= ___2___ ) n++;
/**********found**********/
___3___ ;
}
main()
{ char s[80]="abcdef35adgh3kjsdf7";
int t;
printf("\nThe original string is : %s\n",s);
fun(s,&t);
printf("\nThe result is : %d\n",t);
}
解题思路:
第一处:在for循环中终止值要判断字符串是否结束符,所以应填:s[i]。
第二处:判断是否是数字,所以应填:'9'。
第三处:字符串中数字字符出现的次数n,并存放在形参t所指的变量中,所以应填:*t=n。
***************************************************
给定程序MODI1.C中函数fun的功能是:通过某种方式实现两个变量值的交换, 规定不允许增加语句和表达式。例如变量a 中的值原为8,b中的值原为3, 程序运
行后 a 中的值为 3,b中的值为8。
请改正程序中的错误,使它能得出正确的结果。
注意: 不要改动 main 函数,不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
int fun(int *x,int y)
{
int t ;
/**************found**************/
t = x ; x = y ;
/**************found**************/
return(y) ;
}
main()
{
int a = 3, b = 8 ;
printf("%d %d\n", a, b) ;
b = fun(&a, b) ;
printf("%d %d\n", a, b) ;
}
解题思路:
第一处:由于x是整型指针变量,所以地址不能赋值给整型变量,因此必须取x地址上的值, 所以应改为t=*x;*x=y;。
第二处:已交换后的值存放在t中,所以返回值应为return(t);。
***************************************************
请编写函数fun,它的功能是: 求出 1 到 1000 之间能被 7 或11整除、但不
能同时被 7 和 11 整除的所有整数并将它们放在a所指的数组中,通过 n 返回这 些数的个数。
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
void fun (int *a, int *n)
{
}
main( )
{ int aa[1000], n, k ;
fun ( aa, &n ) ;
for ( k = 0 ; k < n ; k++ )
if((k + 1) % 10 == 0) printf("\n") ;
else printf("%5d", aa[k]) ;
NONO( );
}
解题思路:
本题是利用for循环语句以及取模%运算来得出符合条件的整数并存入a所指的数组。 参考答案:
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套:
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函
数fun的功能是对形参b所指结构体变量中的数据进行修改,最后在主函数中输出修 改后的数据。
例如: b所指变量t中的学号、姓名、和三门课的成绩依次是: 10002、
"ZhangQi"、93、85、87,修改后输出t中的数据应为:10004、" LiJie "、93、 85、87。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
struct student {
long sno;
char name[10];
float score[3];
};
void fun( struct student *b)
{ int i;
/**********found**********/
b__1__ = 10004;
/**********found**********/
strcpy(b__2__, "LiJie");
}
main()
{ struct student t={10002,"ZhangQi", 93, 85, 87};
int i;
printf("\n\nThe original data :\n");
printf("\nNo: %ld Name: %s\nScores: ",t.sno, t.name);
for (i=0; i<3; i++) printf("%6.2f ", t.score[i]);
printf("\n");
/**********found**********/
fun(__3__);
printf("\nThe data after modified :\n");
printf("\nNo: %ld Name: %s\nScores: ",t.sno, t.name);
for (i=0; i<3; i++) printf("%6.2f ", t.score[i]);
printf("\n");
}
解题思路:
本题是对结构体变量中的值进行修改并通过函数中的参数进行返回。
第一处:对学号进行更改,所以应填:->no。
第二处:对姓名进行更改,所以应填:->name。
第三处:对函数的调用,所以应填:&t。
***************************************************
给定程序MODI1.C中函数fun的功能是:应用递归算法求形参a的平方根。求平 方根的迭代公式如下:
1 a
x1 = ? ( x0 + ? )
2 x0
例如,a为2时,平方根值为:1.414214。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 给定源程序:
#include
#include
/**********found**********/
double fun(double a, dounle x0)
{ double x1, y;
x1=(x0+ a/x0)/2.0;
/**********found**********/
if( fabs(x1-xo)>0.00001 )
\TAB y=fun(a,x1);
else y=x1;
return y;
}
main( )
{ double x;
printf("Enter x: "); scanf("%lf",&x);
printf("The square root of %lf is %lf\n",x,fun(x,1.0));
}
解题思路:
第一处: 第二个变量定义的保留字double写错。
第二处: 变量x0错写成xo了。
***************************************************
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组 s中, 请编写函数fun,它的功能是:把高于等于平均分的学生数据放在b所指的数 组中,高于等于平均分的学生人数通过形参n传回,平均分通过函数值返回。 注意: 部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
#define N 12
typedef struct
{ char num[10];
double s;
} STREC;
double fun( STREC *a, STREC *b, int *n )
{
}
main()
{ STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},
\TAB \TAB {"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},
\TAB \TAB {"GA09",60},{"GA11",79},{"GA12",73},{"GA10",90}};
STREC h[N], t;FILE *out ;
int i,j,n; double ave;
ave=fun( s,h,&n );
printf("The %d student data which is higher than %7.3f:\n",n,ave);
for(i=0;i t) b[(*n)++] = a[i] ;
return t ;
}
※※※※※※※※※※※※※※※※※※※※※※※※※
第30套:
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函
数fun的功能是将形参a所指结构体变量中的数据赋给函数中的结构体变量b,并修 改b中的学号和姓名,最后输出修改后的数据。例如:a所指变量中的学号、姓名、 和三门课的成绩依次是:10001、"ZhangSan"、95、80、88,则修改后输出b中的 数据应为:10002、"LiSi"、95、80、88。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
struct student {
long sno;
char name[10];
float score[3];
};
void fun(struct student a)
{ struct student b; int i;
/**********found**********/
b = __1__;
b.sno = 10002;
/**********found**********/
strcpy(__2__, "LiSi");
printf("\nThe data after modified :\n");
printf("\nNo: %ld Name: %s\nScores: ",b.sno, b.name);
/**********found**********/
for (i=0; i<3; i++) printf("%6.2f ", b.__3__);
printf("\n");
}
main()
{ struct student s={10001,"ZhangSan", 95, 80, 88};
int i;
printf("\n\nThe original data :\n");
printf("\nNo: %ld Name: %s\nScores: ",s.sno, s.name);
for (i=0; i<3; i++) printf("%6.2f ", s.score[i]);
printf("\n");
fun(s);
}
解题思路:
本题是对结构体变量中的值进行修改。
第一处:要修改的结构体变量是由形参a来传递的,所以应填:a。
第二处:对结构体中的成员name进行替换,所以应填:b.name。
第三处:分别输出结构体中的成绩,所以应填:score[i]。
***************************************************
给定程序MODI1.C中函数fun的功能是:从s所指字符串中删除所有小写
字母c。 请改正程序中的错误,使它能计算出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
void fun( char *s )
{ int i,j;
for(i=j=0; s[i]!='\0'; i++)
if(s[i]!='c')
/************found************/
\TAB s[j]=s[i];
/************found************/
s[i]='\0';
}
main()
{ char s[80];
printf("Enter a string: "); gets(s);
printf("The original string: "); puts(s);
fun(s);
printf("The string after deleted : "); puts(s);printf("\n\n");
}
解题思路:
第一处: 新字符串的位置值是由变量j来控制的,但程序中字符赋值后没有对j进行增量的 语句,所以应改为:s[j++]=s[i];。
第二处: 对新字符串添加字符串结束符,由于程序中使用变量j对新字符串来控制的,所以 应改为:s[j]=0;。
假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字
符串中的前导*号全部移到字符串的尾部。函数fun中给出的语句仅供参考。
例如,字符串中的内容为:*******A*BC*DEF*G****,移动后,字符串中的内
容应当是:A*BC*DEF*G***********。在编写函数时, 不得使用C语言提供的字符 串函数。
注意: 部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
void fun( char *a )
{
/* 以下代码仅供参考 */
char *p,*q;
int n=0;
p=a;
while(*p=='*') /* 统计串头'*'个数n */
{n++; p++;}
q=a;
/* 向前复制字符串,请填写相应的语句完成其功能 */
for(;n>0;n--) /* 在串尾补n个'*' */
*q++='*';
*q='\0';
}
main()
{ char s[81],*p; int n=0;
printf("Enter a string:\n");gets(s);
fun( s );
printf("The string after moveing:\n");puts(s);
NONO();
}
解题思路:
本题是考察字符串的移动。具体操作请看参考源程序。 参考答案:
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套:
给定程序中,函数fun的功能是:对形参s所指字符串中下标为奇数的字符按
ASCII码大小递增排序,并将排序后下标为奇数的字符取出,存入形参p所指字符 数组中,形成一个新串。
例如,形参s所指的字符串为:baawrskjghzlicda,执行后p所指字符数组中 的字符串应为:aachjlsw。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
void fun(char *s, char *p)
{ int i, j, n, x, t;
n=0;
for(i=0; s[i]!='\0'; i++) n++;
for(i=1; is[j]) t=j;
if(t!=i)
{ x=s[i]; s[i]=s[t]; s[t]=x; }
}
for(i=1,j=0; i
#include
float fun ( float num )
{ int s ;
float n, t, pi ;
t = 1 ; pi = 0 ; n = 1 ; s = 1 ;
/**************found**************/
while(t >= num)
{
pi = pi + t ;
n = n + 2 ;
s = -s ;
/**************found**************/
t = s % n ;
}
pi = pi * 4 ;
return pi ;
}
main( )
{ float n1, n2 ;
printf("Enter a float number: ") ;
scanf("%f", &n1) ;
n2 = fun(n1) ;
printf("%6.4f\n", n2) ;
}
解题思路:
第一处:要判断t的最后一项绝对小于指定的数,由于t是实数,那么应改为 while(fabs(t)>=num)。
第二处:t是s除以n的值,而不是取余数,所以应改t=s/n;。
***************************************************
请编写一个函数void fun (char a[],char b[],int n),其功能是:删除一
个字符串中指定下标的字符。其中, a指向原字符串, 删除指定字符后的字符串存 放在b所指的数组中,n中存放指定的下标。
例如,输入一个字符串: World,然后输入3,则调用该函数后的结果为: Word。 注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
#include
#define LEN 20
void fun (char a[], char b[], int n)
{
}
main( )
{ char str1[LEN], str2[LEN] ;
int n ;
printf("Enter the string:\n") ;
gets(str1) ;
printf("Enter the position of the string deleted:") ;
scanf("%d", &n) ;
fun(str1, str2, n) ;
printf("The new string is: %s\n", str2) ;
NONO() ;
}
解题思路:
本题是利用字符串拷贝和字符串连接来生成新的字符串。
参考答案:
void fun (char a[], char b[], int n)
{
strncpy(b, a, n) ;
b[n] = 0 ;
strcat(b, a + n + 1) ;
}
※※※※※※※※※※※※※※※※※※※※※※※※※
第32套:
给定程序中,函数fun的功能是:在形参ss所指字符串数组中,将所有串长超
过k的字符串中右边的字符删除,只保留左边的k个字符。ss所指字符串数组中共 有N个字符串,且串长小于M。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
#define N 5
#define M 10
/**********found**********/
void fun(char (*ss) __1__, int k)
{ int i=0 ;
/**********found**********/
while(i< __2__) {
/**********found**********/
ss[i][k]=__3__; i++; }
}
main()
{ char x[N][M]={"Create","Modify","Sort","skip","Delete"};
int i;
printf("\nThe original string\n\n");
for(i=0;i
#include
double fun(double eps)
{ double s,t; int n=1;
s=0.0;
/************found************/
t=0;
while( t>eps)
{ s+=t;
t=t * n/(2*n+1);
n++;
}
/************found************/
return(s);
}
main()
{ double x;
printf("\nPlease enter a precision: "); scanf("%lf",&x);
printf("\neps=%lf, Pi=%lf\n\n",x,fun(x));
}
解题思路:
第一处: 初始化t的值,根据程序中的计算程序和试题的要求得出,t应为1。 第二处: 根据公式π/2得出,所以返回时应原有s的基础上乘以2作为返回值。 ***************************************************
假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:使字
符串的前导*号不得多于n个;若多于n个,则删除多余的*号; 若少于或等于n个, 则什么也不做,字符串中间和尾部的*号不删除。函数fun中给出的语句仅供参考。 例如,字符串中的内容为:*******A*BC*DEF*G****,若n的值为4,删除后, 字符串中的内容应当是:****A*BC*DEF*G****;若n的值为8,则字符串中的内容仍 为:*******A*BC*DEF*G****。n的值在主函数中输入。 在编写函数时,不得使用 C语言提供的字符串函数。
注意: 部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
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个位置 */
}
}
main()
{ char s[81]; int n;
printf("Enter a string:\n");gets(s);
printf("Enter n : ");scanf("%d",&n);
fun( s,n );
printf("The string after deleted:\n");puts(s);
NONO();
}
解题思路:
本题是考察字符串的操作。
利用for循环来判断a[j]的字符是否是字符串结束符,如果不是字符串结束符,则把a[j] 的字符依次存放到a[i]。其中,变量i是n的初始值,变量j是字符串前导的*号数。 参考答案:
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套:
给定程序的功能是:调用函数fun将指定源文件中的内容复制到指定的目标
文件中,复制成功时函数返回值为1,失败时返回值为0。在复制的过程中,把复 制的内容输出到终端屏幕。主函数中源文件名放在变量sfname中,目标文件名放 在变量tfname中。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
int fun(char *source, char *target)
{ FILE *fs,*ft; char ch;
/**********found**********/
if((fs=fopen(source, ___1___))==NULL)
return 0;
if((ft=fopen(target, "w"))==NULL)
return 0;
printf("\nThe data in file :\n");
ch=fgetc(fs);
/**********found**********/
while(!feof(___2___))
{ putchar( ch );
/**********found**********/
fputc(ch,___3___);
ch=fgetc(fs);
}
fclose(fs); fclose(ft);
printf("\n\n");
return 1;
}
main()
{ char sfname[20] ="myfile1",tfname[20]="myfile2";
FILE *myf; int i; char c;
myf=fopen(sfname,"w");
printf("\nThe original data :\n");
for(i=1; i<30; i++){ c='A'+rand()%25;fprintf(myf,"%c",c);
printf("%c",c); }
fclose(myf);printf("\n\n");
if (fun(sfname, tfname)) printf("Succeed!");
else printf("Fail!");
}
解题思路:
本题要求是把一个文件中的内容复制到另一个文件中。程序中共有三处要填上适当的内容,
使程序能运行出正确的结果。
第一处:要求打开一个读方式的源文件,因此可以填上"r"或"r+"。打开读文件操作的流是
fs。
第二处:用while循环来判断源文件是否已读到文件结束符,int feof(FILE *stream),因 此,此处只能填写fs。
第三处:把已经读取的字符写入目标文件中,打开写文件操作的流是ft,因此,此处只能 填写ft。
***************************************************
给定程序MODI1.C中函数fun的功能是:将长整型数中每一位上为偶数的数依 次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
例如,当s中的数为:87653142时,t中的数为:8642。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
void fun (long s, long *t)
{ int d;
long sl=1;
*t = 0;
while ( s > 0)
{ d = s%10;
/************found************/
if (d%2=0)
{ *t=d* sl+ *t;
sl *= 10;
}
/************found************/
s \= 10;
}
}
main()
{ long s, t;
printf("\nPlease enter s:"); scanf("%ld", &s);
fun(s, &t);
printf("The result is: %ld\n", t);
}
解题思路:
第一处:判断相等的条件是==。
第二处:整除的符号是/。
***************************************************
函数fun的功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。 合并的方式是:将a数的十位和个位数依次放在c数的十位和千位上, b数的十位 和个位数依次放在c数的百位和个位上。
例如,当a,45,b=12时,调用该函数后,c=5142。
注意: 部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
void fun(int a, int b, long *c)
{
}
main()
{ int a,b; long c;
printf("Input a, b:");
scanf("%d,%d", &a, &b);
fun(a, b, &c);
printf("The result is: %ld\n", c);
NONO();
}
解题思路:
本题是给出两个两位数的正整数分别取出各位上的数字,再按条件组成一个新数。 取a十位数字的方法:a/10
取a个位数字的方法:a%10
参考答案:
void fun(int a, int b, long *c)
{
*c=(a%10)*1000+(b/10)*100+(a/10)*10+(b%10);
}
※※※※※※※※※※※※※※※※※※※※※※※※※
第34套:
用筛选法可得到2,n(n<10000)之间的所有素数,方法是:首先从素数2开
始,将所有2的倍数的数从数表中删去(把数表中相应位置的值置成0);接着从数 表中找下一个非0数,并从数表中删去该数的所有倍数;依此类推,直到所找的下 一个数等于n为止。这样会得到一个序列:
2,3,5,7,11,13,17,19,23,,,
函数fun用筛选法找出所有小于等于n的素数,并统计素数的个数作为函数值 返回。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
int fun(int n)
{ int a[10000], i,j, count=0;
for (i=2; i<=n; i++) a[i] = i;
i = 2;
while (i
#include
void fun(int a,int *b,int *c)
{ int i,j,d,y;
for(i=3;i<=a/2;i=i+2) {
/**************found**************/
Y=1;
for(j=2;j<=sqrt((double)i);j++)
if(i%j==0) y=0;
if(y==1) {
/**************found**************/
d==a-i;
for(j=2;j<=sqrt((double)d);j++)
if(d%j==0) y=0;
if(y==1)
{ *b=i; *c=d; }
}
}
}
main()
{ int a,b,c;
do
{ printf("\nInput a: "); scanf("%d",&a); }
while(a%2);
fun(a,&b,&c);
printf("\n\n%d = %d + %d\n",a,b,c);
}
解题思路:
第一处:变量y错写成Y。
第二处:给变量d进行赋值,所以应改为:d=a-i;。
***************************************************
请编写函数fun, 它的功能是:计算并输出n(包括n)以内能被5或9整除的所有
自然数的倒数之和。
例如,在主函数中从键盘给n输入20后, 输出为: s=0.583333。
注意: 要求n的值不大于100。
部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容, 仅在函数fun的花括号
中填入 你编写的若干语句。
给定源程序:
#include
double fun(int n)
{
}
main()
{ int n; double s;
printf("\nInput n: "); scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n",s);
NONO();
}
解题思路:
本题是计算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套:
给定程序中,函数fun的功能是建立一个N×N的矩阵。 矩阵元素的构成规律
是:最外层元素的值全部为1;从外向内第2层元素的值全部为2;第3层元素的值 全部为3,,依次类推。例如,若N=5,生成的矩阵为:
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#define N 7
/**********found**********/
void fun(int (*a) __1__)
{ int i,j,k,m;
if(N%2==0) m=N/2 ;
else m=N/2+1;
for(i=0; i
#include
void fun( int m, int k )
{
int aa[20], i;
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");
}
解题思路:
第一处:应该取模而不是整除,所以应为:aa[i]=m%k;。
第二处:输出aa的位置不正确,所以应为:printf("%d",aa[i-1]);。
***************************************************
编写一个函数,从num个字符串中找出最长的一个字符串,并通过形参指针max
传回该串地址。(注意: 主函数中用****作为结束输入的标志,函数fun中给出的 语句仅供参考。)
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
#include
fun(char(*a)[81],int num,char **max)
{
/* 以下代码仅供参考 */
int i,k=0,len, maxlen; /* k为a数组中最长串所在元素的下标,初始为0,maxlen为其串 长 */
maxlen=strlen(a[k]);
for(i=1;i maxlen) {
maxlen = strlen(a[i]) ;
k = i ;
}
}
*max=a[k];
}
※※※※※※※※※※※※※※※※※※※※※※※※※
第36套:
给定程序中,函数fun的功能是:统计出带有头结点的单向链表中结点的个数,
存放在形参n所指的存储单元中。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
#define N 8
typedef struct list
{ int data;
struct list *next;
} SLIST;
SLIST *creatlist(int *a);
void outlist(SLIST *);
void fun( SLIST *h, int *n)
{ SLIST *p;
/**********found**********/
___1___=0;
p=h->next;
while(p)
{ (*n)++;
/**********found**********/
p=p->___2___;
}
}
main()
{ SLIST *head;
int a[N]={12,87,45,32,91,16,20,48}, num;
head=creatlist(a); outlist(head);
/**********found**********/
fun(___3___, &num);
printf("\nnumber=%d\n",num);
}
SLIST *creatlist(int a[])
{ SLIST *h,*p,*q; int i;
h=p=(SLIST *)malloc(sizeof(SLIST));
for(i=0; idata=a[i]; p->next=q; p=q;
}
p->next=0;
return h;
}
void outlist(SLIST *h)
{ SLIST *p;
p=h->next;
if (p==NULL) printf("The list is NULL!\n");
else
{ printf("\nHead ");
do
{ printf("->%d",p->data); p=p->next; }
while(p!=NULL);
printf("->End\n");
}
}
解题思路:
本题是要求统计出带有头结点的单向链表中结点的个数。
第一处:对n所指的存储单元进行初始化,所以应填:*n。
第二处:指向p的下一个结点,所以应填:next。
第三处:函数调用,在主函数中已经给出了head,所以应填:head。
***************************************************
给定程序MODI1.C中函数fun的功能是:求出s所指字符串中最后一次出现的t 所指子字符串的地址,通过函数值返回,在主函数中输出从此地址开始的字符串; 若未找到,则函数值为NULL。
例如,当字符串中的内容为:"abcdabfabcdx",t中的内容为:"ab"时,
输出结果应是:abcdx。
当字符串中的内容为:"abcdabfabcdx",t中的内容为:"abd"时,
则程序输出未找到信息:not be found!。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构~ 给定源程序:
#include
#include
char * fun (char *s, char *t )
{
char *p , *r, *a;
/************found************/
a = Null;
while ( *s )
{ p = s; r = t;
while ( *r )
/************found************/
if ( r == p )
{ r++; p++; }
else break;
if ( *r == '\0' ) a = s;
s++;
}
return a ;
}
main()
{
char s[100], t[100], *p;
printf("\nPlease enter string S :"); scanf("%s", s );
printf("\nPlease enter substring t :"); scanf("%s", t );
p = fun( s, t );
if ( p ) printf("\nThe result is : %s\n", p);
else printf("\nNot found !\n" );
}
解题思路:
第一处:指向空指针错误,Null应NULL。
第二处:比较指针位置的值是否相等,所以应改为:if(*r==*p)。
***************************************************
函数fun的功能是: 将s所指字符串中除了下标为偶数、同时ASCII值也为偶 数的字符外,其余的全都删除;串中剩余字符所形成的一个新串放在t所指的数组 中。
例如,若s所指字符串中的内容为:"ABCDEFG123456",其中字符A的ASCII码 值为奇数,因此应当删除;其中字符B的ASCII码值为偶数,但在数组中的下标为 奇数,因此也应当删除;而字符2的ASCII码值为偶数,所在数组中的下标也为偶 数,因此不应当删除,其它依此类推。最后t所指的数组中的内容应是:"246"。 注意: 部分源程序存在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
void fun(char *s, char t[])
{
}
main()
{
char s[100], t[100];
printf("\nPlease enter string S:"); scanf("%s", s);
fun(s, t);
printf("\nThe result is: %s\n", t);
NONO();
}
解题思路:
本题是从一个字符串按要求生成另一个新的字符串。我们使用for循环语句来解决这个问 题。
参考答案:
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套:
给定程序中,函数fun的功能是:在形参ss所指字符串数组中,查找含有形参
substr所指子串的所有字符串并输出,若没找到则输出相应信息。ss所指字符串 数组中共有N个字符串,且串长小于M。程序中库函数strstr(s1,
s2)的功能是在 s1串中查找s2子串,若没有,函数值为0,若有,为非0。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
#define N 5
#define M 15
void fun(char (*ss)[M], char *substr)
{ int i,find=0;
/**********found**********/
for(i=0; i< __1__ ; i++)
/**********found**********/
if( strstr(ss[i], __2__) != NULL )
{ find=1; puts(ss[i]); printf("\n"); }
/**********found**********/
if (find==__3__) printf("\nDon't found!\n");
}
main()
{ char x[N][M]={"BASIC","C
langwage","Java","QBASIC","Access"},str[M];
int i;
printf("\nThe original string\n\n");
for(i=0;i
/************found************/
fun(int x, y, z )
{ int j,t ,n ,m;
j = 1 ;
t=j%x;
m=j%y ;
n=j%z;
while(t!=0||m!=0||n!=0)
{ j = j+1;
t=j%x;
m=j%y;
n=j%z;
}
/************found************/
return i;
}
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);
}
解题思路:
第一处: 函数中形参的定义不正确,应改为:fun(int x,int y, int z)。
第二处: 程序中三个数的最小公倍数是用j处理的,所以应返回j的值。
***************************************************
假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:
只删
除字符串前导和尾部的*号,串中字母之间的*号都不删除。形参n给出了
字符串的 长度, 形参h给出了字符串中前导*号的个数,形参e给出了字符
串中最后*号的个 数。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:****A*BC*DEF*G*******,删除后,字符串中的内 容应当是:A*BC*DEF*G。
注意: 部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
void fun( char *a, int n,int h,int e )
{
}
main()
{ char s[81],*t,*f; int m=0, tn=0, fn=0;
printf("Enter a string:\n");gets(s);
t=f=s;
while(*t){t++;m++;}
t--;
while(*t=='*'){t--;tn++;}
while(*f=='*'){f++;fn++;}
fun( s , m,fn,tn );
printf("The string after deleted:\n");puts(s);
NONO();
}
解题思路:
本题是考察对字符串的操作。
1. 求出字符串的长度。
2. 利用循环把字符串中字符按要求仍存放在原字符串首址开始的位置上。 参考答案:
void fun( char *a, int n,int h,int e )
{
char *p=a ;
int j=0,len=0;
while(*p) {p++; len++;}
while(j
#define N 9
int fun(int a[], int n)
{ int i,j;
j = 0;
for (i=0; i
int fun(int a,int b)
{ int r,t;
if(a
void fun( char *a )
{
}
main()
{ char s[81];
printf("Enter a string:\n");gets(s);
fun( s );
printf("The string after deleted:\n");puts(s);
NONO();
}
解题思路:
本题是考察字符串的操作。
1. 利用循环扫描字符串中所有的字符是否是'*',如果不是'*',则把这些字符存放字符串 a首地址开始的位置上。
2. 最后给字符串a加上结束符。
参考答案:
void fun( char *a )
{
int j =0 ;
char *p=a;
while(*p) {
if(*p != '*') a[j++]=*p ;
p++ ;
}
a[j]=0;
}
※※※※※※※※※※※※※※※※※※※※※※※※※
第39套:
给定程序中,函数fun的功能是:在形参ss所指字符串数组中,删除所有串长
超过k的字符串,函数返回所剩字符串的个数。ss所指字符串数组中共有N个字符 串,且串长小于M。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
#define N 5
#define M 10
int fun(char (*ss)[M], int k)
{ int i,j=0,len;
/**********found**********/
for(i=0; i< __1__ ; i++)
{ len=strlen(ss[i]);
/**********found**********/
if(len<= __2__)
/**********found**********/
strcpy(ss[j++],__3__);
}
return j;
}
main()
{ char
x[N][M]={"Beijing","Shanghai","Tianjing","Nanjing","Wuhan"};
int i,f;
printf("\nThe original string\n\n");
for(i=0;i
#include
void fun(char *p ,char *q, char *c)
{
/************found************/
int k = 1;
/************found************/
while( *p != *q )
{ if( *p<*q ) c[k]=*q;
else c[k]=*p;
if(*p) p++;
if(*q) q++;
k++;
}
}
main()
{ char a[10]="aBCDeFgH", b[10]="ABcd", c[80]={'\0'};
fun(a,b,c);
printf("The string a: "); puts(a);
printf("The string b: "); puts(b);
printf("The result : "); puts(c);
}
解题思路:
第一处: 存放字符串初始位置也是从0开始存放的,由于k是控制c字符串的位置值,所以k
值应为0。
第二处: 判断两个字符串中是否有字符串结束符产生,所以应改为:while( *p || *q ), 而不是两字符串中对应位置的值不相等。
***************************************************
假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字
符串前导的*号之外,将串中其它*号全部删除。在编写函数时,不得使用C语言提供 的字符串函数。函数fun中给出的语句仅供参考。
例如,字符串中的内容为:****A*BC*DEF*G*******,删除后, 字符串中的内 容应当是:****ABCDEFG。
注意: 部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
void fun( char *a )
{
/* 以下代码仅供参考 */
int i=0,k;
while(a[i]=='*') i++;
k=i+1;
while(a[i]!='\0') /* 以下程序段实现非*字符前移 */
{
}
a[i+1]='\0';
}
main()
{ char s[81];
printf("Enter a string:\n");gets(s);
fun( s );
printf("The string after deleted:\n");puts(s);
NONO();
}
解题思路:
本题是考察字符串的操作。
1. 使用while循环语句求出字符串前导*号的个数。
2. 使用while循环语句判断a[i]是否是字符串结束符标志,如果不是字符串结束标志,则 再判断是否是字符*号,如果不是*号,则把a[i]字符存入a[k]中,如果是*号则跳过该*号,直
至字符串结束为止。
参考答案:
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套:
给定程序中已建立一个带有头结点的单向链表,链表中的各结点按结点数据
域中的数据递增有序链接。函数fun的功能是:把形参x的值放入一个新结点并插 入到链表中,插入后各结点数据域的值仍保持递增有序。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
#define N 8
typedef struct list
{ int data;
struct list *next;
} SLIST;
void fun( SLIST *h, int x)
{ SLIST *p, *q, *s;
s=(SLIST *)malloc(sizeof(SLIST));
/**********found**********/
s->data=___1___;
q=h;
p=h->next;
while(p!=NULL && x>p->data) {
/**********found**********/
q=___2___;
p=p->next;
}
s->next=p;
/**********found**********/
q->next=___3___;
}
SLIST *creatlist(int *a)
{ SLIST *h,*p,*q; int i;
h=p=(SLIST *)malloc(sizeof(SLIST));
for(i=0; idata=a[i]; p->next=q; p=q;
}
p->next=0;
return h;
}
void outlist(SLIST *h)
{ SLIST *p;
p=h->next;
if (p==NULL) printf("\nThe list is NULL!\n");
else
{ printf("\nHead");
do { printf("->%d",p->data); p=p->next; } while(p!=NULL);
printf("->End\n");
}
}
main()
{ SLIST *head; int x;
int a[N]={11,12,15,18,19,22,25,29};
head=creatlist(a);
printf("\nThe list before inserting:\n"); outlist(head);
printf("\nEnter a number : "); scanf("%d",&x);
fun(head,x);
printf("\nThe list after inserting:\n"); outlist(head);
}
解题思路:
本题是要求在一个有序的链表中插入一个数,插入后各结点仍然是有序
的。程序中共有三 处要填上适当的内容,使程序能运行出正确的结果。
第一处:在函数fun的开始处,已经对结构指针s分配了内存,其中
data是一个整型变量,
实际要求填入一个整型数据。根据本题要求在一个链表插入一个整型数,该数已通过函数的形
参x传入,因此应填x。
第二处:使用一个while循环找出要插入一个数的位置,在循环体中q实际上保留当前链表p
位置的临时变量,如果x>p->data时,那么再移动链表指针到下一个结果,再进行判断是否符合
条件,如果仍大于,则仍q保留链表p的位置。因此,此处应填p。
第三处:当找到结点位置后,就要插入这个数,完成插入过程。由于函数体中分配了结构 指针s,s的next指针已经指向了p,所以,当前位置q的next指针就应该指向指针s完成链表的链
接。因此,此处应填s。
***************************************************
给定程序MODI1.C中函数fun的功能是:计算正整数num的各位上的数字之积。 例如,若输入:252,则输出应该是:20。若输入:202,则输出应该是:0。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
long fun (long num)
{
/************found************/
long k;
do
{ k*=num%10 ;
/************found************/
num\=10 ;
} while(num) ;
return (k) ;
}
main( )
{ long n ;
printf("\Please enter a number:") ; scanf("%ld",&n) ;
printf("\n%ld\n",fun(n)) ;
}
解题思路:
第一处:由于在k定义时没有赋初值,所以k是一个随机数,根据试题要求,k应赋值为1。 第二处:整除的符号是/。
***************************************************
请编写一个函数fun,它的功能是:计算n门课程的平均分,计算结果作为函 数值返回。
例如:若有5门课程的成绩是:90.5, 72, 80, 61.5, 55
则函数的值为:71.80。
注意: 部分源程序存在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
float fun ( float *a , int n )
{
}
main()
{ float score[30]={90.5, 72, 80, 61.5, 55}, aver;
aver = fun( score, 5 );
printf( "\nAverage score is: %5.2f\n", aver);
NONO ( );
}
解题思路:
本题是使用循环来计算平均值且结果由函数值返回。
参考答案:
float fun ( float *a , int n )
{
int i;
float ave=0.0;
for(i=0; i
#define N 10
double fun(double x[],double *av)
{ int i,j; double d,s;
s=0;
for(i=0; i
/************found************/
int fun ( int n )
{ float A=1; int i;
/************found************/
for (i=2; i
#include
#define N 5
int fun ( int a[][N], int m )
{
}
main ( )
{ int a[N][N], m, i, j;
printf("***** The array *****\n");
for ( i =0; i=3 );
printf("m = %4d\n",m);
fun ( a ,m );
printf ("THE RESULT\n");
for ( i =0; i
void fun(char *s)
{ int i, j=0, k=0; char t1[80], t2[80];
for(i=0; s[i]!='\0'; i++)
if(s[i]>='0' && s[i]<='9')
{
/**********found**********/
t2[j]=s[i]; ___1___;
}
else t1[k++]=s[i];
t2[j]=0; t1[k]=0;
/**********found**********/
for(i=0; i
#include
#define MAXLINE 20
fun ( char *pstr[6])
{ int i, j ;
char *p ;
for (i = 0 ; i < 5 ; i++ ) {
/**************found**************/
for (j = i + 1, j < 6, j++)
{
if(strcmp(*(pstr + i), *(pstr + j)) > 0)
{
p = *(pstr + i) ;
/**************found**************/
*(pstr + i) = pstr + j ;
*(pstr + j) = p ;
}
}
}
}
main( )
{ int i ;
char *pstr[6], str[6][MAXLINE] ;
for(i = 0; i < 6 ; i++) pstr[i] = str[i] ;
printf( "\nEnter 6 string(1 string at each line): \n" ) ;
for(i = 0 ; i < 6 ; i++) scanf("%s", pstr[i]) ;
fun(pstr) ;
printf("The strings after sorting:\n") ;
for(i = 0 ; i < 6 ; i++) printf("%s\n", pstr[i]) ;
}
解题思路:
第一处:for循环语句中缺少分号。
第二处:应该把pstr+j位置上的值赋值给*(pstr+i)上,所以应改为:
*(pstr+i)=*(pstr+j);。
***************************************************
请编写函数fun,它的功能是:求出ss所指字符串中指定字符的个数,
并返回
此值。
例如,若输入字符串: 123412132,输入字符为: 1,则输出:3。
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
#include
#define M 81
int fun(char *ss, char c)
{
}
main()
{ char a[M], ch;
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));
NONO ( );
}
解题思路:
本题是考察考生怎样从字符串中找出指定字符的个数。使用while循环语句来字符串是否结
束,如果没有结束,则判断当前字符是否是指定的字符,如果是指定的字符,则个数cnt加1,
直至字符串结束为止,最后由函数返回。
参考答案:
int fun(char *ss, char c)
{
int cnt = 0 ;
char *p = ss ;
while(*p) {
if(*p == c) cnt++ ;
p++ ;
}
return cnt ;
}
※※※※※※※※※※※※※※※※※※※※※※※※※
第43套:
给定程序中,函数fun的功能是:在形参ss所指字符串数组中查找与形参t所 指字符串相同的串,找到后返回该串在字符串数组中的位置(下标值),未找到 则返回-1。ss所指字符串数组中共有N个内容不同的字符
串,且串长小于M。 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#include
#define N 5
#define M 8
int fun(char (*ss)[M],char *t)
{ int i;
/**********found**********/
for(i=0; i< __1__ ; i++)
/**********found**********/
if(strcmp(ss[i],t)==0 ) return __2__ ;
return -1;
}
main()
{ char ch[N][M]={"if","while","switch","int","for"},t[M];
int n,i;
printf("\nThe original string\n\n");
for(i=0;i
fun( int *b )
{ int k,a1,a2,i=0;
for(k=10; k<=55; k++) {
/************found************/
a2=k/1O;
a1=k-a2*10;
if((k%3==0 && a2==5)||(k%3==0 && a1==5))
{ b[i]=k; i++; }
}
/************found************/
return k;
}
main( )
{ int a[100],k,m;
m=fun( a );
printf("The result is :\n");
for(k=0; k
void fun( char *a )
{
}
main()
{ char s[81];
printf("Enter a string:\n");gets(s);
fun( s );
printf("The string after deleted:\n");puts(s);
NONO();
}
解题思路:
本题是考察字符串的移动。
1. 使用while循环语句和字符串指针p扫描出尾部的*号。
2. 定义两个字符串中间变量s和t,其中s是存放*号后面的字符串,t
是存放*号字符串。
3. 最后利用字符串拷贝和连接,重新组成字符串a。
参考答案:
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'转换成'8','2'转换成'7',,,,'9'转换成'0';若是其它
字符则保持不变;并将转换后的结果作为函数值返回。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
/**********found**********/
___1___ fun(char ch)
{
/**********found**********/
if (ch>='0' && ___2___)
/**********found**********/
return '9'- (ch-___3___);
return ch ;
}
main()
{ char c1, c2;
printf("\nThe result :\n");
c1='2'; c2 = fun(c1);
printf("c1=%c c2=%c\n", c1, c2);
c1='8'; c2 = fun(c1);
printf("c1=%c c2=%c\n", c1, c2);
c1='a'; c2 = fun(c1);
printf("c1=%c c2=%c\n", c1, c2);
}
解题思路:
第一处:要求返回处理好的字符,所以应填:char。
第二处:判断该字符是否是数字,所以应填:ch<='9'。
第三处:只要减去'0'的ASCII值,即可得到要求的结果,所以应填:'0'。 ***************************************************
给定程序MODI1.C中函数fun的功能是:将p所指字符串中的所有字符复制到b 中,要求每复制三个字符之后插入一个空格。
例如,在调用fun函数之前给a输入字符串:ABCDEFGHIJK,
调用函数之后,字符数组b中的内容则为:ABC DEF GHI JK。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 给定源程序:
#include
void fun(char *p, char *b)
{ int i, k=0;
while(*p)
{ i=1;
while( i<=3 && *p ) {
/**********found**********/
b[k]=p;
k++; p++; i++;
}
if(*p)
{
/**********found**********/
b[k++]=" ";
}
}
b[k]='\0';
}
main()
{ char a[80],b[80];
printf("Enter a string: "); gets(a);
printf("The original string: "); puts(a);
fun(a,b);
printf("\nThe string after insert space: "); puts(b);
printf("\n\n");
}
解题思路:
第一处:把指针p所指的值赋值给b[k]中。
第二处:把空格字符赋值给b[k++]中,而不是一个空格的字符串。
***************************************************
N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头 节点。请编写函数fun,它的功能是:求出平均分,由函数值返回。
例如,若学生的成绩是:85,76,69,85,91,72,64,87, 则平均分应当 是:78.625。
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
#include
#define N 8
struct slist
{ double s;
struct slist *next;
};
typedef struct slist STREC;
double fun( STREC *h )
{
}
STREC * creat( double *s)
{ STREC *h,*p,*q; int i=0;
h=p=(STREC*)malloc(sizeof(STREC));p->s=0;
while(is=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("->%4.1f",p->s);p=p->next;}
while(p!=0);
printf("\n\n");
}
main()
{ double s[N]={85,76,69,85,91,72,64,87},ave;
STREC *h;
h=creat( s ); outlist(h);
ave=fun( h );
printf("ave= %6.3f\n",ave);
NONO();
}
解题思路:
本题是计算链表结构中成绩的平均分。具体操作请看答案程序中的说明。 参考答案:
#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套:
函数fun的功能是:把形参a所指数组中的偶数按原顺序依次存放到a[0]、 a[1]、a[2]、,,中,把奇数从数组中删除,偶数个数通过函数值返
回。例如: 若a所指数组中的数据最初排列为:9、1、4、2、3、6、5、8、7,删除奇数后a 所指数组中的数据为:4、2、6、8,返回值为4。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include
#define N 9
int fun(int a[], int n)
{ int i,j;
j = 0;
for (i=0; i1)
例如,当给n输入5时,函数值为18;当给n输入3时,函数值为14。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
给定源程序:
#include
/************found************/
fun ( n )
{ int c;
/************found************/
if(n=1)
c = 10 ;
else
c= fun(n-1)+2;
return(c);
}
main()
{ int n;
printf("Enter n : "); scanf("%d",&n);
printf("The result : %d\n\n", fun(n));
}
解题思路:
第一处:形参n没有定义类型,所以应改为:fun (int n)。
第二处:判断相等的符号是==。
***************************************************
假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:使字
符串中尾部的*号不得多于n个;若多于n个,则删除多余的*号;若少于或等于n个, 则什么也不做, 字符串中间和前面的*号不删除。
例如,字符串中的内容为:****A*BC*DEF*G*******,若n的值为4,删除后, 字符串中的内容应当是:****A*BC*DEF*G****;若n的值为7,则字符串中的内容仍 为:****A*BC*DEF*G*******。n的值在主函数中输入。在编写函数时,不得使用C 语言提供的字符串函数。
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。
给定源程序:
#include
void fun( char *a,int n )
{
}
main()
{ char s[81]; int n;
printf("Enter a string:\n");gets(s);
printf("Enter n : ");scanf("%d",&n);
fun( s,n );
printf("The string after deleted:\n");puts(s);
NONO();
}
解题思路:
本题是考察字符串的操作。
1. 使用while循环语句和字符串指针p扫描出尾部的*号。
2. 找出字符串最右边字母后出现'*'的第1位置。
3. 使用while循环来处理右边'*'是否大于n个,若大于,则取n个'*'。
4. 最后给字符串加上结束符。
参考答案:
void fun( char *a,int n )
{
char *p=a ;
int j=0;
while(*p) p++; p--; /* 字符串的长度 */
while(*p == '*') p--; /* 字符串右的'*' */
p++;
while(j
#include
#define N 5
#define M 8
void fun(char (*ss)[M])
{ char *ps[N],*tp; int i,j,k;
for(i=0; i
#include
/************found************/
fun(int n)
{ double sum, s0, s1, s2, s; int k;
sum = 1.0;
if (n <= 2) sum = 0.0;
s0 = 0.0; s1 = 0.0; s2 = 1.0;
for (k = 4; k <= n; k++)
{ s = s0 + s1 + s2;
sum += sqrt(s);
s0 = s1; s1 = s2; s2 = s;
}
/************found************/
return sum
}
main ( )
{ int n;
printf("Input N=");
scanf("%d", &n);
printf("%f\n", fun(n) );
}
解题思路:
第一处:由于函数返回是实数,所以必须定义返回的类型,只有整型或无结果返回可以忽 略,其他必须定义返回的类型,所以要在此行前加上double或float。
第二处:该行缺少分号。
***************************************************
编写函数fun,它的功能是计算下列级数和,和值由函数值返回。
例如,当n = 10,x,0.3时,函数值为1.349859。
注意: 部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun
的花括号中填入你编写的若干语句。
给定源程序:
#include
#include
double fun(double x , int n)
{
}
main()
{
printf("%f\n", fun(0.3,10));
NONO();
}
解题思路:
本题是根据给定的公式计算结果。使用for循环语句依次求出每一项的值,分别进行累加并 把结果存入变量s中,最后把s作为函数值返回。其中,jc函数是计算阶乘的。 参考答案:
#include
#include
long 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套:
给定程序中,函数fun的功能是:找出形参s所指字符串中出现频率最高的字
母(不区分大小写),并统计出其出现的次数。
例如,形参s所指的字符串为:abcAbsmaxless,程序执行后的输出结果为:
letter 'a' : 3 times
letter 's' : 3 times
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构~
给定源程序:
#include