Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 37

Описать класс Время

20.05.2015, 23:58. Показов 6904. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста

Построить программу для работы с классом Время. Программа должна обеспечивать простейшие функции для работы с данными структурами: увеличение/уменьшение на 1 час, минуту, секунду, ввод значений, вывод значений

Добавлено через 3 часа 55 минут
Подскажите хотя бы как записать увеличение/уменьшение на 1 час, минуту, секунду?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.05.2015, 23:58
Ответы с готовыми решениями:

Описать класс "Поездка". Поля: номер поезда, пункт назначения, дни следования, время прибытия, время стоянки
Описать класс "Поездка". Поля: номер поезда, пункт назначения, дни следования, время прибытия, время стоянки.

Описать класс Время, представленный целыми переменными: час, минута, секунда
2. Класс "Время", представленный целыми переменными: час, минута, секунда.

Описать базовый класс Point. Описать класс Прямоугольник от класса Point
Описать базовый класс Point - точка. Описать класс "прямоугольник". Обязательные поля класса "Прямоугольник": - имя...

36
04.06.2015, 12:44
Студворк — интернет-сервис помощи студентам

Не по теме:

kuroiryuu, Вы правы. Многое я не учел ;)

0
 Аватар для kuroiryuu
328 / 312 / 68
Регистрация: 05.11.2009
Сообщений: 712
04.06.2015, 12:50
Могу только посоветовать реализовать методы
C#
1
2
3
Time AddHour(int);
Time AddMinute(int);
Time AddSecond(int);
внутри этих методов полученное значение правильно сопоставить с часами, минутами, секундами
1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
04.06.2015, 12:58
Цитата Сообщение от Serx Посмотреть сообщение
Я не идеальный кодер И принимаю всю критику, которую Вы мне напишите.
Пожалуйста напишите где я сделал не правильно, если такое возможно. Хочу уметь правильно кодить
Ок, смотрим ваш исправленный код из поста #14.
1) Почему у вас поля статические? Они не должны быть статическими. Допустим у меня программа - напоминалка. К каждому напоминанию я прикрепляю время, когда напоминание должно сработать. Но в вашем классе все экземпляры Time будут показывать одно и то же время. Облом.
2) Как вам уже писали, нет смысла хранить часы, минуты и секунды - в отдельных полях. Это во-первых увеличивает объем памяти, во-вторых усложняет код, и в-третьих приводит к ошибкам, которые рассмотрим ниже. Храните время просто в секундах (или миллисекундах, зависит от необходимой точности. DateTime вообще хранит время в тиках). А минуты и часы - сделайте свойствами, которые будут вычислять минуты и часы из секунд (делением по модулю). Это автоматически устранит проблемы с увеличением времени и переходом секунд в минуты, минут в часы и т.д.
3) Нет смысла в увеличении часов, минут и секунд по-отдельности.
4) Логика увеличения минут и часов, которая у вас почему-то описана в методе input - на самом деле должна быть внутри класса Time.
5) У вас явные ошибки в логике в методе input. Например, если ввести время 1:59:60, ваш код создаст объект с верменем 1:60:00, вместо 2:00:00. Эти ошибки уйдут автоматически, если будет выполнен пункт 2.

Добавлено через 7 минут
3) Нет смысла в увеличении часов, минут и секунд по-отдельности.
Хотел сказать
3) Нет смысла в одновременном увеличении часов, минут и секунд (всех сразу).
1
63 / 69 / 22
Регистрация: 28.04.2015
Сообщений: 194
Записей в блоге: 1
04.06.2015, 15:14

Не по теме:

Спасибо, постараюсь исправить все недочеты ;)
Хотелось бы мне как и у Вас - сразу правильный вариант решения приходит в голову ;)



Добавлено через 2 часа 14 минут
Исправил
Кликните здесь для просмотра всего текста
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
using System;
 
 
namespace ConsoleApplication1
{
    class Time
    {
 
