区域总是变成0结构

时间:2010-07-19 17:39:24

标签: c

我已经制作了一个程序来查找矩形的区域,但它总是给出区域0.Dont得到原因。

#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);
 }

5 个答案:

答案 0 :(得分:4)

调用scanf后,始终设置rect.length。看起来像切割和粘贴bug的经典案例。这也表明您的代码需要进行一些重构。 (事实上​​,你的代码非常可怕)。

答案 1 :(得分: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变量进行操作,而不仅仅是单个全局变量。

答案 2 :(得分:0)

因为您没有设置rect.width,恰好以某种方式初始化为零。

答案 3 :(得分:0)

你永远不会设置rect.width。宽度为0的矩形的面积为0,现在它的长度是多久。

答案 4 :(得分:0)

rectangleget()中有明显错误。

您知道如何使用调试器吗?它可以帮助您设置断点并观察程序的过程,以跟踪变量设置的值。我会留给你找出错误的位置,因为它是作业。