2010-07-19 64 views
0

我已經制定了一個程序來查找矩形的區域,但它總是給區域0.Dont得到原因。區域總是變成0結構

#include<stdio.h> 
#include<conio.h> 
struct rectangle 
{ 
    float width; 
    float length; 
}rect; 
void rectangleget(void); 
void rectangleset(void); 
void area(void); 
void perimeter(void); 

void main(void) 
{ 
    clrscr(); 
    rectangleset(); 
    rectangleget(); 
    area(); 
    perimeter(); 
    getch(); 
} 
void rectangleset(void) 
{ 
    for(;;) 
    { 
     printf("enter length:"); 
     scanf("%f",&rect.length); 
     if(!(rect.length>0 &&rect.length<=20.00)) 
     { 
      printf("invalid entry"); 
     } 
     else 
     { 
      break; 
     } 

    } 
} 

void rectangleget(void) 
{ 
    char ch; 
    for(;;) 
    { 
     printf("enter width:"); 
     scanf("%f",&rect.length); 

     if(!(rect.length>0 &&rect.length<=20.00)) 
     { 
      printf("invalid entry Try again\n"); 
     } 
     else 
     { 
      break; 
     } 

    } 
} 

void area(void) 
{ 
    float areaa=1; 
    areaa=rect.length*rect.width; 
    printf("area is %f",areaa); 
} 


void perimeter(void) 
{ 
    float peri=0; 
    peri=2*(rect.length+rect.width); 
    printf("perimeter is %f",peri); 
} 
+7

Ahh ..帶我回到我的CS-115天..代碼的任務和質量:) – 2010-07-19 17:48:24

回答

4

在調用scanf之後,您總是設置rect.length。看起來像一個經典案例切割&粘貼錯誤。這也表明你的代碼需要重構。 (事實上​​,你的代碼非常可怕)。

+1

重構的+1。至少應該有一個名爲'get_measure(const char * pPrompt,float * pOut)'的函數,並且應該使用它。 – GManNickG 2010-07-19 17:43:32

+1

爲什麼叫做rectangle *的函數可以設置任何東西? – 2010-07-19 17:46:07

+1

@Matthew:我猜是因爲它是「得到」-ting輸入 – 2010-07-19 17:52:34

0

因爲你沒有設置rect.width,這恰好被初始化爲零。

+1

它需要爲0,因爲它是靜態持續時間。 – 2010-07-19 17:44:03

0

你永遠不會設置rect.width。一個0寬的矩形的面積爲0,現在多長時間。

2

這兩個函數,rectangleget()rectangleset()正在初始化結構的length成員 - width永遠不會被初始化。

這些功能似乎有點奇怪 - 也許他們應該命名爲setlength()setwidth()(並設置相應的成員)?

正如在其他答案中提到的,還有其他一些改變會使代碼更好,比如讓初始化函數帶有一個指向要初始化的結構的指針。實際上,對其進行操作的rect應該是一個參數,它幾乎是任何影響它的函數。但是,這些類型的更改可能議題後面的練習......

例如,你可能有下列簽名功能:

void rectangle_set_width(struct rectangle*); 
void rectangle_set_length(struct rectangle*); 
float rectangle_area(struct rectangle const*); 
float rectangle_perimeter(struct rectangle const*); 

,使他們能夠在任何rectangle變量操作,而不僅僅是單個全局變量。

+0

爲什麼要傳遞'struct',如果它是全局的? – 2010-07-19 17:57:29

+2

也許這裏的建議是結構不應該是全局的。 – 2010-07-19 18:33:40

0

您在rectangleget()中有明顯錯誤。

你知道如何使用調試器嗎?它可以幫助你設置斷點並觀察程序的過程,以遵循變量設置的值。我會把它留給你,因爲它是作業,所以找出錯誤的位置。