Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Oxidous
1 / 1 / 1
Регистрация: 03.09.2014
Сообщений: 141
1

Задача по наследованию в C++, нужно реализовать некоторые моменты

08.11.2015, 20:26. Просмотров 422. Ответов 13
Метки нет (Все метки)

Написать программу с объектами и реализовать наследование. Ситуация: Klimat
(базовый объект), Derevo (выводной объект).
a. Klimat: температура воздуха, скорость ветра, влажность и т.д.
b. Derevo: высота, толщина ствола, скорость роста.
c. Описать состояние дерева при различных климатических условиях, на сколько оно вырастит за год, когда оно сломается (при определённой скорости ветра).
d. Всё результаты должны выводиться на экран и записываться в текстовый файл.

Проблема в том, что программа всё время выводит одинаковый результат,что через год,что через 10 лет...
Как можно было бы реализовать,чтоб при скорости ветра,допустим, 20, дерево сломается.
Как реализовать запись результата в текстовый фал,который находится в одной папке с проектом?

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
#include <iostream>
#include <conio.h>
using namespace std;
 
class Klimat
{ 
protected: 
int temper; 
int veter; 
int vlaznost;
public:
Klimat()
{   }
Klimat(int x, int y, int z) 
{ 
temper=x; 
veter=y;
vlaznost=z;
}
void sobrat() 
{
cout<<"Введите температуру: ";
cin>>temper; 
cout<<"Введите скорость ветра: "; 
cin>>veter;
cout<<"Введите влажность: "; 
cin>>vlaznost;
}
};
 
class Derevo: public Klimat
{ 
int visota; 
int ktolshina; 
int vskorost; 
public: Derevo() : Klimat() {}
Derevo(int x, int y, int z, int k, int l) : Klimat (x,y,z)
{
visota=z; 
ktolshina=k; 
vskorost =l;
}
void sobrat()
{
    cout<<"Введите начальную высоту дерева: "; 
cin>> visota;   
cout<<"Введите толщину дерева: ";
cin>> ktolshina;   
cout<<"Введите скорость роста дерева: ";
cin>> vskorost;
 
Klimat::sobrat();
}
void vyvod (int n)
{   
int i=0;
cout<<"Результаты роста дерева: ";
for(i=0; i<n; i++)
cout<<" Через "<<i+1<<" год высота дерева будет "<<visota*2<<"."<<endl;
}
};
 
int main()
{
setlocale (LC_ALL, "Russian");
Derevo yolka;
yolka.sobrat();
yolka.vyvod(10);
system("pause");
return 0;
}
Добавлено через 14 минут
С ломанием дерева вроде разобрался,но правильно ли?

C++
1
2
3
4
5
6
7
8
9
10
11
void vyvod (int n)
{   
cout<<"Результаты роста дерева: "<<endl;
int i=0;
for(i=0; i<n; i++)
cout<<" Через "<<i+1<<" год высота дерева будет "<<visota*2<<"."<<endl;
if (veter>=20 && visota<=3 && ktolshina<= 3)
{
 cout<<"Дерево сломается при скорости ветра "<<veter<<" м/с."<<endl;
}
}
Добавлено через 17 минут
Думаю,что сделал неправильно. Нужно сделать так,чтоб если юзер вводит скорость ветра 20 и больше,то выдавало сообщение "Дерево сломается при скорости ветра..." и дальше уже код не шёл.

Добавлено через 1 час 31 минуту
По первому своему вопросу сделал так:

C++
1
2
3
4
5
6
int obsee = visota * vskorost;
int i=0;
for(i=0; i<n; i++)
cout<<" Через "<<i+1<<" год высота дерева будет "<<obsee++<<"."<<endl;
}
};
Но всё равно мне кажется,что выводит не так,как нужно,не так,как по логике должно быть Если я введу скорость роста дерева,допустим, 4, то в цикле и увеличение должно быть соответствующим,а пока у меня только перемножает один раз,а уже результат каждый цикл увеличивается на 1. Что-то никаких идей, как это правильно сделать.

Что до ломания дерева,то сделал так:

