printf("\n");
}
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
(1)0
(2)j-- (3)j
【考点分析】
本题考查:
数组元素的引用;for循环语句。
【解题思路】
填空1:
N×N矩阵,第一列元素表示为t[0][N-j-1],第一行元素表示为t[j][0],将第一列赋值给第一行,因此填入0。
填空2:
for循环语句中,变量j的变化范围为从N-1递减到0,因此j做自减1操作。
填空3:
最后将临时数组r中的元素赋值给矩阵最后一列。
【解题宝典】
二维数组周边元素的表示方法,通过设定数组下标来完成。
我们举个简单的例子来说明,如二维数组a[3][3],我们列出它的所有数组元素:
a[0][0],a[0][1],a[0][2]
a[1][0],a[1][1],a[1][2]
a[2][0],a[2][1],a[2][2]
那么其周边元素有a[0][0],a[0][1],a[0][2], a[1][0], a[1][2] , a[2][0],a[2][1],a[2][2]。
如果我们把a[3][3]改为a[i][j],就不难表示出该数组的周边元素:
2、程序修改
下列给定程序中函数fun的功能是:
计算S=f(-n)+f(-n+1)+…+f(0)+f
(1)+f
(2)+…+f(n)的值。
例如,当n的值为5时,函数值应为10.407143。
f(x)函数定义如下:
请改正程序中的错误,使程序能输出正确的结果。
注意:
部分源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构!
-----------------------------------------------------------------------------------------------------------------
#include
#include
#include
#include
/*************found**************/
f(doublex)
{
if(x==0.0||x==2.0)
return0.0;
elseif(x<0.0)
return(x-1)/(x-2);
else
return(x+1)/(x-2);
}
doublefun(intn)
{
inti;doubles=0.0,y;
for(i=-n;i<=n;i++)
{y=f(1.0*i);s+=y;}
/*************found**************/
returns
}
voidmain()
{system("CLS");
printf("%f\n",fun(5));
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
(1)double f(double x)
(2)return s;
【考点分析】
本题考查:
函数定义,其一般形式为“类型标识符 函数名(形式参数列表)”,其中类型标识符指明了本函数的类型,函数的类型实际上就是函数返回值的类型。
【解题思路】
该程序的流程是:
fun()函数对f(n)项循环累加,fun()函数采用条件选择语句计算函数f(x)的值。
第一处错误在于未定义函数f(double x)的类型,因为返回值类型为double型,所以此处函数应定义为double。
第二处错误的语法错误。
【解题宝典】
我们在做改错题目时候,首先应该检查C语言语法是否有问题,在很多题目中都有类似的错误。
3、程序设计
编写函数fun,其功能是计算:
s作为函数值返回。
在C语言中可调用log(n)函数求ln(n)。
log函数的引用说明为:
double log(double x)。
例如,若m的值为20,则fun函数值为6.506583。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
-----------------------------------------------------------------------------------------------------------------
#include
#include
doublefun(intm)
{
}
main()
{
voidNONO();
printf("%f\n",fun(20));
NONO();
}
voidNONO()
{/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。
*/
FILE*fp,*wf;
inti,n;
doubles;
fp=fopen("in.dat","r");
wf=fopen("out.dat","w");
for(i=0;i<10;i++){
fscanf(fp,"%d",&n);
s=fun(n);
fprintf(wf,"%f\n",s);
}
fclose(fp);
fclose(wf);
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
double fun(int m)
{
int i;
double s=0.0;
for(i=1;i<=m;i++)
s=s+log(i); /*计算s=ln
(1)+ln
(2)+ln(3)+…+ln(m)*/
return sqrt(s); /*对s求平方根并返回*/
}
【考点分析】
本题考查:
计算表达式的值运用for循环语句通过累加操作求和;平方根函数sqrt()的使用。
【解题思路】
首先计算从1到m的对数的和,因此循环变量的范围是1~m,每次循环都进行一次累加求和。
该题需要注意的是,log()函数的形式参数应当为double型变量,而用于循环的基数变量为整数,需要进行强制转换。
在返回的时候求出平方根。
第九十七套
1、程序填空
下列给定程序中,函数fun的功能是:
在形参ss所指字符串数组中,查找含有形参substr所指子串的所有字符串,并输出,若没找到则输出相应信息。
ss所指字符串数组中共有N个字符串,且串长小于M。
程序中库函数strstr(s1,s2)的功能是在s1串中查找s2子串,若没有,函数值为0,若有,函数值为非0。
请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
注意:
部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
-----------------------------------------------------------------------------------------------------------------
#include
#include
#defineN5
#defineM15
voidfun(char(*ss)[M],char*substr)
{inti,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'tfound!
\n");
}
main()
{charx[N][M]={"BASIC","Clangwage","Java","QBASIC","Access"},str[M];
inti;
printf("\nTheoriginalstring\n\n");
for(i=0;iprintf("\nEnterastringforsearch:
");gets(str);
fun(x,str);
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
(1)N
(2)substr (3)0
【考点分析】
本题考查:
for循环语句;strstr()字符串函数的使用;if语句条件表达式。
【解题思路】
填空1:
此处考查for循环语句中循环变量i的取值范围,题目指出共有N个字符串,所以i的取值范围为0~N-1。
填空2:
strstr(s1,s2)的功能是在s1串中查找s2子串。
题目要求在ss字符串数组中,查找substr所指的字符串,故应填substr。
填空3:
此处使用if条件语句来判断查找结果,由printf("\nDon′t found!
\n")可知此处需填写没有找到的条件,即是find==0。
【解题宝典】
strstr(s1,s2)的功能是在s1串中查找s2子串,若没有找到,则函数值为0,若找到,函数值为非0。
2、程序修改
下列给定程序中函数fun的功能是:
求三个数的最小公倍数。
例如,若给主函数中的变量x1、x2、x3分别输入15,11,2,则输出结果应当是330。
请改正程序中的错误,使它能得出正确的结果。
注意:
部分源程序在文件MODI1.C中,不得增行或删行,也不得更改的程序的结构!
-----------------------------------------------------------------------------------------------------------------
#include
/************found************/
fun(intx,y,z)
{intj,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************/
returni;
}
main()
{intx1,x2,x3,j;
printf("Inputx1x2x3:
");scanf("%d%d%d",&x1,&x2,&x3);
printf("x1=%d,x2=%d,x3=%d\n",x1,x2,x3);
j=fun(x1,x2,x3);
printf("Theminimalcommonmultipleis:
%d\n",j);
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
(1)fun(int x,int y,int z)或int fun(int x,int y,int z)
(2)return j;
【考点分析】
本题考查:
函数定义,注意有参函数的参数列表;函数返回值,通过return语句返回给主调函数。
【解题思路】
(1)定义函数时,必须为每个形参分别定义变量类型。
(2)通过return语句将最小公倍数j返回主调函数。
【解题宝典】
几个自然数公有的倍数中最小的一个,叫做这几个数的最小公倍数。
求几个数的最小公倍数的方法为:
定义一个变量从1开始增加,每增加1即对几个数进行求余运算,直到几个数的余数全部为0,此时该数为这几个数的最小公倍数。
3、程序设计
规定输入的字符串中只包含字母和*号。
请编写函数fun,其功能是:
只删除字符前导和尾部的*号,串中字母间的*号都不删除。
形参n给出了字符串的长度,形参h给出了字符串中前导*号的个数,形参e给出了字符串中尾部*号的个数。
在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:
"****A*BC*DEF*G*******",删除后,字符串中的内容应当是:
"A*BC*DEF*G"。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填
-----------------------------------------------------------------------------------------------------------------
#include
voidfun(char*a,intn,inth,inte)
{
}
main()
{chars[81],*t,*f;intm=0,tn=0,fn=0;voidNONO();
printf("Enterastring:
\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("Thestringafterdeleted:
\n");puts(s);
NONO();
}
voidNONO()
{/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。
*/
FILE*in,*out;
inti;chars[81],*t,*f;
intm=0,tn=0,fn=0;
in=fopen("in.dat","r");
out=fopen("out.dat","w");
for(i=0;i<10;i++){
fscanf(in,"%s",s);
t=f=s;
m=0;tn=0;fn=0;
while(*t){t++;m++;}
t--;
while(*t=='*'){t--;tn++;}
while(*f=='*'){f++;fn++;}
fun(s,m,fn,tn);
fprintf(out,"%s\n",s);
}
fclose(in);
fclose(out);
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
void fun(char *a,int n,int h,int e)
{
int i,j=0;
for(i=h;i
a[j++]=a[i];
a[j]='\0'; /*在字符串最后加上结束标识*/
}
【考点分析】
本题考查:
删除字符串前导*号和尾部*号,其主要思想就是把不删除的字符保留起来。
【解题思路】
由于程序已经给出前导*号和尾部*号的个数,所以只要用循环语句将中间的字符保留起来。
注意循环变量i的初值(h)和终止值(n-e),由于h和e分别表示a中的前导*号和尾部*号的个数,n是字符串的长度,所以从a[h]到a[n-e-1]之间的所有字符都要保留。
循环结束后在新串的尾部加上结束符'\0'。
【解题宝典】
本题技巧:
void fun(char *a,int n,int h,int e )
{
a[n-e]='\0';
strcpy(a,a+h);
}
a[n-e]的作用是在最后一个字母后加上字符串结束符。
本程序采用了strcpy()库函数。
第九十八套
1、程序填空
下列给定程序中,函数fun的功能是:
计算一个带头结点的单向链表中各结点的数据域中数值之和,结果作为函数值返回。
请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
注意:
部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构。
-----------------------------------------------------------------------------------------------------------------
#include
#include
#defineN8
typedefstructlist
{intdata;
structlist*next;
}SLIST;
SLIST*creatlist(int*);
voidoutlist(SLIST*);
intfun(SLIST*h)
{SLIST*p;ints=0;
p=h->next;
while(p)
{
/**********found**********/
s+=p->___1___;
/**********found**********/
p=p->___2___;
}
returns;
}
main()
{SLIST*head;
inta[N]={12,87,45,32,91,16,20,48};
head=creatlist(a);outlist(head);
/**********found**********/
printf("\nsum=%d\n",fun(___3___));
}
SLIST*creatlist(inta[])
{SLIST*h,*p,*q;inti;
h=p=(SLIST*)malloc(sizeof(SLIST));
for(i=0;i{q=(SLIST*)malloc(sizeof(SLIST));
q->data=a[i];p->next=q;p=q;
}
p->next=0;
returnh;
}
voidoutlist(SLIST*h)
{SLIST*p;
p=h->next;
if(p==NULL)printf("ThelistisNULL!
\n");
else
{printf("\nHead");
do
{printf("->%d",p->data);p=p->next;}
while(p!
=NULL);
printf("->End\n");
}
}
-----------------------------------------------------------------------------------------------------------------
【参考答案】
(1)data
(2)next (3)head
【考点分析】
本题考查:
链表数据结构,结点的表示方法;掌