Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 13 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 07.02.2004
Откуда: Свердловская...
Помогите найти ошибку, вроде всё правильно, ан нет.
Код:
#include <iostream.h>
#include "conio.h"

enum CHOISE {DrawRect=1,GetArea, GetPerim,
         ChangeDimensions, Quit};//исп перечислений
   
//объявление класса Rectangle
class Rectangle
{
   public:
      //конструктор
      Rectangle(int width,int height);
      ~Rectangle();
      //методы доступа
      int GetHeight() const {return itsHeight;}
      int GetWidth() const {return itsWidth;}
      int GetArea() const {return itsHeight*itsWidth;}
      int GetPerim() const {return 2*itsWidth+2*itsHeight;}
      void SetSize (int newWidth, int newHeight);
   //прочие методы
   private:
      int itsWidth;
      int itsHeight;
};
//выполнене методов класса
void Rectangle::SetSize(int newWidth, int newHeight)
{
   itsWidth=newWidth;
   itsHeight=newHeight;
}
//конструктор
Rectangle::Rectangle (int width, int height)
{
   itsWidth=width;
   itsHeight=height;
}
//деструктор
Rectangle::~Rectangle() {}

int DoMenu();
void DoDrawRect(Rectangle);
void DoGetArea(Rectangle);
void DoGetPerim(Rectangle);

int main()
{
   //инициализация объекта Rectangle значением 30,5
   Rectangle theRect(30,5);
   
   int choice=DrawRect;
   int fQuit=false;
   
   while (!fQuit)
   {
      choice=DoMenu();
      if (choice<DrawRect || choice>Quit)
      {
         cout<<"\nInvalid Choise, please try gain. \n\n";
         continue;
   }
   switch (choice)
   {
      case    DrawRect:
            DoDrawRect(theRect);
            break;
      case   GetArea:
            DoGetArea (theRect);
            break;
      case   GetPerim:
            DoGetPerim (theRect);
            break;
      case   ChangeDimensions:
            int newLenght, newWidth;
            cout<<"New Visota: ";
            cin>>newWidth;
            cout<<"\nNew Shirina: ";
            cin>>newLenght;
            theRect.SetSize(newWidth,newLenght);
            DoDrawRect(theRect);
            break;
      case   Quit:
            fQuit=true;
            cout<<"\nExiting...\n\n";
            break;
      default:
         cout<<"Error in choice!";
         fQuit=true;
         break;
   }//end switch
   getch();
   return 0;
}//end main

int DoMenu(choice)
{
   int choice;
   cout<<"\n\n  ***Menu***  \n";
   cout<<"(1) Pryamougol'nik\n";
   cout<<"(2) PloLLLad'\n";
   cout<<"(3) Perimeter\n";
   cout<<"(4) Resize\n";
   cout<<"(5) Quit\n";
   
   cin>>choice;
   return choice;
}

void DoDrawRect(Rectangle theRect)
{
   int height=theRect.GetHeight();
   int width=theRect.GetWidth();
   
   for (int i=0;i<height;i++)
   {
      for (int j=0;j<width;j++)
      cout<<"*";
   cout<<"\n";
   }
}

void DoGetArea(Rectangle theRect)
{
   cout<<"PloLLLad': "<<theRect.GetArea()<<endl;
}

void DoGetPerim(Rectangle theRect)
{
   cout<<"Perimrter: "<<theRect.GetPerim()<<endl;
}

Ошибки возникают с последними фуекциями.

_________________
Если надпись на мониторе уменьшается, то ваш монитор уносят.



Партнер
 

Member
Статус: Не в сети
Регистрация: 30.01.2003
Откуда: Москва
Либо ставь std::cout, либо после #include подпиши
Код:
using namespace std;


 

Member
Статус: Не в сети
Регистрация: 07.02.2004
Откуда: Свердловская...
Это я знаю. Это всго лишь спецификации разных стандартов. И ты не прав.
Если бы я написал #include <iostream>, то мне бы понадобилось using namespace std;. И это будет "по новому". Я пишу "по старому". Принципиальных отличий между новой и стророй библиотекой iostream нет.
Вот.

Но с прогой то всё равно касяк... ей по на эти новые, старые библиотеки...

_________________
Если надпись на мониторе уменьшается, то ваш монитор уносят.


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
Что в глаза сразу бросилось:
в функции main проблема со скокбками - не хватает одной(вероятно сразу после getch(); ), над функцией main обьявлен прототип функции int DoMenu(), а ниже функция описывается загадочным образом
Код:
int DoMenu(choice)
{
   int choice;
   cout<<"\n\n  ***Menu***  \n";
   cout<<"(1) Pryamougol'nik\n";
   cout<<"(2) PloLLLad'\n";
   cout<<"(3) Perimeter\n";
   cout<<"(4) Resize\n";
   cout<<"(5) Quit\n";
   
   cin>>choice;
   return choice;
}

И что в заголовке функции значит параметр choise? :) . Убрать его и всё станет на место. Ну и совет Asteroid тоже нужно выполнить (#include <iostream.h> - написать без .h)
Добавлено спустя 1 минуту, 32 секунды
dimonpc2004 писал(а):
Если бы я написал #include <iostream>, то мне бы понадобилось using namespace std;. И это будет "по новому". Я пишу "по старому". Принципиальных отличий между новой и стророй библиотекой iostream нет.

может быть - не знаю (не пользуюсь). Но dev c++ не захавал старый стиль :)


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
dimonpc2004 это не старый стиль, это доисторический стиль использовавшийся до принятия стандарта. Теперь все стандартные хидеры нужно писать без .h Плюс такие вещи как потоки ввода/вывода теперь размещаются в стандартной библиотеке std.
Добавлено спустя 52 минуты, 25 секунд
И пара замечаний по коду :)
У тебя каждый раз, при выполнении
Код:
int choice=DrawRect;
Происходит неявное преобразование типов, потому как твой перечеслимый тип CHOISE имеет меньшую размерность, необходимо форсировать его размер до размера int, т.е. добавить еще один член:
Код:
enum CHOISE {DrawRect=1,GetArea, GetPerim,
         ChangeDimensions, Quit, ForceInt = 0xFFFFFFFF}