        int hour, minute, second;
 
 
        //Свойство. Возвращает и задает значение hour
        public int Hour
        {
            get { return hour; }
            set 
            {
                if ((hour + value) > 0)
                {
                    hour = value;
                }
                else
                {
                    Console.WriteLine("Значение часов не может быть меньше 0");
                }
            }
        }
        //Возвращает и задает значение minute
        public int Minute
        {
            get { return minute; }
            set 
            {
                if ((value+minute) > 0)
                {
 
                    if (value < 60)
                    {
                        minute = value;
                    }
                    else
                    {
                        Hour += value / 60;
                        Minute = value % 60;
                    }
 
                }
                else
                {
                    Console.WriteLine("Значение минут не может быть меньше 0");
                }
                
                
            }
        }
        //Возвращает и задает значение hour
        public int Second
        {
            get { return second; }
            set 
            {
                if ((second + value) > 0)
                {
 
                    if (value < 60)
                    {
                        second = value;
                    }
                    else
                    {
                        Minute += value / 60;
                        Second = value % 60;
                    }
 
                }
                else
                {
                    Console.WriteLine("Значение секунд не может быть меньше 0");
                }
                
            
            }
        }
 
        public string Show() //Для вывода время
        {
            return (hour + ":" + minute + ":" + second).ToString();
        }
 
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Time time = new Time(); //Сейчас 00:00:00
 
            Console.WriteLine("Сейчас время = " + time.Show()); //Покажем наше время
 
 
            Console.WriteLine("Введите цифру операции:");
 
            Console.WriteLine("1 - Ввести время вручную \n\r2 - Увеличить время на 1 \n\r3 - Уменьшить время на 1 \n\r4 - Вывести время \n\r5 - Выход");
 
            while (true)
            {
                int chose;
 
                chose = int.Parse(Console.ReadLine()); //Так мы введем одну из цифр, желательно вводить от 1 - 5
 
                switch (chose)
                {
                    case 1:
                        //Вводим наше время
                        Console.WriteLine("Введите часы");
                        time.Hour = int.Parse(Console.ReadLine());
                        Console.WriteLine("Введите минуты");
                        time.Minute = int.Parse(Console.ReadLine());
                        Console.WriteLine("Введите секунды");
                        time.Second = int.Parse(Console.ReadLine());
 
                        Console.WriteLine("Введено");
                        break;
                    
                    case 2:
                        Console.WriteLine("+1 к: \r\n 1 - Часам? \r\n 2 - Минутам? \r\n 3 - Секундам?");
                        int chose2 = int.Parse(Console.ReadLine());
                            switch (chose2)
                            {
                                case 1:
                                    time.Hour += 1;
                                    Console.WriteLine("Часы увеличены на 1");
                                    break;
                                case 2:
                                    time.Minute += 1;
                                    Console.WriteLine("Минуты увеличены на 1");
                                    break;
                                case 3:
                                    time.Second += 1;
                                    Console.WriteLine("Секунды увеличены на 1");
                                    break;
                                default:
                                    Console.WriteLine("Не правильный ввод!");
                                    
                                    break;
                            }
                           //Увеличиваем наше время на 1 ;)
                        
                        break;
 
                    case 3:
 
 
                        Console.WriteLine("-1 к: \r\n 1 - Часам? \r\n 2 - Минутам? \r\n 3 - Секундам?");
                        int chose3 = int.Parse(Console.ReadLine());
                            switch (chose3)
                            {
                                case 1:
                                    time.Hour -= 1;
                                    if (time.Hour > -1)
                                    {
                                        Console.WriteLine("Часы уменьшены на 1");
                                    }
                                    
                                    break;
                                case 2:
                                    time.Minute -= 1;
                                    if (time.Minute > -1)
                                    {
                                        Console.WriteLine("Минуты уменьшены на 1");
                                    }
                                    
                                    break;
                                case 3:
                                    time.Second -= 1;
 
                                    if (time.Second > -1)
                                    {
                                        Console.WriteLine("Секунды уменьшены на 1");
                                    }
                                    
                                    break;
                                default:
                                    Console.WriteLine("Не правильный ввод!");
 
                                    break;
                            }
                            //Уменьшаем наше время на 1 ;)
 
                        break;
 
                    case 4:
 
                        Console.WriteLine(time.Show()); //Выводим наше время
                        break;
 
                    case 5: //Выходим из приложения
                        goto Exit; //Идем к метке Exit:
 
                    default:
                        Console.WriteLine("Не правильный ввод. Введите значение от 1 - 5"); //Если мы ввели значения например "123", то получим это сообщение, ну а если "фыв"...
                        break;
                }
 
 
            }
 
        Exit: //Метка Exit:
            Console.WriteLine("Всего доброго!");
 
        }
 
    }
}


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

Не по теме:

Надеюсь без косяков ;)

0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
04.06.2015, 15:27
Serx, Нет... Вы же по прежнему храните и часы и минуты...
А должно быть только одно(!) поле
C#
1
int totalSeconds;
которое хранит полное число секунд в данном времени. Других полей быть не должно.
Например, если время 1:32:40, то TotalSeconds должно содержать число 40 + 32 * 60 + 1 * 3600 = 5560
Секунды, минуты и часы - должны быть свойствами и возвращать остатки от деления TotalSeconds на коэфф.
1
63 / 69 / 22
Регистрация: 28.04.2015
Сообщений: 194
Записей в блоге: 1
05.06.2015, 10:15

Не по теме:

Storm23, Понял, как еще свободное время выдастся подумаю еще. Спасибо :good:



Добавлено через 18 часов 45 минут
Примерно вот, что получилось.

Кликните здесь для просмотра всего текста
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
using System;
 
 
namespace ConsoleApplication1
{
    class Time
    {
 
 
        int totalSeconds;
 
        public int TSecond
        {
            get { return totalSeconds; }
            set
            {
                if ((totalSeconds + value) > -1)
                {
                    totalSeconds = value;
                }
                else
                {
                    Console.WriteLine("Значение времени не может быть меньше 0");
                }
 
            }
        }
 
        public string Show() //Для вывода время  часы : минуты : секунды
        {
            return (totalSeconds / 3600 + ":" + ((totalSeconds - ((totalSeconds / 3600) * 3600)) / 60) + ":" + ((totalSeconds - ((totalSeconds / 3600) * 3600)) % 60)).ToString();
        }
 
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Time time = new Time(); //Сейчас 00:00:00
 
           // Console.WriteLine("Сейчас время = " + time.Show()); //Покажем наше время
 
 
            Console.WriteLine("Введите цифру операции:");
 
            Console.WriteLine("1 - Ввести время вручную \n\r2 - Увеличить время на 1 \n\r3 - Уменьшить время на 1 \n\r4 - Вывести время \n\r5 - Выход");
 
            while (true)
            {
 
                int chose = int.Parse(Console.ReadLine()); //Так мы введем одну из цифр, желательно вводить от 1 - 5
 
                switch (chose)
                {
                    case 1:
                        //Задаем наше время наше время
                        time.TSecond = 0;
 
                        Console.WriteLine("Введите часы");
                       
                        time.TSecond += int.Parse(Console.ReadLine()) * 3600;
                        Console.WriteLine("Введите минуты");
                        time.TSecond += int.Parse(Console.ReadLine()) * 60;
                        Console.WriteLine("Введите секунды");
                        time.TSecond += int.Parse(Console.ReadLine());
 
                        Console.WriteLine("Введено");
                        break;
                    
                    case 2:
                        
                        Console.WriteLine("+1 к: \r\n 1 - Часам? \r\n 2 - Минутам? \r\n 3 - Секундам?");
                        
                        int chose2 = int.Parse(Console.ReadLine());
 
                        selectedExpression(time, chose2, false);
                           //Увеличиваем наше время на 1 ;)
                        
                        break;
 
                    case 3:
 
                        Console.WriteLine("-1 к: \r\n 1 - Часам? \r\n 2 - Минутам? \r\n 3 - Секундам?");
 
                        int chose3 = int.Parse(Console.ReadLine());
 
                        selectedExpression(time, chose3, true);
                        
                        break;
                        
                    case 4:
 
                        Console.WriteLine(time.Show()); //Выводим наше время
                        break;
 
                    case 5: //Выходим из приложения
                        goto Exit; //Идем к метке Exit:
 
                    default:
                        Console.WriteLine("Не правильный ввод. Введите значение от 1 - 5"); //Если мы ввели значения например "123", то получим это сообщение, ну а если "фыв"...
                        break;
                }
 
 
            }
 
        Exit: //Метка Exit:
            Console.WriteLine("Всего доброго!");
 
        }
 
        static public void selectedExpression(Time time, int chose, bool Sub)
        {
 
            switch (chose)
            {
                case 1:
 
                    time.TSecond = (Sub ? time.TSecond - 1 * 3600 : time.TSecond + 1 * 3600);
 
                    if (time.TSecond > -1)
                    {
                        Console.WriteLine(Sub ? "Часы уменьшены на 1" : "Часы увеличены на 1");
                    }
                    break;
                case 2:
                    
                    time.TSecond = (Sub ? time.TSecond - 1 * 60 : time.TSecond + 1 * 60);
 
 
                    if (time.TSecond > -1)
                    {
                        Console.WriteLine(Sub ? "Минуты уменьшены на 1" : "Минуты увеличены на 1");
                    }
 
                    break;
                case 3:
                    
                    time.TSecond = (Sub ? time.TSecond - 1 : time.TSecond + 1);
 
                    
                    if (time.TSecond > -1)
                    {
                        Console.WriteLine(Sub ? "Секунды уменьшены на 1" : "Секунды увеличены на 1");
                    }
 
                    break;
                default:
                    Console.WriteLine("Не правильный ввод!");
 
                    break;
            }
 
        }
 
    }
}


Если Вы видите, где еще можно "Улучшить" код, то подскажите пожалуйста. И на ошибки укажите За ранние, большое спасибо.
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
05.06.2015, 10:20
C#
1
2
3
4
public string Show() //Для вывода время  часы : минуты : секунды
        {
            return (totalSeconds / 3600 + ":" + ((totalSeconds - ((totalSeconds / 3600) * 3600)) / 60) + ":" + ((totalSeconds - ((totalSeconds / 3600) * 3600)) % 60)).ToString();
        }
Я бы в данном случае заместо этого метода просто переопределил бы метод ToString();
1
63 / 69 / 22
Регистрация: 28.04.2015
Сообщений: 194
Записей в блоге: 1
05.06.2015, 10:26
Вот так?) А то мало ли я не правильно понял
C#
1
2
3
4
 public override string ToString()
        {
            return (totalSeconds / 3600 + ":" + ((totalSeconds - ((totalSeconds / 3600) * 3600)) / 60) + ":" + ((totalSeconds - ((totalSeconds / 3600) * 3600)) % 60)).ToString();
        }
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
05.06.2015, 10:34
Да, именно так)
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
05.06.2015, 11:08
Serx, Эхх, опять все не то...

Главное что у вас неправильно - вы совершенно не отделаете данные от интерфейса.
Поймите, любая программа состоит как минимум из двух блоков: модель данных и интерфейс.
При этом самое главное условие хорошей архитектуры состоит в том, что эти два блока нужно тщательно изолировать друг от друга.
Модель данных вообще ничего не должна знать об интерфейсе. А интерфейс не должен лезть в логику данных.

Что же мы видим у вас? В свойстве TSecond доменный объект ВНЕЗАПНО вызывает метод класса Console. Ну какое отношение консоль имеет к времени? Доменный объект должен содержать только то, что относится к его модели данных. Для существования времени консоль не нужна. Я уж не говорю, что методы консоли - очень медленные.

Далее посмотрим на интерфейс. Он пытается выполнять действия специфичные для модели данных. Этого быть не должно. Интерфейс должен знать минимум о внутреннем строении данных. Вот например смотрим строку

time.TSecond += int.Parse(Console.ReadLine()) * 3600;

Что такое 3600, Карл?? Что это за магическая константа? Что оно делает в интерфейсе? Как пользовательский интерфейс зависит от числа 3600?
Интерфейс должен заниматься своими делами. Он может измерять ширину контролов или окон, отслеживать нажатия кнопок, выдавать сообщения и т.д. Что такое 3600? Это ширина окна?

Так быть не должно. Вот представьте себе, что вы написали программу-календарь на 10000 строк кода.
И вот тут оказалось, что точности секунд недостаточно, и вы решили изменить внутреннее представление времени с секунд на миллисекунды. Если у вас логика полностью инкапсулирована в классе Time, вы легко можете изменить этот класс, и больше ничего в программе не менять, поскольку интерфейс ничего не знает о внутреннем устройстве Time. А что у вас? Если, вдруг, вы решите поменять логику времени вам придется изменить кучу констант, раскиданных по всему коду интерфейса. А потом полезут ошибки. Фактически вам придется перелопатить весь код.
А все почему? Потому что логика данных размазана по всей программе, вместо того, что бы быть исключительно внутри Time.

Теперь по пунктам:
1) Где свойства Hours Minutes и Seconds? Как мне узнать сколько часов в данном Time ?
2) Где методы, изменяющие время?
3) 3600, 60 и т.п. - в интерфейсе быть не должно.
4) Console - в доменном объекте быть не должно.
5) Show() -> override ToString()
2
05.06.2015, 11:15

Не по теме:

Storm23, Понял, учту. Очередной раз спасибо. Исправлю и закину сюда

0
 Аватар для newyork7776
351 / 344 / 279
Регистрация: 21.05.2013
Сообщений: 1,312
05.06.2015, 13:00
Интересно. И мне захотелось сделать задание
вот мой вариант
Кликните здесь для просмотра всего текста
Класс Time
Кликните здесь для просмотра всего текста
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
using System;
 
namespace ConsoleApplication1
{
    class Time
    {
        private int second;
        
        //конструтор
        public Time(int defaultTimeHours, int defaultTimeMinutes, int defaultTimeSeconds)
        {
            this.Second = (defaultTimeSeconds + MinToSec(defaultTimeMinutes) + hourToSec(defaultTimeHours));
        }
        public Time()
        {
            this.Second = 0;
        }
        public Time(DateTime value)
        {
            this.Second = (value.Second + MinToSec(value.Minute) + hourToSec(value.Hour));
        }
 
 
        //свойство
        private int SecondOriginal
        {
            get { return this.second; }
        }
        private int Second
        {
            set 
            {
                if (value >= 0)
                {
                    this.second = value;
                }
            }
            get 
            {
                return this.second % 60;
            }
        }
        private int Minute
        {
            get 
            {
                return ((this.second / 60) % 60);
            }
        }
        private int Hour
        {
            get
            {
                return (((this.second / 60) / 60) % 24);
            }
        }
 
 
        //методы
        private int hourToSec(int value)
        {
            return value * 60 * 60;
        }
        private int MinToSec(int value)
        {
            return value * 60;
        }
 
 
 
        public string timeToString()
        {
            return String.Format("Time(hh:mm:ss) = {2} : {1} : {0}", this.Second, this.Minute, this.Hour);
        }
        public string AddTime(Time value)
        {
            this.second += value.SecondOriginal;
            return this.timeToString();
        }
        public string SubTime(Time value)
        {
            this.second -= value.SecondOriginal;
            return this.timeToString();
        }
 
        public string AddTime(int defaultTimeHours, int defaultTimeMinutes, int defaultTimeSeconds)
        {
            this.second += (defaultTimeSeconds + MinToSec(defaultTimeMinutes) + hourToSec(defaultTimeHours));
            return this.timeToString();
        }
        public string SubTime(int defaultTimeHours, int defaultTimeMinutes, int defaultTimeSeconds)
        {
            this.second -= (defaultTimeSeconds + MinToSec(defaultTimeMinutes) + hourToSec(defaultTimeHours));
            return this.timeToString();
        }
    }
}

Програмка
Кликните здесь для просмотра всего текста
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
using System;
 
namespace ConsoleApplication1
{
    class Serx
    {
        static void Main(string[] args)
        {
            Time time = new Time(DateTime.Now);
            
            Console.WriteLine("Now =  " + time.timeToString() + "\n\n");
 
            Console.WriteLine("Add 1 hour = " + time.AddTime(1, 0, 0));
            Console.WriteLine("Sub 1 hour = " + time.SubTime(1, 0, 0));
 
            Console.WriteLine(" *** ");
            Console.WriteLine("Add 1 min = " + time.AddTime(0, 1, 0));
            Console.WriteLine("Sub 1 min = " + time.SubTime(0, 1, 0));
 
            Console.WriteLine(" *** ");
            Console.WriteLine("Add 1 sec = " + time.AddTime(0, 0, 1));
            Console.WriteLine("Sub 1 sec = " + time.SubTime(0, 0, 1));
           
 
            Console.ReadLine();
        }
    }
}
0
63 / 69 / 22
Регистрация: 28.04.2015
Сообщений: 194
Записей в блоге: 1
06.06.2015, 14:18

Не по теме:

newyork7776, :good:


Кликните здесь для просмотра всего текста
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
using System;
 
 
namespace ConsoleApplication1
{
    class Time
    {
 
        int totalSeconds;
        const int SecInH = 3600;
        const int SecInMin = 60;
        const float MinusOne = -1;
 
 
 
        int TSecond //Получаем и задаем общее количество секунд
        {
            get { return totalSeconds; }
            set
            {
                if ((totalSeconds + value) > MinusOne)
                {
                    totalSeconds = value;
                }
                else
                {
                    throw new InvalidOperationException("Значение времени не может быть меньше 0!");
                }
 
            }
        }
 
 
        public int Hour  //Получаем и задаем часы
        { 
            get { return totalSeconds / SecInH; }
            set
            {
                TSecond -= this.Hour * SecInH;  //Вычитаем для обнуления предыдущих часов. Обнуляем для того, чтобы задавать по отдельности время(часы, минуты, секунды)
                TSecond += value * SecInH;
            }
        }
        public int Minute  //Получаем и задаем  минуты
        { 
            get { return ((totalSeconds - ((totalSeconds / SecInH) * SecInH)) / SecInMin); }
            set 
            {
                TSecond -= this.Minute * SecInMin;  //Вычитаем для обнуления предыдущих минут
                TSecond += value * SecInMin; 
            }
        }
        public int Second  //Получаем и задаем секунды
        { 
            get { return ((totalSeconds - ((totalSeconds / SecInH) * SecInH)) % SecInMin); }
            set 
            {
                TSecond -= this.Second;  //Вычитаем для обнуления предыдущих секунд
                TSecond += value;
            }
        } 
 
 
        public override string ToString() //Для вывода время  часы : минуты : секунды
        {
            return (totalSeconds / SecInH + ":" + ((totalSeconds - ((totalSeconds / SecInH) * SecInH)) / SecInMin) + ":" + ((totalSeconds - ((totalSeconds / SecInH) * SecInH)) % SecInMin)).ToString();
        }
 
 
        public void AddHours(int hour) //Прибавить любое количество часов
        {
            TSecond += hour * SecInH;
        }
 
        public void AddMinutes(int minute) //Прибавить любое количество минут
        {
            TSecond += minute * SecInMin;
        }
 
        public void AddSeconds(int sec) //Прибавить любое количество секунд
        {
            TSecond += sec;
        }
 
        public void SubHours(int hour) //Вычесть любое количество часов
        {
            TSecond -= hour * SecInH;
        }
 
        public void SubMinutes(int minute) //Вычесть любое количество минут
        {
            TSecond -= minute * SecInMin;
        }
 
        public void SubSeconds(int sec) //Вычесть любое количество секунд
        {
            TSecond -= sec;
        }
 
 
 
    }
 
 
    class Program
    {
        static void Main(string[] args)
        {
 
            Time time = new Time(); //Сейчас 00:00:00
 
 
            Console.WriteLine("Введите цифру операции:");
 
            Console.WriteLine("1 - Ввести время вручную \n\r2 - Увеличить время на 1 \n\r3 - Уменьшить время на 1 \n\r4 - Вывести время \n\r5 - Выход");
 
            while (true)
            {
 
                int chose = int.Parse(Console.ReadLine()); //Так мы введем одну из цифр, желательно вводить от 1 - 5
 
                switch (chose)
                {
                    case 1:
                        
                        Console.WriteLine("   Введите часы");
                        time.Hour = int.Parse(Console.ReadLine());
                        
                        Console.WriteLine("   Введите минуты");
                        time.Minute = int.Parse(Console.ReadLine());
 
                        Console.WriteLine("   Введите секунды");
                        time.Second = int.Parse(Console.ReadLine());
 
                        time.ToString();
                        
                        Console.WriteLine("Введено");
                        break;
                    
                    case 2:
                        
                        Console.WriteLine("+1 к: \r\n 1 - Часам? \r\n 2 - Минутам? \r\n 3 - Секундам?");
                        
                        int chose2 = int.Parse(Console.ReadLine());
 
                        selectedExpression(time, chose2, false); //Увеличиваем время на 1
                           
                        
                        break;
 
                    case 3:
 
                        Console.WriteLine("-1 к: \r\n 1 - Часам? \r\n 2 - Минутам? \r\n 3 - Секундам?");
 
                        int chose3 = int.Parse(Console.ReadLine());
 
                        selectedExpression(time, chose3, true);
                        
                        break;
                        
                    case 4:
 
                        Console.WriteLine(time.ToString()); //Выводим наше время
                        break;
 
                    case 5: //Выходим из приложения
                        goto Exit; //Идем к метке Exit:
 
                    default:
                        Console.WriteLine("Не правильный ввод. Введите значение от 1 - 5"); //Если мы ввели значения например "123", то получим это сообщение, ну а если "фыв"...
                        break;
                }
 
 
            }
 
        Exit: //Метка Exit:
            Console.WriteLine("Всего доброго!");
 
        }
 
        static public void selectedExpression(Time time, int chose, bool Sub)
        {
 
            switch (chose)
            {
                case 1:
 
                    if (Sub)
                    {
                        time.SubHours(1);
                    }
                    else
                    {
                        time.AddHours(1);
                    }   
                    
                    Console.WriteLine(Sub ? "Часы уменьшены на 1" : "Часы увеличены на 1");
 
                    break;
 
                case 2:
 
                    if (Sub)
                    {
                        time.SubMinutes(1);
                    }
                    else
                    {
                        time.AddMinutes(1);
                    }   
 
                    Console.WriteLine(Sub ? "Минуты уменьшены на 1" : "Минуты увеличены на 1");
                    
 
                    break;
 
                case 3:
                    
                    if (Sub)
                    {
                        time.SubSeconds(1);
                    }
                    else
                    {
                        time.AddSeconds(1);
                    }   
 
                    Console.WriteLine(Sub ? "Секунды уменьшены на 1" : "Секунды увеличены на 1");
                    
                    break;
 
                default:
                    Console.WriteLine("Не правильный ввод!");
 
                    break;
            }
 
        }
 
    }
}


Добавлено через 2 минуты
Добавлять конструкторы как newyork7776 не стал, но идея хорошая .
Если есть еще замечания, то подскажите, где и что не так, что подправить, конечно, если хотите.
0
 Аватар для newyork7776
351 / 344 / 279
Регистрация: 21.05.2013
Сообщений: 1,312
06.06.2015, 19:55
69-90 строки
мне немного не понятно - зачем нам создавать сколько всего?

