Курс лекций по программированию. Гарвардский курс по основам программирования CS50 теперь на русском

По основам программирования

Учебно-методическое пособие

для студентов высших учебных заведений, обучающихся

по направлениям экономика, менеджмент

Нижний Новгород


Малыженков В.И. Информатика и вычислительная техника. Курс лекций по основам программирования: Учебно-методическое пособие – Нижний Новгород: Изд-во Нижегородского госуниверситета, 2011. – 52 с.

В пособии рассматриваются методы и приемы решения задач с использованием персонального компьютера, дается описание двух языков программирования – Бейсика и Паскаля.

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

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

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

Рецензент: доцент, к.т.н. Громницкий Владимир Семенович

© Малыженков В.И., 2011

© Нижегородский государственный

университет им. Н.И. Лобачевского, 2011

Введение………………………………………………………………….………..4

Глава1. Основы компьютерной грамотности………………...…………………5

1. Что такое компьютер?.................................................................................5

2. Базовая конфигурация ПК………………………………………………..5

3. Операционные системы (ОС)………………………………………….…7

4. Файловая система MS DOS и WINDOWS……………………………….8

5. Структура файловых систем………………………………….…………10

Глава 2. Обработка данных в среде алгоритмических языков……………..…11

1. Парадигмы программирования………...………………………………11

2. Этапы решения задач на компьютере…………………………………..11

3. Общее описание языков программирования (Basic, Pascal)…………..16

3.1 Алфавит………………………………………………………….…16

3.2 Описание данных………………………………………………….17

3.2.1. Типы данных…………….……………………………….17

3.2.2 Константы…………………………………………………17

3.2.3 Переменные…………………………………………...…..19

3.2.4 Функции…………………..……………………………….20

3.3 Выражения…………………………………………………………21

3.3.1. Арифметические выражения……………………………21

3.3.2.Логические выражения…………….……………………..22

3.3.3 Строковые выражения………………………..…………..23

3.4.Основные исполняемые операторы языков……………………...23

3.4.1 Оператор присваивания………………………………….24

3.4.2 Условный оператор………………………………………24

3.4.3 Оператор выбора по ключу…………………..………….25

3.4.4 Операторы цикла………………...……………………..27

3.4.5 Оператор безусловного перехода…………...……….30

3.4.6 Операторы ввода – вывода……………………………30

3.5.Структура программного модуля……………………………...…31

4. Пример решения задач с модульным подходом……………………….32

5. Сложные типы данных………………...………………………………..35

6. Обработка файлов данных…………………………………..………….38

6.1. Общие понятия……………………..……………………………..38

6.2. Основные операции по обработке файлов………..…………….39

6.3 Операторы (процедуры) обработки файлов в Basic и Pascal…...40

7. Принципы структурного программирования…………..……………..44

8. Описание простейших модулей………………………………………..46

9. Пример составления программы в соответствии с принципами структурного программирования………………………………………47

Литература……………………………………………………………………...51

Введение

Термин «информатика» впервые появился во Франции в начале 70-х годов и произошел от сочетания двух слов: information (информация, разъяснение) и automatique (автоматика, автоматический). Так образовалось французское слово informatique . В русском языке вместо вольного перевода этого термина как «информационная автоматика» утвердилось понятие «информация и средства её автоматической обработки». В США укоренился другое словосочетание - с omputer science – наука о компьютерах.

В нашем курсе мы будем представлять информатику как составляющую следующих компонент:


Настоящий курс лекций посвящен изучению части программного обеспечения персональных компьютеров, называемой как средства программирования на языках Бейсик и Паскаль.

Глава1. Основы компьютерной грамотности.

1. Что такое компьютер?

Термин «компьютер» образован от английского слова compute – вычислять. Так же переводится и английское слово calculate , однако под compute обычно понимается выполнение более сложных операций, в том числе и логических. Так появилось два типа счетно-решающих устройств: компьютеры и калькуляторы.

С точки зрения пользователя компьютер – это комплекс технических средств, предназначенных для автоматической обработки информации в процессе решения вычислительных и информационных задач (обработка, хранение, передача информации).

С технической точки зрения компьютер – это любое устройство или система, способная выполнить заданную четко определенную последовательность операций (программу). Как техническое устройство компьютер в настоящее время получил самое широкое распространение и используется практически в любой сфере человеческой деятельности - от бытовой техники до астрофизических расчетов. В связи с этим классификация компьютеров очень широка - от микро- до суперкомпьютеров.

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

2. Базовая конфигурация ПК.

К основным устройствам персонального компьютера относятся:

1) системный блок;

2) монитор;

3) клавиатура;

4) “мышь”.

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

Кроме того в системном блоке находятся:

HDD, НЖМД – hard disk drive, накопитель на жестких магнитных дисках (жесткий диск, винчестер) - устройство хранения информации. Информация с HDD пересылается в оперативную память для обработки или на внешние устройства. Отличается от оперативной памяти существенно большими объемами хранимой информации, но меньшей скоростью доступа к ней. На винчестере храниться важнейшая часть программного обеспечения любого компьютера - операционная система;

FDD, НГМД – floppy disk drive – дискета, предназначенная для переноса информации с одного на другой компьютер;

CD ROM – compact disk read only memory (память только читается);

DVD –R, RW – design video drive, диски для чтения или чтения-записи. Отличаются от CD , большим обьемом хранимой информации;

Видео – и сетевые карты;

Порты и разъемы для присоединения к компьютеру различных внешних устройств (флэшки, карты памяти и др.)

Монитор.

Монитор – это устройство для просмотра вводимой и выводимой информации, диалоговое устройство.

Мониторы бывают разных типов: с ЭЛТ – электронно-лучевая трубка; ЖК – жидкокристаллические, плазменные. В настоящее время в основном используются ЖК-монитры. Мониторы обладают определенными характеристиками:

1. размер диагонали экрана (типовые 14"-21", всего от 9" до 42" (23-106см);

2. частота обновления и регенерации от 75-до 110Гц. Ниже - мигание, выше – размывание и удвоение изображение;

3. разрешение – количество пикселей на миллиметр(мин:640х480, - 1024х768 - мах:1280х1024); размер пикселя в среднем 0.18-0.25 мм, не выше 0,28;

4. ТСО-92-95-99 – Total Cost Oqupation - это классы защиты потребителя от электромагнитного излучения экрана монитора.

Клавиатура.

Клавиатура является устройством ввода информации. С помощью клавиатуры можно вводить тексты, текстовые команды и некоторые специальные команды (Esc,Ctrl и другие).

(Основы языка С++, I семестр)

Введение

В первом семестре рассматриваются основные конструкции языка Си и базовая технология программирования (структурное программирование).

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

    1. Алгоритм и программа

Алгоритм – точное предписание, определяющий вычислительный процесс, идущий от изменяемых начальных данных к конечному результату, т. е. это рецепт достижения какой-либо цели.

алгоритм

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

Сначала всегда разрабатывается алгоритм действий, а потом он записывается на одном из языков программирования. Текст программы обрабатывается специальными служебными программами – трансляторами. Языки программирования – это искусственные языки. От естественных языков они отличаются ограниченным числом «слов» и очень строгими правилами записи команд (операторов). Совокупность этих требований образует синтаксис языка программирования, а смысл каждой конструкции – его семантику.

    1. Свойства алгоритма

    Массовость: алгоритм должен применяться не к одной задаче, а к целому классу подобных задач (алгоритм для решения квадратного уравнения должен решать не одно уравнение, а все квадратные уравнения).

    Результативность: алгоритм должен приводить к получению результата за конкретное число шагов (при делении 1 на 3 получается периодическая дробь 0,3333(3), для достижения конечного результата надо оговорить точность получения этой дроби, например, до 4 знака после запятой).

    Определенность (детерминированность) – каждое действие алгоритма должно быть понятно его исполнителю (инструкция к бытовому прибору на японском языке для человека не владеющего японским языком не является алгоритмом, т.к не обладает свойством детерминированности).

    Дискретность – процесс должен быть описан с помощью неделимых операций, выполняемых на каждом шаге (т. е. шаги нельзя разделить на более мелкие шаги).

Алгоритмы можно представить в следующих формах:

    словесное описание алгоритма.

    графическое описание алгоритма.

    с помощью алгоритмического языка программирования

1.2. Компиляторы и интерпретаторы

С помощью языка программирования создается текст, описывающий ранее составленный алгоритм. Чтобы получить работающую программу, надо этот текст перевести в последовательность команд процессора, что выполняется при помощи специальных программ, которые называются трансляторами. Трансляторы бывают двух видов: компиляторы и интерпретаторы. Компилятор транслирует текст исходного модуля в машинный код, который называется объектным модулем за один непрерывный процесс. При этом сначала он просматривает исходный текст программы в поисках синтаксических ошибок. Интерпретатор выполняет исходный модуль программы в режиме оператор за оператором, по ходу работы, переводя каждый оператор на машинный язык.

22 июня 2016 в 10:42

Гарвардский курс по основам программирования CS50 теперь на русском

  • Блог компании JavaRush ,
  • Учебный процесс в IT

Предыстория: кто мы и как дошли до жизни такой

Мы - команда проекта JavaRush . А JavaRush, кто еще не в курсе, - это полностью автоматизированный обучающий онлайн-курс по Java. Когда-то давно, именно благодаря и , JavaRush и появился. В то время мы собирались переучить на программистов миллион человек.

Очень амбициозно, не так ли? Но, как говорится, «проект, который можно сделать за две недели, мы делали три месяца. Потому что ничего нельзя сделать за две недели».

В нашу миссию - переучить на Java-программистов миллион - мы по-прежнему верим, но также решили поставить себе тактическую цель поскромнее: сделать офигенный онлайн-курс по Java. Считаю, нам это удалось. Мы продолжаем успешно пилить и допиливать наш JavaRush, обросли успешными «выпускниками»… Но сейчас немного о другом.

К сути

Однажды человек из нашей команды случайно наткнулся на видеозаписи лекций Гарвардского курса CS50 («Основы программирования и компьютерных наук»). Вообще-то я известен тем, что очень жестко критикую вузы за их скучные, неинтересные лекции, которые устарели лет на 10 уже в тот самый момент, когда студенты слышат их в первый раз.

Но нет правил без исключений. Гарвардский CS50 - это такой университетский курс, перед которым я снимаю шляпу. Хочу, чтобы все наши студенты и преподаватели посмотрели его. Именно так должен выглядеть современный университетский курс: ярко, познавательно, вдохновляюще.

Курс просто шикарен, хотя опытные программисты не найдут там много полезной информации для себя: он рассчитан на новичков. Но им - новичкам - рекомендую обязательно изучить CS50.

Курс настолько крут, что Йельский университет отказался от собственного введения в программирование в пользу CS50. Более того, уже несколько лет CS50 могут проходить не только студенты Гарварда, но и все желающие, на сайте edX , причем, абсолютно бесплатно. Единственное «но»: курс на английском…

Короче говоря, CS50 нас настолько впечатлил, что мы решили перевести его на русский, хотя там нет ни слова о Java. Мы нашли классных ребят - студию переводов Vert Dider - и совместно принялись за адаптацию лекций.

А теперь подробнее о CS50

На кого рассчитан

Если вы - новичок, пройдите CS50. Если кто-то из ваших знакомых приглядывается к ИТ и программированию, советуйте CS50 не глядя. Я серьезно.

CS50 подойдет любому человеку, кто решил стать «айтишником». Пожалуй, его можно рекомендовать и способным 12-летним, и умудренным опытом «перебежчикам» из других профессий. Идеально - старшеклассникам и студентам.

Курс очень прогрессивный и обновляется из года в год. При этом в отличие от большинства подобных университетских обучающих программ (например, MIT 6.00X) от слушателя не требуются знания университетской математики, достаточно школьного уровня.

Кто ведет

Профессор компьютерных наук Дэвид Малан . Возможно, когда вы его увидите, у вас произойдет разрыв шаблона «профессор университета»: он чрезвычайно энергичен и подача информации у него ну очень живая. Думаю, успех курса - во многом его заслуга. Также ему помогают многочисленные ассистенты. Некоторые из них - опытные ребята, некоторые - из числа тех, кто сам совсем недавно прошёл CS50.

Что изучают на CS50

  • Основы компьютерных наук и программирования. Системы счисления, работа с командной строкой в Linux, циклы, условные переходы и прочие радости.
  • Концепции алгоритмов и алгоритмичности мышления. Вы узнаете о том, какие задачи можно решать с помощью программирования и каким образом. О бинарном поиске, простом по сути, но очень эффективном и требующем тщательности в реализации, Дэвид Малан расскажет сходу, прямо на нулевой лекции. И попробуйте потом забыть сцену с разрывом телефонного справочника, а вместе с ней - и полученные знания! Вообще, курс охватывает все основные алгоритмы, которые нужно знать и понимать «айтишникам».
  • Концепции абстракции, структуры данных, инкапсуляции, управления памятью. Основы компьютерной безопасности. Процесс разработки ПО и веб-разработка.
  • Основы языка программирования C и визуального языка Scratch. Собственно, все основные примеры и задания студенты делают на языке C.
  • Основы баз данных и SQL.
  • Веб-разработка: основы CSS, HTML, JavaScript и PHP. Естественно, только самые азы.
  • Основы подготовки презентации проектов по программированию.
  • Курс CS50 появился в Гарварде в 80е годы прошлого столетия.
  • В 2014 году Йельский университет решил отказаться от собственного курса по основам компьютерных наук в пользу CS50. В осеннем семестре 2015 года Дэвид Малан на каждой неделе проводил одну лекцию в аудитории Гарварда, вторую - в аудитории Йельского университета.
  • Да, CS50 сразу же стал самым популярным курсом Йеля: в осеннем семестре 2015 года на него записалось 510 студентов, больше, чем на любой другой курс любой специальности.
  • В Гарварде в 2012 году CS50 был вторым по популярности с 691 зарегистрированным студентом, однако в этом же году курс стартовал на образовательной платформе edX, что расширило его аудиторию еще на 53 000 слушателей со всего мира.
  • Осенью 2014 года CS50 выбился в лидеры в родном Гарварде с 818 записавшимися студентами. Это 12% всех учащихся колледжа.
  • Однажды лекцию CS50 вёл экс-CEO Microsoft Стив Балмер . В своем неповторимом и запоминающемся стиле;).
  • В 2005 году Марк Цукерберг вел одну из лекций CS50 в качестве приглашенного гостя. Его пришло послушать… 15 человек.
  • Курс выбирают не только профильные студенты, но и те, кто хотят расширить кругозор, узнать что-то о компьютерах. Порой это кардинально меняет жизнь этих «непрофильных» студентов. Например, выпускница факультета истории и литературы Сьюзен Войчицки (Susan Wojcicki) прослушала CS50 на последнем курсе. А затем переехала в Кремниевую Долину. Сегодня она - исполнительный директор YouTube.

Где найти переведенные лекции

Страница, на которой будут размещены лекции курса на русском языке: javarush.ru/cs50.html . Они будут доступны совершенно бесплатно всем пользователям интернета. Перевод первой лекции 20 июня уже был опубликован на ресурсе. Следующую лекцию ждите 27 июня, и далее они будут появляться по мере их готовности.

Следите за обновлениями на страничках JavaRush в социальных сетях.

Введение.

Язык программирования – набор ключевых слов и система грамматических и синтаксических правил для конструирования операторов, состоящих из групп или строф знаков, с помощью которых человек сообщает компьютеру последовательность команд.

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

Классификация языков программирования:

    Неструктурный (преобразование машинных кодов на языке Assembler);

    Модульные (задачи→подзадачи →алгоритмы→функции);

    Логический подход;

    Объектно-ориентированный подход;

    Функциональный подход;

    Смешанный подход;

    Компонентно-ориентированный подход;

Транслятор – программа для перевода программы понятных человеку символов в программу машинных кодов.

Понятие формального алгоритма.

Формальный алгоритм – заранее заданная последовательность чётко определённых правил или команд для получения решения задач за конечное число шагов.

Рабочая лента – линейно-упорядоченный массив переменной длины. В каждой ячейке 1 символ.Переменная-указатель – управляющая головка, которая в любой момент времени указывает на какую-либо ячейку рабочей ленты.

