程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 關於調試,很大的感觸,請看下面的c程序

關於調試,很大的感觸,請看下面的c程序

編輯:關於C語言

        最近寫了不少的程序,發現效果很好,一些復雜的程序以前看懂的,但是寫不出來的也能夠很快寫出來了,一切得益於調試,以前總不認為調試能起多大作用,真是大錯特錯!!!

        今天感觸頗深,自調試程序以來,我寫程序連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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved