Доработка программы по нахождению названия года по японскому календарю - C (СИ)
Формулировка задачи:
Вот задание
Разработать программу, которая для любого заданного года по современному летоисчислению определяет название соответствующего года по японскому календарю.
В японском календаре принят 60-ти летний цикл, который состоит из пяти двенадцатилетних подциклов, обозначаемых пятью цветами: зелёный (green), красный (red), жёлтый (yellow), белый (white) и чёрный (black). В любом из этих цветных подциклов каждый соответствует названию одного из следующих животных: крыса (rat), бык (bull), тигр (tiger), кролик (rabbit), дракон (dragon), змея (snake), лошадь (horse), овца (sheep), обезьяна (monkey), петух (cock), собака (dog) и кабан (boar). Таким образом, по японскому календарю каждый год в 60-ти летнем цикле обозначает сочетание названий одного из перечисленных цветов и животных. В частности, начало первого цикла, год зелёной крысы (green rat), в современном цикле соответствует 4-ому году нашей эры. Программа должна выполняться в режиме фильтра, получая последовательность номеров годов современного летоисчисления через поток стандартного ввода (stdin) и отображая соответствующие им названия в японском календаре через поток стандартного вывода (stdout). Работа программы должна продолжаться до тех пор, пока не получен признак конца входного потока, установленный в операционной среде её выполнения.
вот мой код.
Подскажите, работает ли моя программа по заданию? Преподаватель сказал что кроме этого нужно добавить возможность фильтрации из файла. то есть перенаправлять файл в программу, как это сделать?
#include <stdio.h>
int wrongi(int);
int main(int argc, char *argv[])
{
const char *color[] = {"green", "red", "yellow", "white", "black"};
const char *animal[] = {"rat", "bull", "tiger", "rabbit", "dragon",
"snake", "horse", "sheep", "monkey", "cock",
"dog", "boar"};
int year;
printf( "\nВведите год: ");
if (scanf( "%d", &year) != 1) return wrongi(1);
if (year < 4) return wrongi(2);
printf( "\t%d = ", year);
year = (year - 4) % 60;
printf( color[year / 12]);
printf( " %s", animal[year % 12]);
printf('\n');
return 0;
}
int wrongi(int kod)
{
if (kod == 1)
printf( "\nНеобходимо указать число!\n");
else
printf( "\nГод должен быть не меньше четырех!\n");
return -1;
}Решение задачи: «Доработка программы по нахождению названия года по японскому календарю»
textual
Листинг программы
#include <stdio.h>
static const char* color[] =
{
"green", "red", "yellow", "white", "black"
};
static const char* animal[] =
{
"rat", "bull", "tiger", "rabbit", "dragon", "snake", "horse", "sheep", "monkey", "cock", "dog", "boar"
};
int main(int argc,char** argv)
{
int year = 0;
int iRes = 0;
while (iRes = scanf("%d",&year))
{
if (iRes != 1)
{
// End of Input
break;
}
if (year < 4)
{
printf("Too small Year value!\n");
continue;
}
year = (year - 4) % 60;
printf(" -->> %s %s\n\n",color[year / 12],animal[year % 12]);
}
return 0;
}
Объяснение кода листинга программы
- В коде присутствуют два массива:
colorиanimal, каждый из которых содержит 12 элементов. - В функции
mainопределены две переменные:yearиiRes. - В цикле
whileпроисходит считывание значения переменнойyearс помощью функцииscanf. - Если при считывании значения произошла ошибка (например, пользователь ввел не число), то условие цикла
whileне выполняется и программа переходит к следующей итерации цикла. - Если значение
yearменьше 4, то выводится сообщение об ошибке и программа продолжает считывать значения. - Значение
yearприводится к диапазону от 0 до 59 (год по григорианскому календарю + 3). - Вычисляется значение
yearпо японскому календарю с помощью формулы: (год по григорианскому календарю - 4) % 60. - Выводится сообщение с названием года по японскому календарю и животным этого года.
- Программа завершается, когда пользователь вводит некорректное значение или достигает конца ввода.