Эффективность алгоритма – алгоритм или функция эффективно вычислима, если существует алгоритм правильно её вычисляющий и удовлетворяющий следующим требованиям:

    Состоит из конечного множества простых команд, для которых однозначно определён порядок исполнения;

    Вычисления должны закончиться и дать результат в конечное число шагов;

    Если аргумент принадлежит области определения, не должны приводить к результату: аргумент не принадлежит области определения.

Эффективным называется алгоритм, который допускает эффективную вычислительную реализацию.

20-е года ХХв. – машина Тьюринга (Гильберт, Черч (основа понятий рекурсивной функции), Клини, Пост, Тьюринг (описание алгоритмического процесса))

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

Абстрактная машина.

∆Фон Неймана (1945-ЭДВАК 3-хкомпонентная архитектура).

Такая ЭВМ выполняет программу, которая должна храниться в памяти, где хранятся и данные этой программы.

ЗУ и УВВ – прямой доступ в памяти.

Переменная – область в памяти.

Память – последовательность ячеек для хранения порции информации. Доступ к информации осуществляется в соответствии с адресом этой ячейки или в порядке очереди.

Классификация памяти:

    постоянная;

    оперативная = временная (v )

УУ – для считывания команд данных из памяти и общая координация команд.

АЛУ – для выполнения простейших арифметических и логических операций.

Основные этапы решения задач на ЭВМ.

    Осознание проблемы, формулировка задачи ;

    Формальная постановка задачи (формируется цель, описывается её содержание), что будет делать программа, не указывая как), анализируется характер, сущность всех величин, используемых в задаче, определяется условие, при которых она решается, результатом данного этапа является спецификация программы);

Спецификация программы точное описание того результата, который необходимо получить с помощью программы.

    Выбор или разработка метода решения задач (с учетом особенностей, метод должен привести задачу к конкретным машинным операциям);

    Разработка алгоритма решения задач (процесс обработки разбивается на отдельные относительно самостоятельные блоки);

    Разработка структур данных и архитектуры программы (начиная с проектирования архитектуры, общих структур данных);

    Перевод алгоритма на язык программирования (требуются языки высокого уровня с соответствующим транслятором в машинный код);

    Разработка системы теста, отладка и тестирование программы (поиск и устранение синтаксических и логических ошибок в программе). Синтаксический контроль выполняет транслятор, который выявляет конструкции и сочетания символов, недопустимые с точки зрения языка программирования. После устранения синтаксических ошибок проверяется логика работы в процессе её выполнения с конкретными исходными данными);

    Решение поставленной задачи и анализ результатов (выполняется многократное решение задач на ЭВМ для различных наборов исходных данных. Получаемый результат интерпретируется специалистом или пользователем, составившим задачу).

Этапы связаны друг с другом, но некоторые могут отсутствовать. Неудовлетворительный результат приводит к пересмотру одного или нескольких предшествующих этапов.

Критерии качества ПО.

    Функциональные возможности . (Описывает свойства ПО в части полноты удовлетворения требований пользователя. Оценка качества ПО должна начинаться с точного и формального установления предъявляемых требований и поверки соответствия ПО данным требованиям.)

    Надежность ПО – характеристика его способностей выполнять возложенные функции при поступлении запросов на их выполнение. В отличие от надежностиправильность ПО – соответствие предъявляемым требованиям, то есть различие в том, что правильность – некоторое статическое свойство, которым в соответствии со спецификацией должна обладать программа. Надежность – динамические требования к работоспособностям системы.

    Практичность:

    Простота использования;

    Модифицируемость (характер трудоемкости внесения изменений в программу при ошибках и др.)

    Сопровождаемость

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

    Мобильность - набор атрибутов, относящихся к соотношению между уровнем качества функций ПО и объемом используемых ресурсов при установленных условиях. Характеризуется 2 способами: с учетом vиспользуемой памяти, быстродействия программы.

Диалоговые программы.

По способу общения программ использования прикладные программы делятся на:

    Функционирующие в автоматическом режиме;

    Диалоговые программы.

Диалог с программой может осуществляться в 2 режимах:

          Пакетном (получает все исходные данные до начала работы)

          Интерактивном (режим вопрос-ответ)

Интерфейс – система унифицированных связей, определяющих способ взаимодействия между компонентами аппаратного обеспечения вычислительной системы, между человеком и ВС и др.

Взаимодействие в интерактивном режиме по следующей схеме:

    Режим командной строки (получает параметры работы с помощью ввода команд)

    Система меню (программа получает управляющий сигнал при выборе пользователем элемента из списка, в котором перечислены все возможные варианты функционирования программы).

Программы делятся на консольные приложения и приложенияс графическим интерфейсом. При проектировании интерфейса «человек-компьютер» должны учитываться требования, призванные обеспечить эффективность взаимодействия пользователя и системы.

Требования:

    Естественный интерфейс;

    Последовательный интерфейс (каждое текущее действие пользователя должно определяться результатом предыдущего действия)

    Не избыточный интерфейс

    Интерфейс должен обеспечивать поддержку пользователя;

    Интерфейс должен быть гибким (включение функций настройки интерфейса)

Жизненный цикл программы.

Период от начальной концепции до морального устаревания.

Жизненный цикл включает следующие этапы:

    Выработка требований к системе;

    Разработка требований ПО;

    Общее проектирование;

    Детальное проектирование;

    Создание отдельных модулей;

    Тестирование отдельных модулей;

    Объединение модулей в системы;

    Выпуск системы;

    Эксплуатация сопровождения системы;

Модели создания систем.

    Каскадная (водопадная)

Возврат предыдущего этапа невозможен.

    Модель развития системы.

    Циклическая.

Способы представления алгоритма.

Свойства определённости алгоритма требуют исполнения при описании его формальных языков. Однако, степень формализации (то, насколько строгим должен быть синтаксис языка), а также представление алгоритма определяются тем, что предполагается в качестве исполнения. Формальный исполнитель субъекта или устройства, способный воспринимать и анализировать указание алгоритма, изменить в соответствии с ним своё состояние и обладающий механизмом управления, способный производить по-маловую обработку информации.

В программировании есть определенные представления алгоритмов, рассчитанные на разных исполнителей:

    Если для человека запись может быть полностью формализована, существенными являются понятность и наглядность;

    Для технических устройств важна однозначность понимания и исполнения, а также ограничение допустимых грамматических конструкций;

Формы представления алгоритмов:

    Символьная (последовательность строк, каждая из которых содержит описание 1-го или нескольких элементарных действий). Порядок выполнения алгоритма задаётся:

    1. В явном виде (указание метки последовательности);

      В неявном виде (элементарность действия определяется возможностями исполнителя).

Символьный способ основный: понятен и человеку, и ЭВМ.

    Помагословесная форма - пронумерованная последовательность строк, каждая из которых содержит описание конкретных действий на естественном языке (для человека) – алгоритмы математических вычислений над конечными числами;

Алгоритм Евклида:

        If a=b, результат a;

        If a>b, ?(a-b), a=a-b → 1) ;

        If a

    Формулы – строчная запись действий, обеспечивающих обработку числовых, символьных и логических данных.

    Псевдокод – ориентированный на человека частично-формализованный (в псевдокоде строго определены только правила записи направляющих структур) язык, позволяющий записывать алгоритм в форме весьма близкой языкам программирования высокого уровня.

Направляющие структуры псевдокода:

      Внешние направляющие алгоритма;

      Ветвление (если, то, иначе, всё)

      Цикл (пока – повторять – конец - пока)

Алгоритм Евклида:

Пока a≠b повтор

Если a>b то

Конец если

Конец пока

D.Язык программирования – искусственно-формализованный язык для ЭВМ

    Графическая (для представления отдельных элементов, используя некоторый набор геометрических фигур). Только для человека.

Наглядность

Трудоемкость

→ соединительная линия

Структурное программирование.

До середины 60-х годов теории разработки алгоритмов не существовало, а процесс разработки определялся опытом и искусством программиста. Однако по мере роста сложности программ возникла необходимость создания методологии разработки программы, которая воплотилась в виде структурного программирования. Идеи такого программирования были высказаны Дейкстрой (1965г.) В том же году итальянские математики Бом, Джакопини сформулировали теорему о структурности, лежащую в основе этого программирования.

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

