有几道c语言程序改错题技巧改错的题,不太会,麻烦哪位大神帮一下

【精品】2012大连理工大学C语言机房模拟试题之程序改错题(全)- 道客巴巴
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 求1到20的阶乘的和。
------------------------------------------------------*/ #include &stdio. h& void fun()
float s=0. 0, t=1. 0;
for(n=1; n&=20; n++)
/**********ERROR**********/
for(j=1; j&=n; j++)
/**********ERROR**********/
/**********ERROR**********/
/**********ERROR**********/
printf(&jiecheng=%d\n&, s) ;
//printf(&jiecheng=%f\n&, s) ; }
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 编写一个函数, 该函数可以统计一个长度为3的字符串在另
一个字符串中出现的次数。
例如: 假定输入的字符串为: asdasasdfgasdaszx67asdmklo, 字符
串为: asd, 则应输出n=4。
------------------------------------------------------*/ #include &stdio. h& #include &string. h& #include &conio. h& int fun(char *str, char *substr)
/**********ERROR**********/
int i, n=0
// int i, n=0;
/**********ERROR**********/
for(i=0; i&=strlen(str) ; i++)
// for(i=0; i&=strlen(str) -3; i++)
//for(i=0;i&strlen(str) -2; i++)
if((str[i]==substr[0]) &&(str[i+1]==substr[1]) &&(str[i+2]==substr[2]) )
/**********ERROR**********/
n=n+1; ++n;
char str[81], substr[4];
printf(&输入主字符串:
gets(str) ;
printf(&输入子字符串:
gets(substr) ;
puts(str) ;
puts(substr) ;
n=fun(str, substr) ;
printf(&n=%d\n&, n) ;
/*------------------------------------------------------
【程序改错】 1246 -------------------------------------------------------- 功能: 有一数组内放10个整数, 要求找出最小数和它的下标, 然后
把它和数组中最前面的元素即第一个数对换位置.
------------------------------------------------------*/ #include &stdio. h& main( )
i, a[10], min, k=0;
printf(&\n please input array 10 elements\n&) ;
for(i=0; i&10; i++)
/***********ERROR***********/
scanf(&%d&,
//scanf(&%d&, &a[i]) ;
for(i=0; i&10; i++)
printf(&%d&, a[i]) ;
/***********ERROR***********/
for(i=3; i&10; i++)
//for(i=1; i&10; i++)
for(i=0; i&10; i++)
// for(i=1; i&=9; i++)
for(i=0; i&=9; i++)
/***********ERROR***********/
if(a[i]&min)
// if(a[i]&min)
/***********ERROR***********/
a[k]=a[i];
// a[k]=a[0];
printf(&\n after eschange: \n&) ;
for(i=0; i&10; i++)
printf(&%d&, a[i]) ;
printf(&\nk=%d\nmin=%d\n&, k, min) ;
/*------------------------------------------------------
【程序改错】 1906 -------------------------------------------------------- 功能: 以下程序把两个数按由大到小的顺序输出来.
------------------------------------------------------*/ #include &stdio. h& /***********ERROR***********/ void swap( int *p1, *p2)
//swap( int *p1, int *p2)
void swap( int *p1, int *p2)
printf(&input a, b: &) ;
/***********ERROR***********/
scanf(&%d%d&, a, b) ;
//scanf(&%d%d&, &a, &b) ;
swap(p, q) ;
printf(&a=%d, b=%d\n&, a, b) ;
/***********ERROR***********/
printf(&max=%d, min=%d\n&, p, q) ;
//printf(&max=%d, min=%d\n&, *p, *q) ;
// printf(&max=%d, min=%d\n&, a, b) ; }
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 输出 Fabonacci 数列的前 20 项, 要求变量类型定义成浮点型,
输出时只输出整数部分, 输出项数不得多于或少于 20。
------------------------------------------------------*/ #include &stdio. h& void fun()
float f1=1, f2=1, f3;
/**********ERROR**********/
printf(&%8d&, f1) ;
//printf(&%8. 0f%8. 0f&, f1,
/**********ERROR**********/
for(i=1; i&=20; i++)
//for(i=3; i&=20; i++)
/**********ERROR**********/
/**********ERROR**********/
printf(&%8. 0f&, f1) ;
//printf(&%8. 0f&, f3) ;
printf(&\n&) ; }
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 求两数平方根之和, 作为函数值返回。
例如: 输入 12 和 20, 输出结果是: y = 7. 936238。
------------------------------------------------------*/ #include &stdio. h& #include &conio. h& #include &math. h&
/**********ERROR**********/ double fun (double *a,
//double fun (double *a,
double *b)
/**********ERROR**********/
c = sqr(a) +sqr(b)
//c = sqrt(*a) +sqrt(*b) ;
/**********ERROR**********/
printf ( &Enter a & b :
scanf (&%lf%lf&,
y = fun (&a,
printf (&y = %f \n&,
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 求广义菲玻那契级数的第 n 项。 广义菲玻那契级数的前 n
1, 1, 1, 3, 5, 9, 17, 31, &&
从第 4 项开始,
每一项都是前 3 项之和。
项值通过函数值返回 main ( ) 函数。
例如: 若 n = 15, 则应输出: The value is:
------------------------------------------------------*/ #include &conio. h& #include &stdio. h&
long fun ( int n )
/**********ERROR**********/
// for (k=4;
d = a+b+c;
/**********ERROR**********/
/**********ERROR**********/
int n = 15;
printf( &The value is:
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 判断字符 ch 是否与 str 所指串中的某个字符相同;
什么也不做, 若不同, 则将其插在串的最后。
------------------------------------------------------*/ #include &conio. h& #include &stdio. h& #include &string. h&
/**********ERROR**********/
void fun(char str,
// char *str {
while ( *str && *str != ch )
/**********ERROR**********/
if ( *str!=' \0'
// if ( *str==' \0'
str [ 0 ] =
/**********ERROR**********/
str[1] = ' 0' ;
char s[81],
printf( &\nPlease enter a string: \n& ) ;
gets ( s ) ;
printf (&\n Please enter the character to search : & ) ;
c = getchar() ;
printf( &\nThe result is %s\n&,
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 求1到10的阶乘的和。
------------------------------------------------------*/
#include &stdio. h& main()
float s=0;
float fac(int n) ;
/**********ERROR**********/
for(i=1; i&10; i++)
//for(i=1; i&=10; i++)
/**********ERROR**********/
s=fac(i) ;
// s=s+fac(i) ;
//s+=fac(i) ;
printf(&%f\n&, s) ;
float fac(int n)
{ /**********ERROR**********/
// float y=1. 0;
//float y=1;
for(i=1; i&=n; i++)
/**********ERROR**********/
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 实现交换两个整数的值。
例如: 给a和b分别输入3和6 , 输出为a=6 b=3 ------------------------------------------------------*/ #include &stdio. h& /**********ERROR**********/ void fun (int a,
//void fun (int *a, int *b)
/**********ERROR**********/
/**********ERROR**********/
/**********ERROR**********/
printf(&enter a, b: &) ; scanf(&%d%d&, &a, &b) ;
fun(&a, &b) ;
printf(&a=%d b=%d\n&, a, b) ;
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 有1、 2、 3、 4个数字, 能组成多少个互不相同且无重复数
字的三位数? 都是多少?
------------------------------------------------------*/ #include &stdio. h& main()
/**********ERROR**********/
printf(&\n&)
//printf(&\n&) ;
/**********ERROR**********/
for(i=1; i&=5; i++)
//for(i=1; i&5; i++)
for(j=1; j&5; j++)
for (k=1; k&5; k++)
/**********ERROR**********/
if (i!=k| | i!=j| | j!=k)
// if (i!=k&&i!=j&&j!=k)
printf(&%d, %d, %d\n&, i, j, k) ;
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 以下程序把两个数按由大到小的顺序输出来.
------------------------------------------------------*/ #include &stdio. h& /***********ERROR***********/ void swap( int *p1, *p2)
//swap( int *p1, int *p2)
printf(&input a, b: &) ;
/***********ERROR***********/
scanf(&%d%d&, a, b) ;
// scanf(&%d%d&, &a, &b) ;
swap(p, q) ;
printf(&a=%d, b=%d\n&, a, b) ;
/***********ERROR***********/
printf(&max=%d, min=%d\n&, p, q) ;
// printf(&max=%d, min=%d\n&, *p, *q) ;
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 猴子吃桃问题: 猴子第一天摘下若干个桃子, 当即吃了一半,
还不过瘾, 又多吃了一个, 第二天早上又将剩下的桃子吃掉
一半, 又多吃了一个。 以后每天早上都吃了前一天剩下的一
半零一个。 到第10天早上想再吃时, 见只剩下一个桃子了。
求第一天共摘了多少。
------------------------------------------------------*/ #include &stdio. h& main()
int day, x1, x2;
/**********ERROR**********/
while(day&0)
/**********ERROR**********/
x1=(x2+1) /2;
// x1=(x2+1) *2;
/**********ERROR**********/
day=day-1;
printf(&the total is %d\n&, x1) ; }
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 将s所指字符串的反序和正序进行连接形成一个新串放在
t所指的数组中。
例如: 当s所指的字符串的内容为&ABCD&时, t所指数组中
的内容为&DCBAABCD&。
------------------------------------------------------*/ #include
&conio. h& #include
&stdio. h& #include
&string. h& /**********ERROR**********/ void fun (char
// void fun (char s[], char t[])
void fun (char *s, char *t)
// void fun (char *s, char t[])
void fun (char s[], char *t)
/**********ERROR**********/
d = len(s) ;
// d = strlen(s) ;
/**********ERROR**********/
for (i = 1;
// for (i = 0;
for (i = 0;
// for (i = 0;
for (i = 0;
d-1&=i; i++)
t[i] = s[d - 1 - i ];
for (i = 0;
t[ d + i ] = s[i];
/**********ERROR**********/
t[2*d] = ' /0' ;
// t[2*d] = ' \0' ;
t[2*d] = NULL;
t[2*d] = 0;
// t[i+d] = ' \0' ;
t[i+d] = NULL;
t[i+d] = 0;
printf(&\nPlease enter string S: &) ;
scanf(&%s&,
printf(&\nThe result is:
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 一个5位数, 判断它是不是回文数。 即12321是回文数, 个
位与万位相同, 十位与千位相同。
------------------------------------------------------*/ #include &stdio. h& main( )
/**********ERROR**********/
long ge, shi, wan,
//long ge, shi, qian, wan,
scanf(&%ld&, &x) ;
/**********ERROR**********/
wan=x%10000;
//wan=x/10000;
shi=x%100/10;
/**********ERROR**********/
if (ge==wan| | shi==qian)
//if(ge==wan&&shi==qian)
if(shi==qian&&ge==wan)
printf(&this number is a huiwen\n&) ;
printf(&this number is not a huiwen\n&) ; }
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 用下面的和式求圆周率的近似值。 直到最后一项的绝对值
小于等于0. 0001。
& /4= 1- 1/3 + 1/5 - 1/7 . . . .
------------------------------------------------------*/ #include &stdio. h& /**********ERROR**********/ #include &math&
//#include &math. h&
#include &math. h& void fun()
/**********ERROR**********/
s=0, t=1, p=1;
//float s=0, t=1, p=1;
double s=0, t=1, p=1;
/**********ERROR**********/
while(fabs(t) &=1e-4)
// while(fabs(t) &1e-4)
/**********ERROR**********/
printf(&pi=%d\n&, s*4) ;
// printf(&pi=%f\n&, s*4) ;
printf(&pi=%lf\n&, s*4) ;
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 实现两个字符串的连接。
例如: 输入dfdfqe和12345时, 则输出dfdfqe12345.
------------------------------------------------------*/ #include&stdio. h& main()
char s1[80], s2[80];
void scat(char s1[], char s2[]) ;
gets(s1) ;
gets(s2) ;
scat(s1, s2) ;
puts(s1) ;
void scat (char s1[], char s2[])
int i=0, j=0;
/**********ERROR**********/
while(s1[i]= =' \0' )
//while(s1[i]!=' \0' ) i++;
while(s1[i]) i++; //while(s1[i]!=NULL) i++;
while(s1[i]!=0) i++;
/**********ERROR**********/
while(s2[j]= =' \0' )
//while(s2[j]!=' \0' )
while(s2[j])
/**********ERROR**********/
s2[j]=s1[i];
//s1[i]=s2[j];
/**********ERROR**********/
s2[j]=' \0' ;
//s1[i]=' \0' ;
*(s1+i) =' \0' ;
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 实现 3 行 3 列矩阵的转置, 即行列互换。
------------------------------------------------------*/ #include &stdio. h& void fun(int a[3][3], int n)
for(i=0; i&n; i++)
for(j=0; j&n; j++)
/**********ERROR**********/
scanf(&%d&, a[i][j]) ;
//scanf(&%d&, &a[i][j]) ;
for(i=0; i&n; i++)
for(j=0; j&n; j++)
printf(&%4d&, a[i][j]) ;
printf(&\n&) ;
for(i=0; i&n; i++)
/**********ERROR**********/
for(j=0; j&n; j++)
//for(j=0;j&i; j++)
/**********ERROR**********/
a[i][j]=t;
//t=a[i][j];
a[i][j]=a[j][i];
/**********ERROR**********/
t=a[j][i];
//a[j][i]=t;
for(i=0; i&n; i++)
for(j=0; j&n; j++)
printf(&%4d&, a[i][j]) ;
printf(&\n&) ;
int b[3][3];
fun(b, 3) ;
/*------------------------------------------------------
【程序改错】
--------------------------------------------------------
功能: 从键盘输入 10 个字符, 统计其中数字字符的个数。
------------------------------------------------------*/ #include &stdio. h&
int main( )
int i, sum=0;
for(i=11; i&=2; i--)
/**********ERROR**********/
c=gets( ) ;
//c=getchar() ;
if(c& ' 0'
| | c& ' 9' )
/**********ERROR**********/
printf(&sum=%d&, sum) ;
/*-------------------------------------------------------- 【程序改错】
-------------------------------------------------------- 功能: 依次取出字符串中所有数字字符, 形成新的字符串, 并取代原字符串。
例如: 输入ab12c3d, 则输出123。
注意: 不得增行或删行, 也不得更改程序的结构!
------------------------------------------------------*/ #include &stdio. h& /**********ERROR**********/ void fun(char s)
//void fun(char *s)
//void fun(char s[])
for(i=0, j=0;
s[i]!=' \0' ;
if(s[i]&=' 0' &&s[i]&=' 9' )
/**********ERROR**********/
s[j]=s[i];
// s[j++]=s[i];
/**********ERROR**********/
s[j]=&\0&;
//s[j]=&\0&;
char item[80];
printf(&\nEnter a string: &) ;
gets(item) ;
printf(&\n\nThe string is:
\&%s\&\n&, item) ;
fun(item) ;
printf(&\n\nThe string of changing is:
\&%s\&\n&, item) ; }
/*------------------------------------------------------
【程序改错】
-------------------------------------------------------- 功能: 读入一个整数m( 5&m&20 ) , 函数rnd获得m个随机整数,
函数sortpb将这m个随机整数从小到大排序。
例如: 若输入整数7, 则应输出: 3 10 17 28 32 36 47。
------------------------------------------------------*/ #include &conio. h& #include &stdio. h& sortpb ( int n,
/**********ERROR**********/
for ( j = 0;
for ( i = j + 1;
/**********ERROR**********/
if ( a[p] & a[j] )
// if ( a[p] & a[i] )
/**********ERROR**********/
if ( p == j )
// if ( p != j )
a[j] = a[p];
double rnd ( )
static t = 29,
r =( r*t + c ) %m;
return( ( double ) r/m ) ; }
getarr( int n,
for( i = 1;
*x = ( int ) ( 50*rnd()
putarr( int n,
for( i = 1;
printf( &%4d&,
if ( !( i%10 )
printf( &\n& ) ;
printf(&\n&) ; }
int aa[20],
printf( &\nPlease enter an integer number between 5 and 20:
scanf( &%d&,
getarr( n,
printf( &\n\nBefore sorting %d numbers:\n&,
putarr( n,
sortpb( n,
printf( &\nAfter sorting %d numbers: \n&,
putarr( n,C语言改错题分类总结_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C语言改错题分类总结
&&C语言改错题分类总结
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩2页未读,
定制HR最喜欢的简历
你可能喜欢帮我做一个C语言题给一堆数组A输入任意6个整数,如:356218,建立一个以下内容的方针8 3 5 6 2 11 8 3
帮我做一个C语言题给一堆数组A输入任意6个整数,如:356218,建立一个以下内容的方针8 3 5 6 2 11 8 3 5 6 22 1 8 3 5 66 2 1 8 3 55 6 2 1 8 33 5 6 2 1 8这是我做的看看那里不对#include "stdio.h"#define N 6void main(){int a[N],i,j,k,n;printf("请输入任意6个整数\n");for(i=0;i
我有更好的回答:
剩余:2000字
与《帮我做一个C语言题给一堆数组A输入任意6个整数,如:356218,建立一个以下内容的方针8 3 5 6 2 11 8 3》相关的作业问题
方法一://用数学函数#include#includevoid main(){ scanf("%d",&a); printf("%d\n",abs(a));}方法二://判断#includevoid main(){ scanf("%d",&a); if(a>=0) printf("%d\n"
int 交换函数(int X){int 新十位数=X用10取余;int 新个位数=(X-[X用10取余])/10;交换函数=10×新十位数+新个位数;输出“交换函数”} 说明:输入的数据为X.
#includevoid main(){int a[6],i,j,k,m;for(i=0;i=0;i--){k=a[5];for(j=4 ;j>=0;j--)a[j+1]=a[j];a[0]=for(m=0;m
第1题答案不唯一吧,既可以是17897张1角的,也可以是1789张1元的+7张1角的.如果你要求张数最少,那么程序很简单,如下:program testimplicit noneinteger,dimension(6)::nominal1,num1 ! 100元 50元 10元 5元 2元 1元integer,dime
int FindMax(int a,int b,int c){if(a>b){if(a>c)}else{if(b>c)}}
已经帮你发过去了.我的邮箱:
首先,用函数必须要声明.另外你说你输入两个数是输出的是小的而不是大的,这是因为你在输入这两个数的时候加了一个逗号你把逗号改成空格就行了.其他的看下图片就知道啦!
11.设i,j,k均为int 型变量,则执行完下面的for循环后,k的值为 .for(i=0,j=10;i
#include#includevoid fun(char str[]){int i,j=0;i=strlen(str)%3;for(j=0;j
一、按要求写词.1.写出与“悲欢离合”结构相似的成语.(阴晴圆缺) 2.写出与“琴棋书画”结构相似的成语.(亭台楼阁) 3.写出表示时间短暂的三字词语.(一刹那) 二、对对子.明月对(骄阳) 莺歌对(燕舞) 功成对(名就) 风飕飕对(雨绵绵) 桃红对(柳绿) 朗月对(清泉) 潮涨落对(云卷舒) 粗茶淡饭对(山珍海味)
1.我明白了—世界上(最大的发明与发现),有时(还面临着受到驱逐和迫害的风险).2.我读了(奥斯特洛夫斯基)写的《钢铁是怎样炼成的》 我的感受是:保尔柯察金是一个真正的令人敬佩的英雄.保尔这个人物在作者的笔下栩栩如生,他是一个有血有肉的、普普通通的、生活在我们身边的平民英雄.是他生活的那个时代造就了他,他的成长经历深深
12.“圈子”代表“朋友”,而朋友的好坏将会决定你的未来;指着是想告诉我们要谨慎交友,要认真严肃对待交友问题.13.首先引用短语说明朋友决定未来;最后得出人心情的好坏也是有圈子的高低决定的.14.A15.(1)在人生中,和你在一起生活最长时间的就是朋友,所以朋友的好坏决定着你的好坏,因此作者的观点是对的.(2)只要你的
if(*n1+10*n2+n2==sum)改成if(*n1+10*n2+n2==sum && n1!=n2)
好久没做过数学题了,有点罗嗦仅供参考!做法看图片,可以放大呵呵.
所有的题几乎都经过了测试.1.d 2.c 3.c (实际是第二个选项)4.d 5.b 6.a 7.b 8.c 9.d 10.b11.a 12.c 13.d 14.d 15.2 16.2 17.1 18.2 19.2 20.2 第18题的答案肯定是2,y^y肯定是0,经过了测试.这是进行异或运算.
I.填入正确的介词!(10P)1.Er dankt mir (für) das neue Buch.2.(Wegen) des Regens kommt er zu uns.3.Ich helfe ihm (bei) der Arbeit.4.Der Lehrer spricht (mit) den Schülern
Ⅰ. Multiple choices (there is one correct answer only):1. The center of mass a system of particles has a constant velocity if:A. the forces exerted by the parti
青春如一首美妙的歌,令人为之陶醉,如一曲高山流水,流泻出一个个越动的音符有吃的才能叫家.“家”是一个象形字,在一个有顶盖有围墙的地方养一只豕(即猪),就是家了.所以家的要点之一是有遮有挡——有一间或多间房子,不受水淋日晒、风吹雪打之苦.要点之二是有点积蓄——有或多或少的财物,不为有上顿没下顿发愁.家的原始要求就这么简单
1 I prefer walking to cycle.cycle 应该改为cycling.因为prefer doing sth to doing sth 是固定用法.2 Nearly nobody could work it out.nearly nobody应该改为Few people,表示几乎没有人,英语中习惯用《C语言上改错题详解》 www.wenku1.com
C语言上改错题详解日期:
1、 给定程序 MODI1.C 中,函数 fun 的功能是:通过某种方式实现两个变量值的交换, 规定不允许增加任何语句和表达式。例如变量 a 中的值原为 10, b 中的值原为 20,程序运 行后 a 中的值为 20, b 中的值为 10。请改正程序中的错误,使它能得出正确的结果。注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!试题源程序如下:#include/**********found***********/void fun(int x,int y){/**********found***********/t=x; x=y;/**********found***********/}main(){ int a,b;printf(printf(b=fun(&a,b);printf(}分析 1) 当对以上程序进行编译时,给出的第一个出错信息是:void function may not return avalue。指出 void 类型的函数不可能返回一个函数值。从主函数可知,函数将返回值 赋给整型变量 b , 因此, fun 函数应当是 int 类型, 在 fun 之前的 void 应改为 int 或删除 void 。 (2)改正以上错误的同时, 考生会发现主函数中调用 fun 函数时, 第一个实参和形参的类 型不匹配,实参的类型是 int 变量的地址值,形参的类型是 int 类型变量,因此应该在 fun 函数的第一个形参 x 之前加一个 *号,把 x 定义成一个能接受地址的指针。(3)进行修改后的程序编译不再出错,运行程序时给 a 和 b 输入数据 (注意输入的数据用 空格隔开 ) 。 若给 a 输入 10, 给 b 输入 20, 从输出的结果看 a 和 b 的值都没有变, 也就是说, 在 fun 函数中并没有进行指定的交换操作,这就要求对 fun 函数中的语句进行检查。(4)在函数内可以发现语句 t=x;把地址值赋给了整型变量, 这是不允许的, 按题义应当把 指针 x 所指 a 的值赋给 t ,因此语句应该是 t=*x;同样语句 x=y;应该改成 *x=y;,这样就把主 函数中变量 b 的值赋给了变量改变后再运行程序并给 a 和 b 分别输入 10和 20,观察输 出结果可以看到 a 和 b 的值都为 20,也就是说 b 的值已给了 a ,而 b 本身并没有改变。 (5)再审查程序应当看到在主函数中, b 最后的值是通过 fun 函数的返回值赋给的,观察 函数的 return 语句, 返回的是函数中 y 的值,而这是主函数中 b 的原值,因此在逻辑上存在 错误,按题义应该返回 a 的原值,而此时, a 的原值已通过 t=*x放在了 fun 函数的 t 中,所 以 return 语句应改成:。再次运行程序,就的到了正确的结果。(6)提示:①首先检查被调用函数的类型和形参的类型是否与主函数中的调用函数和实参类型一 致,如果不一致,应按主函数中的调用来进行修改。例如,实参为指针或数组名时,对应的 形参一定应定义成基类型相同的指针。 在主函数中返回的函数值赋给一个指针时, 则函数的 类型也一定是基类型相同的地址值 ?BR>②若函数有返回值,应检查 return 语句中的表 达式的类型是否与函数的类型一致。③若形参是指针类型,则在函数中应通过间址符 (*)来引用主函数中的变量。2、给定程序 MODI1.C 中,函数 fun 的功能是:求出以下分数序列的前 n 项之和。 (序列见 后面的图片 )其结果通过函数值返回 main 函数。例如,若 n 的值为:5,则应输出:8.391667。 请改正程序中的错误,或在下划线处填上适当的内容并把下划线删除,使它能得出正 确的结果。注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!试题源程序如下:#include/**********found**********/fun(int n){double t,s,a,b,c;/**********found**********/s=1;a=1;b=2;/**********found**********/For(i=0,i<=n,i++){t=a/b; s=s+t;/**********found**********/________;a=b;b=c;}}main(){printf(printf(}分析:(1)当对以上程序进行编译时,给出的第一个出错信息是:S , 指出语句缺少分号 (。再看出现此信息的上一行,关键字 for 写成了 For ,改正后再编译,给 出的出错信息是:Code has no effect ,指出代码无效,检查信息所在的 for 语句行,可以发 现括号内的各项用逗号分开而不是用分号,因此应当改正。(2)进行以上改正后,编译指出下划线处出错,这是必然的,应当在此处填写适当的语 句。这要求考生理解题义和给定的程序算法。由程序可见,分数序列中的每一项放在变量 t 中,其中的分子放在变量 a 中,分母放在变量 b 中,累加和放在变量 s 中。每次累加之后, 需要重新获得下一项的分子和分母, 按给出的分数序列可知, 下一项的分母是上一项的分子, 这由语句 b=a;来实现; 而下一项的分子是上一项的分子与分母之和, 根据语句 a=c;可知, 上 一项的分子与分母之和放在变量 c 中,因此在下划线处应填入:c=a+b。(3)编译之后没有语法错, 执行程序给 n 输入 5, 输出的结果是 0.000000, 检查函数中的 return 语句, 函数的返回值是 s , 难道 s 中的值是 0? 为此, 在 for 循环体的最后添加一个输出 语句 printf(n=5s=1.500000s=4.5000000s=5.8333333s=7.5833333s=9.154762The value of function is:0.000000可见, s 的值不是 0 !由此可以断定函数值在返回时出了问题, 检查与函数值有关的函数 值类型,发现函数的类型为 int ,而在主函数中,从输出格式可见输出的函数值是双精度型, 而 s 本身也是双精度型,因此应当在函数名 fun 前添加类型名 double 。(4)再次执行程序给 n 输入 5,输出的结果不是 8.391667,而是 10.791126,大于应得的 结果,这就应当检查所赋的初值和循环次数是否过多 ; 首先检查各变量的初值,存放累加和 的 s 初值应是 0,而不应是 1,进行改正;变量 a 是分子,第一项分子的初值应是 2,第一 项的分母应是 1,因此应给 a 赋 2,给 b 赋 1,进行改正。(5)改正后执行程序给 n 输入 5,输出的结果是 10.007051,因此接着检查循环次数,发 现 for 循环的循环控制变量 i 从 0变化到 5,循环次数是 6,因此应把 for 循环改成 for(i=0;i <n;i++)或 for(i=1;i<=n;i++),再次运行即得到正确的结果。(6)提示:①对于计算类型的程序,最好一开始就检查一下函数值的类型。②对于计算类型的程序,需要注意变量的初值,循环重复的次数。③对于如 1/n这样的整除应该改为 1.0/n或 (double)1/n这样的方式。④所有的关键字必须小写,例如:不能把 if 写成 If ,把 double 写成 Double 。⑤注意,变量名字母的大、小写,例如,定义变量名为 str 则不能错写成 Str 、定义变量 名为 pt 则不能错写成 Pt 。3 、给定程序 MODI1.C 中,函数 fun 的功能是:给定 n 个实数,输出平均值,并统计在平 均值以上 (含平均值 ) 的实数的个数。例如, n 的值为 8时,输入 28.3、 41.5、 19.0、 89.5、 55.8、 74.2、 22.4、 68.9,所 得平均值为 49.949997;在平均值以上 (含平均值 ) 的实数的个数为 4。请改正函数 fun 中的错误,使它能得出正确的结果。注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!试题源程序如下:#include int fun(float x[],int n)/**********found**********//**********found**********/float xn=0.0;for(i=0;i<n;i++)/**********found**********/xn=xn+x[j]/n;printf(for(i=0;i<n;i++)/**********found**********/if(x[i]=>xn)c++;}main(){ float x[20]={28.3,41.5,19.0,89.5,55.8,74.2,22.4,68.9};printf(}分析:(1)当对以上程序进行编译时, 给出的第一个出错信息是:Declaration syntax error, 指出在说明语句 中有语法错,仔细观察,可以发现在说明语句前却少了函数体开始的 左花括号,应当添加左花括号。(2)修改后进行编译,在第一个 for 循环体处给出一个警告出错信息:Possible use of'xn'beforedefintion ,提示 xn 有确定的值之前使用了它。此处,变量 xn 用于存放累加和, xn 出现在赋值号的右边,在第一次累加时它应当有初值,向上寻找,没有发现给它赋过初 值,因此应当在定义语句中给它赋初值 0。改成 float xn=0.0;(3)修改后再次进行编译,编译提示 if 语句中的关系表达式有语法错,出错信息是: E查看关系表达式,可发现关系运算符 (4)修改后再次进行编译,编译指出在 c++;处有错,出错信息是:Undefined symbol'c', 指出符号 'c' 没有经过定义;此处变量 c 用以统计数组中高于、等于平均值的实数的个数,查 看函数开头处的定义语句,未曾对 c 进行过定义,因此应该在 int 语句中添加。(5)修改后再次进行编译,编译给出出错信息:Undefined symbol'c' ,指出变量 c 没有定 义。所以说明语句应写成 int i,c=0;。因为函数用 c 进行累加,它应当先赋初值 0,(6)进行了以上的修改后,编译已无错误,运行程序得到正确的结果。4、给定程序 MODI1.C 中,函数 fun 的功能是:从字符串 s 中删除所有小写字母 c 。主函数 中已给 s 赋字符串:cabcdabcdabcxccc ,输出结果应该是:abdabdabx 。请改正函数 fun 中的错误,使它能得出正确的结果。注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!试题源程序如下:/**********found**********/include void fun(char s){ int i,j;for(i=j=0;s[i];i++)if(s[i]!='c')/**********found**********/s[j]=s[i];/**********found**********/s[i]=0;}main(){ char s[80]=printf(fun(s);printf(}分析:(1)当对以上程序进行编译时, 给出的第一个出错信息是:Declaration syntax error,指出在 include 行有语法错。观察此行首先可以发现在 include 之前没有 (2)再次进行编译时给出了出错信息:Invalid indirection, 指出 for 语句中的 s[i]为非法的 标识符。在此 s[i]以带下标的形式表示字符串中的某个元素,并作为循环结束标志,当 s[i]中的值为 0时循环结束,也就是说,遇到字符串结束标志时循环结束;观察形参 s ,仅说明 它是一个字符变量, 当然不可以使用 s[i]的形式, 而对应的实参却是一个字符数组名, 显然, 形参应定义成:char*s,进行修改后编译不再有错。(3)运行程序,输出结果是:xabcdabcdabcxccc ,与预定的结果不符。应进一步检查函数 fun 中的逻辑结构。 检查程序可知在 for 循环中, 通过下标 i 用 if 语句来逐个检查 s 所指字符 串中的每个字符是否为小写的字母 c ,若不是,就重新放回 s 所指字符数组中,所放位置由 下标 j 来指定; i 由 for 循环变量来控制变化,而 j 除了赋过初值外,没有改变过,因此,只 要不是小写字母 c 就不断重复放在 s[0](因为 j 一直为 0) 中,只有 s[0]中的字符改变,其他位 置上的内容都没有改变。 应该每在 s[j]中放入一个非小写字母 c 之后, 使 j 增 1, if 子句中的 s[j]=s[i];应改写为:s[j++]=s[i];,或改写为:{s[j]=s[i];j++;}。(4)改正后,再次运行程序,输出的字符串为:abdabdabxabcxccc ,与预定的结果也不相 同。 但可以看到字符串的前部分是正确的, 应当考虑字符串结束标志是否放错了位置; 检查 函数中最后的语句 s[i]=0;可见,字符串结束标志没有放在由 j 所指的字符串的最后,而是仍 放在原串的最后了,因此,此语句应该成 s[j]=0;。(5)改正后,再次运行程序,得到了正确的结果:abdabdabx 。(6)提示:本题中出现的错误基本是逻辑错,对于这样的试题,要求考生能够读懂程序, 分析算法方面的错误进行改正。5、给定程序 MODI1. C 中,函数 fun 的功能是:求出在字符串中最后一次出现的子字符串 的地址,通过函数值返回,在主函数中输出从此地址开始的字符串;若未找到则函数值为 NULL 。例如,当字符串 s 中的内容为:abcdabfabcdx ,子串 t 中的内容为:abc 时,输出结果 应为:abcdx 。当子串 t 中的内容为:abd 时,输出未找到信息:Notbe found!。请改正函数 fun 中指定部位的错误,使它能得出正确的结果。注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!试题源程序如下:#include /**********found**********/char fun( char *s, char *t ){ char *p, *r, *a;a=NULL;/**********found**********/while( s ){ p=s; r=t;while(*r)/**********found**********/if( r==p ) r++; p++; }if( *r==0 ) a=s;s++;}/**********found**********/}main(){ char s[50]= printf(printf(p=fun(s,t);if(p)printf(else printf(}分析:(1)对以上程序进行编译, 给出出错信息:Misplaced else, 指出 else 放错了位置; 检查 else 语句,本身没有错,察看有关的 if 语句,可以发现 if 子句应是一个复合语句,但 缺了左括号,进行改正。(2)再次进行编译,在函数的最后出错,显示出错信息:Undefined symbol 'retrun',指出错 在 retrun 。在此把 return 拼错,进行改正。(3)编译无错,运行程序,输入子串:abc ,输出结果也是:abc ,显然不对。需进一步检 查程序。(4)函数中,形参指针 s 、 t 分别指向主函数中的主串 s 和子串 t ,为叙述简单,直接称 s 串和 t 串;函数中定义 p 、 r 和 a 为工作指针,从 return 语句看,指针 a 存放字符串中最后一 次出现子字符串的地址。(5)主函数中, fun 函数返回的值放在指针 p 中,因此 fun 函数值应是地址, fun 函数的 类型应是基类型为 char 的指针,但是程序中 fun 函数的类型为 char ,应当改正为 char*。改 正后运行程序, 仍不正确(6)外层 while 循环的判断条件应当是逐个 检查 s 串中的字符是否为字符串结束标志, 若是字符串结束标志则循环应结束; 而此处用 s(地 址 ) 作为循环控制表达式是不合理的,应该改为 *s。(7)查看外层 while 的循环体,第一条语句在 p 中放入 s 当前所指地址,在 r 中放入 t 当 前所指地址。内嵌的 while 循环体把 s 串和子串中的字符逐个进行比较,如果在子串结束前 有不同的字符,则执行 break 退出此内循环, s 指向下一个字符重新再比较;反之,若相同, 则 r 和 p 同时向后移,继续比较直到遇到子串结束;因此内循环中 if 语句的表达式应是 *r==*p;进行改正。(8)改正后按要求输入子串,得到正确结果。(9)提示:本题的改错虽有语法错的部分,但要完全得到正确结果,必须读懂程序,理 解算法。这样的改错题有一定的难度。本文由(www.wenku1.com)首发,转载请保留网址和出处!
免费下载文档:

我要回帖

更多关于 c语言程序改错题 的文章

 

随机推荐