Я застреваю на следующей проблеме от моего C программирование класса:
Запишите программу, которая предлагает пользователю вводить год и затем производит календарь (в течение всего года).
Я понятия не имею, как приблизиться к этой проблеме. Я могу обычно запускать свои проблемы домашней работы (это - дополнительная проблема проблемы), но я действительно потерян. Мы работали через главы 1-10 Deitel & Deitel (циклы, массивы, указатели, ввод-вывод, и т.д.), но я не знаю, как приблизиться к этому вообще. Любые подсказки или предложения ценились бы.
Это может помочь вам понять математику календаря. Если сказочная книга календальные расчеты не в вашей университетской библиотеке, они могут привести вас к перепечатанию статьи по той же авторам в программного практики и опыта . И попросите вашего профила запрашивать книгу для библиотеки.
Самое сложное - определить, в какой день недели начинается год.
http://en.wikipedia.org/wiki/Calculating_the_day_of_the_week
Но даже без этих знаний, когда я впервые это реализовал, я использовал справочную дату (например, вы знаете, что сегодня 11 января 2010 года - это понедельник) и отсчитывал оттуда дни. (Просто имейте в виду, что високосные годы имеют дополнительный день, и что високосные годы - каждые 4 года, за исключением каждых 100 лет, за исключением каждых 400 лет)
Ну, сначала выясните алгоритмическую часть вашей проблемы - дали год, найдите, какой день 1 января.
После этого просто обратите внимание на количество дней в каждом месяце (храните его в массиве, скажем num_days []
), а также отмечают количество месяцев в год и массив строк для месяцы.
для E.G. Внешний цикл итерации за месяцы. Скажем, итерация для (i = 0; i
месяц [I]
, затем новая линия.
Затем, с простыми вкладками, печать Sun Mon Tue ..., а другая новая линия.
Затем, используя 1 января 1 января соответствует (вызовите его в первом дне
), вставьте пробелы и начните с того дня. Продолжайте печатать даты и новые линии, пока вы не ударите Max_Month [I]
, который является 31
(на январь). Храните название дня последнего дня предыдущего месяца и просто повторите отношение к тому дню в первом дне
.
Считается ли этот код? : -)
char command[]="cal 2010";
sprintf(command,"cal %d",argv[1]);
system(command);
Это предполагает машины Unix с Cal на пути.
Вам нужна пара пары для начала. Во-первых, вам нужна формула, которая вычисляет день недели на 1 января любого вступительного года. Вам также понадобится формула, чтобы определить, является ли год в виде скачкового года. Обе эти формулы легко найти простым поиском Google. Третий предмет, который вам нужен, это простой массив, содержащий количество дней в каждом из 12 месяцев для нежирного года.
Как только у вас есть эти вещи, его тривиальна, чтобы определить день недели на каждый месяц года. Обязательно приходится на 29 февраля в виде скачкового года. Оттуда вам просто нужно создать функцию, которая примирает ежемесячный календарь в форме, которая выглядит похоже на календарь, висящую на стене. Попробуйте сначала зарисовать желаемую макет на бумаге и используйте это как шаблон для создания соответствующих операторов формата.
Вот какой полный код для вас, чтобы использовать... должен любить 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>
-121--148â5-
Хорошим началом могут быть функции localtime (3) и mktime (3) . Кроме того, можно внедрить арифметику соответствующих дат с нуля. Затем просто создайте первую строку календаря (найдите день недели, соответствующий 1 января, затем напечатайте тахт в нужном месте, затем остаток недели), затем напечатайте все, кроме последних строк, затем напечатайте последнюю строку.
В зависимости от того, хотите ли вы, чтобы календарь был разделен по месяцам или нет, это МОЖЕТ быть лучше делать в месяц, а не в год.
-121--4780405-Вообще, когда у вас есть большая проблема, как эта, вы хотите разбить ее на небольшие проблемы, которые легче решить.
Вот одна возможная небольшая проблема: если вы знаете, сколько дней в месяце, и на какой будний день приходится первый месяц, не могли бы вы вывести календарь для этого месяца?
Это должно сделать трюк
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 coproc
, чтобы создать другой процесс, затем перенаправьте его операции ввода-вывода в существующую оболочку (или другой процесс, если вы хотите) Может быть проверен алгоритм судного дня . Это даст вам определенные «обреченности» дни как 31 января - судный день, для 2008 года, это была суббота. Вы можете работать с задними словами оттуда
Хорошее начало может быть локальное время (3) и MKTime (3) функций. Кроме того, вы можете реализовать соответствующую дату арифметику с нуля. Затем, просто генерируйте первую строку календаря (найдите в будний день, который соответствует 1 января, затем распечатайте TAHT в нужном месте, а затем остальной частью недели), затем распечатайте все, кроме последних строк, затем распечатайте последнюю линия.
В зависимости от того, если вы хотите, чтобы календарь страницированный месяц или нет, это может быть лучше сделано ONA в месяц вместо каждой годовой базы.
В основном есть два подхода:
Легкий / прагматический способ: решить задачу и забыть обо всем остальном. Здесь вы можете проверить документацию для MKTIME ()
(вы найдете пример, основанный на MKTIME ниже ..).
Научно-инженерный способ: научитесь знать, как это работает! Вы можете начать в Великой статье Википедии о Грегорианском календаре . Прочитайте его, понять его и напишите код, который реализует основные алгоритмы (которые представляют , без ракеты, можно). Это улучшит ваши навыки много (на самом деле, вы действительно должны делать такую вещь, может быть, не календаж, но и еще одна тема, это даст вам большой прыжок в понимании . Все вещи).
Теперь какой-то прагматичный код для начала. 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 лет. Вы все еще должны настроить его, чтобы быть правильными для скачковых лет! Также результат еще не очень довольно, только одна строка в день.
Редактировать: добавленные выходные данные будней.
Хорошим стартом могут быть функции localtime(3) и mktime(3). В качестве альтернативы можно реализовать соответствующую арифметику даты с нуля. Затем просто сгенерируйте первую строку календаря (найдите день недели, соответствующий 1 января, затем распечатайте тахт в нужном месте, а затем оставшуюся часть недели), затем распечатайте все строки, кроме последней, после чего распечатайте последнюю строку.
В зависимости от того, хотите ли вы, чтобы календарь был разбит на страницы по месяцам или нет, лучше делать это MAY ona в месяц, а не в год.