И еще каждый раз при вызове void DoDrawRect(Rectangle theRect) у тебя происходит копирование твоего класса, передавай класс по константной ссылке:
void DoDrawRect(const Rectangle &theRect)
Тоже самое и с другими функциями.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 07.02.2004
Откуда: Свердловская...
А Вас вообще этот код компилируется?
У меня нет...

_________________
Если надпись на мониторе уменьшается, то ваш монитор уносят.


 

Member
Статус: Не в сети
Регистрация: 10.03.2004
Откуда: Минск
dimonpc2004
int DoMenu(choice)
{ ...
Это что такое вообще? Что за choice? Функция ведь объявлена int DoMenu();. Никаикх параметров не передается. Даже если бы и передавалось что-то, то нужно писать сначал тип, птом переменная, например int DoMenu(int choice).
И забыл одну закрывающуюся фигурную скобку после закрытия блока switch. Блок while ведь тоже закрыть нужно.
Теперь все компилируется и кажется работает (прямоугольник рисует, остальное не смотрел).


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
Код:
#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
enum CHOISE {DrawRect=1,GetArea, GetPerim,
         ChangeDimensions, Quit};//исп перечислений
   
//объявление класса Rectangle
class Rectangle
{
   public:
      //конструктор
      Rectangle(int width,int height);
      ~Rectangle();
      //методы доступа
      int GetHeight() const {return itsHeight;}
      int GetWidth() const {return itsWidth;}
      int GetArea() const {return itsHeight*itsWidth;}
      int GetPerim() const {return 2*itsWidth+2*itsHeight;}
      void SetSize (int newWidth, int newHeight);
   //прочие методы
   private:
      int itsWidth;
      int itsHeight;
};
//выполнене методов класса
void Rectangle::SetSize(int newWidth, int newHeight)
{
   itsWidth=newWidth;
   itsHeight=newHeight;
}
//конструктор
Rectangle::Rectangle (int width, int height)
{
   itsWidth=width;
   itsHeight=height;
}
//деструктор
Rectangle::~Rectangle() {}

int DoMenu();
void DoDrawRect(const Rectangle &theRect);
void DoGetArea(const Rectangle &theRect);
void DoGetPerim(const Rectangle &theRect);

int _tmain(int argc, _TCHAR* argv[])
{
   //инициализация объекта Rectangle значением 30,5
   Rectangle theRect(30,5);
   
   int choice=DrawRect;

   int fQuit=false;
   
   while (!fQuit)
   {
      choice=DoMenu();
      if (choice<DrawRect || choice>Quit)
      {
         cout<<"\nInvalid Choise, please try gain. \n\n";
         continue;
   }
   switch (choice)
   {
      case    DrawRect:
            DoDrawRect(theRect);
            break;
      case   GetArea:
            DoGetArea (theRect);
            break;
      case   GetPerim:
            DoGetPerim (theRect);
            break;
      case   ChangeDimensions:
            int newLenght, newWidth;
            cout<<"New Visota: ";
            cin>>newWidth;
            cout<<"\nNew Shirina: ";
            cin>>newLenght;
            theRect.SetSize(newWidth,newLenght);
            DoDrawRect(theRect);
            break;
      case   Quit:
            fQuit=true;
            cout<<"\nExiting...\n\n";
            break;
      default:
         cout<<"Error in choice!";
         fQuit=true;
         break;
   }//end switch
   getch();
   }
   return 0;
}//end main

int DoMenu()
{
   int choice;
   cout<<"\n\n  ***Menu***  \n";
   cout<<"(1) Pryamougol'nik\n";
   cout<<"(2) PloLLLad'\n";
   cout<<"(3) Perimeter\n";
   cout<<"(4) Resize\n";
   cout<<"(5) Quit\n";
   
   cin>>choice;
   return choice;
}

void DoDrawRect(const Rectangle &theRect)
{
   int height=theRect.GetHeight();
   int width=theRect.GetWidth();
   
   for (int i=0;i<height;i++)
   {
      for (int j=0;j<width;j++)
      cout<<"*";
   cout<<"\n";
   }
}

void DoGetArea(const Rectangle &theRect)
{
   cout<<"PloLLLad': "<<theRect.GetArea()<<endl;
}

void DoGetPerim(const Rectangle &theRect)
{
   cout<<"Perimrter: "<<theRect.GetPerim()<<endl;
}

Проверено на VC - работает. Добавил константные ссылки Daemon'a.
Daemon писал(а):
Происходит неявное преобразование типов, потому как твой перечеслимый тип CHOISE имеет меньшую размерность, необходимо форсировать его размер до размера int, т.е. добавить еще один член:

Можешь пояснить почему размерность меньше ? :) .


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
mein
Цитата:
Можешь пояснить почему размерность меньше ?
Читал однажды, что компайлер смотрит на значение последнего члена в перечеслимом типе и по нему выводит тип всех членов, по этому следует форсировать размерность членов перечислимого типа.

