С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Динулька
0 / 0 / 0
Регистрация: 05.03.2016
Сообщений: 14
1

Наследование. Класс Круг и класс эллипс

28.03.2016, 11:58. Просмотров 1144. Ответов 13
Метки нет (Все метки)

Здравствуйте уважаемые программисты. Нужно исправить ошибки в программе. Честно я в этом ничего не понимаю.
Вот код программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "stdafx.h"
#include <iostream>
#include <cmath>
#define M_PI 3.14159265358979323846
using namespace std;
 
class Ellips {
public:
    Ellips(double a, double b);
    double perimeter() const;
    double a() const { return m_a; }
    double b() const { return m_b; }
private:
    double m_a, m_b;
};
 
Ellips::Ellips(double a, double b)
{
    m_a = a;
    m_b = b;
}
 
double Ellips::perimeter() const
{
    double result = 4*(M_PI*m_a*m_b +(m_a-m_b)*(m_a-m_b))/(m_a+m_b);
    return result;
}
 
class Circle{
public:
    Circle(double r);
    double perimeter() const;
    double redius() const { return m_r; }
    //friend Ellips;
private:
    double m_r;
};
 
Circle::Circle(double r)
{
    m_r = r;
}
 
double Circle::perimeter() const
{
    double result = 2.0 * M_PI * m_r;
    return result;
}
 
// Вычисляем во сколько раз периметр Эллипса больше периметра Круга
int howManyTimes(const Circle &c, const Ellips &e, double &result) {
    // Код ошибки
    int error = 0;
 
    // Проверяем деление на ноль
    if (c.perimeter() > 0) {
        // Вычисляем во сколько раз периметр Эллипса больше периметра Круга
        result = e.perimeter() / c.perimeter();
    } else {
        error = 1; // в случае деления на ноль возвращаем код ошибки
    }
 
    // ошибок нет - возвращаем ноль
    return error;
}
 
int main()
{
    double r = 5.5;
    Circle circle(r);
    double p = circle.perimeter();
    cout << "Radius = " << r << endl;
    cout << "Perimeter = " << p << endl;
    double a = 5.5;
    double b = 5.5;
    Ellips ellips(a, b);
    double i = ellips.perimeter();
    cout << "Bolshie poluosi Ellipsa = " << a << b << endl;
    cout << "Dina okrujnosti = " << i << endl;
 
    // Вычисляем во сколько раз периметр Эллипса больше периметра Круга
    double result;
    int error = howManyTimes(circle, ellips, result);
    if (error) {
        cerr << "Error: division by zero." << endl;
        return error;
    } else {
        cout << "howManyTimes = " << result << endl;
    }
 
    system("pause");
    return 0;
}
Замечания преподавателя:
1.Не организовано наследие
2.Длина круга(эллипса) не являются атрибутами класса
3.Комментарий "howManyTimes =" , который выводиться на экран, не несет информации про результат действия.
Если можно исправьте, буду очень благодарна.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2016, 11:58
Ответы с готовыми решениями:

Абстрактный класс, наследование, класс хранится в другом классе
Нужна помощь. Написать программу: 1 класс. Имеется абстрактный класс который...

Наследование: базовый класс Квадрат, производный класс Пирамида
Помогите, пожалуйста!:cry: Добавлено через 6 минут Создать класс КВАДРАТ,...

Наследование. Классы "Точка - Круг - Эллипс"
Если коротко объяснять суть проблемы: Класс tEllipse наследует от tCircle...

класс эллипс
ПОМОГИТЕ ПОЖАЛУЙСТА, начала изучать с++ столкнулась с такой вот задачей...... ...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class...

13
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7093 / 3395 / 461
Регистрация: 04.12.2011
Сообщений: 9,448
Записей в блоге: 5
29.03.2016, 09:49 2
Лучший ответ Сообщение было отмечено Динулька как решение

Решение

Динулька, глядя на код возникает смешанное чувство. Код и даже его разметка не соответствуют тексту приглашений ввода. Где Вы его взяли?
Для наследования лучше всего унаследовать эллипс от круга так как наследник это расширение родителя, а не наоборот. Поэтому порядок объявления изменён. Остальные изменения - косметика. Я думаю разберётесь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
#include <cmath>
#define M_PI 3.14159265358979323846
using namespace std;
 
class Circle 
{
public:
    Circle(double r);
    virtual double perimeter() const;
    double a() const { return m_a; }
   
private:
    double m_a;
};
 
Circle::Circle(double r)
{
    m_a = r;
}
 
double Circle::perimeter() const
{
    double result = 2.0 * M_PI * m_a;
    return result;
}
 
class Ellips : public Circle
{
public:
    Ellips(double a, double b);
    double perimeter() const;    
    double b() const { return m_b; }
private:
double m_b;
};
 
Ellips::Ellips(double a, double b)
:Circle(a), m_b(b)
{}
 
double Ellips::perimeter() const
{
    double result = 4*(M_PI*a()*m_b +(a()-m_b)*(a()-m_b))/(a()+m_b);
    return result;
}
 
// Вычисляем во сколько раз периметр Эллипса больше периметра Круга
int howManyTimes(const Circle &c, const Ellips &e, double &result) {
    // Код ошибки
    int error = 0;
 
    // Проверяем деление на ноль
    if (c.perimeter() > 0) {
        // Вычисляем во сколько раз периметр Эллипса больше периметра Круга
        result = e.perimeter() / c.perimeter();
    } else {
        error = 1; // в случае деления на ноль возвращаем код ошибки
    }
 
    // ошибок нет - возвращаем ноль
    return error;
}
 
 
 
 
 
int main(int argc, char* argv[])
{
double r = 5.5;
    Circle circle(r);
    double p = circle.perimeter();
    cout << "Radius = " << r << endl;
    cout << "Perimeter of the circle = " << p << endl;
    double a = 3.5;
    double b = 7.0;
    Ellips ellips(a, b);
    double i = ellips.perimeter();
    cout << "Poluosi Ellipsa = " << a << " and " << b << endl;
    cout << "Perimeter of the ellips = " << i << endl;
 
    // Вычисляем во сколько раз периметр Эллипса больше периметра Круга
    double result;
    int error = howManyTimes(circle, ellips, result);
    if (error) {
        cerr << "Error: division by zero." << endl;
        return error;
    } else {
        cout << "All right! This ellips is= " << result << "longer" << endl;
    }
 
 
 
cout<<endl;
cin.ignore(cin.rdbuf()->in_avail());
cin.clear();
cin.get();
return 0;    
}
1
Динулька
0 / 0 / 0
Регистрация: 05.03.2016
Сообщений: 14
29.03.2016, 10:09  [ТС] 3
Спасибо большое, что откликнулись. Код взят из интернета. Честно я пока во всём этом "тёмный лес", а сессию завалить не хочется. Поэтому прошу помощи у грамотных людей.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7093 / 3395 / 461
Регистрация: 04.12.2011
Сообщений: 9,448
Записей в блоге: 5
29.03.2016, 10:15 4
Цитата Сообщение от Динулька Посмотреть сообщение
Честно я пока во всём этом "тёмный лес",
Ищите грибы и ягоды. Мы Вас проводим.
Цитата Сообщение от Динулька Посмотреть сообщение
Код взят из интернета.
Во всяком случае вы мужественно... н-нет скорее женственно дополнили его надписями. Это приятно глазу и вызывает желание поучаствовать.
Цитата Сообщение от Динулька Посмотреть сообщение
Спасибо большое
Не за что. Рад помочь.
0
Динулька
0 / 0 / 0
Регистрация: 05.03.2016
Сообщений: 14
29.03.2016, 10:34  [ТС] 5
А Вы с юмором аж настроение подняли!!!

Добавлено через 9 минут
Задание решено. Очень благодарна.
0
IGPIGP
29.03.2016, 13:30
  #6

Не по теме:

Цитата Сообщение от Динулька Посмотреть сообщение
аж настроение подняли!!!
Это взаимно :D
Цитата Сообщение от Динулька Посмотреть сообщение
Задание решено. Очень благодарна.
Обращайтесь. :)

