您的位置:首页 > 其它

关于调试,很大的感触,请看下面的c程序

2011-03-28 21:30 549 查看
最近写了不少的程序,发现效果很好,一些复杂的程序以前看懂的,但是写不出来的也能够很快写出来了,一切得益于调试,以前总不认为调试能起多大作用,真是大错特错!!!

今天感触颇深,自调试程序以来,我写程序连warning都没有了,更不用说程序运行不了的情况,确实让我学习了不少东西,非常高兴,也养成了一个很好的习惯,不断为自己的代码写上注释,养成一个很好的习惯,这也得益于陈正冲老师的教诲!!在此深表感谢~~~

废话少说,看下面的程序:

/************************************************

* File name :multi_rows.c

* CopyRight :2011-03-24,All rights Reserved.

* Module name :...

*

* CPU :

* RTOS :....

*

* Create Date :2011-03-24

* Author/Corporation: hackerling/maple Corporation

*

* Abstract Description :

* 这个程序的思路就是:在一个数组中来存储两个多项式,然后结果存储在从下

* 标为0开始的位置,然后输出。当然,在main()函数里,那个调用padd()的starta/finisha,startb/finishb,这几个参数的值这里需要根据你的输入做相应的更改,我没有继续完善,因为很简单,自己注意!!

* ---------------Revision History--------------

* No Version Date Revised By Item Description

*

*

**************************************************************/

#include <stdio.h>

#include <stdlib.h>

#define MAX_TERMS 100

struct polynomial //多项式某项的结点结构

{

float coef; //系数

int expon; //指数

};

struct polynomial terms[MAX_TERMS]; //数组最多想为MAX_TERMS

int avail=0; //avail为全局变量

int COMPARE(int coef1,int coef2) //比较两个数的大小

{

if(coef1<coef2)

return -1;

else if (coef1==coef2)

return 0;

else

return 1;

}

void attach(float coefficient,int exponent) //加入一个新项到一个多项式中

{

if(avail>MAX_TERMS)

{

printf("Too many terms in the polynomial");

exit(1);

}

terms[avail].coef=coefficient;

/*

***************************************************************************************************/

terms[avail].expon=exponent; //此处存在风险,极大的风险,因为他会改变数组的值从而影响后面的判断*

/ ***************************************************************************************************

*/

avail++; //多项式的项数加1

}

void padd(int starta,int finisha,int startb,int finishb,int *startd,int *finishd)

//用于计算a(x)+b(x)=d(x)

//其中starta/finisha表示的第一个多项式的起始和终止下标,startb/finishb表示第二个多项式的下标

{

float coefficient; //存储系数

*startd=avail; //相加的结果放在数组从下标0开始到下标finishd处

while(starta<=finisha && startb<=finishb) //处理两个可能存在相加的情况

{

switch(COMPARE(terms[starta].expon,terms[startb].expon))

{

case -1:

attach(terms[startb].coef,terms[startb].expon);

startb++;

break;

case 0:

coefficient=terms[starta].coef+terms[startb].coef;

if(coefficient)

attach(coefficient,terms[starta].expon);

starta++;

startb++;

break;

case 1:

attach(terms[starta].coef,terms[starta].expon);

starta++;

break;

default:

break;

}

}

for(;starta<=finisha;starta++) //单独处理第一个多项式

attach(terms[starta].coef,terms[starta].expon);

for(;startb<=finishb;startb++) //单独处理第二个多项式

attach(terms[startb].coef,terms[startb].expon);

*finishd=avail-1; //结果最终的位置

}

void main()

{

int startd,finishd;

int i;

for(i=0;i<4;i++) //输入所要计算的多项式值,按:coef空格expon换行 输入

{

scanf("%f %d",&terms[i].coef,&terms[i].expon);

}

padd(0,1,2,3,&startd,&finishd);

for(i=0;i<=finishd;i++) //输出

{

printf("%f %d\n",terms[i].coef,terms[i].expon);

}

return;

}

编译运行程序,您会发现,所有的加法似乎都能进行,而且是正确的,

4*pow(x,3)+2*pow(x,2)

5*pow(x,3)+3*pow(x,2)





上面我们发现结果完全正确,就是9*pow(x,3)+5*pow(x,2)

可是,

不对不对,这程序是存在错误的,以前也许我就高兴的自以为编出多项式加法运算了,可是,请您调试下列数据:

4*pow(x,4)+4

3*pow(x,1)+1

求这两个多项式的和,您会发现会是如下结果:





这结果不对哦!!!不是4*pow(x,4)+3*pow(x,1)+5

为什么???

其实,只要你用调试器调试调试,就会发现





就是这个地方影响了这个程序的判断,所以导致结果的不对!呵呵,因为发现了这个,让我觉得程序调试真的很重要很重要,还有哦,《C语言通用案例开发经典》上面就是用这个,也许作者还没有发现这个问题哦!!希望能够尽快改正!!!

呵呵,欢迎拍砖!!!
本文出自 “王小毛-爱你!” 博客,请务必保留此出处http://lingchuan.blog.51cto.com/933741/529037
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