В структурном программировании 3 варианта организации потока управления:

    Линейный поток (несколько функциональных блоков выполняются последовательно;

    Ветвление;

    Циклический.

Алгоритм называется структурным, если он может быть представлен последовательностью перечисленных функциональных блоков.

Особенности структурных алгоритмов.

    Понятность и простота восприятия;

    Проверяемость;

    Модифицируемость.

Структурная теорема:

Любому неструктурному алгоритму может быть поставлен ему в соответствие эквивалентный ему структурный алгоритм, любая программа может быть написана только с использованием конструкций условий и цикла.

Информация, подготовленная для определенных целей, при этом часто подразумевается определенный формат. В вычислительной технике рассматриваются 3 различных значения этого термина:

    Это объекты, отличные от команд, то есть операнды, обрабатываемые программой. Значения констант и переменных файлы данных, противоположных файлам программ. Значение термина зависит от контекста. Команды на исходном языке являются данными для компилятора. Объектный код, получаемый в результате работы компилятора, является исходными данными для загрузчика после начала исполнения. Объектный код становится программой.

    в контексте программ слово «данные» может интерпретироваться в смысле «исходные данные», в противоположность результатам работы результатам работы программы, ее выходных данных. При этом результаты одной программы могут быть данными для другой.

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

Значение переменной – данные.

Информация.

Применительно к терминам обработка информации, информационные технологии (ИТ), теория информации.

Под информацией понимается совокупность символов. Символы определяются как образы, несущие смысловую нагрузку. Некоторое количество информации может рассматриваться с 3 основных точек зрения:

    с поведенческой (создание порции информации осуществляется по некоторой причине, а получение этой информации моет привести к некоторому результату, наблюдаемому действию или мыслительной операции);

    с математико-лингвистической (порция информации может быть записана путем соотнесения ее с другой информацией, указания ее смысла и структуры)

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

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

Программа на языке высокого уровня.

Этапы существования ПО (не жизненный цикл программы):

Подвергается трансляции (процедура перевода с языка высокого уровня на машинный язык.) В ходе трансляции может использоваться переход на промежуточный язык – кросстрансляции. в качестве промежуточного языка может использоваться язык Ассемблера.

Ассемблер – программа, осуществляющая перевод с языка ассемблера на машинный язык.

Машинный язык – язык, использующий машинные команды, записанные в формате воспринимаемом конкретным вычислительным устройством.

Язык ассемблера представляет собой мнемонимическую запись машинного языка (add-сложить).

Транслятор – программа, выполняющая процедуру трансляции. 2 вида:

    компилятор;

    интерпретатор.

    1. Компилятор – осуществляет перевод текста программы на машинный язык целиком.

Результат работы – объектный файл, содержащий программу на машинном языке и информацию о данных, используемых программой. Объектный файл обрабатывается компоновщиком (линкером) или редактором связи.

Компоновщик обрабатывает объектные файлы, разрешает внешние ссылки (делает доступным вызовы объектов функций или данных из других объектных файлов или стандартных библиотек), осуществляет необходимую подготовительную работу для последующей загрузки программы на исполнение. В случае сBorlandCмы получаем исполняемый файл (.exe).

Загрузчик программ, осуществляющих размещение исполняемого кода и данных в памяти ЭВМ и передающий управление первой исполняемой команде программы.

В случае персональных ЭВМ функции загрузчика распределены между ОС и кодом, включаемым в исполняемый файл.

Исполнение программы начинается с загрузки в регистр счетчика исполняемых команд ЦП, адреса первой исполняемой команды программы.

Устройство управления считывает по этому адресу код команды, в соответствии с ним считывает значения операндов (если они есть), передает код и операнды АЛУ, которое выполняет необходимые операции.

По завершению выполнения команды значение регистра счетчика команд увеличивается на значение длины команды, которая известна по коду операции.

Процедура повторяется до тех пор, пока не будет встречена команда stop . Исполняемая программа обычно завершается возвратом управления программе, вызвавшей данную программу (ОС).

      Интерпретатор – покомандно или построчно считывает программу на исходном языке, переводит на машинный язык и отправляет на выполнение.

Входом является программа на языке программирования. Результат – построчно выполняемая команда.

Пример машинной команды, языка высокого уровня.

Оператор goto– безусловного перехода.

Goto_«метка»;

«Метка» - идентификатор, определяющий точку в тексте программы. В языке С с помощью метки осуществляются переходы на определенный оператор или пустой оператор.

А=В+С; после компиляции

М:А=Д+Е; gotoбудет переведен вjump. В качестве операнда из программы должен быть адрес. Метка М после компиляции получит свое значение как адрес относительно начала исполняемого кода, начиная с которого после перевода на машинный язык будут записаны команды, соответствующие А=Д+Е. (М на относительную ссылку). При загрузке размещения в памяти относительная ссылка будет заменена действительным адресом (абсолютной ссылкой в каком-либо формате). После того, как в счетчик команд попадет адрес командыjump, то произойдет загрузка значения абсолютного адреса метки М в регистр счетчика команд, представляет собой безусловный переход

На оператор А=Д+Е. собственно оператор А=Д+Е приведет к появлению машинных команд: сложения, пересылке.

Интерпретатор языка командной строки.

Идентификатор строка символов, используемая для идентификации или именования некоторого элемента программы. Вид именуемого элемента зависит от языка программирования (это может быть переменная, структура данных, процедура, оператор, конструкция высокого уровня или сама программа).

Имя – обозначение объекта в программе или в системе. Имя обозначает объект независимо от его физического местоположения или адреса. Имена используются с целью их долговременного закрепления, например, за описываемым модулем (подпрограммой вычисления квадратного корня) или для удобства (человеку проще распознавать имена, чем адреса).

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

В рассмотренном примере (с goto) идентификатор используется для именования адреса, по которому размещаться оператор, который будет выполняться сразу после оператора безусловного перехода «goto».

Критерии качества программы.

Для определения качества используются следующие свойства:

    Правильность;

    Эффективность;

    Тиражируемость;

    Модифицируемость;

    Стиль программирования.

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

Семантика – часть определения языка, касающаяся указания смысла и действия текста, составленного в соответствии с синтаксическими правилами этого языка.

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

Синтаксическим анализом (парсингом) называют процесс принятия решений о том, является ли цепочка данных символов предложением данного языка и,если является, то дополнительно процесс определения синтаксической структуры введенной строки, определяемой грамматикой.

Грамматика – один из основных подходов к описанию бесконечного формального языка конечными средствами. Содержит набор правил, используемых для вывода одной строки из другой путем замены подстрок. Строки определенного языка выводятся из некоторой начальной строки путем многократного применения этих правил.

Программная спецификация – точное описание того результата, который необходимо достичь с помощью программы. Описание должно точно устанавливать что должна делать программа, не указывая как. Для программ, заканчивающих свою работу каким-либо результатом программная спецификация может иметь форму спецификации «ввода-вывода», которая описывает желаемое отображение множества входных величин в множество выходных.

Для циклических программ в которых нельзя указать точку завершения, нельзя дать простую спецификацию «ввода-вывода». В этом случае специфицируются отдельные функции, реализуемые программой в ходе циклической операции.

При доказательстве правильности типичных последовательных программ, написанных на некотором императивном процедурном языке, описание программы представляют в форме двух простых утверждений: входного и выходного. Утверждения выражают свойства определенных элементов программы и отношения между ними. Доказательство состоит в формальной демонстрации того, что семантика программы совместима с входным и выходным утверждениями. Программа решения квадратного уравнения: а,в,с – входные; х1,х2 – выходные.

Императивные и декларативные языки.

Императивные (процедурные) языки. Класс языков программирования.

Программа, написанная на процедурном языке, явно указывает способ получения желаемого результата, не определяя при этом ожидаемых свойств результата. Результат неявно задается только способом получения его при помощи определенной процедуры. Процедура получения желаемого результата имеет вид последовательности операций, и поэтому для процедурных языков характерно указание логики управления в программе и порядка выполнения операторов. В этих языках обычно присутствуют операторы присваивания, которые разрушают информацию (присваемое значение заменяет предыдущее) и также зависит от порядка выполнения. Процедурные языки тесно связаны с фон-неймановской моделью вычисления (C,Pascal,Fortran).

Императивным противопоставляют декларативные языки (Prolog).

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

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

    Надежность ПО.

Характеристика способностей системы ПО выполнять возложенные на нее функции (при поступлении требований на их выполнение). Понятие надежности ПО существенно отличается от понятия доказательства правильности программы.

Правильность – некоторое статическое свойство, которым в соответствие со спецификациями должна обладать программа.

Надежность относится к динамическим требованиям, предъявляемым системе удовлетворять требованиям.

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

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

Обеспечение качества ПО.

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

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

Стандарты программирования – система правил или соглашений, которые ограничивают форму представления программ, создаваемых конкретной организацией.

    Эффективность – с точки зрения качества ПО эффективной программа будет в соответствии с 2 взаимоисключающими критериями:

    Время выполнения;

    Объем использованной памяти;

(Даны переменные а и в. результат а=в, а в=а)

    Стиль программирования.

Товарищи инженеры, уже четвертый год пошел, как я взялся преподавать в . За это время у меня накопилось огромное количество примеров кода и материалов, примерно на 90 лекций . Должен сказать, что за весь период своей профессиональной деятельности (а это 24 года почти ежедневного написания кода), я никогда не подымал свой уровень программирования, как за последние годы, работая со студентами. Если раньше мне казалось, что написать кратко, сложно и внушительно - это верх мастерства, то теперь я осознал, что мой код должны понимать студенты после минимальных объяснений, иначе он никуда не годится. Я пришел к выводу, что способность эту можно и нужно распространить не только на обучающий код, но и на весь рабочий код. Более того, обучающий код не должен существенно отличаться от рабочего кода, потому, что мы учим будущих инженеров делать настоящие системы, а не учебные. А после многочисленных просьб, я решил записывать все лекции в виде скринкастов, которые сразу после завершения лекции отправляются на ютюб. За этот учебный год я планирую записать 100 лекций, из которых уже опубликованы 23 , готовы материалы еще для 67 лекций и новых 10 лекций еще в процессе подготовки.

Концепция курса

Все вы знаете, что у нас в отрасли есть существенные проблемы с фундаментальным инженерным образованием:

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

Построить курс на базе JavaScript - это конечно экспериментальная затея, но этот язык уж точно не будет лишним ни для кого в современном ИТ. У самих же JavaScript разработчиков очень часто наблюдается плохая базовая инженерная подготовка и нехватка фундаментальных знаний по структурам данных, алгоритмам, базовым абстракциям, паттернам, архитектуре, парадигмам и приемам программирования. Большинство кода, что пишется сейчас в индустрии, просто выбрасывается вскоре после создания, потом опять переписывается и опять выбрасывается. В общем, качество и знания редко требуются, разве что на собеседованиях. Выгоднее всего делать некачественный код и обслуживать его или выбрасывать код и продавать больше времени на его повторное написание. Кроме того, наша отрасль совершенно оторвалась от науки, в этом есть существенные заслуги маркетологов, потому что мы уже программируем не на языках программирования и не на абстракциях, а мы программируем на фреймворках и библиотеках, которые нам "втюхали" в красивой обертке. Мы собираем все из кубиков, часто без всякого научного осмысления и редко можем ответить на вопрос, почему мы делаем так а не иначе. Все по частям уже давным-давно написано, все можно найти в интернете, но оказалось, что одно с другим не лепится, то есть по частям оно есть, а вместе это не работает. Связывать разобщенные кусочки кода гораздо сложнее чем поодиночке их сделать. Происходит это именно из-за отсутствия системного подхода, терминологического раскола и понятийной рассинхронизации специалистов. Вместе будет работать только то, что идеологически совместимо, что базируется на общей теории и выведенных из этой теории общих стандартах. Я надеюсь, что этим курсом я сделаю хоть небольшой шаг к достижению такого важного для отрасли консенсуса.


Все материалы курса в свободном доступе на github , а лекции открытые, их можно посещать бесплатно. Каждую неделю я записываю 4 лекции. Мы проводим еще семинары и практические занятия, но они не записываются.

Структура курса

  • Базовые понятия : программные абстракции, переменные, операторы, типы данных, массивы, структуры, скалярные и ссылочные типы, отображения;
  • Основные понятия : функции, контексты и область видимости, классы и объекты, прототипы, методы, лямбды, чистые функции, побочные эффекты, замыкания, частичное применение, каррирование, композиция, функции высшего порядка, колбэки, враперы, декораторы, примеси, события, интерфейс, синглтон, итераторы, функциональные объекты, функторы, монады, работа с файлами, потоки, сокеты, мемоизация, наследование, генераторы, асинхронное программирование, чеининг, модули и зависимости, обработка ошибок, фабрики и пулы, таймеры, регулярные выражения;
  • Вспомогательные материалы : git, системы контроля версий и менеджеры пакетов, работа с консолью, тестирование, непрерывная интеграция, логирование, линтеры, оптимизация и производительность, борьба с утечками памяти, скрытые классы, мономорфные функции, дженерики, сборка мусора, управление памятью;
  • Структуры данных : коллекции, массивы и типизированные массивы, буферы, списки, стек, очередь, дек, деревья двоичные и иерархические, многомерные деревья, повороты и балансировка ветвей, множества, хешмапы, графы, развернутые списки, асинхронная очередь, автоматы, итерирование структур данных и поиск;
  • Расширенные понятия : символы, прокси, диферы, фьючеры и промисы, линзы, трансдьюсеры, async/await, коллекторы данных, асинхронная композиция, адаптеры асинхронности, асинхронные итераторы, интроспекция, рефлексия, скаффолдинг, инверсия управления и внедрение зависимостей, песочницы, слоистая архитектура, компонентный подход, слой доступа к данным, проекции данных, мониторинг файловой системы, клиент-серверная и трехзвенная архитектура, кластеризация и балансировка, проектирование протоколов, динамическая перегрузка модулей, метаданные, динамическое связывание, межпроцессовое взаимодействие;
  • Примеры кода и комплексного использования технологий: живые электронные таблицы, чат на вебсокетах, реализация языка запросов к графам, альтернативная библиотека асинхронных абстракций metasync, сравнение реализации одинаковых задач на разных парадигмах, сравнение стилей функционального программирования, примеры структуры приложений, маршрутизация обработчиков в node.js приложениях, изоляция кода в песочницах, транзакционные объекты;
  • Парадигмы программирования : императивное, структурное и неструктурное, процедурное, объектно-ориентированное, прототипное, функциональное, логическое, декларативное, асинхронное, реактивное, событийное, автоматное, обобщенное, программирование управляемое потоками данных, мультипарадигменное, метапрограммирование.