我已经制作了一个程序来查找矩形的区域,但它总是给出区域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);
}
答案 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()
中有明显错误。
您知道如何使用调试器吗?它可以帮助您设置断点并观察程序的过程,以跟踪变量设置的值。我会留给你找出错误的位置,因为它是作业。