C++
1
2
3
4
5
while (veter>=20 && visota<=3 && ktolshina<= 3)
{
cout<<"Дерево сломается при скорости ветра "<<veter<<" м/с."<<" и высоте "<<visota<<" м."<<endl;
break;
}
Но тоже плохо, ибо нужно,чтоб если введены параметры,то выдавалось сообщение и программа прекращала свою работу,но break; не помогает,ибо хоть сообщение и выводится,однако программа работает дальше и выводит рост дерева за год,2,3 и т.д.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2015, 20:26
Ответы с готовыми решениями:

Задача по наследованию. Не понимаю некоторые моменты в формулировке задания
Здравствуйте! Вот есть задание: Описать базовый класс СТРОКА Обязательные...

Объясните некоторые моменты из c++
Добрый день. Я хочу начать познавать сие творение, т.к. 1 семестр на первом...

Объясните некоторые моменты в задаче
Здравствуйте, вот мне накинули задачу Пользователь вводит число А не более...

Циклы в Си++, хотелось бы уточнить некоторые моменты
Начинаю изучать Си, учусь по самоучителю при отсутствии знакомых и друзей...

Шейкер Сортировка! Непонятны некоторые моменты
Столкнулся с задачей реализации Шейкер сортировки .Почитал теорию и понял , что...

13
Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 437
Записей в блоге: 9
Завершенные тесты: 1
08.11.2015, 21:17 2
Oxidous,

Не по теме:

задачу сопроматовскую составь, когда дерево сломается... куча инфы в тырнете по выводу и вводу в файл

1
Oxidous
1 / 1 / 1
Регистрация: 03.09.2014
Сообщений: 141
08.11.2015, 21:42  [ТС] 3
Крюгер, Я везде нахожу только как записывать строку в файл, а мне нужно,чтоб результат работы функции записывался в файл
Типа этого:
C++
1
2
3
4
ofstream fou;
fou.open("result.txt");
fou << yolka.vyvod(10);
fou.close();
Но так не работает
0
Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 437
Записей в блоге: 9
Завершенные тесты: 1
08.11.2015, 22:22 4
Oxidous,
C++
1
2
3
4
5
6
friend std::ostream& operator <<
            ( std::ostream& o, const Vector3& v )
        {
            o << "Vector3(" << v.x << ", " << v.y << ", " << v.z << ")";
            return o;
        }
переделайте это под файловый поток, и добавьте этот метод в класс что выводить надо.
и не забывайте о правах доступа к полям класса

Добавлено через 2 минуты
а еще вы не правильно заполняете поля класса. нельзя вот так напрямую их вводить.

Добавлено через 55 секунд
вернее физически можно но это противоречит инкапсуляции

Добавлено через 53 секунды
такой же член класса можно определить и для ввода данных. (как я привел вам)

Добавлено через 4 минуты
вы не правильно делаете инициализацию объектов класса
. я бы всё по нормальному переписал, на вашем месте.

Добавлено через 25 минут
Oxidous, в общем типа того:
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
#include <iostream>
#include <conio.h>
using namespace std;
 
class Klimat
{ 
protected: 
 
int _temper; 
int _veter; 
int _vlaznost;
 
public:
 
Klimat():_temper(0),_veter(0),_vlaznost(0){}
Klimat(int temper, int veter, int vlaznost):_temper(temper),_veter(veter),_vlaznost(vlaznost) {}
 
//------------------вывод----------------------------------
friend std::ostream& operator <<
            ( std::ostream& o, const Klimat& k )
        {
            o << "Температура" << k._temper << "\n " << "Скорость ветра" << k._veter<<"\n " << "Влажность" << k._vlaznost<< "\n";
            return o;
        }
//------------------ввод-----------------------------------
friend std::istream& operator >>
            ( std::ostream& i, const Klimat& k )
        {
            cout<<"Введите температуру: ";
            i>>_temper;
            cout<<"Введите скорость ветра: ";
            i>>_veter;
            cout<<"Введите влажность: "; 
            i>>_vlaznost;
            return i;
        }
};
 
class Derevo: public Klimat
{
private:
    
int _visota; 
int _ktolshina; 
int _vskorost; 
 
public: 
 
Derevo() : Klimat() {}
Derevo(int temper, int veter, int vlaznost, int visota, int ktolshina, int vskorost) : Klimat (temper,veter,vlaznost),_visota(visota), _ktolshina(ktolshina), _vskorost(vskorost){}
 
//--- здесь ввод/вывод аналогично как и в 1 классе.
//---вычислительных методов , да и вообще чего либо кроме каркасов класса я не увидел честно говоря.
//---далее реализуете рассчетные методы.
};
 
int main()
{
//----здесь уже будете использовать класс по-человечески.
return 0;
}

Не по теме:

от себя хочу добавить, у вас ужасный код-стайл. читать невыносимо. во-первых: транслит это плохо,
во -вторых табуляции нету!
в-третьих вы не понимаете как работать с классами наверное, ибо коряво. списки инициализации можно использовать для всех полей класса

1
Oxidous
1 / 1 / 1
Регистрация: 03.09.2014
Сообщений: 141
08.11.2015, 22:23  [ТС] 5
Крюгер, Благодарю за ответ Получилось у меня записывать в файл так,как хотел
А как можно реализовать такую вещь:
Если я ввожу скорость ветра больше или равную 20,то на экран выводится только строка: "Дерево сломается при скорости 20 м/с." и после этого ничего больше не выводится
Чуть выше я уже писал код,который действительно выводит строку с сообщением,но вот только после неё всё равно выполняется цикл и выводятся 10 строк.
Мне тяжело даётся C++,если честно, а потому не могли бы Вы мне пояснить,в чём моя проблема,что в этой части сделал не так и как лучше написать?
0
Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 437
Записей в блоге: 9
Завершенные тесты: 1
08.11.2015, 22:33 6
Oxidous, можно, добавьте в членом класса еще одну сравнивающую функцию, которая сравнит текущее значение поля с указанной вами константой 20 м/с, и собсно по результату условия выводите то что вас интересует.

Добавлено через 37 секунд
надо добавить
C++
1
break
Добавлено через 2 минуты
объясню внятнее: сравниваем условие, и если скорость == 20 м/с , то вывод сообщения и туда же бряк.

C++
1
if(veter == 20 ){ cout<<"alarm!!!ololo!! " ; break;}
примерно так

Добавлено через 2 минуты
еще существуют безусловные переходы по метке... (если интересует.)

C++
1
2
3
4
5
6
label: { code code code }
 
code code
code...
 
goto label;
1
Fyret
200 / 186 / 45
Регистрация: 30.07.2013
Сообщений: 392
08.11.2015, 22:49 7
Уже столько сообщений в теме, но самого интересного я так и не дождался.
Неужели никого не смущает, что Дерево наследует(!!!) Климату? С такой иерархией классов, уверен, задачу не сдать.
Наверное, имелся в виду базовый класс Климат и его каки-нибудь потомки: Заполярье, Средиземноморье, Сахара и т.п.
1
Kuzia domovenok
2354 / 2089 / 493
Регистрация: 25.03.2012
Сообщений: 7,465
Записей в блоге: 1
08.11.2015, 22:56 8
Fyret, да вообще мрак. Полно нубов даже среди преподов часто дают задачи по наследованию квадрата от линии. Да, это ошибочно, но тут хоть какой-то ход (пусть и ошибочной) логики, приведшей к такой ошибке прослеживается! А вот как можно наследовать вообще не связанные между собой понятия: деревья и валенки - для меня загадка!
0
Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 437
Записей в блоге: 9
Завершенные тесты: 1
08.11.2015, 23:01 9
Fyret, мне лень смотреть на его иерархию, честно =) . ну мб он творчески подходит к задаче? мб человеку так хочется? я лишь ответил на волнующие его вопросы =)

Добавлено через 1 минуту

Не по теме:

я так классы не наследую

0
Fyret
200 / 186 / 45
Регистрация: 30.07.2013
Сообщений: 392
08.11.2015, 23:06 10
Ну ясно, у каждого своя лень Мне вот было лень отвечать на замусоленные уже вопросы по файловому вводу-выводу, а про чудное наследование - не выдержал.
0
Oxidous
1 / 1 / 1
Регистрация: 03.09.2014
Сообщений: 141
10.11.2015, 22:11  [ТС] 11
Благодарю за ответы
Всё получилось так,как нужно

Добавлено через 7 часов 41 минуту
Разобрался с этим делом,вынес функцию за пределы класса.
Ф-ция в классе:
C++
1
void vyvod(int n);
Вынесена за пределы класса:
C++
1
inline void Derevo::vyvod (int n)
Но теперь не могу перекинуть функцию в отлельный файл.
Пишет:
Error 7 error LNK2019: unresolved external symbol "public: void __thiscall Derevo::vyvod(int)" (?vyvod@Derevo@@QAEXH@Z) referenced in function _main D:\CPP\An_d\An_d\Derevo.obj Antras_d
0
Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 437
Записей в блоге: 9
Завершенные тесты: 1
10.11.2015, 22:57 12
Oxidous, я вам скинул пример кода где ваш геморрой вовсе не требуется , и почему у вас эта функция встраиваемая? зачем??

Добавлено через 4 минуты
Oxidous,


C++
1
2
3
4
5
6
7
8
9
10
11
inline void vyvod(int n);  //тут этот инлайн чертов, в объявлении класса
 
а тут
 
void Derevo::vyvod (int n)
{
 
 
}
 
вот так. но это велосипед.
1
Oxidous
1 / 1 / 1
Регистрация: 03.09.2014
Сообщений: 141
12.11.2015, 09:42  [ТС] 13
Крюгер, Огромное Вам спасибо Вы очень и очень мне помогаете. Тяжко даётся C++, если честно,а нормально начать изучать просто нет времени,хоть и очень инетересно, и есть желание,ибо заочная учёба - это гонка,чтоб всё сдать вовремя...

Интересует такой вопрос:

Я создал класс с пременной:

C++
1
2
3
4
5
6
7
8
9
10
11
12
class Vasia
{
    int vremia;
public:
    Vasia()
    {
        vremia =0;
    }
    Vasia(int t)
    {
        vremia = t;
    }
В этом классе есть две процедуры. Допустим,в первой процедуре на экран выводится столько строк,сколько юзер введёт с клавиатуры:

C++
1
2
3
4
5
6
7
8
9
void sobrat (int t)
{
cout<<"Vvedite kolicestvo let: "
cin>>t;
...
int i=0;
for(i=0; i<t; i++)
cout<<" Через "<<i+1<<" Vsem pridet zopa "<<endl;
}
Вторая процедура идентичная и нужна только для того,чтоб сохранить в файл инфу.

C++
1
2
3
4
5
6
7
8
void zapis(int t)
{
ofstream fail;
fail.open("rezultat.txt");
...
int i=0;
for(i=0; i<t; i++)
fail<<" Через "<<i+1<<" Vsem pridet zopa "<<endl;
Можно ли как-то сделать так,чтоб если юзер с клавиатуры вводит в переменную "t" значение равное,допустим, 15, то и в файл записывалось 15 строк из воторой процедуры. Иными словами,я хочу задавать значение переменной в первой процедуре,а использовать это введённое значение - в двух процедурах.
0
Крюгер
40 / 60 / 8
Регистрация: 16.11.2012
Сообщений: 437
Записей в блоге: 9
Завершенные тесты: 1
14.11.2015, 00:40 14
Oxidous,

Не по теме:

в с++ нету процедур. есть только функции, которые возвращают или не возвращают результат. аналогично процедурам в делфи но всё же функции



я вам уже приводил пример, вам не надо никаких т.н. "процедур", вот здесь: http://www.cyberforum.ru/cpp-beginners/thread1575075.html#post8312402
просто перегружаете операторы ввода и вывода, и получите то что вам нужно. нафига вы делаете такие костыли?
0
14.11.2015, 00:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2015, 00:40

Quick sort, не понятно некоторые моменты.
здравствуйте нужно реализовать quicksort Есть код с учебника по которому мы...

Нужно объяснить некоторые строки в программе
#include &lt;iostream&gt; #include &lt;stdio.h&gt; using namespace std; struct AUD {...

Есть масив, нужно удалить некоторые елементы, со сдвигом
Есть масив, нужно удалить некоторые елементы, со сдвигом. Подскажите как можно...


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

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

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