Как заменить перечисления на массивы указателей на строки?
Здесь вводится первая и вторая дата, если первая дата предшествует второй, то выводится 1, если вторая дата предшествует первой, то выводится 0. Нужно заменить перечисления на массивы указателей на строки, не понятно как это осуществить, пожалуйста, подскажите.
enum month { January = 1, February, March, April, May, June, July, August, September, October, November, December }; //список месяцев
month Get_m(int n) { // функция определения месяца
switch (n) {
case 1: return January;
case 2: return February;
case 3: return March;
case 4: return April;
case 5: return May;
case 6: return June;
case 7: return July;
case 8: return August;
case 9: return September;
case 10: return October;
case 11: return November;
case 12: return December;
}
}
int func(int d1, int d2, int m1, int m2, int y1, int y2) {
month g = Get_m(m1);
month f = Get_m(m2);
if (y1 < y2) { // выяснение какая дата первее
return 1;
}
else if (y1 > y2) {
return 0;
}
else {
if (g < f) {
return 1;
}
else if (g > f) {
return 0;
}
else {
if (d1 < d2) {
return 1;
}
else if (d1 > d2) {
return 0;
}
}
}
}
void main() {
setlocale(LC_ALL, "Rus");
int d1, d2, m1, m2, y1, y2;
printf("Введите первый день, первый месяц и первый год "); //ввод дат
scanf_s("%d %d %d", &d1, &m1, &y1);
printf("Введите второй день, второй месяц и второй год ");
scanf_s("%d %d %d", &d2, &m2, &y2);
printf("Результат: %d", func(d1, d2, m1, m2, y1, y2));
}
Ответы (2 шт):
Для функции сравнения массив указателей на строки не нужен. Но в принципе
const char* MonthName[ ] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };
// или так, чтобы индексы месяцев начинались с единицы
const char* MonthName[ ] = { "", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };
Строка может понадобиться если вы захотите сделать красивый вывод типа 10 Января 2022 меньше 11 Января 2022.
А вашу функцию можно немного переделать. В ней есть небольшой недочет - что она выдаст, если даты окажутся одинаковыми? Если решить этот вопрос, то можно немного упростить.
int func(int d1, int d2, int m1, int m2, int y1, int y2)
{
if (y1 < y2) // выяснение какая дата первее
return 1;
else if (y1 > y2)
return 0;
if (m1 < m2)
return 1;
else if (m1 > m2)
return 0;
if (d1 < d2)
return 1;
else if (d1 > d2)
return 0;
return -1; // если даты равны
}
И ещё один момент - вероятно нужно проверять корректность введенной даты. Чтобы не сравнивать 78.18.2022 с -55.-99.-2022
Проверять надо диапазоны:
- дни от 1 до 31
- месяцы от 1 до 12
- год в принципе может быть любой, если считать отрицательные числа как до н.э
- количество дней в месяце март - 31, апрель - 30
- количество дней в феврале (високосный год или нет)
Вариант 1
int func(int d1, int d2, int m1, int m2, int y1, int y2) {
return (y2 < y1) ? 1 : (y2 > y1) ? 0 :
(m2 < m1) ? 1 : (m2 > m1) ? 0 :
(d2 < d1) ? 1 : 0;
}
Вариант 2
int func(int d1, int d2, int m1, int m2, int y1, int y2) {
return y1*10000+m1*100+d1 > y2*10000+m2*100+d2;
}
При совпадении дат оба варианта выводят 0.