Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
#1

Неявное преобразование типа - C++

29.03.2012, 15:02. Просмотров 918. Ответов 6
Метки нет (Все метки)

Привет. Решаю задачу, не могу решить проблему.

Есть класс 'time' и производный от него класс 'interval'.
1 - содержит поля h, m, s, основные методы работы, конвертации и т.п.
2 - наследует все поля класса 'time'.
Принцип работы такой. Заполняем 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
class time {
protected:
    int hour,
                 minute,
                 second;
    int all;
    int part;
    bool clock_system; // true - 24, false - 12
public:
    // methods
    void input_f1();
    void output_f1();
    void show_f1();
    void convert_to_f1();
    
    void input_f2();
    void output_f2();
    void show_f2();
    void convert_to_f2();
 
    bool get_format();
    int get_all();
 
 
};
 
 
class Interval: public time {
    // methods
public:
    void find(time left, time right);
};
Функция, которая ищет сам промежуток.
C++
1
2
3
4
5
6
void Interval::find(time left, time right) {
    all = abs(left.get_all()-right.get_all());
    hour = all/3600;
    minute = all%hour;
    second = all%60;
}
Программа посчитает hour, но на minute запорется (просто выдаст сообщение о невозможности продолж. работы программы предложит отправлять или не отправлять отчет). Как решить? Я считаю что это проблема с типами.

Изначально h, m, s определил как unsigned int, переменная all должна быть long int (условие задачи), вчера нифига не заработало все переписал под int, все равно zero. Может со стороны увидите?

В теории все должно работать на этих 4-5 строках:
C++
1
2
3
4
5
6
7
8
9
10
int main() {
    time l, r; // объяв. объекты класса время
    Interval o; // объяв. объект класса интервал времкени
    
    l.input_f2(); // ввели первый момент
    r.input_f2(); // ввели второй момент
 
    o.find(l, r); // нашли интервал между моментам
    o.output_f2(); // вывели интервал
}
Программа останавливается в ф-ии find на 4 строке.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2012, 15:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неявное преобразование типа (C++):

Неявное преобразование типа данных через структуры - C++
Помню что вроде был в С/С++ такой прием, который позволял посмотреть на содержимое переменной одного типа с точки зрения другого типа....

Как запретить компилятору неявное преобразование из числового типа в символьный? - C++
У мя возникла такая проблема: я ввожу данные типа char и мне надо быть уверенным, что я ввел именно символ, т.е. если я ввожу число мне...

Не работает явное преобразование типа, а неявное работает. - C++
Опечатался. Не работает явное преобразования, а не явное работает. Есть класс( не обращайте внимание на члены данные класса ): class...

Неявное преобразование типов? - C++
есть класс Vector затем с его помощью создается класс Matrix (матрица - массив векторов) дошла очередь до операции умножения матрицы...

Неявное преобразование типов - C++
если я правильно понял, то explicit работает таким образом: class abc { int x; public: abc(int x_):x(x_){} ~abc(){} };

Неявное преобразование типов - C++
Здравствуйте, определен класс: template<typename T> class Polynomial { public: explicit...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
29.03.2012, 15:31 #2
Цитата Сообщение от VladSharikov Посмотреть сообщение
высчитываем разницу между двумя моментами времени (переводим все в секунды, вычитаем по модулю), переводим обратно в часы, минуты, секунды и присваиваем их полям класса интервал.
Зачем так? Можно же просто вычесть из часов часы, из минут минуты, а из секунд секунды по модулю. Зачем несколько раз всё переводить?
Вам просто нужно дописать геттеры для часов, минут и секунд
C++
1
2
3
int getHour() const {return hour;}
int getMin() const {return minute;}
int getSec() const {return seconds;}
Вычитайте по модулю и возвращайте новый объект time
0
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
29.03.2012, 15:39  [ТС] #3
думал, это получится 100%, но зачем тогда вообще переменная, содержащая общее время в секундах? это условие задачи, я быть может написать забыл
0
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
29.03.2012, 15:50 #4
Цитата Сообщение от VladSharikov Посмотреть сообщение
но зачем тогда вообще переменная, содержащая общее время в секундах? это условие задачи, я быть может написать забыл
Напишите условие задачи

Ну просто не логично переводит всё в сукунды, затем вычитать, а потом всё обратно переводить))
Даже если по заданию, то эта переменная нужна точно не для подсчётов.
0
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
29.03.2012, 15:57  [ТС] #5
Поправил - ни с того ни с сего появилась ошибка

Error spawning 'mt.exe

Я понимаю это не из-за вашего кода

идеи есть?

Добавлено через 3 минуты
1) Класс «время». Класс должен содержать такие поля как часы, минуты, секунды и время, выраженное длинным целым числом (время, переведенное в секунды); методы: ввод времени в заданном формате, вывод времени в заданном формате, преобразование между форматами.

2) Класс «интервал времени». Класс должен позволять оперировать с двумя значениями времени – начальным и конечным; позволять определять временные интервалы в часах, минутах, секундах; находить начальное время, если известно конечное и интервал; определять конечное время, если известно начальное и интервал; определять интервал времени между начальным и конечным и выводить его в разных форматах.
0
Merovingian
54 / 54 / 5
Регистрация: 24.09.2011
Сообщений: 149
29.03.2012, 17:26 #6
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
101
102
103
104
105
106
#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;
using std::ostream;
 
class time
{
protected:
    int hours;
    int minutes;
    int seconds;
    double inSeconds;
    bool part;
    bool system; // true - 24; false - 12
public:
    time(){};
    time(int, int, int, bool);
    
    int getH() const{return hours;}
    int getM() const{return minutes;}
    int getS() const{return seconds;}
    bool getSys() const{return system;}
    double getInSeconds() const{ return inSeconds;}
    friend ostream& operator<<(ostream&, const time&);
    
    void convert();
};
 
ostream& operator<<(ostream& cout_, const time& obj)
{
    cout_ << obj.hours<<":"<<obj.minutes<<":"<<obj.seconds;
    if(!obj.system)
        if(obj.part==true)
            cout_ << " AM";
        else
            cout_ << " PM";
    return cout_;
}
 
time::time(int h, int m, int s, bool sys)
{
    h = h%24;
    inSeconds = h * 3600 + m * 60 + s;
    if(sys == false)
    {
        h = h%12;
        if(h >= 12)
            part = true;
        else
            part = false;
    }
    hours = h;
    minutes = m%60;
    seconds = s%60;
    system = sys;
}
 
void time::convert()
{
    if(system) //24
    {
        hours>=12 ? part=true : part = false;
        hours = hours%12;
    }
    else //12
    {
        part==true;
        hours = 12+hours;
    }
    system = system^1;
}
 
class interval: public time
{
public:
    interval(const time,const time);
    friend ostream& operator<<(ostream&, const interval&);
};
 
interval::interval(time l, time r): time()
{
    hours = abs(l.getH() - r.getH());
    minutes = abs(l.getM() - r.getM());
    seconds = abs(l.getS() - r.getS());
}
 
ostream& operator<<(ostream& cout_, const interval& obj)
{
    cout_ << obj.hours<<":"<<obj.minutes<<":"<<obj.seconds;
    return cout_;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    time t(16,15,15,1);
    cout<<t<<endl;
    t.convert();
    cout<<t<<endl;
    time t2(15,14,14,1);
    interval i(t,t2);
    cout<<i;
    system("pause");
    return 0;
}
Доработайте!
Есть такая проблема как метод convert, он наследуется. А конвертировать в интервале нечего. Нужно написать либо отдельный класс, который будет конвертить, либо как то наверное без наследования обойтись. + double inSeconds; bool part; bool system; - не нужны для class interval.

Может кто-то подскажет кроме меня как лучше сделать?
0
VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
29.03.2012, 17:42  [ТС] #7
Вот говорю
обяз тыкнут как сделать

я в принципе сделал все
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2012, 17:42
Привет! Вот еще темы с ответами:

Неявное преобразование переменных - C++
Добрый вечер! Хочу попросить помощи в разъяснении следующей ситуации: есть код: #include &lt;iostream&gt; using namespace std; ...

Объясните неявное преобразование в этом случае - C++
scoped_ptr p = new Object();То есть &quot;p&quot; неявно преобразовывается в указатель, но как не понятно. Это я встретил просматривая вот это. В...

Неявное восходящее преобразование при защищенном/закрытом наследовании - C++
Здравствуйте. Читаю книгу Стивена Прата по C++. Попался непонятный момент: в одной таблице (в таблице 14.1 в 6-й рус. редакции на стр....

Продемонстровать неявное преобразование типов: из целого в вещественный и обратно - C++
Помогите решить задачи по С++, никак не могу, вся надежда только на вас. 1. Даны вещественные и целые числа. Наглядно продемонстрируйте...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.03.2012, 17:42
Ответ Создать тему
Опции темы

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