С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 05.03.2016
Сообщений: 14

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

28.03.2016, 11:58. Показов 4189. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.03.2016, 11:58
Ответы с готовыми решениями:

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

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

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

13
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.03.2016, 09:49
Лучший ответ Сообщение было отмечено Динулька как решение

Решение

Динулька, глядя на код возникает смешанное чувство. Код и даже его разметка не соответствуют тексту приглашений ввода. Где Вы его взяли?
Для наследования лучше всего унаследовать эллипс от круга так как наследник это расширение родителя, а не наоборот. Поэтому порядок объявления изменён. Остальные изменения - косметика. Я думаю разберётесь:
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  [ТС]
Спасибо большое, что откликнулись. Код взят из интернета. Честно я пока во всём этом "тёмный лес", а сессию завалить не хочется. Поэтому прошу помощи у грамотных людей.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.03.2016, 10:15
Цитата Сообщение от Динулька Посмотреть сообщение
Честно я пока во всём этом "тёмный лес",
Ищите грибы и ягоды. Мы Вас проводим.
Цитата Сообщение от Динулька Посмотреть сообщение
Код взят из интернета.
Во всяком случае вы мужественно... н-нет скорее женственно дополнили его надписями. Это приятно глазу и вызывает желание поучаствовать.
Цитата Сообщение от Динулька Посмотреть сообщение
Спасибо большое
Не за что. Рад помочь.
0
0 / 0 / 0
Регистрация: 05.03.2016
Сообщений: 14
29.03.2016, 10:34  [ТС]
А Вы с юмором аж настроение подняли!!!

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

Не по теме:

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

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

Цитата Сообщение от Динулька Посмотреть сообщение
Честно признаться особо некогда разбираться, а бывает и лень.
Венец творенья, дивная Диана!
Может перевестись на что-то более близкое? В крайнем случае, если говорить о IT, то сейчас в корочку не смотрят при приёме на работу, так, что получить её без знаний не велик грех.
И всё же, тогда нужно по-разбираться хотя-бы на тройку. Иначе, какой бы код Вы не предоставили, а одного вопроса будет достаточно, чтобы вопросов больше не было. Как бы там ни было, - постите на форум вопросы. Я по возможности помогу, да и много кто подключится, я думаю.
Ну а объёмные вещи, это конечно, к фрилансерам.
0
0 / 0 / 0
Регистрация: 05.03.2016
Сообщений: 14
30.03.2016, 13:19  [ТС]
Разбираться обязательно буду (по возможности). Нашла хорошие видео уроки Просто реально очень мало времени, сейчас уже пора на работу собираться. Всего Вам доброго
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.03.2016, 13:26
Цитата Сообщение от Динулька Посмотреть сообщение
Всего Вам доброго
И Вам.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.03.2016, 13:26
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru