Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2016, 22:02   #1
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию [Pascal] Восточный календарь

Добрый день,

Условие:


По восточному календарю каждый год имеет название животного с указанием его цвета. Циклическая последовательность смены названий годов и, соответственно, названий животных следующая: крыса, бык, тигр, заяц, дракон, змея, лошадь, овца, обезьяна, петух, собака, свинья, крыса, … . Циклическая последовательность смены цветов: белый, черный синий, красный, желтый … . Цвета меняются через каждые 2 года. Необходимо по заданному натуральному числу N (N<=3000) определить название года по восточному календарю.

Входные данные:
Входной файл input.txt содержит натуральное число N. Ограничения: N<=3000.

Выходные данные:
В выходной файл output.txt нужно вывести год знак - и его название. (возле тире пробелов не ставить!)

Названия животных и цветов выводить на английском языке:
крыса - rat, бык - bull, тигр - tiger, заяц - hare, дракон - dragon, змея -snake, лошадь - horse, овца - sheep, обезьяна - monkey, петух - rooster, собака - dog, свинья - pig;

синий - blue, красный - red, желтый - yellow, белый - white, черный - black.

Примеры:

input.txt
2002
2003
2004

output.txt
2002-black horse
2003-black sheep
2004-blue monkey

___________________________________ _________________


Вообще вначале я хотел использовать case ... of для нахождения цвета и животного. Но с животным возникли трудности.

Мой код

Код:
Program Vostok_kalendar;
uses crt;

var n,x,i:integer;
    k:byte;
    s:string[25];
    f:text;

begin
clrscr;
assign(f,'input.txt');
reset(f);
readln(f,n);
close(f);
s:='-';
x:= n mod 10; {Определяем последную цифру у числа N}
case x of {В зависимости от значения последней цифры x числа N выбирается цвет}
0,1:s:=s+'white '; {Цвет меняется каждые 2 года!}
2,3:s:=s+'black ';
4,5:s:=s+'blue ';
6,7:s:=s+'red ';
8,9:s:=s+'yellow ';
end;
k:=0;
for i:=1 to n do {С этим циклом ПРОБЛЕМА!Работает не так как я предпологал}
  begin
    if (k = 12) or (i mod 10 = 0)then k:=1
      else k:=k+1;
    write('i= ',i,' ');writeln('k= ',k,' ')
  end;
case k of {Определения животного по счетчику k}
1:s:=s+'rat'; {Животное меняется каждый год! Цикл составляет 12 лет!}
2:s:=s+'bull';
3:s:=s+'tiger';
4:s:=s+'hare';
5:s:=s+'dragon';
6:s:=s+'snake';
7:s:=s+'horse';
8:s:=s+'sheep';
9:s:=s+'monkey';
10:s:=s+'rooster';
11:s:=s+'dog';
12:s:=s+'pig';
end;
assign(f,'output.txt');rewrite(f);
write(f,n,s); close(f);
end.
Проблема в цикле определения животного для числа N. Согласно восточному календарю цикл смены животных длится 12 лет. 1-крыса 2-бык ... 12-свинья и всё заново. Моя задумка заключалась в том что, начиная с 1 года (белый крыса) и до года N прогонять эти 12 лет через счетчик k и на 13 год менять счетчик k=1. Таким образом по задумке в k должно оставаться число цикла, который потом в case определяет животного. Но с большимми числами, пример 19** и 21** и т.д. начинает косячно работать, выдавая неверное животное.

Жду любой помощи по реализации данного куска кода, параллельно буду пытаться найти другие решения.

Заранее спасибо!
artems67 вне форума Ответить с цитированием
Старый 28.11.2016, 22:08   #2
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Цитата:
Сообщение от artems67 Посмотреть сообщение
параллельно буду пытаться найти другие решения
и найдешь в гугле, инфа 100%. Такую задачу я на олимпиаде в 2003 г решал.
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 28.11.2016, 22:26   #3
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию

Цитата:
Сообщение от Aleksandr H. Посмотреть сообщение
и найдешь в гугле, инфа 100%. Такую задачу я на олимпиаде в 2003 г решал.
Да, вы правы, реализация в 1 строчку
Код:
k:=(n-3) mod 12;
Только почему именно 3 вычитаем. Я не совсем понял, так как код выложен был без комментариев. А ещё не доконца уверен в остатке от деления на 12, к примеру числа 2004 (2004-3=2001 mod 12) просто остаток у меня на калькуляторе получился 75, а 2004-blue monkey (monkey - 9). Хотя в файл верный ответ выводи. + эта строчка не будет корректно работать если n=1.
artems67 вне форума Ответить с цитированием
Старый 28.11.2016, 23:11   #4
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию

Модернизировал кусок кода с животным:
Код:
if n < 12 then k:=n
  else if n = 12 then k:=0
    else  k:= (n-3) mod 12; 
case k of {Определения животного по k}
0:s:=s+'pig';
1:s:=s+'rat'; {Животное меняется каждый год! Цикл составляет 12 лет!}
2:s:=s+'bull';
3:s:=s+'tiger';
4:s:=s+'hare';
5:s:=s+'dragon';
6:s:=s+'snake';
7:s:=s+'horse';
8:s:=s+'sheep';
9:s:=s+'monkey';
10:s:=s+'rooster';
11:s:=s+'dog';
end;
Запустил программу на тест и погорел на 20 тесте, очень обидно. Набрал 95 % ((
artems67 вне форума Ответить с цитированием
Старый 28.11.2016, 23:18   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Цитата:
...к примеру числа 2004 (2004-3=2001 mod 12) просто остаток у меня на калькуляторе получился 75...
Это как? Т.е. 75 на 12 не делится? Вроде как остаток получится 3.
Но 2001 mod 12 = 9.

Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 28.11.2016, 23:24   #6
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Это как? Т.е. 75 на 12 не делится? Вроде как остаток получится 3.
Но 2001 mod 12 = 9.

Как-то так, ...
Я разобрался уже. Только тест прога моя не приходит. Вроде все предусмотрел.
artems67 вне форума Ответить с цитированием
Старый 28.11.2016, 23:49   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Так думаю, что следует разделить ветку определения животного и цвета.
Для животных и цвета я бы определил массивы слов и тогда
Код:
k := Year MOD 12; {k - индекс в массиве животных}
Так как цветов пять и они повторяются дважды, то следующий цикл цветов приходит через 10 лет
Код:
Color := Year MOD 10; {Индекс в массиве цветов}
Размерность массива для животных 12, а для цвета - 10 (повторил бы цвета).

PS: Первые элементы массивов должны соответствовать первому году.


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 29.11.2016, 14:33   #8
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию

Оказывается 1-й год н.э. по китайскому календарю это белый петух (
Пруфl). Пришлось вставлять "костыль":
Код:
 if n = 1 then k:=10
чтобы прога прошла последний тест с n=1 . Это поменяло кардинально восприятие мною этой задачи, я снова перестал понимать как грамотно решить эту задачу.

(С костылем прошла тест)

Последний раз редактировалось artems67; 29.11.2016 в 14:38.
artems67 вне форума Ответить с цитированием
Старый 29.11.2016, 14:49   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Тут всего решения
Код:
const cYear: array[0..11] of String = ('monkey','rooster','dog','pig','rat','bull','tiger','hare','dragon','snake','horse','sheep');
      cColor: array[0..4] of String = ('white','black','blue','red','yellow');
...
  g:=2017;
  i:=g mod 12;
  j:=(g mod 10) div 2;
  //cColor[j]+' '+cYear[i] - результат
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
по дате рождения вывести восточный и западный гороскопы с краткой характеристикой и рисунками (Delphi) dark999 Помощь студентам 6 22.04.2011 23:12
Задача про восточный календарь. Fist_valera Паскаль, Turbo Pascal, PascalABC.NET 4 27.02.2011 16:42
Календарь mineralkaaa Общие вопросы Delphi 5 11.09.2010 01:28
Григорианский календарь (Pascal) Mish92(21-09) Помощь студентам 5 10.10.2009 20:30