область всегда становится 0-структурой - PullRequest
0 голосов
/ 19 июля 2010

Я создал программу для поиска области прямоугольника, но она всегда дает область 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);
 }

Ответы [ 5 ]

4 голосов
/ 19 июля 2010

После вызова scanf вы всегда устанавливаете rect.length. Похоже на классический случай ошибки вырезать и вставить. Что также указывает на то, что ваш код нуждается в рефакторинге. (На самом деле ваш код довольно ужасен).

2 голосов
/ 19 июля 2010

Обе функции 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 голосов
/ 19 июля 2010

У вас есть очевидная ошибка в rectangleget().

Знаете ли вы, как использовать отладчик?Это очень помогло бы вам установить контрольные точки и следить за ходом программы, чтобы следить за тем, какие значения установлены для ваших переменных.Я оставлю это вам, чтобы выяснить, где ошибка, так как это домашняя работа.

0 голосов
/ 19 июля 2010

Вы никогда не устанавливаете rect.width.Прямоугольник шириной 0 имеет площадь 0, теперь независимо от его длины.

0 голосов
/ 19 июля 2010

Поскольку вы не устанавливаете rect.width, который как-то инициализируется нулем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...