_________________
Ку ку


 

Advanced member
Статус: Не в сети
Регистрация: 09.03.2004
Откуда: Кишинёв
Daemon
В общем понятно(хотя я проверил сайзофом вроде показал 4 :oops: ). Тогда вопрос с другой стороны: чем грозит присвоение переменной типа int значением меньшей размерности? Просто никогда не задумывался над этим вопросом - так всё работало.


 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
mein прочел стандарт - там написано, мол тип значений перечислимого типа определяется интегральным типом, который может вместить максимальное значение, которое содержит член перечеслимого типа. Этот интегральный тип должен быть меньше int. А вот какой это будет тип - написано, что implementation defined.
Цитата:
Тогда вопрос с другой стороны: чем грозит присвоение переменной типа int значением меньшей размерности? Просто никогда не задумывался над этим вопросом - так всё работало.
Приведением типов и следственно штраф по производительности :)

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 07.02.2004
Откуда: Свердловская...
Спасибо всем большое. У меня что-то с компилятором...

_________________
Если надпись на мониторе уменьшается, то ваш монитор уносят.


 

Member
Статус: Не в сети
Регистрация: 10.03.2004
Откуда: Минск
dimonpc2004 Так какие ошибки он выдает? У тебя не хватает фигурной скобки там, где я написал и лишние параметры у функции DoMenu.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 13 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan