最近寫了不少的程序,發現效果很好,一些復雜的程序以前看懂的,但是寫不出來的也能夠很快寫出來了,一切得益於調試,以前總不認為調試能起多大作用,真是大錯特錯!!!
今天感觸頗深,自調試程序以來,我寫程序連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