//объявление класса 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"; } }
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, т.е. добавить еще один член:
И еще каждый раз при вызове void DoDrawRect(Rectangle theRect) у тебя происходит копирование твоего класса, передавай класс по константной ссылке: void DoDrawRect(const Rectangle &theRect) Тоже самое и с другими функциями.
Member
Статус: Не в сети Регистрация: 10.03.2004 Откуда: Минск
dimonpc2004 int DoMenu(choice)
{ ...
Это что такое вообще? Что за choice? Функция ведь объявлена int DoMenu();. Никаикх параметров не передается. Даже если бы и передавалось что-то, то нужно писать сначал тип, птом переменная, например int DoMenu(int choice).
И забыл одну закрывающуюся фигурную скобку после закрытия блока switch. Блок while ведь тоже закрыть нужно.
Теперь все компилируется и кажется работает (прямоугольник рисует, остальное не смотрел).
//объявление класса 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() {}
Проверено на VC - работает. Добавил константные ссылки Daemon'a.
Daemon писал(а):
Происходит неявное преобразование типов, потому как твой перечеслимый тип CHOISE имеет меньшую размерность, необходимо форсировать его размер до размера int, т.е. добавить еще один член:
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
mein
Цитата:
Можешь пояснить почему размерность меньше ?
Читал однажды, что компайлер смотрит на значение последнего члена в перечеслимом типе и по нему выводит тип всех членов, по этому следует форсировать размерность членов перечислимого типа.
Advanced member
Статус: Не в сети Регистрация: 09.03.2004 Откуда: Кишинёв
Daemon В общем понятно(хотя я проверил сайзофом вроде показал 4 ). Тогда вопрос с другой стороны: чем грозит присвоение переменной типа int значением меньшей размерности? Просто никогда не задумывался над этим вопросом - так всё работало.
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
mein прочел стандарт - там написано, мол тип значений перечислимого типа определяется интегральным типом, который может вместить максимальное значение, которое содержит член перечеслимого типа. Этот интегральный тип должен быть меньше int. А вот какой это будет тип - написано, что implementation defined.
Цитата:
Тогда вопрос с другой стороны: чем грозит присвоение переменной типа int значением меньшей размерности? Просто никогда не задумывался над этим вопросом - так всё работало.
Приведением типов и следственно штраф по производительности
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения