ЮС
Юлия Спиридонова

Помогите разобраться в программе.

Совсем недавно начал знакомство с C#. Дали задание описать класс для изменения времени на заданное пользователем. Битый час бьюсь с задачкой, уже закипают мозги. Вроде все правильно, но существует ошибка. Если пользователь вводит допустим: 4 часа, 120 минут, то программа, 59 запишет в минуты, а все остальное занесет в часы. Так вот, идя дальше и вводя значение секунд = 120 мы получим сообщение об ошибке, что введено слишком много секунд, потому что минут уже 59, и если перевести секунды в минуты, то кол-во минут получится > 60. Подскажите, как сделать так, чтобы он и с секундами проделывал то же самое, что делает с минутами, то есть оставляет подходящую часть себе, а остальное отправляет в минуты и в часы. Я понимаю, что там делается по аналогии, но все же есть расхождения, я пробую менять код, но никак не могу дойти до верного решения. Подскажите пожалуйста, что мне нужно сделать. Вот фрагмент кода, где я описал методы добавления времени:

public bool AddHours(int plusHours)

{

bool flag = true;

if (Hours + plusHours <= 24)

Hours = Hours + plusHours;

else

{

Console.WriteLine("Невозможно изменить на введенное количество часов");

flag = false;

}

return flag;

}

public bool AddMinutes(int plusMinutes)

{

bool flag = true;

if (Minutes + plusMinutes <= 59)

Minutes = Minutes + plusMinutes;

else

{

int plusHours = (plusMinutes - 59) / 60;

Hours = Hours + plusHours;

Minutes = (plusMinutes-1) - plusHours * 60;

flag = false;

}

return flag;

}

public bool AddSeconds(int plusSeconds)

{

bool flag = true;

if (Seconds + plusSeconds <= 59)

Seconds = Seconds + plusSeconds;

else

{

int plusMinutes = (plusSeconds - 59) / 60;

if (Minutes + plusMinutes <= 59)

Minutes = Minutes + plusMinutes;

else

{

do

{

Console.WriteLine("Нельзя изменить на столько секунд, введите новое значение");

plusMinutes = int.Parse(Console.ReadLine());

if (Minutes + plusMinutes <= 59)

{

flag = false;

}

else

{

int plusHours = (plusMinutes) / 60;

Hours = Hours + plusHours;

}

}

while (Minutes + plusMinutes <= 59);

}

Seconds = (plusSeconds - 1) - plusMinutes * 60;

flag = false;

}

return flag;

}

Я изменил немного код. И в объекте указал, чтобы первыми спрашивались секунды. Так лучше? Или для большей понятности нужен весь код?
class Time1
{
private int a;
private int b;
private int c;

public Time1(int hours, int minutes, int seconds)
{
Hours = hours;
Minutes = minutes;
Seconds = seconds;

}
public bool AddHours(int plusHours)
{
bool flag = true;

if (Hours + plusHours < 24)
Hours = Hours + plusHours;
else
{
Console.WriteLine("Невозможно изменить на введенное количество часов");
flag = false;
}
return flag;
}
public bool AddMinutes(int plusMinutes)
{
bool flag = true;
if (Minutes + plusMinutes <= 59)
Minutes = Minutes + plusMinutes;
else
{
int plusHours = (plusMinutes) / 60;
Hours = Hours + plusHours;
Minutes = (Minutes + plusMinutes) - plusHours * 60;

flag = false;
}

return flag;
}
public bool AddSeconds(int plusSeconds)
{

bool flag = true;
if (Seconds + plusSeconds <= 59)
Seconds = Seconds + plusSeconds;
else
{
int plusMinutes = (plusSeconds) / 60;
if (Minutes + plusMinutes <= 59)
Minutes = Minutes + plusMinutes;
else
{
int plusHours = (plusMinutes) / 60;
Hours = Hours + plusHours;
}
Seconds = (plusSeconds) - plusMinutes * 60;
flag = false;

}
return flag;

}

public int Hours
{
get
{
return c;
}
set
{
if (c < 0 && c < 24)
c = value;

}
}
public int Minutes
{
get
{
return b;
}
set
{
if (b < 0 && b <= 1439)
b = value;
else
Console.WriteLine("Вы ввели недопустимое значение");
}
}
public int Seconds
{
get
{
return a;
}
set
{
if (a < 0 && a <= 86399 )
Console.WriteLine("Вы ввели недопустимое значение");
else
a = value;
}
}

АС
Артем Суюшев

У вас время в классе должно храниться всего в одном приватном поле и в секундах.
Сеттеры принимают различные варианты (целые числа, строки в различных форматах) и конвертируют время в секунды. Геттеры наоборот перед тем как вернуть время в необходимом формате пересчитывают его из секунд, затем приводят к нужному типу. Соответственно должны быть реализованы конструкторы, оператор присваивания, и по необходимости операторы сравнения, а также можно перегрузить метод ToString()

Димас
Димас

Начинай с секунд, чего ты сверху лезешь?

ДМ
Дмитрий Мельников

Николай прав, переводи в секунды

АС
Андрей Сербин

Потому что это известная задача преобразования величин, к примеру дюймы и футы)) Отличное решение в учебнике для новичков : Р. Лафоре Объектно ориентированное программирование в С++.Нужно учиться проектировать правильно классы.

Похожие вопросы
помогите пожалуйста разобраться с программой Vk.Musik.ru
помогите разобраться с программой на паскале! пожалуйста!
Помогите разобраться с программой друг вокруг.
Помогите разобрать программу на паскале на циклы
Помогите разобраться с программой на С++
Гуру С++ помогите разобраться с программой
Помогите разобраться в программе, я написал, но там ошибки
помогите пожалуйста разобраться с программой! прошу вас!
помогите разобраться в программе паскаль
Помогите разобраться с программой