
- •Часть 1
- •Общие сведения Сведения об эумк
- •Методические рекомендации по изучению дисциплины
- •Рабочая учебная программа
- •Учреждение образования
- •«Белорусский государственный университет
- •Информатики и радиоэлектроники»
- •Часть 2 __184__
- •Содержание дисциплины
- •1. Индивидуальные практические занятия, их характеристика
- •2. Контрольные работы, их характеристика
- •3. Курсовой проект, его характеристика
- •4. Литература
- •4.1. Основная
- •4.2. Дополнительная
- •5. Перечень компьютерных программ, наглядных и других пособий, методических указаний и материалов и технических средств обучения
- •Протокол согласования учЕбной программы по изучаемой учебной дисциплине с другими дисциплинами специальности
- •Теоретический раздел Введение
- •1. Основные типы данных
- •1.1. Общие сведения
- •1.2. Данные типа int
- •1.3. Данные типа char
- •1.4. Модификаторы доступа const и volatile
- •1.5. Данные вещественного типа (с плавающей точкой)
- •1.6. Элементарный ввод-вывод
- •1.7. Структура простой программы на языке Си
- •2. Операции и выражения
- •2.1. Выражение и его интерпретация
- •2.2. Основные операции
- •2.2.1. Арифметические операции
- •2.2.2. Побитовые логические операции
- •2.2.3. Операции сдвига
- •2.2.4. Операция присваивания
- •2.2.5. Операция sizeof
- •2.2.6. Преобразование типов в выражениях
- •2.2.7. Операция преобразования типов
- •2.2.8. Приоритеты в языке Си
- •3. Операторы управления вычислительным процессом
- •3.1. Оператор if
- •3.2. Операции отношения
- •3.3. Логические операции
- •3.4. Операция запятая
- •3.5. Операция условия ?:
- •3.6. Оператор безусловного перехода goto
- •3.7. Оператор switch
- •`` ` `3.8. Операторы цикла
- •3.8.1. Оператор for
- •3.8.2. Оператор while
- •3.8.3. Оператор do...While
- •3.9. Оператор break
- •3.10. Оператор continue
- •4. Массивы и указатели
- •4.1. Одномерные массивы и их инициализация
- •4.2. Многомерные массивы и их инициализация
- •4.3. Объявление указателей
- •4.4. Операции над указателями
- •1) Взятие адреса
- •2) Косвенная адресация или разыменование указателя
- •3) Увеличение или уменьшение значения указателя на целое число
- •4) Разность указателей
- •5) Сравнение указателей
- •6) Присваивание указателей друг другу
- •4.6. Связь между указателями и массивами
- •4.7. Динамическое распределение памяти
- •4.8. Массивы указателей
- •5. Функции
- •5.1. Общие сведения
- •5.2. Область видимости переменных
- •5.2.1. Локальные переменные
- •5.2.2. Глобальные переменные
- •5.3. Передача параметров в функцию
- •5.4. Рекурсивные функции
- •5.5. Использование функций в качестве параметров функций
- •5.6. Указатели на функции
- •5.7. Структура программы на Си
- •5.8. Передача параметров в функцию main()
- •6. Строки
- •7. Классы хранения и видимость переменных
- •7.1. Общие сведения
- •7.2. Автоматический класс хранения (auto)
- •7.3. Регистровый класс хранения (register)
- •7.4. Статический класс хранения (static)
- •7.5. Внешний класс хранения (extern)
- •7.6. Заключение
- •8. Структуры, объединения и перечисления
- •8.1. Общие сведения
- •8.2. Инициализация структурных переменных
- •8.3. Вложенные структуры
- •8.4. Указатели на структуры
- •8.5. Массивы структурных переменных
- •8.6. Передача функциям структурных переменных
- •8.7. Оператор typedef
- •8.8. Поля битов в структурах
- •8.9. Объединения
- •8.10. Перечисления
- •9. Динамические структуры данных
- •9.1. Общие сведения
- •9.2. Связные списки
- •9.2.1. Односвязные списки
- •9.2.2. Двусвязные списки
- •9.2.3. Циклические списки
- •9.3. Стеки
- •9.4. Очереди
- •9.5. Деревья
- •9.5.1. Понятие графа
- •9.5.2. Бинарные деревья
- •10. Файлы
- •10.1. Общие сведения
- •10.2. Открытие и закрытие файлов
- •10.3. Функции ввода-вывода для работы с текстовыми файлами
- •10.4. Произвольный доступ к файлу
- •10.5. Функции ввода-вывода для работы с бинарными файлами
- •11. Директивы препроцессора
- •11.1. Основные понятия
- •11.2. Директива #include
- •11.3. Директивы препроцессора #define и #undef
- •11.3.1. Символические константы
- •11.3.2. Макросы с параметрами
- •11.3.3. Директива #undef
- •11.4. Условная компиляция
- •11.5. Директивы # и ##
- •12. Модульное программирование
- •13. Введение в объектно-ориентированное программирование
- •13.1. Постановка задачи
- •13.2. Решение задачи средствами Си
- •13.5. Наследование
- •13.6. Перегрузка
- •13.7. Ссылочный тип
- •Литература
- •Приложение 1. Рекомендации по оформлению текстов программ
- •Тесты к теоретическому разделу Вопросы к разделу 1. Основные типы данных
- •Вопросы к разделу 2. Операции и выражения
- •Вопросы к разделу 3. Операторы управления вычислительным процессом
- •Вопросы к разделу 4. Массивы и указатели
- •Вопросы к разделу 5. Функции
- •Вопросы к разделу 6. Строки
- •Вопросы к разделу 7. Классы хранения и видимость переменных
- •Вопросы к разделу 8. Структуры, объединения и перечисления
- •Вопросы к разделу 9. Динамические структуры данных
- •Вопросы к разделу 10. Файлы
- •Вопросы к разделу 11. Директивы препроцессора
- •Вопросы к разделу 12. Модульное программирование
- •Вопросы к разделу 13. Введение в ооп
- •Правильные ответы на вопросы тестов к теоретическому разделу
- •Вопросы к теоретическому зачету
- •Варианты индивидуальных заданий
- •Контрольная работа №2
- •Варианты индивидуальных заданий
- •Индивидуальные практические работы Указания к выбору варианта индивидуальных практических работ
- •Индивидуальная практическая работа № 1. Массивы и строки
- •Варианты индивидуальных заданий
- •Индивидуальная практическая работа № 2. Динамические структуры данных
- •Варианты индивидуальных заданий
5. Перечень компьютерных программ, наглядных и других пособий, методических указаний и материалов и технических средств обучения
Перечень методических материалов и пособий
Бахтизин В.В. и др. Лабораторный практикум по курсам "Конструирование программ и языки программирование" и "Программирование". Часть 4 Программирование на Ассемблере с использованием отладчика Turbo Debugger. - Мн.: БГУИР, 1996.
Бахтизин В.В., Глухова Л.А. Лабораторный практикум по курсам "Конструирование программ и языки программирование" и "Программирование". Часть 3. Программирование на языке Си в среде Турбо для ПЭВМ. - Мн.: БГУИР, 1993.
Бахтизин В.В., Глухова Л.А. и др. Методические указания по вычислительной практике и самостоятельной работе по курсам "Программирование" и "Конструирование программ и языки программирования" для студентов специальности "Вычислительные машины, комплексы, системы и сети", "Программное обеспечение ЭВМ и автоматизированных систем" и слушателей спецфакультета переподготовки по направлению "Микропроцессорные системы". Части 1, 2, 3, 4. - Мн.: Ротапринт МРТИ, 1989 – 1992.
Бахтизин В.В., Марина И.М., Шостак Е.В. Учебно-методическое пособие по курсу «Конструирование программ и языки программирования». Ч.1.-Мн:Ротапринт БГУИР, 2006.
Перечень компьютерных программ, необходимых для выполнения индивидуальных практических и курсовых работ
Операционная система Windows.
Система программирования Borland С++.
Система программирования Microsoft Visual Studio.
Протокол согласования учЕбной программы по изучаемой учебной дисциплине с другими дисциплинами специальности
(дисциплины, изучение которых опирается на данную дисциплину)
Название дисциплины, с которой требуется согласование
|
Кафедра, обеспечиваю-щая изучение этой дисциплины
|
Предложения об изменениях в содержании учебной программы по изучаемой дисциплине |
Решение, принятое кафедрой, разработавшей учебную программу (с указанием даты и номера протокола)1 |
1 |
2 |
3 |
4 |
Объектно-ориентированное программирование |
ПОИТ |
отсутствуют |
|
Операционные системы и системное программирование |
ПОИТ |
отсутствуют |
|
Зав. кафедрой (________________)
_______________________
1 При наличии предложений об изменениях в содержании учебной программы по изучаемой учебной дисциплине.
Теоретический раздел Введение
Созданный ещё в середине прошлого века, язык программирования Си остаётся одним из наиболее популярных языков программирования в мире. Несмотря на ожесточённую конкуренцию в условиях лавинообразного развития информационных технологий, знание Си по-прежнему считается одним из признаков профессионализма. Претерпев некоторые изменения за время, прошедшее с момента его появления, он не только занял место основного языка во многих областях разработки программного обеспечения, но и стал основой для десятков новых языков программирования. Так, например, сегодня подавляющее большинство веб-сайтов в той или иной степени использует PHP. В разработке кроссплатформенных приложений значительное место занимает язык программирования Java. Технология AJAX, ставшая одной из основ Веб 2.0, одним из своих компонентов содержит JavaScript. Эти и многие другие языки в той или иной степени унаследовали синтаксис и основные концепции Си.
Си уже на протяжении многих лет остаётся основным языком системного программирования вообще и разработки операционных систем в частности. Большая часть компонентов операционных систем линейки Windows, семейства UNIX (в том числе и набирающая популярность Linux) написаны именно на этом языке, причём в основном это требовательные к скорости выполнения и размеру участки кода.
История создания языка программирования Си освещается весьма противоречиво и разнообразно. Помимо официальных сведений есть довольно забавные предположения о том, что причиной появления нового языка программирования стала насущная потребность его создателей в запуске любимой игры на одном из компьютеров своей лаборатории. Продолжает пользоваться успехом сообщение о признании отцов Си в том, что создание этого языка было первоапрельским розыгрышем. Между тем, настоящую историю его появления можно считать не менее интересной.
Точную дату появления языка Си назвать крайне затруднительно: Деннис Ритчи (Dennis Ritchie, один из создателей языка) в своей публикации «The Development of the C Language» называет 1969 – 1973 гг., отмечая при этом неразрывную связь Си с разрабатывавшейся в то же время операционной системой UNIX. Наиболее продуктивным назван 1972 г.
В конце 60-х годов XX века Кен Томпсон (Ken Thompson) из Bell Telephone Laboratories, где в то время велась разработка операционной системы Multics, задался целью создать удобную в использовании вычислительную среду, в которой предполагалось использование древовидной файловой системы, интерпретатора вводимых пользователем команд, а также общих принципов доступа к различным устройствам. Язык PL/1, широко использовавшийся в ходе разработки Multics, не удовлетворял всех запросов программистов, поэтому применялся ряд других языков, включая BCPL.
ЭВМ, с которой пришлось работать К. Томпсону начиная с 1968 г., была DEC PDP-7. Объём доступной памяти составлял 8 тысяч 18-битных слов, будучи даже по тем временам весьма небольшим. Кроме того, для этой ЭВМ не было программного обеспечения, которое могло бы быть полезным для К. Томпсона. Поэтому, желая работать с языком программирования высокого уровня, он написал оригинальную версию UNIX на ассемблере для PDP-7. Сам процесс разработки происходил на компьютере GE-635, с помощью которого генерировалась бумажная лента, а эта лента в свою очередь могла быть прочитана на PDP-7. Несмотря на все трудности К. Томпсону удалось создать примитивное ядро ОС, текстовый редактор, ассемблер, простую оболочку (интерпретатор команд) и несколько утилит, после чего новая ОС стала самодостаточной и стало возможным отказаться от использования бумажной ленты.
В 1969 г., вскоре после того, как UNIX была впервые запущена на PDP-7, Дуг МакИлрой (Doug McIlroy) создал первый язык программирования высокого уровня для новой системы – реализацию TMG, языка, который использовался для написания компиляторов. Между тем, К. Томпсон решил, что UNIX требуется язык системного программирования. Таким языком стал созданный самим К. Томпсоном язык B, который, по сути, представлял собой «BCPL, ужатый до 8 КБ памяти и профильтрованный мозгом Томпсона».
После того, как разработка языка B была завершена, он был переписан на самом себе. В ходе работы над B К. Томпсон постоянно вынужден был бороться с ограничениями в объёме доступной памяти: каждое усовершенствование языка приводило к увеличению размеров компилятора, но после того, как компилятор переписывался с использованием этого усовершенствования, удавалось уменьшить его размер. К примерам таких усовершенствований можно отнести операторы наподобие =+ (в Си этому оператору соответствует +=), ++ и -- (сохранились в Си без изменений).
Язык B также не смог в полной мере решить все задачи, которые стояли перед разработчиками: были проблемы в работе с указателями, строковыми данными и т.д. Поэтому в 1971 г. Д. Ритчи начал расширять его путём добавления символьного типа данных и поддержки новой ЭВМ – PDP-11. Результатом его работы стало создание языка, который оказался промежуточным звеном между B и Си и получил название NB («new B», новый B). Одним из важных достижений стала поддержка арифметики указателей, которая используется до сих пор, а разрешение проблемы, связанной с представлением массивов и структур, стало одним из основных событий в процессе перехода от нетипизированного языка BCPL к языку с типизацией Си, фактически завершив этот переход. По словам самого Д. Ритчи, он «решил последовать однобуквенному стилю и назвал его [новый язык] C, оставляя открытым вопрос о том, является ли это название результатом движения по алфавиту или буквам названия языка BCPL».
Дальнейшие изменения в Си производились с целью в той или иной степени упростить его и сделать более понятным. Значительное место в этом процессе отводится Алану Снайдеру (Alan Snyder). Именно ему приписывается идея введения операторов && и ||, а также, частично, идея использования препроцессора для поддержки механизма включения файлов, который существовал в BCPL и B.
К началу 1973 г. новый язык и его компилятор достигли уровня, достаточного для того, чтобы переписать ядро UNIX для PDP-11. В это же время начинается развитие языка в сторону его переносимости (portability). Здесь оказались очень кстати идеи условной компиляции и макросов, предложенные Майком Леском (Mike Lesk) и Джоном Рейзером (John Reiser). Прототипом современной стандартной библиотеки ввода-вывода стал «переносимый пакет ввода-вывода» («portable I/O package»), написанный М. Леском.
В 1978 г. Д. Ритчи и Брайан Керниган (Brian Kernighan) опубликовали книгу «The C Programming Language» («Язык программирования Си»). Несмотря на то, что в ней не затрагивались некоторые нововведения, которые вскоре получили широкое распространение, она на протяжении более чем 10 лет была руководством по языку до появления формального стандарта.
К 1982 г. стало понятно, что Си нуждается в стандартизации. Наилучшее приближение к стандарту – первая редакция K&R (книги Б. Кернигана и Д. Ритчи) – уже не соответствовала тому языку, который реально использовался: например, не было даже упоминания о типах void и enum. Кроме того, излишне акцентировалось внимание на отдельных аспектах языка. Поэтому летом 1983 г. для создания стандарта языка ANSI был сформирован комитет X3J11. Предполагалось, что созданный комитетом стандарт должен будет максимально полно отражать существующие особенности языка Си. Эта задача была успешно выполнена: единственным существенным нововведением стала необходимость указания типов формальных параметров в прототипах функций. Так, до появления стандарта объявление функции могло выглядеть так:
double sin();
По стандарту предполагался следующий вариант оформления:
double sin(double);
Незначительные нововведения, такие как модификаторы const или volatile, в целом не изменили характера языка, а стандарт стал скорее набором рекомендаций по эффективному программированию на Си, чем новым изобретением.
Значительное внимание было совершенно справедливо уделено стандартной библиотеке Си, поскольку сам язык Си не предполагал каких-либо средств взаимодействия «с окружающим миром», являясь изначально исключительно языком системного программирования.
Со временем у языка Си появилось много «наследников», среди которых сравнительно молодые Concurrent C, Objective C, C* и, особенно, C++. А сам язык часто используется в качестве промежуточного во многих компиляторах.
Две наиболее характерные черты языка Си и одновременно наиболее часто критикуемые – отношения между массивами и указателями, и сходство синтаксиса описаний с синтаксисом выражений. Во всех случаях особенности языка объясняются историческими событиями. Язык Си произошёл от языка без типизации, а не возник искусственным образом.
Важной особенностью языка Си также является возможность смешивания в выражениях целочисленных данных и указателей. Как компиляторы конца 70-х гг. XX века, так и современные компиляторы, не препятствуют этому явным образом. K&R Си предполагал, что обеспечение корректной работы подобных выражений является задачей программиста, что, очевидно, было слабым местом языка программирования и основным исправлением ANSI X3J11.
Успех языка Си объясняется множеством факторов. Несомненно, важнейшим из них является успех ОС UNIX. Не менее важно и то, что Си остаётся простым и компактным языком, который легко воспринимается людьми, которые знакомы с принципами работы компьютеров и оптимизации программ. В то же время язык в достаточной степени абстрагируется от особенностей конкретной ЭВМ. В равной степени важным фактором является то, что стандартная библиотека, как, впрочем, и сам язык, с течением времени претерпела весьма незначительные изменения. Язык Си изначально позиционировался как средство создания более сложных программных средств, он удовлетворяет минимальные потребности программиста, не пытаясь обеспечить его слишком большим набором готовых алгоритмов.