二、基本操作题(共18分)
请补充函数proc(),该函数的功能是计算下面公式SN的值:
SN=1+1/3十4/5+...+2N-1/SN-1
例如,当N=20时,SN=29.031674。
注意:部分源程序给出如下。
请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#include
double proc(int n)
{
double s=1.0,sl=0.0;
int k;
for(【k=2】;k<=n;k++)
{
sl=S;
【s+=(2*k一1)/sl】
}
return 【s】 ;
)
void main()
{
int k=0:
double sum;
system("CLS");
printf("\nPlease input N=");
scanf("%d",&k);
sum=proc(k);
printf("\nS=%If",sum);
)
三、程序改错题(共24分)
下列给定程序中,函数proc()的功能是根据整型形参n,计算如下公式的值:
Y=1-1/(22)+1/(33)-1/(44)+…+(-1)(n+1)/(nn)
例如,n中的值为l0,则应输出0.817962。
请修改程序中的错误,使它能得到正确结果。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
#include
double proc(int n)
{
double y=1.0;
f|****found****
int J=1; .
int i;
for(i=2;i<=n;i++)
{
j=-l*j;//****found****
y+=1/(i*i);
)
return(y);
)
void main()
{
int n=10:
system("CLS"):
printf("\nThe result is%lf\n",proc(n));
)
四、程序设计题(共18分)
编写一个函数,从传人的M个字符中找出最长的一个字符串,并通过形参指针max传回该串地址(用****作为结束输入的标志)。
注意:部分源程序给出如下。
请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的花括号中填人所编写的若干语句。
试题程序:
#include
#include
#include
char*proc(char(*a)[81],int num)
{
)
void main()
{
char ss[l0][81],*max;
int n,i=0;
printf("输入若干个字符串:");
gets(ss[i]);
puts(ss[i]);
while(!strcmp(ss[i],"****")= =0)
{
i++:
gets(ssEi]);
puts(ss[i]);
)
n=i:
max=proe(SS,n);
printf("\nmax=%s\n",max);
}
二、基本操作题程序填空题
【1】k=2【2】s+=(2*k一1)/sl【3】s
【解析】由题目中所给公式可知,多项武的第一项为1。变量s中存放多项式的和,其初始值为l。因此,循环从第二项开始,因此,【1】处填“k=2”;变量sl中存放各项表达武的值,由公式可知,【2】处填“s+=(2*k-1)/sl”;题目中要求将多项式的和返回到主函数当中,因此,【3】处填“s”。
三、程序改错题
(1)错误:int j=1;正确:double j=1.0;
(2)错误:y+=1/(i*i); 正确:y+=j/(i*i);
【解析】由函数proc()可知,变量j的作用是控制每一项符号的变化,并且作为运算的分子,应改为double型变量。因此,“int j=1;”应改为“double j=1.0;”。变量y中存放多项式的值,多项式中的每一项符号由变量j决定。因此,“y+=1/(i*i);”应改为“y+=j/(i*i);”。
四、程序设计题
char*proc(char(*a)[81],int M)
{
char*max;
int i=0:
max=a[O]:
for(i=0;i if(strlen(max) max=a[i];
return max; //返回最长字符串的地址
}
【解析】本题首先要定义一个字符指针用于保存最长的字符串,并使其初始值指向第一个字符串;再循环遍历字符串数组,通过if语句比较字符串的长度,并把最长的字符串地址赋给字符指针;最后返回最长字符串的地址。
二、基本操作题(共18分)
请补充main( )函数,该函数的功能是:输入两个正整数numl和num2,求这两个数的最大公约和最小公倍数。
例如,若输入的两个正整数为12,4,则它们的最大公约数为12,最小公倍数为4。
注意:部分源程序给出如下。
请勿改动main( )函数和其他函数中的任何内容,仅在main( )函数的横线上填人所编写的若干表达式或语句。
试题程序:
#include
#include
void main( )
{
int a,b,numl,num2,t;
system("CLS"):
printf("\nInput two numbers:\n");
scanf("%d,%d",&numl,&num2);
if(numl {
a=num2;
b=numl:
}
else
{
a=numl;
b=num2;
)
while(【b!=0】)
{
t= 【a%b】
a=b;
b=t:
}
printf(“greatest common divisor:
%d\n",a);
printf("least common multiple:
%d\n", 【numl*num2/a】;
}
三、程序改错题(共24分)
下列给定程序中函数proc的功能是:取出长整型变量s中偶数位上的数,依次构成一个新数放在t中。例如,当s中的数为l23456789时,t中的数为2468。请修改程序中的错误,使它能得出正确的结果。
注意:不要改动main( )函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
#include
//****found****
void proc(long S,long t)
{long sl=10;
s/=10;
*t=s%10;
//****found****
while(s { s=s/l00;
*t=s%10*sl+*t;
sl=sl*10;
}
)
void main( )
{long S,t;
system("CLS"):
printf("\nPlease enter S:");
scanf("%ld",&s);
proc(S,&t);.
printf("The result is:%ld\n",t);
}
四、程序设计题(共18分)
请编写函数proc( ),其功能是:将str所指字符串中除下标为偶数、同时ASCIl码值为奇数的字符外,其余的字符都删除,串中剩余字符所形成的一个新串放在t所指的数组中。例如,若str所指字符串中的内容为ABCDEFGl2345,其中字符B的ASCIl码值为偶数,所在元素的下标为奇数,因此必须删除;而字符A的ASCIl码值为奇数,所在数组中的下标为偶数,因此不应当删除。依此类推,最后t所指的数组中的内容应是ACEG。
注意:部分源程序给出如下。
请勿改动main( )函数和其他函数中的任何内容,仅在函数proc( )的花括号中填人所写的若干语句。
试题程序:
#include
#include
#include
#include
void proc(char*str,char t[])
{
)
void main( )
{
char str[100],t[100];
system("CLS");
printf("\nPlease enter string str:");
scanf("%S",str);
proc(str,t);
printf("\nThe result iS:%s\n",t);
二、基本操作题程序填空题
【1】b!=0【2】a%b[3]numl*num2/a
【解析】由程序可知,变量b中存放两个正整数中较小的那个数,while循环求两个正整数的公约数。因此【1】填“b!=0”;【2】填“a%b”.【3】处是求两个正整数最小公倍数的表达式,因此【3】填“numl*num2/a”。
三、程序改错题
(1)错误:void proc(10ng S,long t)
正确:void proc(long s,long*t)
(2)错误:while(s<0)
正确:while(s>O)
【解析】从主函数中实参可知,形参的第二个变量是长整型的指针变量。因此“void proc(long s,long t)”应改为“void proc(long s,long*t)”;要从低位开始取出长整型变量s中偶数位上的数,每次变量S要除以100,然后判断其是否大于0来决定是否要继续,因此“while(s0)”。
四、程序设计题
void proc(char*str。chart[3])
{
int i,j=0;
for(i=0;str[i]! =’\O’;i++)//从数组的第一个元素开始,到其最后一个
{if(i%2= =0&&str[i]%2 1=o)//下标为偶数、同时ASCIl码值为奇数的字符
t[j++]=str[i];} //如果成立,则把它放到t数组中
t[i]=’\o’;//字符串结束标志为’\0’
}
【解析】题目中要求将字符串str中下标为偶数,同时ASCIl码值为奇数的字符放在数组t中。首先,需要检查字符串str中下标为偶数的字符其ASCIl码值是否为奇数,将符合要求的字符放在数组t中。最后,为新的字符串数组添加结束符。
二、基本操作题(共18分)
请补充main( )函数,该函数的功能是:如果数组arr的前一个元素比后一个元素小,则把它保存在数组bb中并输出。
例如,若数组中的元素为:“40,68,62,33,35,52,48,95,66,73”,则输出:“40,33,35,48,66”。
注意:部分源程序给出如下。
请勿改动函数( )main和其他函数中的任何内容,仅在main( )函数的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#define M l0
void main( )
{
int i,n=0;
int arr[M]=(40,68,62,33,35,52,48,95,66,73);
int bb[M];
system("CLS");
for(i=0;i<【1】;i++)
if(arr[i]
【2】;
printf("\n***display bb***\n");
for(i=0;i
printf("bb[%d]=%2d",【3】);
}
三、程序改错题(共24分)
给定程序中,函数proc( )的功能是:使数组中的元素的值缩小5倍。
请修改程序中的错误,使它能得出正确的结果。
注意:不要改动main( )函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
#include
float m[lO];
//****found****
int proc(void)
{
int j;
printf("In subfunc after calling\n");
for(j=0;j<10;j++)
{
//****found****
printf("%f",m[j]%5);
}
}
void main( )
{
int i;
printf("In main before calling\n");
for(i=0;i<10;i++)
{
m[i]=i+20;
printf("%f",m[i]);
}
proc( );
printf("\nln main after calling\n");
for(i=0;i<10;i++)
printf("%f",m[i]/5);
}
四、程序设计题(共18分)
学生的记录由学号和成绩组成,M名学生的数据已在主函数中放入结构体数组stu中,请编写函数proc( ),其功能是:按分数的高低排列学生的记录,高分在前。
注意:部分源程序给出如下。
请勿改动main( )函数和其他函数中的任何内容,仅在函数proc( )的花括号中填入所编写的若干语句。
试题程序:
#include
#define M l6
typedef struct
{
char num[l0];
int S;
}
STREC:
void proc(STREC a[])
{
int i,j;
STREC t;
for(i=1;i
排序*/
for(j=0;j
if(a[j].s
的记录,高分在前*/
{t=a[j];a[j]=a[j+1];a[j+1]=t;)
}
void main( )
{
STREC stu[M]={{"GA005",85),{"GA003",76},
{"GA002",69},{"GA004",85),{"GA001",91),
{"GA007",72),{"GA008",64),{"GA006",87),
{"GA015",85),{"GA013",91),{"GA012",64),
{¨GA014",91),{"GA011",66),{"GA017",64},
{"GA018",64),{"GA016",72}};
int i;
proc(stu);
printf("The data after sorted:\n");
for(i=0;i
{
if(i%4= =0)
//每行输出4个学生记录
printf("n");
printf("%s%4d",stu[i],num,stu[i].s);
}
printf("\n");
}
二、基本操作题程序填空题
【1】M-1【2】bb[n++]=arr[i]【3】i,bb[i]
【解析】由整个for循环可知,变量i为数组arr的下标,题目中要求取出前一个元素比后一个元素小的元素,所以只需要判断前M-1个元素即可。因此,【1】处填“M-1”;如果第i个元素比第i+1个元素小,将第1个元素放入数组bb中,因此,【2】处填“bb[n++]=arr[i]”。最后,要输出数组bb中的每一个元素。因此,【3】处填“i,bb[i]”。
三、程序改错题
(1)错误:int proc(void)
正确:void proc(void)
(2)错误:printf("%f",m[j]%5);
正确:pfintf("%f",m[j]/5);
【解析】由主函数中的函数调用可知,函数proe( )没有返回值。因此“int proc(void)”应改为“void proc(void)”。题目中要求使数组中元素的值缩小到l/5,而不是对5取余。因此,“printf("%f",m[j]%5);”应改为“printf(”%f”,mEjl/5);”。
四、程序设计题
void proc(STREC a[])
{
int i,j;
STREC t;
for(i=1;i
二、基本操作题(共18分)
给定程序的功能是计算score中m个人的平均成绩aver,将低于aver的成绩放在be-low中,通过函数名返回人数。
例如,当score={10,20,30,40,50,60,70,80,90},m=9时,函数返回的人数应该是4,below={10,20,30,40}。
注意:部分源程序给出如下。
请勿改动main()函数和其他函数中的任何内容,仅在横线上填人所编写的若干表达式或语句。
试题程序:
#include
#include
int fun(int score[],int m,int below[])
{
int i,j=0;
float aver=0.0;
for(i=0;i
aver+=score[i];
aver/=(float)m;
for(i=0;i
if(score[i]
below[j++]=【score[i]】 ;
return j;
}
} void main()
{
int i,n,below[9];
int score[9]={10,20,30,40,50,60,70,80,90};
n=fun(score,9, 【below】 );
printf("\n Below the average score are:%d\n",n);
for(i=0;i
printf("%d",【below[i]】);
}
三、程序改错题(共24分)
下列给定程序中函数fun()的功能是:用递归算法计算斐波拉契数列中第n项的值。从第l项起,斐波拉契数列为:1,1,2,3,5,8,13,21,…
例如,若给n输入7,则该项的斐波拉契数值为l3。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构!
试题程序:
#include
long fun(int g)
{
//****found****
switch(g);
{
case 0:return 0;
||****found****
case l:case 2:return l;
}
return(fun(g-1)+fun(g-2));
}
void main()
{
long fib;int n;
printf("Input n:");
scanf("%d",&n);
printf("n=%d\n",n);
fib=fun(n);
printf("fib=%d\n\n",fib);
}
四、程序设计题(共18分)
某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已在主函数中给出,请编写函数,其功能是:求出该学生的平均分,并放入记录的ave成员中。
例如,学生的成绩是:85.5,76,69.5,85,91,72,64.5,87.5,则他的平均分应为78.875。
注意:部分源程序给出如下。
请勿改动main()函数和其他函数中的任何内容,仅在函数fun()部位中填入你编写的若干语句。
试题程序:
#include
#define N 8
typedef struct
{
char num[10];
double s[N];
double ave;
}STREC;
vold fun(STREC*a)
{
}
void main()
STREC s={"GA005",85.5,76,69.5,85,91,72,64.5,87.5};
int i;
fun(&s);
printf("The%s’s student data:\n",s.num);
for(i=0;i
printf("%4.1fkn",s.s[i]);
printf("\nknave=%7.3fkn",s.aVe);
printf("\n");
}
二、基本操作题程序填空题
【1】score[i]或*(score+i)【2】below【3】below[i]或*(below+i)
【解析】fun()函数的功能是返回低于平均成绩的人数,通过for循环遍历数组score,求和存入变量aver,然后计算出平均值。第二个循环将低于平均成绩的数据赋值数组b,因此第【1】处填“score[i]”或“*(score+i)”;在主函数中调用函数fun()时,最后一个参数应填入数组名blew,即将低分考生数据存入数组blew中,然后语句“printf("\n Below the average score are:%d"n);”输出低分考生个数,n值即fun()函数返回值也就是低分考生的人数值。最后利用循环输出below中的结果。
三、程序改错题
(1)错误:switch(g);
正确:switch(g)
(2)错误:case l:case2:return l;
正确:case l;case 2:return l;
【解析】此题考查C语言的语法规则,switch(表达式)后不应该带有“;”,case语句常量后应该是“:”。
switch语句的一般形式如下:
switch(表达式){
case常量表达式1:语句1;
case常量表达式2:语句2;
case常量表达式n:语句i;
default:语句n+1;
}
四、程序设计题
void fun(STREC*a)
{
int i;
a->ave=0.0;
for(i=0;i
a->ave=a->ave+a->s[i];
/*求各门课程成绩的总和*/
a->ave=a->ave/N;/*求平均分*/
}
【解析】本题考查的是指向结构体类型的指针变量做参数和结构体类型成员的运算。fun()函数中求出平均成绩,要带回主函数则必须定义一个指针类型的形参STREC*a,同时引用成员使用指向运算符,a->ave和a->s[i]。
二、基本操作题(共18分)
请补充函数proc(),函数proc()的功能是求7的阶乘。
注意:部分源程序给出如下。
请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的横线上填入所编写的若干表达式或语句。
试题程序:
#include
long proc(int n)
{
if( 【n>1】 )
return(n*proc( 【n-1】 );
else if(【n= =1】)
return l;
}
void main()
{
int k=7:
printf("%d!=%ld\n",k,proc(k));
}
三、程序改错题(共24分)
下列给定的程序中,函数proc()的功能是:用选择法对数组中的m个元素按从小到大的顺序进行排序。
例如,排序前的数据为:11 32-5 2 14
则排序后的数据为:-5 2 11 14 32
请修改程序中的错误,使它能得到正确结果。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#define M 20
void proc(int a[],int n)
{
int i,j,t,P;
//****found****
for(j=0;j
{
p=j;
for(i=j;i
if(a[[i]
p=i;
t=a[p];
a [p]=aEj3;
//****found****
a[p]=t;
}
}
void main()
{
int arr[M]={11,32,-5,2,14},i,m=5;
printf("排序前的数据:");
for(i=0;i
printf("%d",arr[i]);
printf("\n");
proc(arr,m);
printf("排序后的顺序:");
for(i=0;i
printf("%d",arr[i]);
printf("\n");
}
四、程序设计题(共18分)
请编写函数proc(),该函数的功能是:将放在字符串数组中的M个字符串(每串的长度
不超过N),按顺序合并组成一个新的字符串。
例如,若字符串数组中的M个字符串为:
ABCD
BCDEFG
CDEFGHI
则合并后的字符串内容应该是ABCDBCDEFGCDEFGHl。
注意:部分源程序给出如下。
请勿改动main()函数和其他函数中的任何内容,仅在函数proc()