С самоучитель. Уроки по с ravesli com 2 предисловие
Скачать 2.56 Mb.
|
САМОУЧИТЕЛЬ УРОКИ ПО С++ ravesli.com 2 ПРЕДИСЛОВИЕ Есть два основных подхода в изучении программирования. В этой статье мы рассмотрим плюсы и минусы каждого из них и постараемся выбрать золотую середину, чтобы максимально эффективно и результативно использовать свой самый главный ресурс - время. Метод «Снизу-Вверх» Суть – изучение базиса и необходимого фундамента для дальнейшего продвижения. Подход «Снизу-Вверх» популярен не только во многих онлайн и офлайн курсах, но и в образовательных учреждениях (например, в университетах или колледжах). Вы начинаете с нуля и изучаете только одну концепцию или тему за раз. Идея состоит в том, чтобы получить прочный фундамент и основы программирования, которые в дальнейшем помогут вам развиваться в любом направлении программирования. Главным преимуществом является то, что вы действительно изучаете основы. Не имеет значения, делаете ли вы 3D-игру или интерактивный веб-сайт - фундаментальные основы применимы и используются везде. Учить каждую концепцию отдельно - легче, так как это происходит изолированно. Если выбранный вами курс с подходом «Снизу-Вверх» хорошо структурирован, то вы не будете подвергнуты бомбардировке 1000 разными терминами/концепциями за раз. Вам предоставляется каждая новая тема изолированно в «удобно-съедобном» виде. Сначала идут базовые вещи (например, что такое переменная, функция, программа и т.д.), а затем уже происходит плавный переход к более сложным темам (например, к классам, циклам, ООП и т.д.). ravesli.com 3 Минусом, если его вообще можно так назвать, является скорость продвижения. Хотя это всё также индивидуально. Сначала вы тратите время, чтобы получить необходимые знания и только потом применяете их на практике. А чтобы сделать что-либо значительное, вам потребуется многое узнать. Например, для реализации интерактивного веб-сайта вам могут понадобиться недели, если не месяцы обучения. А для создания более-менее хорошей 3D-игры вам понадобятся месяцы, если не годы. А когда период изучения затягивается, а счастья от мгновенного результата вы не получаете, то здесь и начинается конфликт ожиданий. Но суть в том, что большинству новичков гораздо интереснее создать веб-сайт за день, нежели неделю разбираться со всеми нюансами циклов или массивов. Это не плохо и не хорошо, это факт. Метод «Сверху-Вниз» Суть - создание рабочих проектов с самого старта обучения. Большинство программистов-самоучек начинали свой путь именно с этого подхода. Цель — создать готовый, рабочий проект. Например, 3D-игру или красивый интерактивный веб-сайт. Самый быстрый способ реализовать проект с нуля - следовать подробному туториалу. Повторяя в точности все шаги из выбранного вами гайда вы сможете в течение относительно небольшого срока создать готовый проект с нуля. Главным преимуществом является то, что вы сходу что-то делаете, вы не погружаетесь в изучение базы, не тратите время на то, чтобы ознакомиться и разобраться со всеми концепциями и их нюансами. Вы тупо делаете проект. И это чувство мгновенного результата от своих действий мотивирует вас на протяжении прохождения всех уроков. Но в этом и кроется главный недостаток - вы не учите основы. Базис, который вам необходим для дальнейшего роста вы просто-напросто пропускаете. ravesli.com 4 В конце туториала вы даже можете не понимать, как работает ваше творение. Если уроки недостаточно подробные, то у вас будут большие пробелы в знаниях, которые заполнить быстро уже не получиться. Вам всё равно придётся потратить якобы "сэкономленное" время на изучение основ. Если же вы попытаетесь отслониться от инструкций туториала хоть малейшим действием, то весь ваш проект может рухнуть в одну минуту, и вы даже не поймёте, почему так сталось и как это исправить. Вам просто нужно всё копировать и повторять. Даже не пытайтесь заглянуть под капот. Не смотрите в эту бездну :) Какой подход выбрать? Ни первый, ни второй. Чтобы стать опытным программистом, вам нужно совмещать оба этих подхода. Вам нужен опыт создания программ/приложений/продуктов, даже если вы не понимаете полностью все детали. Вам нужна мотивация, чтобы продолжать обучаться, и это чувство счастья от мгновенного результата может вам помочь. Изучение только концепций и теории недостаточно, чтобы подготовить вас к работе над реальными проектами. Но при этом вам необходимы знания основ. Вам нужно уметь понимать и отлаживать как собственный код, так и код, написанный другими разработчиками. Вы должны научиться писать код сами, без помощи кого- либо и без каких-либо подсказок. Привыкать к готовым решениям в Интернете - не очень хорошая практика, так как решений вы можете и не найти, а задачу решить придётся. Выход - чередовать эти 2 подхода. Чувствуете, что перегружены и не понимаете, что делает ваш код? Переключитесь на подход "Снизу-Вверх". Вернитесь к теории и ravesli.com 5 разберитесь с тем, что и как делает ваш код. Постарайтесь заполнить пробелы в своих знаниях. Надоедает изучение абстрактных концепций программирования? Переключитесь на подход "Сверху-Вниз". Создайте что-то маленькое, например, простенький сайт или игру. Постарайтесь применить на практике полученные знания и ощутите "счастье от мгновенного результата". Легко и просто не будет, но и не настолько сложно, чтобы это не осилить. Не беспокойтесь слишком много о том, что вы ещё чего-то не знаете - это дело времени. Но и не забывайте о том, что без действий ничего, абсолютно ничего не будет. А чтобы вам в этом помочь, а именно в изучении программирования, в частности С++, был создан курс по C++. В этом курсе как раз и совмещаются эти 2 подхода. Все темы раскрываются поочерёдно и изложены в "удобно-съедобном" виде. Вся теория сразу же иллюстрируется в примерах и в конце уроков (не каждого!) есть тесты: задания, которые вам нужно решить, применив полученные знания из урока на практике. Также в конце каждой главы есть итоговый тест - то самое чувство мгновенного результата и самостоятельной практики. Поэтому пробуйте то, что подходит вам, совмещайте разные подходы и не забывайте о самом главном - получать удовольствие от процесса. ravesli.com 6 Урок №1. Введение в программирование Компьютеры понимают только очень ограниченный набор инструкций, и чтобы заставить их что-то делать, нужно четко сформулировать задание, используя эти же инструкции. Программа (также «приложение» или «программное обеспечение», «софт») - это набор инструкций, которые указывают компьютеру, что ему нужно делать. Физическая часть компьютера, которая выполняет эти инструкции, называется «железом» или аппаратной частью (например: процессор, материнская плата и т.д.). Машинный язык Процессор компьютера не способен понимать напрямую языки программирования, такие как C++, Java, Python и т.д. Очень ограниченный набор инструкций, которые изначально понимает процессор, называется машинным кодом (или ещё «машинным языком»). То, как эти инструкции организованы, выходит за рамки этого введения, но стоит отметить две вещи. Во-первых, каждая команда (инструкция) состоит только из двух цифр: 0 или 1. Эти числа называются битами (сокращенно от англ. «binary digit») или двоичным кодом. Например, одна команда машинного кода архитектуры x86 выглядит следующим образом: 10110000 01100001 Во-вторых, каждый набор битов переводится процессором в инструкции для выполнения определенного задания (например: сравнить два числа или переместить число в определенную ячейку памяти). Разные типы процессоров обычно имеют разные наборы инструкций, поэтому инструкции, которые будут работать на процессорах Intel вполне ravesli.com 7 вероятно, что не будут работать на процессорах Xenon, которые используются в игровых приставках Xbox. Раньше, когда компьютеры только начинали массово распостраняться, программисты должны были писать программы непосредственно на машинном языке, что было очень неудобно, трудно и занимало намного больше времени, нежели сейчас. Язык ассемблера Так как программировать на машинном языке - удовольствие специфическое, то программисты изобрели язык ассемблера. В этом языке каждая команда идентифицируется коротким именем (а не набором единиц с нулями), и переменными можно управлять через их имена. Таким образом, писать/читать код стало гораздо легче. Тем не менее, процессор всё равно не понимает язык ассемблера напрямую. Его также нужно переводить, с помощью ассемблера, в машинный код. Ассемблер – это транслятор (переводчик), который переводит код, написанный на языке ассемблера, в машинный язык. В Интернете этот язык называют просто - "Ассемблер". Преимуществом Ассемблера является производительность (точнее скорость выполнения) и он до сих пор используется, когда это имеет решающее значение. Тем не менее, причина подобного преимущества заключается в том, что программирование на этом языке адаптируется к конкретному процессору. Программы адаптированы под один процессор не будут работать с другим. Кроме того, чтобы программировать на Ассемблере, по-прежнему нужно знать очень много не очень читабельных инструкций для выполнения даже простого задания. Например, вот та же команда, что выше, но на языке ассемблера: mov al, 061h ravesli.com 8 Высокоуровневые языки программирования Для решения проблем читабельности кода и чрезмерной сложности были разработаны высокоуровневые языки программирования. C, C++, Pascal, Java, JavaScript и Perl - это всё языки высокого уровня. Они позволяют писать и выполнять программы, не переживая о совместимости кода с разными архитектурами процессоров. Программы, написанные на языках высокого уровня, также должны быть переведены в машинный код перед выполнением. Есть два варианта: компиляция, которая выполняется компилятором; интерпретация, которая выполняется интерпретатором. Компилятор – это программа, которая читает код и создаёт автономную (способную работать независимо от другого аппаратного или программного обеспечения) исполняемую программу, которую процессор понимает напрямую. При запуске программы весь код компилируется целиком, а затем создаётся исполняемый файл и уже при повторном запуске программы компиляция не выполняется. Если по-простому, то процесс компиляции выглядит следующим образом: Интерпретатор - это программа, которая напрямую выполняет код, без его предыдущей компиляции в исполняемый файл. Интерпретаторы более гибкие, но менее эффективны, так как процесс интерпретации выполняется повторно при каждом запуске программы. ravesli.com 9 Процесс интерпретации: Любой язык может быть компилируемым или интерпретируемым, однако, такие языки, как C, C++ и Pascal - компилируются, в то время как "скриптовые" языки, такие, как Perl и JavaScript - интерпретируются. Некоторые языки программирования (например, Java) могут как компилироваться, так и интерпретироваться. Преимущества высокоуровневых языков программирования 1. Легче писать/читать код. Вот та же команда, что выше, но на языке C++: а = 97; 2. Требуется меньше инструкций для выполнения определенного задания. В C++ вы можете сделать что-то вроде этого: а = Ь * 2 + 5; в одной строке. В языке ассемблера вам пришлось бы использовать 5 или 6 инструкций. 3. Вы не должны заботиться о таких деталях, как загрузка переменных в регистры процессора. Компилятор или интерпретатор берет это на себя. 4. Высокоуровневые языки программирования портативнее под различные архитектуры (но есть один нюанс). ravesli.com 10 Нюанс заключается в том, что многие платформы, такие как Microsoft Windows, имеют свои собственные специфические функции, с помощью которых писать код намного легче. Но тогда придется пожертвовать портативностью, так как функции, специфические для одной платформы, вполне вероятно, что могут не работать на другой платформе. Обо всём этом мы детальнее поговорим в следующих уроках. ravesli.com 11 Урок №2. Введение в языки программирования С и С++ Перед C++ был C. C (произносится как "Си") был разработан в 1972 году Деннисом Ритчи в Bell Telephone Laboratories как системный язык программирования. Т. е. язык для написания операционных систем. Основным заданием Ритчи было создание легко компилируемого минималистического языка, который предоставлял бы эффективный доступ к памяти, относительно быстро выполнялся, и на котором можно было бы писать эффективный код. Таким образом, создавая высокоуровневый язык, был разработан С, который во многом относился к языкам низкого уровня, оставаясь при этом независимым от платформ, под которые бы писался код. C в конечном итоге стал настолько эффективным и гибким, что в 1973 году Ритчи и Кен Томпсон переписали больше половины операционной системы UNIX, используя этот язык. Многие предыдущие операционные системы были написаны на языке ассемблера. В отличие от Ассемблера, программы на котором пишутся под конкретные процессоры, отличная портативность языка C позволила перекомпилировать UNIX и на другие типы компьютеров, ускоряя его популяризацию. Язык C и операционная система UNIX тесно связаны между собой, и популярность первого отчасти связана с успехом второго. В 1978 году Брайан Керниган и Деннис Ритчи опубликовали книгу под названием "Язык программирования Cи". Эта книга, более известна как "K&R" (первые буквы фамилий авторов), стала стандартом и своеобразной инструкциею к С. Когда требовалась максимальная портативность, то программисты придерживались рекомендаций в K&R, поскольку большинство компиляторов в то время были реализованы в соответствие стандартам, описанным в этой же книге. ravesli.com 12 В 1983 году Американский национальный институт стандартов ("American National Standards Institute" - ANSI ) сформировал комитет для установления официального стандарта для языка C. В 1989 году они закончили и выпустили стандарт C89, более широко известен как ANSI C. В 1990 Международная организация по стандартизации ("International Organization for Standardization" - ISO ) приняла ANSI C (с небольшими изменениями). Эта версия C стала известна как C90. В конечном счете, компиляторы адаптировались под требования ANSI C/C90 и программы, в которых требовалась максимальная портативность, писались в соответствие с этими стандартами. В 1999 году комитет ANSI выпустил новую версию языка C, которая получила название C99. Она приняла много особенностей, которые уже были реализованные в компиляторах (в виде разных расширений) или в C++. C++ C++ (произносится как «Си плюс плюс») был разработан Бьёрном Страуструпом в Bell Labs в качестве дополнения к C в 1979 г. Он добавил множество новых фич в язык С. Его популярность была вызвана объектно-ориентированностью языка. Насчет объектно-ориентированного программирования (ООП) и его отличий от традиционных методов программирования мы поговорим несколько позже. C++ был ратифицированным (одобренным) комитетом ISO в 1998 году и потом снова в 2003 году (под названием C++03). Потом были еще три обновления (C++11, C++14 и C++17, ратифицированные в 2011, 2014 и 2017 годах соответственно), которые добавили больше функциональных возможностей. ravesli.com 13 Философия С и С++ Смысл философии языков С и C++ можно определить выражением "доверять программисту". Например, компилятор не будет вам мешать сделать что-то новое, что имеет смысл, но также не будет мешать вам сделать что-то такое, что может привести к сбою. Это одна из главных причин, почему так важно знать то, что вы не должны делать в C/C++ как и то, что вы должны делать. Примечание: Вам не нужны знания языка С, чтобы проходить данные уроки. В процессе изучения этих уроков вы получите необходимую базу и фундамент знаний. ravesli.com 14 Урок №3. Введение в разработку программных продуктов Перед написанием и выполнением нашей первой программы, мы должны понять, как вообще разрабатываются программы на языке C++. Схема разработки ПО (программного обеспечения): Шаг №1: Определите проблему, которую хотели бы решить Это шаг «Что?». Здесь вы должны понять, что же вы хотите, чтобы ваша программа делала. Этот шаг может быть, как самым простым, так и самым сложным. Всё, что вам нужно - чётко сформулировать идею. Только после этого вы сможете приступать к следующему шагу. ravesli.com 15 Вот несколько примеров выполнения шага №1: "Я хочу написать программу, которая вычисляла бы среднее арифметическое чисел, которые я введу". "Я хочу написать программу, в которой будет 2D лабиринт, по которому сможет передвигаться пользователь". "Я хочу написать программу, которая будет анализировать цены акций на бирже и давать предсказания по поводу скачков вверх или вниз". Шаг №2: Определитесь, как вы собираетесь решить эту проблему Здесь мы уже отвечаем на вопрос «Как?». Каким образом можно решить проблему с шага №1? Этим шагом довольно часто пренебрегают при разработке программного обеспечения. Суть в том, что способов решения задачи может быть много, только часть из них - хорошие решения, а часть - плохие. Вы должны научиться отделять первые от вторых. Очень часто можно наблюдать ситуацию, когда у программиста возникает идея и он сразу же садится программировать. Как вы уже могли бы догадаться – такой сценарий далеко не всегда приводит к эффективным результатам. Как правило, хорошие решения имеют следующие характеристики: простота; хорошая документация (с инструкциями и комментариями); модульный принцип: любая часть программы может быть повторно использована или изменена позже, не затрагивая другие части кода; надёжность: соответствующая обработка ошибок и экстренных ситуаций. Когда вы садитесь и начинаете сразу программировать, вы думаете: "Я хочу сделать это, вот это и ещё вот это!". Таким образом вы принимаете решения, которые позволят вам поскорее выполнить ravesli.com 16 задание. Однако это может привести к тому, что вы получите программу, которую позже будет трудно изменить/модифицировать, добавить что-то новое или вам попросту придется разбираться с большим количеством багов. Исследования показали, что программист тратит примерно 20% времени на написание программы и 80% на отладку (исправления ошибок) или поддержку (добавление новых функциональных возможностей) кода. Следовательно, лучше потратить дополнительное время на обдумывание лучшего способа решения проблемы перед процессом написания кода, нежели потом тратить оставшиеся 80% времени на поиск и исправление ошибок. |