- •Предисловие
- •Введение
- •Введение в программирование
- •1.1. Предисловие к курсу
- •1.2. Идеология языка
- •1.3. Обзор среды Microsoft Developer Studio
- •1.4. Жизненный цикл программного обеспечения
- •1.5. Общая структура программы
- •1.6. Директивы препроцессора
- •1.7. Построение исполняемого файла
- •1.8. Строительные блоки программы
- •Контрольные вопросы
- •Типы данных. Переменные. Массивы. Операции и Указатели
- •Стандартные типы и размеры данных
- •2.1.1. Объявление переменных
- •Управляющие символьные константы
- •2.2. Объявление указателя
- •2.2.1. Операции разыменования и взятия адреса
- •2.2.2. Указатели на указатели
- •2.2.3. Арифметические операции с указателями
- •2.3. Массивы
- •2.3.1. Инициализация массивов
- •2.3.2 Динамические массивы
- •2.3.3. Методы доступа к элементам массивов
- •2.3.4. Массивы указателей
- •2.4. Строки
- •2.5. Операции
- •2.5.1. Арифметические операции
- •Арифметические операции
- •2.5.2 Операции сравнения и логические операции
- •Операции сравнения и логические операции
- •2.5.3. Побитовые операции
- •Побитовые операции
- •Контрольные вопросы
- •3.1. Базовые операторы
- •3.1.1. Оператор выражение
- •3.2.2. Оператор switch
- •3.3.4. Оператор goto
- •3.4. Операторы цикла
- •3.4.1. Оператор for
- •3.4.2. Оператор while
- •3.4.3. Оператор do..While
- •Контрольные вопросы
- •Стандартный ввод/вывод. Работа с файлами.
- •4.1. Роль стандартного ввода/вывода
- •4.1.1. Основные функции стандартного ввода/вывода
- •4.2. Понятие файла
- •4.2.1. Строение файлов
- •4.2.2. Порядок работы с файлом
- •4.2.3. Обзор библиотечных функций с для работы с файлами
- •4.3. Программные конструкции при работе с файлами
- •4.3.1. Открытие/закрытие файла
- •4.3.2. Цикл посимвольного чтения содержимого файла
- •4.3.3. Цикл построчного чтения содержимого файла
- •Контрольные вопросы
- •Функция. Пользовательские типы данных.
- •5.1. Понятие функции
- •5.1.1. Определение функции
- •5.1.2. Формальные параметры
- •5.1.3. Тип возвращаемого значения
- •5.1.4. Тело функции
- •5.1.5. Фактические параметры
- •5.1.6. Рекурсивные вызовы
- •5.1.7. Передача параметров
- •5.1.8. Библиотеки стандартных функций
- •5.2. Пользовательские типы данных.
- •5.2.1. Ключевое слово typedef
- •5.2.2. Перечислимый тип данных
- •5.2.3. Понятие структуры
- •5.2.4. Указатели на структурный объект
- •Контрольные вопросы
- •Работа с динамической памятью. Динамические структуры данных
- •6.1. Работа с динамической памятью
- •6.1.1. Статическое и динамическое распределение памяти
- •6.1.2. Основные принципы динамического распределения
- •6.1.3. Способы работы с динамической памятью
- •6.2. Динамические структуры данных
- •6.2.1. Стек
- •6.2.2.Линейный список
- •Контрольные вопросы
- •Объектно-ориентированное программирование
- •7.1. Критерии качества декомпозиции проекта
- •7.2. Новые концепции программирования
- •7.3. Достоинства ооп
- •7.4. Объекты и классы в ооп
- •7.4.1. Определение класса
- •7.4.2. Использование класса
- •7.4.3. Вложенные классы
- •Контрольные вопросы
- •Конструкторы и Перегрузка операций.
- •8.1. Перегрузка операций
- •8.1.1. Перегрузка операций внешними функциями
- •8.1.2. Перегрузка операций методами класса
- •8.2. Конструкторы и деструктор
- •8.2.1. Конструкторы и параметры
- •Контрольные вопросы
- •9.1. Простое открытое наследование
- •9.1.1 Конструкторы и деструкторы при наследовании
- •9.1.2. Поля и методы при наследовании
- •9.1.3. Вложенные классы и наследование
- •9.1.4. Закрытое наследование
- •9.1.5. Виртуальные функции
- •9.1.6. Чистые виртуальные функции и абстрактные классы
- •9.3. Основы программирования под Windows
- •9.3.1. Типы данных в Windows
- •9.4. Cреда Microsoft Developer Studio
- •9.4.1. Библиотека mfc
- •9.4.2. Архитектура приложения
- •9.4.3. Каркас приложения
- •9.4.4. Проект приложения
- •Контрольные вопросы
- •Заключение
- •Список Литературы
Контрольные вопросы
1. Какие методы проектирования ПО вы знаете?
2. Перечислите характерные особенности языка С/С++.
3. Приведите основные блоки программы С/С++.
4. Построение исполняемого файла С/С++.
5. Состав языка С/С++.
6. Общая структура программы на языке С/С++.
7. Директивы препроцессора.
8. Какие вы знаете жизненные циклы программного обеспечения?
Лекция 2.
Типы данных. Переменные. Массивы. Операции и Указатели
2.1. Организация данных в С/С++
В языке С/С++ имеется набор встроенных или базовых типов, на основе которых в дальнейшем можно конструировать пользовательские типы. Каждый тип означает вид хранимых данных и определяет, сколько памяти в байтах необходимо отвести для хранения одного значения. Будем считать, что для хранения одного значения выделяется ячейка соответствующего размера. В C++ существуют несколько часто используемых типов данных (не все):
- численные знаковые целые (int, short, char);
- численные знаковые дробные (float, double, long (в С), long double (в С);
- численные беззнаковые - все перечисленные выше типы с добавлением Unsigned;
- сhar так же может использоваться, как символьный тип.
Кроме перечисленных типов данных в С++ добавляется еще два – это bool и wchar_t.
Язык С\С++ позволяет создавать пользовательские типы данных, которые определяются самим пользователем.
Стандартные типы и размеры соответствующих ячеек приведены в табл. 4.
Таблица 4
Стандартные типы и размеры данных
№ |
Тип |
Диапазон значений |
Размер (Байт) |
1 |
char |
-128..127 |
1 |
2 |
unsigned char |
0..255 |
1 |
3 |
int |
-32 768.. 32 767 |
2 |
4 |
unsigned int |
0..65535 |
2 |
5 |
long |
-2 147 483 648..2 147 483 647 |
4 |
6 |
unsigned long |
0..4 294 967 295 |
4 |
7 |
float |
3.4e-38..3.4e+38 |
4 |
8 |
double |
1.7e-308..1.7e+308 |
8 |
9 |
long double |
3.4e-4932..3.4e+4932 |
10 |
Для того чтобы узнать размер ячейки соответствующего типа, достаточно написать в программе sizeof (тип). Дело в том, что для различных ОС размеры ячейки одного типа могут отличаться (например, тип int в 16- и 32-разрядных ОС, 1 байт и 2 байта соответственно).
Оператор sizeof вычисляет размер своего операнда в байтах. Операнд должен быть выражением, которое не вычисляется, или именем типа в скобках. Оператор sizeof нельзя применить к функции, битовому полю, неопределенному классу, типу void или к массиву с неуказанными границами индексов. Байт никак не определяется языком, кроме как результатом операции sizeof, а именно sizeof (char) есть 1.
2.1.1. Объявление переменных
Переменная - это именованная область памяти, значение которой может изменяться в процессе выполнения программы.
Переменная представляет собой имя ячейки памяти, которая используется для хранения модифицируемого значения. Чтобы память была доступна программе для использования, она должна быть закреплена за ней.
Существует статическое и динамическое выделение памяти. Статическое выделение памяти происходит на этапе компиляции, и размер блока не может быть изменен в течение времени выполнения программы. Динамическая память выделяется именно в процессе выполнения, и ее размер может зависеть от текущего состояния программы. Участок памяти, закрепленный за программой, используется для хранения данных. Если данные меняются в процессе работы, то говорят об использовании переменных, если нет – то констант. Для доступа к переменной или константе необходимо использовать имя или адрес.
Все переменные должны быть объявлены для своего использования, для того чтобы компилятор смог выделить статическую память, поэтому ему требуется знать ее точный размер. Для того чтобы объявить переменную, необходимо указать: имя, адрес, размер (определяемый типом) и значение.
Например:
char a;
int b,c;
double d;
Переменные, объявленные внутри функции, называются локальными. Если переменная объявлена вне тел функций, то она считается глобальной и размещается в сегменте данных, а ее начальное значение равно нулю. Объявление переменной с присвоением ей начального значения называется инициализацией.
Если функция имеет аргумент, следует объявить переменные, которые будут принимать их значения, эти переменные называются формальными.
В языке С++ существуют два квалификатора, управляющих доступом и модификацией: const и volatile.
Константа – это именованная область памяти, значение которой не может изменяться в процессе выполнения программы. Константам всегда присваивается некоторое значение при объявлении, и оно не может быть изменено в дальнейшем. Переменные типа const не могут изменяться, однако их можно инициализировать.
Пример:
const char a=’\n’;
const int b=0,c=1;
const double d=2.121.
Квалификатор volatile сообщает компилятору, что значение переменной может изменяться неявно. Например, адрес глобальной переменной передать таймеру операционной системы и использовать его для отсчета реального времени. В этом случае содержимое переменной изменяется без явного выполнения какого-либо оператора присваивания.
Особо следует отметить символьный тип (char). Формально символьный тип хранит числа в диапазоне от -128 до 127. Ячейка памяти, отводимая под char, занимает ровно 1 байт памяти, поэтому тип char можно использовать для представления одного байта памяти.
Помимо этого, данный тип используют для хранения кода символа, согласно кодовой таблице ASCII. Коды символов лежат в диапазоне от 0 до 255. Символ с кодом 0 является зарезервированным и используется для обозначения конца строки в памяти. При работе с символьными константами можно использовать два представления:
- кодовое: char ch=33; – в ячейку ch заносится символ “!” с кодом 33;
- символьное: char ch=’!’; – то же самое.
Оба представления можно считать одинаковыми, поскольку в памяти, в конечном итоге, хранятся числа, а не символы. Второй способ является предпочтительным, поскольку задается начертание символа, и при изучении программы это улучшает ее ясность. Все символы можно разделить на две группы: видимые и служебные. Видимые символы используются для представления текста (в этот набор входит также пробел, символ с кодом 32, обозначаемый как ’ ’). Коды видимых символов лежат в диапазоне от 32 до 255. Служебные символы используются в программе для вспомогательных действий, например, для форматирования текста.
В языке С/С++ предусмотрены управляющие символьные константы, которые приведены в табл. 5.
Таблица 5