Входной год, затем распечатайте календарь

Я застреваю на следующей проблеме от моего C программирование класса:

Запишите программу, которая предлагает пользователю вводить год и затем производит календарь (в течение всего года).

Я понятия не имею, как приблизиться к этой проблеме. Я могу обычно запускать свои проблемы домашней работы (это - дополнительная проблема проблемы), но я действительно потерян. Мы работали через главы 1-10 Deitel & Deitel (циклы, массивы, указатели, ввод-вывод, и т.д.), но я не знаю, как приблизиться к этому вообще. Любые подсказки или предложения ценились бы.

5
задан Bill the Lizard 20 September 2012 в 21:04
поделиться

10 ответов

Это может помочь вам понять математику календаря. Если сказочная книга календальные расчеты не в вашей университетской библиотеке, они могут привести вас к перепечатанию статьи по той же авторам в программного практики и опыта . И попросите вашего профила запрашивать книгу для библиотеки.

4
ответ дан 13 December 2019 в 22:08
поделиться

Самое сложное - определить, в какой день недели начинается год.

http://en.wikipedia.org/wiki/Calculating_the_day_of_the_week

Но даже без этих знаний, когда я впервые это реализовал, я использовал справочную дату (например, вы знаете, что сегодня 11 января 2010 года - это понедельник) и отсчитывал оттуда дни. (Просто имейте в виду, что високосные годы имеют дополнительный день, и что високосные годы - каждые 4 года, за исключением каждых 100 лет, за исключением каждых 400 лет)

http://en.wikipedia.org/wiki/Leap_year

1
ответ дан 13 December 2019 в 22:08
поделиться

Ну, сначала выясните алгоритмическую часть вашей проблемы - дали год, найдите, какой день 1 января.

После этого просто обратите внимание на количество дней в каждом месяце (храните его в массиве, скажем num_days [] ), а также отмечают количество месяцев в год и массив строк для месяцы.

для E.G. Внешний цикл итерации за месяцы. Скажем, итерация для (i = 0; i . Затем, на каждый месяц, распечатайте строку, например месяц [I] , затем новая линия.

Затем, с простыми вкладками, печать Sun Mon Tue ..., а другая новая линия.

Затем, используя 1 января 1 января соответствует (вызовите его в первом дне ), вставьте пробелы и начните с того дня. Продолжайте печатать даты и новые линии, пока вы не ударите Max_Month [I] , который является 31 (на январь). Храните название дня последнего дня предыдущего месяца и просто повторите отношение к тому дню в первом дне .

0
ответ дан 13 December 2019 в 22:08
поделиться

Считается ли этот код? : -)

char command[]="cal 2010";
sprintf(command,"cal %d",argv[1]);
system(command);

Это предполагает машины Unix с Cal на пути.

1
ответ дан 13 December 2019 в 22:08
поделиться

Вам нужна пара пары для начала. Во-первых, вам нужна формула, которая вычисляет день недели на 1 января любого вступительного года. Вам также понадобится формула, чтобы определить, является ли год в виде скачкового года. Обе эти формулы легко найти простым поиском Google. Третий предмет, который вам нужен, это простой массив, содержащий количество дней в каждом из 12 месяцев для нежирного года.

Как только у вас есть эти вещи, его тривиальна, чтобы определить день недели на каждый месяц года. Обязательно приходится на 29 февраля в виде скачкового года. Оттуда вам просто нужно создать функцию, которая примирает ежемесячный календарь в форме, которая выглядит похоже на календарь, висящую на стене. Попробуйте сначала зарисовать желаемую макет на бумаге и используйте это как шаблон для создания соответствующих операторов формата.

0
ответ дан 13 December 2019 в 22:08
поделиться

Вот какой полный код для вас, чтобы использовать... должен любить Google AJAX API Playground: -)

Edit 1: Примечание: это позволяет только выбрать 5, потому что я не хотел копировать/вставлять другие 10 опции: -)

<!--
  copyright (c) 2009 Google inc.

  You are free to copy and use this sample.
  License can be found here: http://code.google.com/apis/ajaxsearch/faq/#license
-->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title>Sample Select Maximum with jQuery</title>
    <script src="http://www.google.com/jsapi?key=ABQIAAAA1XbMiDxx_BTCY2_FkPh06RRaGTYH6UMl8mADNa0YKuWNNa8VNxQEerTAUcfkyrr6OwBovxn7TDAH5Q">    </script>
    <script type="text/javascript">
    google.load("jquery", "1");

    $(document).ready(function() {

      var last_valid_selection = null;

      $('#testbox').change(function(event) {
        if ($(this).val().length > 5) {
          alert('You can only choose 5!');
          $(this).val(last_valid_selection);
        } else {
          last_valid_selection = $(this).val();
        }
      });
    });
    </script>
  </head>
  <body style="font-family: Arial;border: 0 none;">
    <select multiple id='testbox'>
      <option value='1'>First Option</option>
      <option value='2'>Second Option</option>
      <option value='3'>Third Option</option>
      <option value='4'>Fourth Option</option>
      <option value='5'>Fifth Option</option>
      <option value='6'>Sixth Option</option>
      <option value='7'>Seventh Option</option>
      <option value='8'>Eighth Option</option>
      <option value='9'>Ninth Option</option>
      <option value='10'>Tenth Option</option>
    </select>
  </body>
</html>

Demo

-121--148â5-

Хорошим началом могут быть функции localtime (3) и mktime (3) . Кроме того, можно внедрить арифметику соответствующих дат с нуля. Затем просто создайте первую строку календаря (найдите день недели, соответствующий 1 января, затем напечатайте тахт в нужном месте, затем остаток недели), затем напечатайте все, кроме последних строк, затем напечатайте последнюю строку.

В зависимости от того, хотите ли вы, чтобы календарь был разделен по месяцам или нет, это МОЖЕТ быть лучше делать в месяц, а не в год.

-121--4780405-

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

Вот одна возможная небольшая проблема: если вы знаете, сколько дней в месяце, и на какой будний день приходится первый месяц, не могли бы вы вывести календарь для этого месяца?

3
ответ дан 13 December 2019 в 22:08
поделиться

Это должно сделать трюк

UPDATE
    <tablename> 
SET
    <fieldname> = replace(<fieldname>,'\n',char(13)+char(10)),
    <otherfieldname> = replace(< otherfieldname >,'\n',char(13)+char(10))
-121--3866360-

Файл bash NEWS, repro 'd here с некоторым резюме, имеет некоторую хорошую информацию. Новые функции включают:

  • ассоциативные массивы : имя членов в массиве с помощью массив [имя] и доступ с помощью $ {массив [имя]}
  • Специальный * * glob образца: match all files and «zero or more» directory
  • Co-processes : используйте ключевое слово coproc , чтобы создать другой процесс, затем перенаправьте его операции ввода-вывода в существующую оболочку (или другой процесс, если вы хотите)
  • Расширения, изменяющие регистр : совпадения имен без учета регистра символов
-121--4501651-

Может быть проверен алгоритм судного дня . Это даст вам определенные «обреченности» дни как 31 января - судный день, для 2008 года, это была суббота. Вы можете работать с задними словами оттуда

0
ответ дан 13 December 2019 в 22:08
поделиться

Хорошее начало может быть локальное время (3) и MKTime (3) функций. Кроме того, вы можете реализовать соответствующую дату арифметику с нуля. Затем, просто генерируйте первую строку календаря (найдите в будний день, который соответствует 1 января, затем распечатайте TAHT в нужном месте, а затем остальной частью недели), затем распечатайте все, кроме последних строк, затем распечатайте последнюю линия.

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

1
ответ дан 13 December 2019 в 22:08
поделиться

В основном есть два подхода:

  1. Легкий / прагматический способ: решить задачу и забыть обо всем остальном. Здесь вы можете проверить документацию для MKTIME () (вы найдете пример, основанный на MKTIME ниже ..).

  2. Научно-инженерный способ: научитесь знать, как это работает! Вы можете начать в Великой статье Википедии о Грегорианском календаре . Прочитайте его, понять его и напишите код, который реализует основные алгоритмы (которые представляют , без ракеты, можно). Это улучшит ваши навыки много (на самом деле, вы действительно должны делать такую ​​вещь, может быть, не календаж, но и еще одна тема, это даст вам большой прыжок в понимании . Все вещи).

Теперь какой-то прагматичный код для начала. MKTIME () имеет отличную функцию: она знает детали Calender, и он принимает E.G. Дата «2010-01-60» и преобразует его на 29 февраля 2010 года. Но это будет работать только на даты после 1970 года. Это не будет работать на более ранние даты (хотя я не на 100% уверен, но это должно T работать, потому что время Unix начинается с 1 января 1970 года, но попробуйте другие даты, возможно, MKTime () не ограничивается временем UNIX).

Псевдокод, это отпечатки каждый день на одной строке (гггг-мм-дд):

void print_cal( int year ) {
    static char weekdays[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
    struct tm tm;
    for( int day=0; day<365; ++day ) {
        memset( &tm, 0, sizeof(tm) );
        tm.tm_year = year - 1900;
        tm.tm_mday = day;
        mktime( &tm ); // modifies tm

        printf( "%04d-%02d-%02d, %s\n", tm.tm_year, tm.tm_mon+1, tm.tm_mday, weekdays[tm.tm_wday] );
    }
}

Этот код игнорирует Leap лет. Вы все еще должны настроить его, чтобы быть правильными для скачковых лет! Также результат еще не очень довольно, только одна строка в день.

Редактировать: добавленные выходные данные будней.

0
ответ дан 13 December 2019 в 22:08
поделиться

Хорошим стартом могут быть функции localtime(3) и mktime(3). В качестве альтернативы можно реализовать соответствующую арифметику даты с нуля. Затем просто сгенерируйте первую строку календаря (найдите день недели, соответствующий 1 января, затем распечатайте тахт в нужном месте, а затем оставшуюся часть недели), затем распечатайте все строки, кроме последней, после чего распечатайте последнюю строку.

В зависимости от того, хотите ли вы, чтобы календарь был разбит на страницы по месяцам или нет, лучше делать это MAY ona в месяц, а не в год.

0
ответ дан 13 December 2019 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: