Лекция 1. Вводная¶
Предисловие¶
Визитка¶
Штанюк Антон Александрович
- Основной сайт: <http://shtanyuk.tk>
- Программные проекты: <https://github.com/ashtanyuk>, <https://bitbucket.org/ashtan>
- Почта: <mailto:ashtanyuk@gmail.com>
Материалы данного курса находятся по адресу: <http://shtanyuk.tk/edu/nniit/courses.html>
Информация¶
Информация о курсе¶
- Лекции - 12 по 4 ак. часа
- Лабораторные занятия (по подгруппам) - 15 по 4 ак. часа
- Экзамен (письменное тестирование)
- Небольшие проекты (около 40)
- Финальный проект (файловый компрессор по методу Хаффмана)
Суммарная продолжительность: около 4 месяцев.
Материалы¶
Информация:
- Материалы лекций: <http://shtanyuk.tk/edu/nniit/courses.html>
- Материалы практикумов: <http://shtanyuk.tk/edu/nniit/courses.html>
- Литература: <http://shtanyuk.tk/useful/books.html#c>
Программное обеспечение:
- Visual Studio (2012-2019), Community Edition
- Git
Дополнительно:
- Google test - для модульного тестирования.
- Непрерывная интеграция <https://travis-ci.org>
Сделать в ближайшее время¶
- Раздобыть компьютер (лучше быстрый ноутбук).
- Установить Visual Studio и настроить работу с пустыми (empty) проектами verb!C++!
- Установить Git (читать введение: <https://github.com/ashtanyuk/Git-intro>).
- Завести аккаунт на <https://github.com>.
- Выделить время для самостоятельной работы (чем больше, тем лучше, не менее 2-х часов в день).
- Познакомиться с коллегами по курсу и наладить взаимодействие.
О чем курс?¶
- Немного о программировании вообще.
- Немного о разработке ПО.
- Немного об алгоритмах и структурах данных.
- Много о языке программирования С.
Почему язык С?¶
- Один из самых популярных языков более 40 лет.
- Синтаксическая ‘’латынь’‘.
- Идеальный способ изучить алгоритмы и структуры данных.
- Идеальный способ понять ‘’механику’’ выполнения программ.
- По-прежнему востребован у работодателей.
Области применения:
- Системное программное обеспечение (ОС, утилиты, антивирусы и т.п.)
- Реализация протоколов (TCP/IP, UDP, и т.д.)
- Графика (сложные игры, графические модели)
- Встраиваемые системы (микроконтроллеры, АСУ)
- Высокопроизводительные вычисления на суперкомпьютерах
Программирование и разработка ПО¶
Программирование vs Разработка ПО¶
Программирование и разработка ПО - связанные, но разные понятия.
Программированием может заниматься кто угодно.
Разработкой обычно занимаются профессионалы.
Разработка ПО обычно включает в себя:
- Проектирование
- Программирование
- Тестирование
- Документирование
Специализации в разработке¶
Профессиональные специализации:
- Кодер
- Тестировщик
- Архитектор
- Технический писатель
- Переговорщик
- Менеджер
- Маркетолог
- Сервисный инженер
- Специалист службы поддержки
- Переводчик
- ...
Аспекты и подходы¶
Аспекты и подходы к разработке¶
Написание хороших программ требует ума, вкуса и терпения

Б.Страуструп
- Теоретический.
- Технологический.
- Творческий.
- Любительский.
- Профессиональный.
Признаки любительского подхода¶
- Пренебрежение этапами разработки (упрощённое проектирование, отсутствие тестирования, документирования, анализа результатов).
- Пренебрежение технологиями разработки (решение ‘’в лоб’‘, изобретение ‘’велосипедов’‘).
- Небрежное кодирование.
Результат:
Часто появляются велосипеды с квадратными колёсами

Профессиональный подход к программированию¶
Как профессионал решает вычислительные задачи:
- Разбивает задачи на более мелкие и легко решаемые подзадачи.
- Распознаёт и применяет известные решения к новым задачам.
- Распознаёт нерешаемые задачи.
- Находит и использует правильные инструменты для работы.
Профессионал предлагает хорошие решения:
- Надёжные, корректные и защищённые.
- Эффективные с точки зрения расхода ресурсов.
- Масштабируемые: адаптивные, децентрализованные.
- Элегантные.
С другой стороны, нужно всегда помнить мудрую фразу:
Ноев ковчег был построен любителем, а Титаник - профессионалами...
Жизненный цикл ПО¶
- Формулировка задачи (определение требований).
- Спецификация системы в соответствии с требованиями.
- Проектирование.
- Реализация (кодирование).
- Тестирование и отладка.
- Эксплуатация и сопровождение.
Гибкие методологии разработки¶
Итерационная модель жизненного цикла привела к появлению гибких методологий разработки ПО:
- Экстремальное программирование (ХР)
- Scrum
- RAD
- и др.
Основные идеи:
- люди и взаимодействие важнее процессов и инструментов;
- работающий продукт важнее исчерпывающей документации;
- сотрудничество с заказчиком важнее согласования условий контракта;
- готовность к изменениям важнее следования первоначальному плану.
Качели¶
Этап Значение ![]()
Как объяснил клиент чего он хочет ![]()
Как понял клиента руководитель проекта ![]()
Как было описано в ТЗ ![]()
Как написали программисты ![]()
Как планировалось внедрить ![]()
Что удалось внедрить ![]()
Как представил проект бизнес-консультант ![]()
Как задокументировали проект ![]()
Как заплатил клиент ![]()
Как сработала тех-поддержка ![]()
Что на самом деле хотел клиент
Язык С¶
Краткая история языка С¶
- 1969 - Кеном Томпсоном разработана ОС Unix для PDP-7 (Bell Lab).
- 1972 - Язык Си создан Денисом Ритчи (Bell Lab).
- 1973 - Исходный код Unix переписан с ассемблера на Си.
- 1978 - Вышло первое издание “The C programming language”.
- Начало 80-х - Бъярном Страуструпом разработан С++ (‘’С с классами’‘)
- 1987 - Появление IDE Turbo C.
- 1989 - публикация первого стандарта ANSI C (ANSI X3.159-1989).
- 1999 - публикация второго стандарта ISO 9899:1999 (C99).


Краткая история языка C¶
Языки программирования, возникшие в результате влияния С:
- C++
- Objective-C
- Perl
- Java
- C#
- PHP
Популярность Си за 10 лет¶

Лидеры¶

Положения стандарта языка С¶
Стандарты официальные и неофициальные:
- K&R - 1978, неофициальный
- C89,C90 - 1990, официальный
- C99 - 1999, официальный
- C11 - 2011, официальный
Положения стандартов:
- Доверять программисту.
- Не мешать программисту делать то, что ему необходимо.
- Сохранять язык простым и компактным.
- Обеспечивать только один способ выполнения определенной операции.
- Делать что-либо быстро.
Достоинства и недостатки¶
Достоинства¶
- Компактность (минимум базовых средств).
- Лаконичность и выразительность.
- Переносимость.
- Эффективность компилятора.
- “Средний уровень”.
- Универсальность.
- Мощность (наличие огромного числа библиотек).
Недостатки¶
- Трудность в освоении.
- Слабая типизация.
- Отсутствие автоматического управления памятью.
- Незащищенность от ошибок.
Создание программы¶
Инструментальные средства¶
- Текстовый редактор
- Препроцессор
- Компилятор
- Компоновщик
- Отладчик
- Профайлер
Схема построения программы¶

Первая программа¶
int main()
{
printf("Hello, world!\n");
return 0;
}
Hello, world!
_
Правила оформления¶
- Наличие отступов в блоках
- Положение скобок
{
{
{
}
}
}
- Одна строка - одно выражение
- Комментарий к месту
- Комментарии и сообщения на английском
Примеры программ¶
void hello(char *name)
{
printf("Hello, %s!\n",name);
}
int main(void)
{
hello("all");
return 0;
}
void
hello( char * name
){printf("Hello, %s!\n",name )
; } int
main(void){ hello("all")
;return 0
;}
Паровоз¶

Дополнительная информация¶
Наиболее широко распространенный компилятор С называется gcc. После того, как набран текст программы и сохранен в файле (например main.c, можно давать следующие команды:
gcc -c main.c
gcc -o myprog main.o
или
gcc -o myprog main.c
После этого можно запускать программу на выполнение с помощью команды:
./myprog
Важнейшие опции gcc¶
- -o имя - имя выходного файла (программы)
- -std=c89,c99 - использование стандарта
- -g - включение в программу отладочной информации для отладчика gdb
- -On - включение n-ого уровня оптимизации
- -Idir - добавляет каталог dir для поиска в них заголовочных файлов
- -llib - добавляет имя библиотеки **lib**для компоновки
- -Ldir - добавляет каталог с библиотеками для компоновки
Пользовательские интерфейсы¶
Виды интерфейсов¶
Традиционно выделяют два вида пользовательских интерфейсов:
- CLI (Command Line Interface) - интерфейс командной строки
- GUI (Graphical User Interface) - графический интерфейс пользователя
CLI реализуется с помощью стандартной библиотеки С и не требует допольнительных средств.
GUI создаётся с помощью средств сторонних библиотек.
Достоинства командного интерфейса:
- Кроссплатформенность
- Простота реализации
- Гибкость
- Автоматизируемость (скрипты)
Достоинства графического интерфейса:
- Наглядность
- Информативность
- Привлекательность
- Обучаемость
Графические интерфейсы¶
Графические интерфейсы создаются с помощью специальных приложений и библиотек
Наиболее известные библиотеки:
- QT (C++) - cross
- GTK (C) - unix
- CLR (Managed C++) - windows
- wxWidgets (C++) - cross
- BCL (C++) - windows
Особенности стандартов¶
С99¶
Новые возможности языка:
- встраиваемые функции (объявленные с ключевым словом inline);
- место, в котором возможно объявление переменных, больше не ограничено глобальной областью видимости и началом составного оператора (блока);
- несколько новых типов данных, включая long long int, дополнительные расширенные целые типы, явный логический тип данных, а также комплексный тип complex для представления комплексных чисел
- массивы переменной длины (variable-length arrays);
- поддержка однострочных комментариев, начинающихся с //, как в BCPL или C++
- новые библиотечные функции, как, например, snprintf;
- новые заголовочные файлы, такие как stdbool.h и inttypes.h;
- типовые математические функции (tgmath.h);
- улучшена поддержка стандарта IEEE 754-2008 (формат представления чисел с плавающей запятой);
- проектируемые инициализаторы;
- составные константы;
- поддержка вариативных макросов (макросов переменной арности);
- смягчение (restrict) ограничений для более агрессивной оптимизации кода;
С11¶
Новые возможности стандарта C11 (2011):
- поддержка многопоточности;
- улучшенная поддержка юникода;
- обобщенные макросы (type-generic expressions, позволяют статичную перегрузку);
- анонимные структуры и объединения (упрощают обращение ко вложенным конструкциям);
- управление выравниванием объектов;
- статичные утверждения (static assertions);
- удаление опасной функции gets (в пользу безопасной gets_s);
- функция quick_exit;
- спецификатор функции _Noreturn;
- новый режим эксклюзивного открытия файла.
Вопросы для самоконтроля¶
- Какие существуют аспекты разработки? Подходы?
- Какие признаки характеризуют любительский подход?
- Какие этапы входят в жизненный цикл ПО?
- Как называется самая известная серия рисунков, посвященная ошибкам проектирования?
- Какие события повлияли на возникновение и распространение языка С?
- Кто является автором языка С?
- Как называлась первая книга о языке С?
- Как можно отследить динамику интереса к языкам программирования?
- Что можно сказать о стандартах языка С?
- Какие принципы характеризуют язык С?
- Какие достоинства у языка С?
- Какие недостатки свойственны С?
- Что входит в инструментальные средства С?
- Как происходит процесс построения программы?
- Как традиционно называется первая программа? Что она делает?
- Как влияет неправильное форматирование на восприятие текста программы?
- К чему может привести неправильное форматирование текста программы?
- Как построить и запустить программу в ОС Unix?
- С какими параметрами вызывается gcc?
- Какие существуют виды интерфейсов?
- В чём достоинства командного интерфейса?
- В чём достоинства графического интерфейса?
- Какие существуют известные библиотеки для построения графических интерфейсов?
- Что предлагает стандарт C99?
- Что появилось в стандарте C11?