0
Динулька
0 / 0 / 0
Регистрация: 05.03.2016
Сообщений: 14
30.03.2016, 00:30  [ТС] 7
И снова здравствуйте! Задание отправила на проверку и получила ответ:"Относительно программы замечаний нет,но объясните зачем использовать виртуальные функции и что это Вам дает?"
Если возможно растолкуйте пожалуйста
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7093 / 3395 / 461
Регистрация: 04.12.2011
Сообщений: 9,448
Записей в блоге: 5
30.03.2016, 01:25 8
Динулька, виртуальная функция решает очень тонкий вопрос наследования. Это сохранение интерфейса при обращении через указатель на базовый класс.
В данной программе это не используется. Нужно признать, что я сделал, это возможно и зря. Если Вы ещё не учили виртуальные методы и полиморфное наследование, то точно зря. Если учили, то нет. Дело в том, что в реальной задаче методы расчёта периметра/площади и пр. геометрических характеристик, а так же методы отрисовки, например, делались бы виртуальными.
Я бы ответил, что в данной программе можно легко убрать слово virtual и тогда класс наследник скроет своим методом метод родителя. И хоть данная программа и будет работать так же как и работала, но это будет зло. Потому, что указанные классы нельзя будет использовать в алгоритмах, где их объекты обрабатываются совместно. В таких алгоритмах доступ к объекту производится через указатель на базовый класс. Почитайте об этом.
Если Вы не учили ещё по программе, то мы спалились. Но тут Вы можете сказать, что прочли о полиморфном наследовании самостоятельно.
Беда ещё и в том, что я не успел "покалечить" красивое форматирование Вашего кода. Выпустил из виду. А любой ушлый препод такое форматирование увидит. Его не бывает у новичков.
Я советую Вам разобрать код и защищаться. Это обезоружит любого нормального преподавателя. Меня бы, точно обезоружило.
0
Динулька
0 / 0 / 0
Регистрация: 05.03.2016
Сообщений: 14
30.03.2016, 10:30  [ТС] 9
Вы мой спаситель. Только объясните пожалуйста что значит
Цитата Сообщение от IGPIGP Посмотреть сообщение
разобрать код
?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7093 / 3395 / 461
Регистрация: 04.12.2011
Сообщений: 9,448
Записей в блоге: 5
30.03.2016, 11:46 10
Цитата Сообщение от Динулька Посмотреть сообщение
Только объясните пожалуйста что значит
разобрать код
Постарайтесь в общих чертах понять, что там происходит. Хотя бы в общих чертах. Если программирование не Ваш профилирующий предмет, то препод, которого это не устроит, это несчастье по жизни. Тут надо решить проблему выбора:
1. Скинуться всей группой на киллера;
2. Платить мзду.
А если программирование это Ваша будущая профессия, то в общих чертах уже не достаточно. Тогда только: Арбайт-арбайт-арбайт.
0
Динулька
0 / 0 / 0
Регистрация: 05.03.2016
Сообщений: 14
30.03.2016, 11:57  [ТС] 11
К моему большому огорчению это мой профилирующий предмет Маленькая пред история: Когда надо было учиться , закончила только бурсу, теперь работаю в трех сменном режиме на заводе. Честно признаться особо некогда разбираться, а бывает и лень. А насчет мзды давайте в личке обсудим.diana1977@ukr.net. Может Вы мне наберёте необходимые баллы за умеренную плату? Кстати Вы меня опять расмешили
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7093 / 3395 / 461
Регистрация: 04.12.2011
Сообщений: 9,448
Записей в блоге: 5
30.03.2016, 12:58 12
Цитата Сообщение от Динулька Посмотреть сообщение
Может Вы мне наберёте необходимые баллы за умеренную плату?
Я говорил исключительно о мотивах преподавателя. И одной из целей была фраза:
Цитата Сообщение от Динулька Посмотреть сообщение
Кстати Вы меня опять расмешили

Цитата Сообщение от Динулька Посмотреть сообщение
Честно признаться особо некогда разбираться, а бывает и лень.
Венец творенья, дивная Диана!
Может перевестись на что-то более близкое? В крайнем случае, если говорить о IT, то сейчас в корочку не смотрят при приёме на работу, так, что получить её без знаний не велик грех.
И всё же, тогда нужно по-разбираться хотя-бы на тройку. Иначе, какой бы код Вы не предоставили, а одного вопроса будет достаточно, чтобы вопросов больше не было. Как бы там ни было, - постите на форум вопросы. Я по возможности помогу, да и много кто подключится, я думаю.
Ну а объёмные вещи, это конечно, к фрилансерам.
0
Динулька
0 / 0 / 0
Регистрация: 05.03.2016
Сообщений: 14
30.03.2016, 13:19  [ТС] 13
Разбираться обязательно буду (по возможности). Нашла хорошие видео уроки Просто реально очень мало времени, сейчас уже пора на работу собираться. Всего Вам доброго
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7093 / 3395 / 461
Регистрация: 04.12.2011
Сообщений: 9,448
Записей в блоге: 5
30.03.2016, 13:26 14
Цитата Сообщение от Динулька Посмотреть сообщение
Всего Вам доброго
И Вам.
0
30.03.2016, 13:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2016, 13:26

Написать класс, описывающий эллипс
Здравствуйте.. необходимо написать программу... столкнулся с трудностями.....

Класс Эллипс. Перегруженные операторы
#include &lt;iostream&gt; using namespace std; class Ellipse { private:...

класс круг С++
Разработать класс &quot;круг &quot;, который определяется своим радиусом r. Класс должен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru