文档库 最新最全的文档下载
当前位置:文档库 › 程序改错题

程序改错题

1、下列给定程序中,函数fun的功能是:分别统计字符串中大写字母和小写字母的个数。例如,给字符串s输入:AaaaBBb123CCccccd,则应输出结果:upper=5,1ower=9。
请改正程序中的错误,使它能计算出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include <conio.h>
#include <stdio.h>
/********found********/
void fun(char *s,int a,int b)
{
while (*s)
{
/********found********/
if (*s>='A' && *s<='Z')
*a++;
/********found********/
if (*s>='a' && *s<='z')
*b++;
s++;
}
}
main( )
{
char s[100];
int upper = 0,lower=0;
printf("\nPlease a string:");
gets(s);
fun(s,&upper,&lower);
printf("\n upper=%d lower=%d\n",upper,lower);
}

解:
(1)错误:void fun( char *s, int a, int b) 正确:void fun(char *s, int *a, int *b)
(2)错误:a++; 正确:(*a)++;
(3)错误:b++; 正确:(*b)++;
【解析】(1)根据题中程序可以看出,函数fun传递的是地址,那么在函数中就应该出现指针,所以改为void fun (char *s ,int *a, int *b)。
(2)和(3)很明显,这里是要累加数值,因为a、b是指针变量,所以是错误的。



2、下列给定程序中,函数fun()的功能是:根据整型形参m的值,计算如下公式的值。
t=1-1/(2×2)-1/(3×3)-…-1/(m×m)
请改正函数fun()中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
double fun(int m)
{double y=1.0;
int I;
/*************found**************/
for(I=2;I<m;I++)
/*************found**************/
y-=1/(I*I);
return(y);
}
void main()
{int n=5;
system("CLS");
printf("\nThe result is %1f\n", fun(n));
}

(1)错误:for(I=2; I<m; I++) 正确:for(I=2; I<=m; I++)
(2)错误:y-=1/(I*I); 正确:y-=1.0/(I*I);
【解析】该题是一道简单的计算题,循环条件for(I=2;I<m;I++)中忽略了i=m时的一种情况,因为题目中I是从2到m的一个计算公式。y-=1/(I*I);的错误很明显,是语法错误,由定义double y=1.0可知,应该是y-=1.0/(I*I);,而非y-=1/(I*I);。



3、下列给定程序中,fun函数的功能是:根据形参m,计算下列公式的值。
t=1+1/2+1/3+1/4+…+1/m
例如,若输入5,则应输出2.283333。
请改正程序中的错误,使它能计算出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
double fun(int m)
{
double t=1.0;
int I;

for(I=2;I<=m;I++)
/*************found**************/
t+=1.0/k;
/*************found**************/
return I;
}
void main()
{int m;
system("CLS");
pri
ntf("\nPlease enter 1integer number: ");
scanf("%d",&m);
printf("\nThe result is %1f\n", fun(m));
}

(1)错误:t+=1.0/k; 正确:t+=1.0/I;
(2)错误:return I; 正确:return t;
【解析】该题目考查分母成等差数列递增的一个数学公式,我们先看循环条件for(I=2;I<=m;I++),i从2开始递增到m,所以t的值应该是由1.0/I的值逐步循环叠加后的结果,而不是t+=1.0/k;。return I;考查对程序的解读能力,当循环结束后(由输入m的值决定),函数返回当前t的值。



4、下列给定的程序中,函数fun的功能是:计算并输出k以内最大的10个能被13或17整除的自然数之和。K的值由主函数传入,若k的值为500,则函数的值为4622。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int fun(int k)
{ int m=0,mc=0, j;
while((k>=2)&&(mc<10))
{
/*************found**************/
if((k%13=0)||(k%17=0))
{ m=m+k;mc++;}
k--;
/*************found**************/
return m;
}
void main()
{system("CLS");
printf("%d\n ",fun(500));
}

(1)错误:if((k%13=0)||(k%17=0)) 正确:if((k%13==0)||(k%17==0))
(2)错误:缺少大括号 正确:加 }
【解析】x能被y整除的表示方法是x%y==0,而并非像题目中所表示的x%y=0,所以,if((k%13=0)||(k%17=0))修改后的结果应该是答案所示信息。(2)中缺少程序完整所需的"}",此类信息在做题时一定要注意,我们可以在做题前先运行一下程序,这样明显的错误一般都会有错误信息显示出来,比如丢失"}"的错误信息是"Compound statement missing } in function fun",并在当前错误处停止光标,我们只要按回车键进行编辑就可以了。



5、下列给定程序中,函数fun的功能是:根据整型形参m,计算如下公式的值。
y=1+1/(2*2)+1/(3*3)+...+1/(m*m)
例如,若m中的值为5,则应输出:1.463611。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include <conio.h>
#include <stdio.h>
double fun(int m)
{
double y=1.0;
int i;
/********found********/
for (i=2; i<m; i++)
/********found********/
y+=1/(i*i);
return(y);
}
main( )
{
int n=5;
printf("\nThe result is%1f\n",fun(n));
}

(1)错误:for (i=2;i<m;i++) 正确:for(i=2;i<=m;i++)

(2)错误:y+=1/(i*i) 正确:y+=1.0/(i*i)
【解析】(1)for (i=2;i<m;i++)中是一个基础的分析错误,应该包括m。(2)y是一个double型变量,题中得出的结果是一个整数,所以改为y+=1.0/(i*i)。



6、下列给定程序中,函数fun的功能是:按如下递归公式求函数值。
fu
n(n)= 10 (n=1) fun(n-1)+2 (n>1)
例如,当给n输入5时,函数值为18;当给n输入3时,函数值为14。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include <stdio.h>
/********found********/
int 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));
}

(1)错误:int fun(n) 正确:int fun (int n)
(2)错误:if (n=1) 正确:if (n==1)
【解析】(1)主函数中已经定义了变量n的类型,在子函数中也要定义。(2)if后面应该紧跟一个条件判断表达式,而n=1是付值表达式,表达式的值永远为真,也就是说这个条件永远成立,没有递归执行。
.


7、下列给定程序中函数fun的功能是:计算n!。例如,给n输入5,则输出120.000000。
请改正程序中的错误,使程序能输出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include <stdio.h>
#include<conio.h>
double fun(int n)
{
double result = 1.0;
/********found*******/
if n==0
return 1.0;
while (n>1 && n<170)
/********found********/
result = n--;
return result;
}
main ( )
{
int n;
printf("Input N:");
scanf("%d",&n);
printf("\n\n%d!=%lf\n\n",n,fun(n));
}

(1)错误:if n==0 正确:if( n==0)
(2)错误:result =n--; 正确:result *=n--;
【解析】(1)这里是一个简单的格式错误,if条件应该加括号。
(2)根据阶乘的概念,从n开始,n!=n*(n-1)!,直到1,所以应该为result *=n--;



8、下列给定程序中函数fun的功能是:计算正整数num各位上的数字之积。例如,若输入252,则输出应该是20。若输入202,则输出应该是0。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include <stdio.h>
#include <conio.h>
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);
pri

ntf("\n%ld\n",fun(n));
}

(1)错误:long k; 正确:long k=1;
(2)错误:num \=10; 正确:num /=10;
【解析】(1)k用来存放各位数字的积,初值应为1。
(2)这里是一个符号错误,除号使用"/"来表示的。



9、下列给定程序中函数fun的功能是:将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。例如当s中的数为87653142时,t中的数为7531。
请改正函数fun中的错
误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
void fun(long s,long *t)
{int d;
long s1=1;
/*************found**************/
t=0;
while(s>0)
{ d=s%10;
/*************found**************/
if(d%2==0)
{*t=d*s1+*t;
s1*=10;
}
s/=10;
}
}
void main()
{long s, t;
system("CLS");
printf("\nPlease enter s: "); scanf
("%ld",&s);
fun(s,&t);
printf("The result is :%ld\n",t);
}

(1)错误:t=0; 正确:*t=0;
(2)错误:if(d%2==0) 正确:if(d%2!=0)
【解析】其实,本题的重点在考查两个问题:第1个错误中出现了一个t=0,那么请看一下t是从哪儿来的,第1次出现t的地方在哪儿?对,就这么简单。那我们再来思考一下用C语言表达一个奇数的话应该怎么表达?用数学的方法呢?偶数是能被2整除的,奇数刚好相反,那么if(d%2==0)是想表示奇数还是偶数呢,看题目就明白了!



10、下列给定程序中,函数fun的功能是:计算s所指字符串中含有t所指字符串的数目,并作为函数值返回。
请改正函数fun中的错误或在横线处填上适当的内容并把横线删除,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include <conio.h>
#include <stdio.h>
#include <string.h>
#define N 80
int fun(char *s,char *t)
{
int n;
char *p, *r;
n = 0;
/********found********/
p = &s[0];*r = t;
while (*p)
{
if (*r == *p)
{
r++;
if(*r == '\0')
{
n++;
/*******found*******/
____填空____
}
}
p++;
}
return n;
}
main ( )
{
char a[N],b[N];
int m;
printf("\nPlease enter string a :");
gets(a);
printf("\nPlease enter sUbstring b :");
gets(b);
m = fun(a,b);
m = printf("\nThe result is:m=%d\n",m);
}

(1)错误:*r =t; 正确:r=t;
(2)应填:r=t;或r=&t[0];
【解析】从字符串s中找出子字符串的方法是:从第1个字符开始,对字符串进行遍历;若s串的当前字符等于t串的第1个字符,两字符串的指针自动加1,继

续比较下一个字符;若比较至字符串的末尾,则跳出循环;若s串的字符和t串的字符不对应相同,则继续对s串的下一个字符进行处理。



相关文档