上机改错题61-70
61
题目:
下列给定程序中,函数fun的功能是:根据整型形参m,计算如下公式的值。
y=1/(100*100) + 1/(200*200) + 1/(300*300) + …… + 1/(m*m)
例如,若m=2000,则应输出:0.000160。
请改正modi.c程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
/********found********/
fun ( int m )
{
double y = 0, d ;
int i ;
/********found********/
for( i = 100, i <= m, i += 100 )
{
d = (double)i * (double)i ;
y += 1.0 / d ;
}
return( y ) ;
}
main( )
{
int n = 2000 ;
clrscr() ;
printf( "\nThe result is %lf\n", fun ( n ) ) ;
}
62
题目:
下列给定程序中,函数fun的功能是:计算并输出high以内最大的10个素数之和。High由主函数传给fun函数。若high的值为100,则函数的值为732。
请改正modi.c程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
#include
int fun( int high )
{
int sum = 0, n=0, j, yes;
while ((high >= 2) && (n < 10))
{
yes = 1;
for (j=2; j<=high/2; j++)
/********found********/
if (high % j ==0 )
{
yes=0;
break
}
if (yes)
{
sum +=high;
n++;
}
high--;
}
return sum;
}
main( )
{
clrscr() ;
printf("%d\n", fun (100));
}
63
题目:
下列给定程序中,函数fun的功能是:将字符串p中的所有字符复制到字符串b中,要求每复制三个字符之后插入一个空格。例如,在调用fun函数之前给字符串a输入ABCDEFGHIJK,调用函数之后,字符串b中的内容则为ABC DEF GHI JK。
请改正modi.c程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
void fun(char *p, char *b)
{
int i, k=0;
while(*p)
{
/********found********/
i=1;
/********found********/
while( i<3||*p )
{
b[k]=*p;
k++;
p++;
i++;
}
/********found********/
if(*p)
{
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");
}
64
题目:
下列给定程序中,函数fun的功能是:将大写字母转换为对应小写字母之后的第五个字母;若小写字母为v至z,使小写字母的值减21。转换后的小写字母作为函数值返回。例如,若形参是字母A,则转换为小写字母f;若形参是字母W,则转换为小写字母b。
请改正modi.c程序中函数fun的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
char fun(char c)
{
/********found********/
if( c>='A' && c<='Z')
c=c-32;
/********found********/
if(c>='a' && c<='u')
c=c-5;
else if(c>='v'&&c<='z')
c=c-21;
return c;
}
main( )
{
char c1,c2;
printf("\nEnter a letter(A-Z): ");
c1=getchar();
if( isupper(c1))
{
c2=fun(c1);
printf("\n\nThe letter %c change to %c\n", c1,c2);
}
else
printf("\nEnter (A-Z)!\n");
}
65
题目:
下列给定程序中,函数fun的功能是:从低位开始取出长整型变量s中奇数位上的数,依次构成一个新数放在t中,例如,当s中的数为7654321时,t中的数为7531。
请改正modi.c程序中函数fun的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
/********found********/
void fun(long s, long t)
{
long s1=10;
*t = s % 10;
while ( s > 0)
{
s = s/100;
*t = s%10 * s1 + *t;
/********found********/
s1 = s1*100;
}
}
main( )
{
long s, t;
clrscr();
printf("\nPlease enter s:");
scanf("%ld", &s);
fun(s, &t);
printf("The result is: %ld\n", t);
}
国货手机PK品牌手机 火热7月母婴用品大特卖 促销大联盟 限时大抢购 09夏日男装采购节 09女人狂恋首饰潮 居家品省钱搜索,浪漫主义回归! 夏季特卖杯具大搜索~~ 09别样手袋包包
66
题目:
下列给定程序中,函数fun的功能是:求出以下分数序列的前n项之和。
2/1,3/2,5/3,8/5,13/8,21/13,……
和值通过函数值返回main函数。例如,若n=5,则应输出8.391667。
请改正modi.c程序中函数fun的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#
include
#include
/********found********/
fun (int n )
{
int a=2, b=1, c, k ;
double s=0.0 ;
for ( k = 1; k <= n; k++ )
{
s = s + 1.0 * a / b ;
/********found********/
c = a;
a += b;
b += c;
}
return s;
}
main( )
{
int n = 5 ;
clrscr();
printf("\nThe value of function is :%lf\n", fun ( n ) ) ;
}
67
题目:
下列给定程序中,函数fun的功能是:应用递归算法求某数a的平方根。求平方根的迭代公式如下:
x1=(1/2)*(x0+a/x0)
例如,2的平方根值为1.414214。
请改正modi.c程序中函数fun的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
/********found********/
fun(double a, double x0)
{
double x1, y;
x1=(x0+ a/x0)/2.0;
/********found********/
if( fabs(x1-x0)>0.00001 )
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));
}
68
题目:
下列给定程序中,函数fun的功能是:根据输入的三个边长(整型值),判断能否构成三角形;构成的是等边三角形,还是等腰三角形。若能构成等边三角形函数返回3,若能构成等腰三角形函数返回2,若能构成三角形函数返回1,若不能构成三角形函数返回0。
请改正modi.c程序中函数fun的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
int fun(int a,int b,int c)
{
if(a+b>c && b+c>a && a+c>b)
{
/********found********/
if(a==b && b==c)
return 1;
else
if(a==b || b==c || a==c)
return 2;
else
/********found********/
return 3;
}
else
return 0;
}
main( )
{
int a,b,c,shape;
printf("\nInput a,b,c: ");
scanf("%d%d%d",&a,&b,&c);
printf("\na=%d, b=%d, c=%d\n",a,b,c);
shape=fun(a,b,c);
printf("\n\nThe shape : %d\n", shape);
}
69
题目:
下列给定程序的功能是:读入一个英文文本行,将其中每个单词的第一个字母改成大写,然后输出此文本行(这里的"单词"是指由空格隔开的字符串)。例如,若输入I am a student to take the examination,则应输出I Am A Student To Take The Examination。
请改正modi.c程序
中函数fun的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
#include
#include
/********found********/
upfst ( char p )
{
int k=0;
for ( ; *p; p++ )
if ( k )
{
if ( *p==' ' )
k=0;
}
else
if ( *p!=' ' )
{
k=1;
*p = toupper( *p );
}
}
main( )
{
char chrstr[81];
clrscr();
printf("\nPlease enter an English text line: " );
gets( chrstr );
printf("\n\nBefore changing:\n %s", chrstr );
upfst( chrstr );
printf("\nAfter changing:\n %s\n", chrstr );
}
70
题目:
下列给定程序中,函数fun的功能是:从整数1至55之间,选出能被3整除、且有一位上的数是5的那些数,并把这些数放在b所指的数组中,这些数的个数作为函数值返回。规定,函数中a1放个位数,a2放十位数。
请改正modi.c程序中函数fun的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include
/********found********/
fun( int *b )
{
int k,a1,a2,i=0;
/********found********/
for(k=10; k<=55; k++)
{
a2=k/10;
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
printf("%4d",a[k]);
printf("\n");
}
61
分析:
题目要求在fun函数中根据整型形参m,计算如下公式的值。
y=1/(100*100) + 1/(200*200) + 1/(300*300) + …… + 1/(m*m)
程序第一处改错处将fun ( int m )修改为double fun ( int m )的原因是按照标准C语言的规定,任何函数都必须声明函数的返回值类型,如果该函数没有返回值,则必须将函数的返回类型声明为void。该题中的fun函数最后存在return( y ) ;语句,该语句将y作为fun函数返回值返回,它的类型就是fun函数的返回类型,所以fun函数声明自己的返回类型为y变量的类型,即double。
程序第二处改错处将for(i = 100,i<= m,i += 100)修改为for( i = 100;i <= m;i += 100 )的原因是按照C语言的语法,for循环中三部分之间需要使用分号隔开而不是逗号。
程序注解如下:
#include
#include
/********found********/
double fun ( int m )
{
double y = 0,
d ;
int i ;
/********found********/
/* 按照公式y计算100至m的合计值 */
for(i=100;i<=m;i+=100)
{
/* 计算公式的单个项的值 */
d = (double)i * (double)i ;
/* 计算公式y的累加值y变量 */
y += 1.0 / d ;
}
return( y ) ;
}
main( )
{
int n = 2000 ;
/* clrscr函数的作用是清屏,即将输出窗口已有信息全部清除 */
/* clrscr函数定义在conio.h中,所以存在#include
clrscr() ;
printf( "\nThe result is %lf\n", fun ( n ) ) ;
}
62
分析:
题目要求在fun函数中计算并输出high以内最大的10个素数之和。high由主函数传给fun函数。若high的值为100,则函数的值为732。
所谓素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。
了解素数的概念之后,我们可以有以下思路用于判断某一个整数是否为素数:
给定一个整数m,我们可以从2开始至m逐一检查在这范围之内的整数是否可以被m整除。如果可以,那说明整数m除了能表示为它自己和1的乘积以外,还能表示为其他两个整数的乘积,所以整数m不是素数。如果从2开始至m范围之内的所有整数都不可以被m整除,那说明整数m符合素数的定义,所以整数m是一个素数。
那从2开始至m逐一检查在这范围之内的整数是否可以被n整除呢?一方面我们可以循环进行,另外判断两个整数是否可以被整除可以使用取模(%)运算。例如10%5等于0,那么10可以整除5。11%5等于6,不等于0,那么11不可以整除5。
此题唯一一处改错处将break修改为break;的原因是在C语言中,任何一条完整的语句必须以分号为结尾。所以break语句是一个完整的语句,所以必须在结尾处加上分号。
程序注解如下:
#include
#include
#include
/* fun函数的作用是计算并输出high以内最大的10个素数之和 */
int fun( int high )
{
/* sum用于累加10个素数之和,所以初始化为0 */
/* n用于记录是否已经累加了10个素数,所以初始化为0 */
int sum = 0, n=0, j, yes;
/* 由于寻找high以内最大的10个素数,所以high会逐渐减一,但要high>= 2 */
/* 由于不能累加10以上的素数,所以n需要设置n<10的循环条件 */
while ((high >= 2) && (n < 10))
{
/* 预先设置yes标记为1,如果发现high不是素数,再将yes设置为0 */
yes = 1;
/
* 判断从2至high/2这个范围的所有整数是否能被high整除 */
/* 以便判断high是否为素数 */
for (j=2; j<=high/2; j++)
/********found********/
/* 如果high能够整除j,说明high不符合素数的定义 */
if (high % j ==0 )
{
/* 设置代表high不是素数的标记,将yes设置为0 */
yes=0;
/* high不是素数,无需判断后续的整数是否能被high整除 */
break;
}
/* if (yes)是if (yes !=0)的简写方式 */
/* 判断以上for循环是否执行break退出 */
if (yes)
{
/* yes等于1的情况下high是素数,sum把high累加 */
sum +=high;
/* n加一,表示sum又累加了一个素数,按照题意不能累加10个素数 */
n++;
}
/* high减一,以便寻找high以内最大的10个素数 */
high--;
}
/* 返回high以内最大的10个素数之和sum */
return sum;
}
main( )
{
/* clrscr函数的作用是清屏,即将输出窗口已有信息全部清除 */
/* clrscr函数定义在conio.h中,所以存在#include
clrscr() ;
printf("%d\n", fun (100));
}
63
分析:
题目要求在fun函数中将字符串p中的所有字符复制到字符串b中,要求每复制三个字符之后插入一个空格。例如,在调用fun函数之前给字符串a输入ABCDEFGHIJK,调用函数之后,字符串b中的内容则为ABC DEF GHI JK。
为了实现以上要求,需要使用循环逐个地将p所指字符串中的字符一个一个地拷贝到字符串b中。在拷贝过程中,需要将p指针不断往后移动,使用*p提取p指针当前指向的字符,直至p指针指向字符串的结束标记'\0'。另外,需要设置一个计数器,每拷贝一个字符这个计数器加一,当计数器满3之后就要在b字符串中插入一个空格。插入空格之后,计数器应该恢复为0,重新开始计数。这个计数器就是fun函数中的i变量。
程序第一处改错处将i=1;修改为i=0;的原因是i变量作用是记录插入b字符串数组的字符是不是满3个,以便插入空格。所以,每次拷贝3个字符之后应该将i重新设置为0,重新开始计数。
程序第二处改错处将while( i<3||*p )修改为while( i<3&&*p )的原因是while( i<3||*p )将导致只要拷贝p字符串前3个字符while循环条件中的i<3表达式就不满足了,然而*p这个条件还是满足的,因为while( i<3||*p )是while( i<3||*p!='\0')的简写方式。所以while( i<3||*p )的循环体还将继续执行。但是fun函数的本意是在这个时候退出这个while循环,执行后面b[k++]=' ' ;语句达到插入空格的目的,而while( i<3||*p )不
能达到此目的。
程序第三处改错处将b[k]=' ' ;修改为b[k++]=' ' ;的原因是该语句的目的是在每复制三个字符之后插入一个空格。但是如果k在插入空格之后不增加一,那么下一个字符放入b字符串数组的时候将仍旧放入k指示的位置,将覆盖那个位置的空格,所以需要将k在放入一个字符或者空格之后加一,以便指示下一个字符放入的位置。b[k++]=' ' ;相当于b[k]=' '; k++;两条语句,符合题目不得增行或删行,也不得更改程序的结构的要求。
程序注解如下:
#include
void fun(char *p, char *b)
{
int i, k=0;
/* while(*p)相当于while(*p!= '\0') */
/* 也就是说p指针从字符串开头不移动到最后结束标记'\0'循环不会停止 */
while(*p)
{
/********found********/
/* i变量作用是记录插入b字符串数组的字符是不是满3个,以便插入空格 */
/* 所以应该计数之前应该初始化为0 */
i=0;
/********found********/
/* while( i<3&&*p )相当于while( i<3&&*p!= '\0' ) */
/* 也就是说拷贝至b字符串的字符不满3个且p字符串没有被拷贝结束 */
/* 该while循环不会终止 */
while( i<3&&*p )
{
/* 拷贝p指针当前所指的字符到b字符串数组中 */
/* k指示字符放入b字符串数组的下标位置 */
b[k]=*p;
/* k加一,以便指示下一个字符放入b字符串数组的下标位置 */
k++;
/* p指针在字符串往后移动一个字符位置,准备拷贝下一个字符 */
p++;
/* i加一,记录一个字符已经拷贝至b字符串数组中 */
i++;
}
/********found********/
/* 以上while循环退出有两个原因: */
/* 一个就是i等于3,这说明已经拷贝了3个字符至b字符串数组中 */
/* 另一个是*p=='\0'表达式成立,即p指针移动到了字符串末尾 */
/* 所以下面的if语句排除了*p=='\0'情况,只有i等于3情况成立 */
/* if(*p)是if(*p!= '\0')的简写方式 */
if(*p)
{
/* i等于3情况成立,说明拷贝了3个字符,按照题意插入一个空格 */
b[k++]=' ' ;
}
}
/* 在b字符串数组最后字符的后面一个位置设置字符串结束标记'\0' */
b[k]='\0';
}
main( )
{
char a[80],b[80];
printf("Enter a string: ");
/* 使用gets函数接收键盘输入的字符串,将其放入a字符串数组中 */
gets(a);
printf("The original string: ");
/* 使用puts函数输出a字符串数组的内容 */
puts(a);
fun(a,b);
printf("\nThe string
after insert space: ");
/* 使用puts函数输出b字符串数组的内容 */
puts(b);
printf("\n\n");
}
64
分析:
题目要求在fun函数中将大写字母转换为对应小写字母之后的第五个字母;若小写字母为v至z,使小写字母的值减21。转换后的小写字母作为函数值返回。例如,若形参是字母A,则转换为小写字母f;若形参是字母W,则转换为小写字母b。
字母之间的转换可以将字母减去或者加上两个字母ASCII码之间的差距实现。例如大写字母'A'的ASCII码是65,小写字母'a'的ASCII码是97,所以将大写字母'A'转换为小写字母'a'可以使用'A'+('a'-'A')= 'A'+ (97-65)= 'A'+32='a',而将小写字母'a'转换为大写字母'A'可以使用'a'-('a'-'A')= 'a'- (97-65)= 'a' - 32='A'。
由于大写字母'A'至'Z'的ASCII码的范围是65至90,小写字母'a'至'z'的ASCII码的范围是97至122,所以大写字母转换为对应的小写字母只要加上大、小写字母ASCII码之间的差距32即可。同样,小写字母转换为对应的大写字母只要减去大、小写字母ASCII码之间的差距32即可。
程序第一处改错处将c=c-32;修改为c=c+32;的原因是if( c>='A' && c<='Z')语句判断的是c字符的ASCII码是否介于'A'和'Z'的ASCII码之间,由于大写字母的ASCII码是连续的,所以if( c>='A' && c<='Z')语句判断的是c字符是否是大写字母。按照题意,如果c的确是大写字母,则应该将大写字母转换为对应小写字母之后的第五个字母。所以c=c-32;所在语句的作用应该是先将大写字母c转换为对应小写字母,所以按照以上说明的大写字母转换为对应的小写字母的方法,需要将大写字母c加上大、小写字母ASCII码之间的差距32即可。
程序第二处改错处将c=c-5;修改为c=c+5;的原因是该语句的目的是将c再转换为对应小写字母之后的第五个字母。在大、小写字母中,字母越排后,它的ASCII码最大,所以应该加5。
程序注解如下:
#include
#include
char fun(char c)
{
/********found********/
/* 将c字符转换为对应的小写字母,即将c加上32即可 */
if( c>='A' && c<='Z')
c=c+32;
/********found********/
/* 将c再转换为对应小写字母之后的第五个字母 */
if(c>='a' && c<='u')
c=c+5;
else if(c>='v'&&c<='z')
/* 若小写字母为v至z,使小写字母的值减21 */
c=c-21;
/* 转换后的小写字母作为函数值返回 */
return c;
}
main( )
{
char c1,c2;
printf("\nEnter a letter(A-Z): ");
/* 使用getchar函数从键盘上输入一个字符,放入c1变量中 */
/* getchar函数定义在stdio.h中,所以存在#include
c1=getchar();
/*
使用isupper函数判断c1参数是否是大写字母 */
/* isupper函数定义在ctype.h中,所以存在#include
if( isupper(c1))
{
c2=fun(c1);
printf("\n\nThe letter %c change to %c\n", c1,c2);
}
else
printf("\nEnter (A-Z)!\n");
}
65
分析:
题目要求在fun函数中从低位开始取出长整型变量s中奇数位上的数,依次构成一个新数放在t中,例如,当s中的数为7654321时,t中的数为7531。
为了实现以上要求,fun函数将长整型变量s不断使用整除(/)和取模(%)运算将长整型变量s从最低位将各个奇数位的数字提取出来,然后将该数字放入*t的已有数据的最高位。
例如,当s中的数为7654321时,首先将s%10 = 7654321%10 = 1,提取从低位第一个奇数位数字1,通过*t = s % 10;放入t所指地址中,即*t=1。
然后通过s = s/100;使s = 7654321/100 = 76543,将从低位第二个奇数位数字3移动到最低位,然后通过s%10取出最低位数字3,即76543%10 = 3。提取出之后通过*t = s%10 * s1 + *t;的计算方法将3放入*t的最高位。即*t = 3*10 + 1 = 31。注意计算之后s1要扩大10倍,以便将下一个奇数位数字能够放入*t的百位。即s1=s1*10=10810=100。
重复以上过程,通过s = s/100;使s = 76543/100 = 765,将从低位第三个奇数位数字5移动到最低位,然后通过s%10取出最低位数字5,即765%10 = 5。提取出之后通过*t = s%10 * s1 + *t;的计算方法将5放入*t的最高位。即*t = 5*100 + 31 = 531。注意计算之后s1要继续扩大10倍,以便将下一个奇数位数字能够放入*t的千位。
重复以上过程,直至s/100得到的商等于0,那么就不必要再继续了。
程序第一处改错处将void fun(long s, long t) 修改为void fun(long s, long *t)的原因是fun函数将计算得到的新数字放入t参数,希望通过t参数返回给main函数。但是在C语言中,单纯传递简单的数据类型如long类型的参数不能将在函数中对简单类型的参数的修改传回main函数,这是参数传值方式的特点。为了解决这个问题,参数必须使用地址传递方式,即传入指针类型的变量。所以应该将t的类型由long改成long *类型。
另外,从main函数调用fun函数的fun(s, &t);语句可以看出fun第二个参数是传入t的地址,也就是传入指针类型。因为指针是指向某地址的,所以&t的类型就是long *类型
程序第二处改错处将s1 = s1*100;修改为s1 = s1*10;的原因是该语句的目的是将s1增长10倍以便下次循环可以将从s提取的数字放入*t的最高位
程序注解如下:
#include
#include
/********found********/
/* fun函数作用是从低位取出长整型变量s中奇数位上的数,依次构成新数放在t中 */
void
fun(long s, long *t)
{
long s1=10;
/* 先使用取模10将s从低位的第一个奇数位数字提取并放入*t中 */
*t = s % 10;
/* 直到s的所有奇数位都被通过整除100提取出来才终止while循环 */
while ( s > 0)
{
/* 通过整除100,将长整型变量s丢弃最低的两位数字 */
/* 这能使原s的值从低位开始后续的奇数位的数字位于最低位,以便提取 */
/* 例如7654321/100=76543,将7654321中的3移动至最低位 */
s = s/100;
/* s%10取出s的最低位数字 */
/* s%10*s1 + *t将取出的最低位数字移动到*t已有数据的最高位 */
*t = s%10 * s1 + *t;
/********found********/
/* 将s1增长10倍以便下次循环可以将从s提取的数字放入*t的最高位 */
s1 = s1*10;
}
}
main( )
{
long s, t;
/* clrscr 函数定义在conio.h中,所以存在#include
/* clrscr 函数作用是清除输出窗口中已经存在的所有信息 */
clrscr();
printf("\nPlease enter s:");
/* 使用scanf函数输入长整型变量s的值 */
scanf("%ld", &s);
/* 调用fun函数进行题目指定的处理 */
fun(s, &t);
/* 输出fun处理之后的t变量的值 *
printf("The result is: %ld\n", t);
}
国货手机PK品牌手机 火热7月母婴用品大特卖 促销大联盟 限时大抢购 09夏日男装采购节 09女人狂恋首饰潮 居家品省钱搜索,浪漫主义回归! 夏季特卖杯具大搜索~~ 09别样手袋包包
66
分析:
题目要求在fun函数中求出以下分数序列的前n项之和。
2/1,3/2,5/3,8/5,13/8,21/13,……
和值通过函数值返回main函数。例如,若n=5,则应输出8.391667。
通过观察我们可以发现以上分数序列中每一项的规律,即每一项的分子都是前一项分子和分母之和,而每一项的分母则是前一项的分子。
程序第一处改错处将fun (int n )修改为double fun (int n )的原因是按照标准C语言的语法,任何函数都必须在函数头声明函数的返回类型。这个返回类型应该和该函数中使用return语句返回的值的类型保持一致。如果该函数没有使用return语句返回任何值,那么该函数也需要在函数头声明该函数的返回类型为void。此题的fun函数中存在return s;语句,s的类型为double,所以应该在fun函数头声明该函数的返回类型为double。
程序第二处改错处将b += c;修改为b = c;的原因是该语句的作用是计算下一项的分母,按照以上对分数序列每一项的观察,发现每一项的分母则是前一项的分子,所以只要设置为保存前一项分子的c变量。
程序注解如下:
#include
#include
/********found********/
double fun (int n )
{
/* a代表每一项的分子,所以初始化为第一项的分子2 */
/* b代表每一项的分母,所以初始化为第一项的分母1 */
int a=2, b=1, c, k ;
/* s用于保存该分数序列前若干项的合计值,所以初始化为0.0 */
double s=0.0 ;
/* 从分数序列的第一项开始累加至第n项,计算合计值s */
for ( k = 1; k <= n; k++ )
{
/* 加上第k项的值 */
s = s + 1.0 * a / b ;
/********found********/
/* 预先保存a的值,防止被下面程序覆盖而丢失原有a的值 */
c = a;
/* 计算下一项的分子a */
a += b;
/* 设置下一项的分母b */
b = c;
}
/* 返回分数序列前n项的合计值s */
return s;
}
main( )
{
int n = 5 ;
/* clrscr函数定义在conio.h中,所以存在#include
/* clrscr函数的作用是清除输出窗口中已经存在的所有信息 */
clrscr();
printf("\nThe value of function is :%lf\n", fun ( n ) ) ;
}
67
分析:
题目要求在fun函数中应用递归算法求某数a的平方根。求平方根的迭代公式如下:
x1=(1/2)*(x0+a/x0)
例如,2的平方根值为1.414214。
程序第一处改错处将fun(double a, double x0)修改为double fun(double a, double x0)的原因是按照标准C语言的语法,任何函数都必须在函数头声明函数的返回类型。这个函数返回类型应该和该函数中使用return语句返回的值的类型保持一致。如果没有return返回的值,函数的返回类型也应该声明为void。此题的fun函数存在return y;语句,而y变量定义为double类型,所以fun函数的返回类型也应该是double类型。所以将将fun(double a, double x0)修改为double fun(double a, double x0)。
程序第二处改错处将if(fabs(x1-x0)>0.00001)修改为if(fabs(x1-x0)>=0.00001 )的原因是如果fabs(x1-x0)小于0.00001,那么说明精度够了,不需要再继续递归计算了。反过来,要继续递归计算平方根的值,就需要条件fabs(x1-x0)大于等寓于0.00001。
程序注解如下:
#include
#include
/********found********/
double fun(double a, double x0)
{
double x1, y;
/* 使用求平方根的迭代公式x1=(1/2)*(x0+a/x0) */
x1=(x0+ a/x0)/2.0;
/********found********/
if( fabs(x1-x0)>=0.00001 )
/* 如果精度还小于0.00001,继续递归计算平方根 */
y=fun(a,x1);
else
/* 如果精度达到要求,则x1的值就是平方根的值 */
y=x1;
/* 返回计算得到的参数a的平方根y */
return y;
}
main( )
{
double x;
printf("Enter x: ");
sca
nf("%lf",&x);
printf("The square root of %lf is %lf\n",x,fun(x,1.0));
}
68
分析:
题目要求在fun函数中根据输入的三个边长(整型值),判断能否构成三角形;构成的是等边三角形,还是等腰三角形。若能构成等边三角形函数返回3,若能构成等腰三角形函数返回2,若能构成三角形函数返回1,若不能构成三角形函数返回0。
程序第一处改错处将return 1;修改为return 3; 的原因是该语句所满足的条件if(a==b && b==c)实际上判断的是三条边是否都相等,也就是等边三角形。按照题意,若能构成等边三角形函数返回3。所以将return 1;修改为return 3;语句。
程序第二处改错处将return 3; 修改为return 1;的原因是该语句所满足的条件排除了等边三角形和等腰三角形。按照题意,若仅能够构成三角形函数返回1。所以将return 3; 修改为return 1;语句。
程序注解如下:
#include
/* a、b、c分别表示组成三角形的三个边的长度 */
int fun(int a,int b,int c)
{
/* 按照数学原理,只有任意两条边长之和都大于第三条边长,才能构成三角形 */
if(a+b>c && b+c>a && a+c>b)
{
/********found********/
/* 判断三条边长是否相等,即等边三角形 */
if(a==b && b==c)
/* 按照题意,若能构成等边三角形函数返回3 *
return 3;
else
/* 判断三条边长是否存在相同长度的两条边,即等腰三角形 */
if(a==b || b==c || a==c)
/* 按照题意,若能构成等腰三角形函数返回2 */
return 2;
else
/********found********/
/* 按照题意,若能构成三角形函数返回1 */
return 1;
}
else
/* a、b、c三条边的长度关系不符合构成三角形的条件,所以返回0 */
return 0;
}
main( )
{
int a,b,c,shape;
printf("\nInput a,b,c: ");
/* 使用scanf函数输入a、b、c的值,a、b、c分别表示三角形的三个边长 */
scanf("%d%d%d",&a,&b,&c);
printf("\na=%d, b=%d, c=%d\n",a,b,c);
shape=fun(a,b,c);
/* 输出a、b、c三个边长组成的三角形的类别 */
printf("\n\nThe shape : %d\n", shape);
}
69
分析:
题目要求读入一个英文文本行,将其中每个单词的第一个字母改成大写,然后输出此文本行(这里的"单词"是指由空格隔开的字符串)。例如,若输入I am a student to take the examination,则应输出I Am A Student To Take The Examination。
此题唯一一处改错处将upfst ( char p )修改为void upfst ( char *p )的原因是按照标准C语言的语法,任何函数必须在函数
头声明中声明该函数的返回类型。该返回类型应该和函数中使用return语句返回的值的类型保持一致。如果该函数没有使用return返回任何值,那么该函数的返回类型必须声明为void。此题的upfset函数没有任何return语句返回任何值,所以该函数必须声明函数返回类型为void。所以应该将upfst ( char p )修改为void upfst ( char *p )。
程序注解如下:
#include
#include
#include
/********found********/
void upfst ( char *p )
{
int k=0;
/* for ( ; *p; p++ )相当于for ( ; *p!= '\0'; p++ ) */
for ( ; *p; p++ )
/* if ( k )相当于if ( k!=0 ) */
if ( k )
{
/* 判断p当前指向的字符是否是空格 */
if ( *p==' ' )
k=0;
}
else
/* 判断p当前指向的字符是否不是空格 */
if ( *p!=' ' )
{
k=1;
/* 使用toupper函数将*p转换为大写字母 */
/* toupper函数定义在ctype.h ,所以存在#include
*p = toupper( *p );
}
}
main( )
{
char chrstr[81];
/* clrscr函数的作用是清除输出窗口中已经存在的所有信息 */
clrscr();
printf("\nPlease enter an English text line: " );
/* 使用gets函数接收从键盘输入的字符串,将其放入chrstr字符串数组中 */
gets( chrstr );
/* 输出处理之前的chrstr字符串的内容 */
printf("\n\nBefore changing:\n %s", chrstr );
upfst( chrstr );
/* 输出处理之后的chrstr字符串的内容 */
printf("\nAfter changing:\n %s\n", chrstr );
}
70
分析:
题目要求在fun函数中从整数1至55之间,选出能被3整除、且有一位上的数是5的那些数,并把这些数放在b所指的数组中,这些数的个数作为函数值返回。规定,函数中a1放个位数,a2放十位数。
程序第一处改错处将fun( int *b )修改为int fun( int *b )的原因是按照标准C语言的语法,任何函数必须在函数头声明该函数的返回类型。这个返回类型应该和该函数使用return语句返回的值的类型保持一致。如果函数中没有使用return语句返回任何值,那么在该函数的函数头声明必须将该函数的返回类型声明为void。在此题的fun函数中存在return i;语句,而i被定义为int类型,所以fun函数的返回类型应该声明为int。即应该将fun( int *b )修改为int fun( int *b )。
程序第二处改错处将for(k=10; k<=55; k++)修改为for(k=1; k<55; k++)的原因是题目要求在整数1至55之间这个范围进行选取数字,所以应该将for(k=10; k<=55; k++)修改为for(k=1; k<55; k++)。
程序第三处改
错处将return k;修改为return i;的原因是i变量的作用是记录那些能被3整除、且有一位上的数是5的数字的个数,题目要求这些数的个数作为函数值返回,所以此处语句应该返回i而不是k。
程序注解如下:
#include
/********found********/
int fun( int *b )
{
int k,a1,a2,i=0;
/********found********/
/* 按照题意从整数1至55之间进行选取 */
for(k=1; k<55; k++)
{
/* 将k的十位数放入a2,因为k是二位数,所以k/10能够取得十位数 */
a2=k/10;
/* 取得k的个位数放入a1中 */
a1=k-a2*10;
/* 选出能被3整除、且有一位上的数是5的那些数 *
/* k%3==0成立说明k能被3整除 */
/* 且有一位上的数是5,所以判断个位、十位数字是否为5 */
if((k%3==0 && a2==5)||(k%3==0 && a1==5))
{
/* 将能被3整除、且有一位上的数是5的这些数放在b所指的数组中 */
b[i]=k;
/* i记录符合条件放入b数组的数字的个数,所以这里要加一 */
i++;
}
}
/********found********/
/* 返回符合条件放入b数组的数字的个数i */
return i;
}
main( )
{
int a[100],k,m;
m=fun( a );
printf("The result is:\n");
/* 输出a数组中保存的能被3整除、且有一位上的数是5的数字 */
for(k=0; k
printf("%4d",a[k]);
printf("\n");
}
本本美容专家店※全球第一家创立DIY笔记本电脑美容商城
广州【同利电脑】二手笔记本专卖--不满意包退
acer、神舟笔记本专卖店!四钻+消保 「广州商盟」宝贝传奇
屏线/硬盘线/屏线(屏)转接线/测试线(广州粤海电子直销)
四钻店★中国数码网·原装美行IBM笔记本★学生创业100%诚信
【北京商盟】██芭比数码专卖██
身边朋友
天机本联科技淘宝旗舰店
【经实数码】五钻至尊卖家 笔记本 笔记本电脑 二手笔记本电脑
摩男本本之家
本本乐园88
海尔笔记本电脑授权专卖 微软正版软件代理
冲5钻◆新年快乐◆新货不断上市中/牛皮纸原创本到货
联想笔记本电脑专卖店 手机配件批发店
中美数码电子特快
快麦网-笔记本电脑包专卖店
鑫源二手笔记本旗舰店
四钻鸿诚 二手笔记本电脑超市
五钻信用<天空数码笔记本电脑专卖店>
森林木本本
二手网吧电脑批发中心
醉爱咖啡数码
保定搏浪电脑公司网络分店
【斯玛特电脑服务中心】