Добавлено через 1 минуту
9-12 строки - +
1
63 / 69 / 22
Регистрация: 28.04.2015
Сообщений: 194
Записей в блоге: 1
06.06.2015, 20:29
Цитата Сообщение от newyork7776 Посмотреть сообщение
69-90 строки
мне немного не понятно - зачем нам создавать сколько всего?
Может я и намудрил как всегда). В общем эти методы/функции прибавляют/отнимают к/от времени по отдельности
Цитата Сообщение от newyork7776 Посмотреть сообщение
9-12 строки - +
Если правильно понял, то
Цитата Сообщение от Storm23 Посмотреть сообщение
Вот представьте себе, что вы написали программу-календарь на 10000 строк кода.
И вот тут оказалось, что точности секунд недостаточно, и вы решили изменить внутреннее представление времени с секунд на миллисекунды. Если у вас логика полностью инкапсулирована в классе Time, вы легко можете изменить этот класс, и больше ничего в программе не менять, поскольку интерфейс ничего не знает о внутреннем устройстве Time. А что у вас? Если, вдруг, вы решите поменять логику времени вам придется изменить кучу констант, раскиданных по всему коду интерфейса. А потом полезут ошибки. Фактически вам придется перелопатить весь код.
А все почему? Потому что логика данных размазана по всей программе, вместо того, что бы быть исключительно внутри Time.
Вот еще то же, налепил)

C#
1
2
3
4
        public override string ToString() //Для вывода время  часы : минуты : секунды
        {
            return (totalSeconds / SecInH + ":" + ((totalSeconds - ((totalSeconds / SecInH) * SecInH)) / SecInMin) + ":" + ((totalSeconds - ((totalSeconds / SecInH) * SecInH)) % SecInMin)).ToString();
        }
Когда есть свойства с такими же формулами

C#
1
const float MinusOne = -1;
float перепутал с short, то есть подумал, если поставить константу в "более меньшее с максимальным значением число", то это на "пару байт"(вроде на short выделяется 16 байт) сократит расход в оперативной памяти))
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10428 / 5158 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.06.2015, 20:47
Serx,
1) Смущает строка
C#
1
if ((totalSeconds + value) > MinusOne)
Странная логика. И ненужная.
Я бы вообще убрал свойство TSecond. Зачем оно?
Если вы хотите, что бы totalSeconds всегда было положительным, просто объявите его uint, вместо int.
2) Зачем методы SubHours и т.п., если можно просто вызвать AddHours(-1) ? Ну то есть их можно и оставить, но это переусложнение кода, как на мой взгляд.
3) В методе ToString вы снова размазываете логику (только теперь уже внутри класса Time). Зачем вам опять делить/умножать, если у вас уже есть готовые свойства Hours, Minutes, Seconds? Специфические вещи (в данном случае алгоритмы пересчета часы-минуты-секунды) нужно делать в одном месте. Что бы это было легко поменять.
1
63 / 69 / 22
Регистрация: 28.04.2015
Сообщений: 194
Записей в блоге: 1
06.06.2015, 21:13
Storm23, Немножко намудрил А так спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.06.2015, 21:13

Описать класс "поезд", содержащий поля "пункт назначения", "номер поезда", "время отправления"
Помогите пожалуйста с классом Описать класс «поезд», содержащий следующие закрытые поля: • название пункта назначения; • номер...

Описать базовый класс колоды карт и производный класс пасьянс
Здраствуйте! товарищи-программисты, помогите пожалуйста со следующим заданием: Создать колоду карт. Конструкторы колоды должны...

Описать класс Car и его наследника, класс Avto
Создать класс Автомобиль: Поля: - Марка - приватный - Габариты (А, Б, С) - публичный - Руль (право, лево) -...

Описать класс Car и его наследника, класс Sedan
Описать базовый класс CAR (автомашина) со свойствами: •*Марка машины; На его основе создать класс с именем SEDAN (седан), содержащий...

Описать класс «Расписание занятий». Каждая запись содержит день недели, время, название учебной дисциплины, а
Описать класс «Расписание занятий». Каждая запись содержит день недели, время, название учебной дисциплины, аудиторию. Помогите...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru