关于调试,很大的感触,请看下面的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
今天感触颇深,自调试程序以来,我写程序连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
相关文章推荐
- 关于Android adb 调试程序解决小米MIUI的INSTALL_FAILED_UPDATE_INCOMPATIBLE的安装错误
- 关于Netbean Java程序下面读取记事本文件中文乱码
- 关于android程序源码级调试
- 关于,VS2010 里面 一个解决方案包含多个win32程序,调试的问题~~~happy
- 关于EPP3调试PHP程序
- 关于java程序的跟踪调试
- 关于 MinGW gdb 调试 qt程序用printqstring 来显示的设置。
- 在未安装IIS的情况下,先安装了.NET,则在调试程序的时候会出现下面的错误
- 关于Windows编程中一些注意事项——程序运行时的出错,而调试却没有错
- 关于Android应用调试在小米手机安装程序时出现Installation failed with message INSTALL_CANCELED_BY_USER问题解决
- 关于android程序在虚拟机成功调试但是在真机闪退的问题!
- Java关于远程调试程序教程(以Eclipse为例)
- 关于调试----在单步执行某个程序的中间修改源代码,当修改代码之后移动到下一步时,调试器自动在执行下一语句之前重新编译
- 关于c++检测内存泄露相关知识(windows程序调试)
- 关于c++检测内存泄露相关知识(windows程序调试)
- 调试用Python C API 写的程序问题还真多,关于import搜索路径的,复制过来,以防忘记
- 关于vs2003调试时提示:试图运行项目时出错:无法启动调试 没有正确安装调试器。请运行安装程序安装
- 关于vs2003调试时提示:试图运行项目时出错:无法启动调试 没有正确安装调试器。请运行安装程序安装
- 关于调试dll程序的方法
- 关于GDB调试go语言程序中出现 os.Args无法打印的问题