上机改错题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钻◆新年快乐◆新货不断上市中/牛皮纸原创本到货
联想笔记本电脑专卖店 手机配件批发店
中美数码电子特快
快麦网-笔记本电脑包专卖店
鑫源二手笔记本旗舰店

四钻鸿诚 二手笔记本电脑超市
五钻信用<天空数码笔记本电脑专卖店>
森林木本本
二手网吧电脑批发中心
醉爱咖啡数码
保定搏浪电脑公司网络分店
【斯玛特电脑服务中心】

相关文档
最新文档