Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Не могу придумать алгоритм (http://www.tehnari.ru/f41/t41118/)

Linka 20.10.2010 23:29

Не могу придумать алгоритм
 
Нужно написать программу на языке С, не могу придумать алгоритм. Помогите пожалуйста :)

Программа следующая: пользователь вводит дату рождения (день, месяц, год) программа показывает кто он по знаку зодиака и в какой год он родился (например год свиньи).

Конкретно не пойму как можно определить знак зодиака?

Месяц записывается в одну переменную, день в другую. В зависимости от введенного месяца, смотрится значение второй переменной и в зависимости от того в каком интервале он находится, программа выдает соотв. сообщение.

Но мы сейчас проходим массивы и я так подозреваю, что они тоже должны быть задействованы. Можно ли это как-то реализовать с помощью массивов ?

Спасибо заранее.

kreol 21.10.2010 00:20

ну можно год дату и месяц например ввести в массив)
а там уже проверять куда попадет ячейка... но это будет нормально если у вас много пользователей и вы вбиваете для каждого... а так достаточно просто переменных... ну а проверка там та, которую вы написали...

AlexZir 21.10.2010 07:05

Раз обязательно нужны массивы, можно в них занести знаки зодиака и названия годов, потом проверять соответствие. К примеру, год можно определить путём вычисления остатка от деления разности введенного и эталонного значения на 12. За эталонное значение можно принять любой определенный год, название которого вам известно. Сам остаток от деления и будет индексом для элемента массива.

Для определения знака зодиака вам нужно ввести выбор из 12 вариантов. Дело в том, что для каждого знака периоды охватывают 2 месяца и нужно проверять попадание в них введенной даты. Каждый из вариантов выбора даст вам индекс для элемента массива знаков зодиака.

В конце вам останется только вывести все полученные значения.

Vladimir_S 21.10.2010 10:44

Вот, нарисовал некий алгоритм насчет Зодиака. Реализация (увы) - на Паскале, но, думаю, перевести в СИ несложно. Здесь применяются латинские названия Знаков:
Aries - Овен
Taurus - Телец
Gemini - Близнецы
Cancer - Рак
Leo - Лев
Virgo - Дева
Libra - Весы
Scorpio - Скорпион
Saggitarius - Стрелец
Capricorn - Козерог
Aquarius - Водолей
Pisces - Рыбы
Код:

VAR
 month,date,md: WORD;
 S:STRING;
Begin
 Write('Enter month (1-12) ');
 ReadLn(Month);
 Write('Enter date (1-31) ');
 ReadLn(Date);
 md:=month*100+date;
 If md< 121 then S:='Capricorn' else
 If md< 219 then S:='Aquarius' else
 If md< 321 then S:='Pisces' else
 If md< 421 then S:='Aries' else
 If md< 521 then S:='Taurus' else
 If md< 622 then S:='Gemini' else
 If md< 723 then S:='Cancer' else
 If md< 823 then S:='Leo' else
 If md< 924 then S:='Virgo' else
 If md<1024 then S:='Libra' else
 If md<1123 then S:='Scorpio' else
 If md<1222 then S:='Sagittarius' else
 S:='Capricorn';
 WriteLn('Zodiac sign is ',S);
 ReadLn;
END.

Проверено - работает.

Vladimir_S 21.10.2010 11:48

Еще в свое время для себя сделал программку по восточному календарю. Сейчас малость "причесал": убрал кириллицу (DOS) и годы до н.э. (у меня учитываются и такие). К сожалению, опять же Паскаль.
Код:

CONST
  Matter_Color:ARRAY[0..9] of STRING[16]=('Metal    White  ',
                                          'Metal    White  ',
                                          'Water    Black  ',
                                          'Water    Black ',
                                          'Wood    Blue  ',
                                          'Wood    Blue  ',
                                          'Fire    Red  ',
                                          'Fire    Red  ',
                                          'Earth    Yellow',
                                          'Earth    Yellow');

 Animal:ARRAY[0..11] of STRING[8]=('Monkey',
                                  'Hen  ',
                                  'Dog  ',
                                  'Swine ',
                                  'Mouse ',
                                  'Cow  ',
                                  'Tiger ',
                                  'Rabbit',
                                  'Dragon',
                                  'Snake ',
                                  'Horse ',
                                  'Sheep ');

VAR
 CurYear, Mod1, Mod2, Mod3:LongInt;

BEGIN
 WRITELN('Enter zero year to exit');
 WRITELN;
 REPEAT
  WRITE('Enter the year:  '); READLN(CurYear);
  IF CurYear>0 THEN
  BEGIN
    Mod1:=CurYear mod 60;
    Mod2:=Mod1 mod 10;
    Mod3:=Mod1 mod 12;
    WRITELN(CurYear:8,'  ',Animal[Mod3],'  ',Matter_Color[Mod2]);
  END;
 UNTIL CurYear=0;
END.

Может быть, пригодится.

Linka 21.10.2010 18:06

Спасибо всем большое )

Linka 23.10.2010 05:46

Vladimir_S, не подскажите, а можно ли в языке Си сделать массив строк ? Как у вас во втором примере ? Ведь в Си строка - это массив символов.

Vladimir_S 23.10.2010 10:00

Цитата:

Сообщение от Linka (Сообщение 408437)
Vladimir_S, не подскажите, а можно ли в языке Си сделать массив строк ? Как у вас во втором примере ? Ведь в Си строка - это массив символов.

К сожалению - не подскажу. СИ, как говорится, "не мой профиль".
Между прочим, в Паскале строка тоже ни что иное, как массив символов.

KiD2 23.10.2010 10:24

Можно сделать массив строк в Cи, например вот так:
const string Str1[4] = {"Sc","Cs","Df","Hd"};
или
string Str[10];
Str[0]="aaaa";
Только нужно будет подключать string.h...
P.S.: в наиболее ранних версиях Си нет string, только char :) А в более поздних помимо string, появился и AnsiString...

Linka 23.10.2010 16:46

KiD2, попробовал твои варианты - выдает ошибку. Значит Си старый ? String.h подключил.


Часовой пояс GMT +4, время: 03:55.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.