Можно, например, узнать, что есть такая функция, как strlen(), которая поможет мне точно и без лишних заморочек ответить на вопрос, сколько элементов в массиве символов.
Осталось только разобраться, что там происходит с символом конца строки (учитывается ли он при подсчёте или нет), и можно сказать, что ещё один шаг в решении задачи пройден.
Вчера вечером меня осенила "гениальная" идея по поводу решения тестовой задачи. Еле сдержался, чтобы не бросить учёбу и не продолжить решать задачу.
И правильно сделал. Потому что сегодня утром до меня, наконец, дошло, что это решение было неправильным.
Всё-таки, наступив пару раз на "грабли", я хоть чему-то, да научился. ))
Краткий отчёт по учёбе:
По языку C - последняя лекция оказалась сложной. Было много новой информации, вызвавшей много новых вопросов, и мало времени над всем этим подумать. Нужно будет повторить её ещё раз.
По английскому языку - продолжаем изучать способы образования прилагательных. Здесь по-прежнему пока всё идёт ровно и без особого напряжения.
Книжка по программированию - "завяз" в районе 300-х страниц. Автор начал приводить много примеров на языке Паскаль. Приходится разбираться и прикидывать, как всё это могло быть сделано на языке C. Что интересно, некоторые из примеров в книге можно использовать для решения моей злополучной тестовой задачи, но только на языке Паскаль, т.к. в языке C таких команд нет. ))
Хм... Меня только что снова осенила "гениальная" идея по поводу решения тестовой задачи.
Сегодня вечером нужно будет её проверить. В следующем сообщении обязательно напишу, что у меня получилось.
Несмотря на то, что я два дня назад "попрощался" с тестовой задачей до лучших времён, вчера вечером снова за неё взялся. На этот раз решил передавать треугольное число в функцию main() в качестве символьного параметра (второго в скобках):
int main (int argc, char * argv)
"Бился" над этим способом до 00:00 часов. "Разбился" о непонимание того, как подсчитать в переданном массиве символов число его элементов. Наугад попробовал разными методами через sizeof и деление, но ничего не вышло. Либо компилятор выдавал ошибку, либо программа считала, что есть только один элемент в переданном массиве символов.
Итог "битвы" такой: 2:0 - в пользу задачи, плюс пропущенные по одному уроку программирования на C и английского языка. ))
На выходных придётся снова поднажать с учёбой.
Ещё сегодня полазил по сайту "Лаборатории Касперского". У них, оказывается, есть интернатура (стажировка) для студентов 3 - 4 курсов. Очень расстроился, когда узнал, что это работает только в г.Москве и у меня не получится курсе на 3 - 4 постажироваться удалённо.
Ну, ничего. Думаю, через пару-тройку лет обязательно найду себе место для стажировки.
От "медленного" курса по C осталась одна лекция и начнём изучать "быстрый" курс по C.
По английскому сейчас изучаем местоимения и читаем детские стишки для отработки правильности чтения.
Вчера мне позвонил одноклассник с необычной просьбой. Ему пришёл из Китая новый смартфон и он не может установить в него сим-карту. Точнее, её есть куда вставить, но смартфон её не "видит". Попросил меня помочь. ))
В чём вопрос? Что не сделаешь для лучшего друга? Привози!
Поглядим, что там за чудо китайской техники такое, в которое сим-карту можно вставить как-то неправильно. )) Заодно угощу товарища домашним салом (много его что-то скопилось).
Ещё "новость" в тему смартфонов: в день выхода iphone 7 у жены сломался старенький iphone 4S (не работает wi-fi). Вот, теряюсь в догадках, что это может быть: желание жены купить новый iphone, желание Apple, чтобы моя жена купила новый iphone или всё-таки желание iphone 4S уйти "на покой"?
Моя Королева вроде как вне подозрений, так как новый смартфон она хочет не от Apple.
Для Apple такие "шутки" nj;t вроде как не совсем характерны и мелковаты. Раньше за ними такой прямолинейности не замечал. В основном, с выходом каждого обновления iOS iphone 4S просто начинал больше тормозить. В итоге, к последнему обновлению от той скорости работы, из-за которой он в своё время покупался, осталась только "тень отца Гамлета" (сплошные "тормоза"). ))
Сейчас много читаю в Интернете статей и новостей на тему IT и пополняю по ссылкам из них свою коллекцию книг. Когда я всё это буду читать? Ничего, прорвёмся. У нас, ведь, ещё "1000 лет на Земле". )) Возможно, какие-то из книг войдут в мой так называемый "долг знаний".
Почему №1? Потому что уверен, что их будет ещё очень много. ))
Вчера вечером занялся решением первой тестовой задачи на продвинутых (углублённых) курсах программирования на C. Задание было такое: написать программу, которая находит номер введенного целого положительного треугольного числа в диапазоне от 1 до 9'223'372'036'854'775'807.
Написал целых три программы.
Как решал:
1. Определил, что числа в диапазоне от 1 в 9'223'372'036'854'775'807 входят в множество long long int чисел.
2. Поверхностно изучил функции scanf() и sqrt().
3. Поверхностно изучил операторы цикла for, while и ветвления if - else.
4. Почитал, что такое треугольные числа и как они рассчитываются.
5. Написал первую программу, которая в цикле while требовала ввести правильное треугольное число, проверяла его на соответствие диапазону исходных данных и вычисляло его номер.
6. Подумав, решил от цикла while отказаться - его, ведь, не было в условиях задачи. Написал программу без цикла, с диалогами на английском:
#include <stdio.h> #include <math.h> void checkNumber (const long long int * const ptr) { int n = (sqrt(1+8* (*ptr))-1)/2; if (*ptr > 0 && *ptr <= 9223372036854775807 && (n%1) == 0 && (n*(n+1)/2) == *ptr) { printf ("The number of this triangular number is: %d\n", n); } else { printf ("It's not valid number.\n"); } return; } int main (void) { long long int triangularNumber; long long int *triangularNumberPtr = &triangularNumber; printf ("Input positive triangular number: "); scanf ("%lli", &triangularNumber); checkNumber (triangularNumberPtr);
return 0; }
Использовал в программе указатели, чтоб было вроде как "правильнее".
7. Отправил программу на проверку и дальше третьего теста она не прошла.
Уж не помню, какие там ошибки автотест выдавал, но смысл был в том, что диалоги в программе не нужны.
8. Убрал диалоги, указатели и прочие "красивости":
#include <stdio.h> #include <math.h> int main (void) { long long int tn;
scanf ("%lli", &tn); long double n = (sqrt(1+8*tn)-1)/2;
Для переменной n использовал тип long double, так как дальше 5 теста пройти не смог, а в комментариях к задаче другие программисты написали, что тесты не проходит в том числе если тип этой переменной будет не long double. Короче, сделал сам точно не знаю, что и программа всё равно в тестах далеко не ушла.
В консоли работает нормально, если вводить в неё более-менее нормальные данные. Такие "числа" как 1.5, 21/5, 41,5, 23a программа принимает как валидные и первые цифры таких чисел (1, 21, 41, 23) определяет для себя как введенное число, которое нужно проверить на "треугольность" и вычислить его номер.
Погуглил на тему проверки валидности вводимых данных, но все решения были или на непонятном мне C++ или представляли собой тупой посимвольный перебор по алфавиту.
В общем, не хватило мне знаний для того, чтобы решить поставленную задачу так, чтобы она прошла все тесты.
В связи с этим немного удивляет содержание той части курса "углублённого" программирования на C, которая предшествовала задаче (массивы, указатели и организация работы с памятью).
Ситуация очень напоминает оставленную кем-то в комментариях к задаче шутку:
"Обожаю наши методички по лабам C++!
Это винтик, это отвертка, винтик можно крутить отверткой. Это всякие железяки, их можно соединять винтиками, закрутив отверткой. Еще бывают гайки и шестеренки.
Задание: Постройте синхрофазотрон".
Ну, что ж, изучать мне ещё "методички" и изучать.))
Развлекусь пока созерцанием скриншота своего рабочего стола:
Последние выходные традиционно прошли в стиле "интенсив". ))
Спорт, учёба, вывоз с дачи тёщи с сельхозпродукцией, учёба, спорт, учёба.
Прошёл первый блок уроков углублённого программирования на C и остановился на первом же тестовом задании. С теорией "продвинутого" курса было всё более-менее понятно: новое знание не опиралось на какие-то положения, которые не были ещё мной изучены на "медленном" курсе программирования на языке C. А вот, тестовая задача предполагала как раз наличие таких знаний (циклы, ветвления). Поэтому пришлось приостановить изучение "продвинутого" курса и в ускоренном режиме продолжить изучение "медленного" курса.
В субботу "терзал" массивы и указатели. В воскресенье изучал циклы и ветвления.
Мне кажется, что, единственным достоинством "медленного" курса по программированию на языке C является низкий "порог вхождения" - подробно объясняется, как и с чего начать. Возможно, после того, как этот "порог" был пройден, мне нужно было переходить на "быстрый" курс. Уже, глядишь и прошёл бы все необходимые операторы.
Ну, ничего. От "медленного" курса осталось всего два урока и начну проходить "быстрые" курсы с более академическим подходом в преподавании. Начну сначала. Заодно, повторю уже пройденное на "медленных" курсах. ))
Сегодня попробую написать тестовую программу из продвинутого курса. Посмотрим, что у меня получится, и, сколько это займёт времени.))
Сильно торопиться не буду, так как, в любом случае, продвинутый курс начался 23 августа, а я к нему присоединился только 23 сентября. Хотя, мой азарт может победить здравый смысл и заставить вступить в "соревнование" с самим собой. ))
На английском всё идет ровно. Изучили местоимения. Этот курс пока что не отнимает у меня много умственных сил, так как в ответ на получаемые на каждом уроке знания у меня в памяти "всплывает" воспоминание о том, что я это уже изучал когда-то раньше. А вспоминать мне всегда было гораздо легче, чем изучать с нуля.
В первом томе книги А.В. Столярова "Программирование: введение в профессию" я уже где-то в районе 280 - 300 страницы. В этом месте в книге автор рассказывает про язык программирования Паскаль, приводит примеры решения на нём некоторых задач. Синтаксис этого языка я не стараюсь запомнить наизусть. Мне достаточно простого понимания того, что делает написанная на нём программа. До Паскаля автор кратко прошёлся по основным командам bash и клавиатурным сочетаниям текстовых редакторов vim и nano.
Ещё раз повторюсь, книга очень интересная и информативная и, в отличие от книги Дж.Сомнеза "Путь программиста", полностью соответствует своему названию.
По итогам результатов своих экспериментов с Window Managers, я решил пока что оставить себе Openbox. В нём достаточно много работы для клавиатуры и есть возможность в случае чего "пощёлкать" мышкой. Теперь мой рабочий стол выглядит пустой экран с курсором - ни обоев, ни иконок, ни панелек, ни виджетов. Осталось только настроить запуск терминала одной кнопкой. Займусь этим после того, как напишу тестовую программу для продвинутых курсов по C.
В качестве менеджера файлов поставил gnome commander. В нём также можно работать с клавиатуры или мышкой. Понравилось, что в gnome commander для файлов можно открывать контекстное меню ("открыть с помощью" и другие подобные функции) и переименовывать файлы привычным нажатием клавиши "F2".
Вчера решил залезть на страничку автора курса по программированию на C. Нашёл там кучу ссылок на другие курсы. Некоторые из них мне очень понравились. Хочу изучить все. Собственно, вопрос: где взять ещё времени для учёбы? Думаю, человек, который изобретёт способ сознательно учиться во сне, станет очень богатым. Хотя, богатство его будет основано, скорее, не на связанной с таким способом технологией обучения, а на развлекательных технологиях.
Где-то читал, что человек предпочтёт развлечения учёбе, так как первые приносят ему больше удовольствия, чем второе. Развлечения оказывают воздействие на центры удовольствия, а учеба - на аналитические центры. Из-за этого мозг воспринимает развлечение как удовольствие и отдых, а учёбу - как работу, напряжение и лишний расход энергии. Есть расхожее мнение, что основным движителем прогресса была лень. Возможно, что именно из-за присущей большинству людей такой лени, учеба даётся им гораздо тяжелее развлечений.
Из этой ситуации уже давно ищут выход. Кому-то самостоятельно удаётся приучить свой мозг к мысли о том, что учёба приносит удовольствие. Кого-то приучают к этому с детства.
В настоящее время есть много проектов, в которых пытаются игровыми способами стимулировать человека к обучению.
Так, например, в Китае используют повальную увлеченность китайцев караоке при обучении их русскому языку:
Софтверные компании выпускают игры, направленные на обучение математике, биологии, химии и др. наукам.
Лично я думаю, что игровые методы обучения - это "костыли". В игре человек сосредотачивается не на новом знании, а на процессе получения удовольствия от игры и усваивает не столько нужное новое знание, сколько знание о том, каким способом в процессе этой игры можно получить больше удовольствия.
Наибольшая эффективность обучения может быть достигнута только в том случае, если не только процесс усвоения знания, но и само новое знание будут приносить мозгу удовольствие или иную выгоду.
Многие мои знакомые воспринимают учёбу как какую-то каторгу:
А мое решение о переквалификации - как несмешную шутку или какой-то сугубо мазохистский поступок. Уверен, что некоторые даже крутят пальцем у виска, когда я не вижу. ))
Но всё это "лирика". Учёба у меня идёт по плану. Вчера на уроке по C по верхушкам прошли массивы. Осталось 4 лекции и нужно поскорее переходить на более академический курс.
Параллельно с этим планирую начать "углублённые" курсы по C.
На английском всё ещё изучаем грамматику.
Попробовал оконный менеджер awesome. Интересная и быстрая штука. Только непривычны клавиатурные сочетания (все завязаны на кнопку "Super" или "Windows") и не нравится, что нельзя просто взять и изменить размер окна мышкой. )) Думаю, это просто дело привычки.
Сегодня планирую попробовать dwm и ещё парочку других.
Ведущая на курсах английского языка заметно ускорила скорость своей речи (особенно ближе к концу урока). Теперь приходится поднапрячься, чтобы успеть произнести какую-нибудь фразу до неё.
Немного настораживает способ обучения английскому. В первые со школы вижу такую методику, когда сначала изучаем алфавит, затем - звуки, после - правила построения предложений и формирования глаголов и существительных, а сами слова не учим и фразы из них самостоятельно не строим. Обычно всегда стараются параллельно учить слова и правила их складывания в предложения.
Ладно, посмотрим, что будет дальше. Может быть буду учить слова отдельно.
По языку C вчера прошли одну лекцию по массивам. Сегодня будет ещё одна. Автор стал снимать свои уроки в ОС Ubuntu. Подсмотрел у него в консоли разноцветные названия имени пользователя и хоста в терминале. Мне показалось очень удобным, когда служебная "статическая" информация отделена цветом от вводимой в терминал и выводимой в терминале "динамической" информации (мои команды, вывод программ и т.п.). Немного погуглил и сделал себе так же. Теперь у меня в терминале тоже всё красиво и удобно. Примерно вот так:
Попробовал несколько Window Manager-ов Linux: IceWm, fwm, fluxbox, WindowMaker. Не понравилось в них то, что нужно потратить много времени на настройку под себя (чтобы всё нужное было под рукой и не было ничего лишнего). Плюс, в некоторых WM есть такие неприятные "мелочи", как неработающее переключение раскладок клавиатуры, некорректная работа окон в некоторых программах (отсутствие прокрутки) и т.п.
Что понравилось в лёгких WM: скорость работы - почти мгновенный отклик на любое действие.
Решил, что пока у меня нет лишнего времени, чтобы тратить его на тщательную настройку WM, попробую ещё пару WM и если ничего не подберу подходящего, то вернусь на Unity.
Да, и ещё хочу попробовать пару фреймовых оконных менеджеров. Уж очень они хардкорно выглядят.))
Вчера пропустил урок по английскому языку. Беда, печаль. Но мы это исправим на выходных.
На уроке по языку C прошли указатели. Автор курса 2,5 часа путано, сбивчиво, обрывая одну мысль и переходя на другую, многократно повторяя то, о чём уже сказал не один раз, рассказывал то, что можно было бы донести до нас максимум за 30 минут. Урок автор закончил примерно такими словами: "Что такое указатели мы с вами разобрались. А для чего они нужны, мы будем разбираться позднее".
Тема следующего урока - массивы... В темах последующих уроков также ничего про указатели не сказано. Получается, что когда через много-много уроков мы опять вернёмся к указателям, автор выдаст нам новую версию своей путанной и сбивчивой лекции на 2,5 часа? ))
Но я не сильно переживаю по этому поводу. Есть ещё "быстрый" курс по языку C, в котором указателям посвящена отдельная лекция, и замечательная книжка по программированию, в которой автор также пообещал посвятить много времени указателям. Так что никуда указатели не денутся. ))
В книге по программированию прочитал, что для того, чтобы стать программистом, нужно обязательно придумать себе какое-нибудь тех-задание на разработку ПО и выполнить его.
Ну, что ж. Я придумал себе целых три:
1) Программа, которая будет уведомлять меня о появлении изменений (новых публикаций) на сайтах (отдельных страницах этих сайтов), у которых нет рассылки новостей. Допускаю, что такая программа (и не одна) уже есть, но мне нужен свой "велосипед".
2) Программа, которая будет на сканированные изображения документов наносить отметку о том, что копия документа является заверенной (с текущей датой, должностью, Ф.И.О. и подписью). Попробую изобрести свой Water Mark.
3) Программа для видео-наблюдения, включающая запись изображения только при изменении картинки, получаемой от камеры.
Посмотрим, что смогу из этого в будущем осилить. В процессе учебы займусь сбором необходимой информации и постепенными набросками будущих программ. Возможно, что по мере усвоения новой информации у меня появятся другие идеи на счёт моей первой серьёзной программы.
А ещё сегодня по дороге на работу чуть не наступил на живого богомола. Раньше я их в живую никогда не видел и думал, что они у нас не водятся. Вот так: век живи - век под ноги смотри. ))
Сегодня, как и до этого, всё у меня идёт по плану. Правда, работа вносит в него свои коррективы - вместо двух уроков по каждому предмету, как хотелось бы, успеваю изучить только по одному уроку. Ну, так никто и не обещал, что будет легко. Поэтому всё - по плану. ))
Изучаю местный рынок труда на наличие вакансий для программистов. Их довольно много. Так что по завершении переквалификации без работы точно не останусь.
Пару недель назад прочитал статью Прокопова Никиты "Голые короли IT" и стал лучше понимать, что за "разброд и шатания" творятся в IT.
До этого просто недоумевал, почему на рынке труда так много вакансий для специалистов в тех областях и технологиях IT, которые, судя по категоричным высказываниям блогеров и подкастеров, устарели, громоздки, неудобны и вообще давно "умерли". Оказывается, всё просто: на технологии и специализированное ПО тоже есть мода. ))
Осознав это, вздохнул свободнее: можно больше не метаться в поисках самой востребованной технологии, чтобы уж наверняка найти работу по будущей специальности, а просто изучать программирование.
Удалил из своего плей-листа пару подкастов, в которых люди занимались самолюбованием и самовосхвалением.
Приобрёл несколько рекомендованных сообществом IT книг. Жаль, что нельзя читать во сне. Ведь так много нового хочется узнать. Ничего. Вода камень точит. Буду читать каждый день минимум по часу и рано или поздно все книжки будут прочитаны. ))