Я всегда любил условные операторы, с тех пор как впервые столкнулся с ними в средней школе, когда мы учились писать простые программы на Basic. В строгой логике всех этих if/then/else была и пронзительная красота, и в них было какое-то успокаивающее качество, как будто все в мире можно было описать и определить ими.

Мне всегда нравилось писать условные операторы, так что сегодняшняя задача могла бы быть проще простого. Что ж, это все еще было легко, но это также было довольно болезненным напоминанием о том, что мне нужно уделять больше внимания мелким деталям (и я не говорю о точках с запятой — почему-то я редко сталкиваюсь с проблемами в моем коде из-за отсутствия точки с запятой; может быть, потому, что я уже научился обращать на них особое внимание, ха-ха!).

Я начал с написанного от руки псевдокода — сначала всегда помогает написание псевдокода, и мне проще написать его в блокноте или на листе бумаги вместе с некоторыми заметками. У меня есть три причины поступать так: во-первых, я быстрее запоминаю вещи, если пишу их от руки; во-вторых, иметь отдельно псевдокод и заметки удобнее, чем иметь их в окне Gedit и переключаться туда и обратно; в-третьих, я люблю красивые и аккуратные блокноты :)

Во-первых, мне нужно было узнать, как определить, является ли число четным или нечетным. Раньше я считал себя очень плохим в математике, поэтому я был рад обнаружить, что мне не нужно было ломать голову, чтобы вспомнить или просто гуглить об операторе модуля :) Затем я посмотрел описание задачи и написал свою псевдокод. Вот:

(Обычно я пишу свой псевдокод очень близко к реальному коду, но я всегда опускаю фигурные скобки, потому что их слишком утомительно писать, и любой рукописный текст выглядит беспорядочно!)

После этого я приступил к написанию фактического кода. Я немного увлекся своими условными выражениями, поэтому первая версия выглядела так:

if (N % 2 != 0) {
printf(“Weird”);
else if (N % 2 = 0 && N => 2 && N =< 5) {
printf(“Not weird”);
else if (N % 2 = 0 && N => 6 && N =< 20) {
printf(“Weird”);
else {
printf(“Not weird”);
}
}
}
}

Конечно, у меня сразу появилось множество error: expected ‘}’ before ‘else’. Что ж, легко заметить ошибку и исправить ее. Следующая версия:

if (N % 2 != 0) {
printf(“Weird”);
}
else if (N % 2 = 0 && N => 2 && N =< 5) {
printf(“Not weird”);
}
else if (N % 2 = 0 && N => 6 && N =< 20) {
printf(“Weird”);
}
else {
printf(“Not weird”);
}

Теперь у меня есть кое-что новое: error: expected expression before ‘>’ token. Я подозревал, что это как-то связано с порядком символов › и = в операторах сравнения, поэтому пошел проверить. Конечно, правильный способ — поставить › или ‹ перед =. Кстати, вот полный список операторов Си.

Следующее сообщение об ошибке было немного более запутанным: lvalue required as left operand of assignment. Первый результат поиска Google прибивает его. Теперь код компилируется отлично, но вердикт… Неверный ответ!

Я сделал ту же ошибку, что и в предыдущем задании: ожидаемый ответ был Не странно, а не Не странно.

Итак, вот окончательный код для этой задачи:

if (N % 2 != 0) {
printf(“Weird”);
}
else if (N % 2 == 0 && N >= 2 && N <= 5) {
printf(“Not Weird”);
}
else if (N % 2 == 0 && N >= 6 && N <= 20) {
printf(“Weird”);
}
else {
printf(“Not Weird”);
}

Ничего сложного и ничего особо интересного. Но хороший урок внимательности и бдительности — кажется, вашим девизом как программиста должно быть «Постоянная бдительность!» :)