- •Введение
- •1Основы программирования Тема 1.1. Введение в программирование
- •1.1.1Основные понятия программирования
- •1.1.2Первая программа
- •1.1.3Комментарии
- •1.1.4Переменные и типы данных
- •1.1.5Ключевые слова и идентификаторы
- •1.1.6Вывод информации на экран
- •1.1.8Вывод русских букв
- •1.1.9Простые вычисления
- •1.1.10Контрольные вопросы
- •Тема 1.2. Математические вычисления
- •1.2.1Операции и выражения
- •1.1.7Ввод информации с клавиатуры
- •1.2.2Оператор присваивания
- •1.2.3Приоритет операций
- •1.2.4Смешанные выражения и преобразование типов
- •1.2.5Явное преобразование типов
- •1.2.6Функции и их аргументы
- •1.2.7Математические функции
- •1.2.8Контрольные вопросы
- •Тема 1.3. Условный оператор if-else
- •1.3.1Примеры использования условных операторов
- •1.3.2Конструкция if-else
- •1.3.3Оператор ?: и сокращенная запись для if-else
- •1.3.4Логические операторы и выражения
- •1.3.5Использование оператора if без ветки else
- •1.3.6Лесенка if-else-if
- •1.3.7Контрольные вопросы
- •Тема 1.4. Условный оператор switch-case
- •1.4.1Синтаксис оператора switch-case
- •1.4.2Исключение операторов break из switch
- •1.4.3Реализация простого консольного меню
- •1.4.4Контрольные вопросы
- •Тема 1.5. Символы и строки
- •1.5.1Объявление и вывод строк
- •1.5.2Кавычки и апострофы
- •1.5.3Ввод русских символов
- •1.5.4Контрольные вопросы
- •2Циклы и массивы Тема 2.1. Цикл на базе if и goto
- •2.1.1Синтаксис оператора goto
- •2.1.2Использование оператора goto при реализации меню
- •2.1.3Оператор goto и игра «Угадай число!»
- •2.1.4Реализация цикла на базе if и goto
- •2.1.5Контрольные вопросы
- •Тема 2.2. Циклы while и do-while
- •2.2.1Назначение циклов и базовые понятия
- •2.2.2Цикл while
- •2.2.3Условие, вложенное в цикл
- •2.2.4Обработка данных в цикле
- •2.2.5Неизвестное число итераций
- •2.2.6Цикл do-while
- •2.2.7Перевод числа в другую систему счисления
- •2.2.8Бесконечный цикл while
- •2.2.9Контрольные вопросы
- •Тема 2.3. Цикл for
- •2.3.1Предпосылки к созданию цикла for
- •2.3.2Синтаксис цикла for
- •2.3.3Вариации цикла for
- •2.3.4Оператор break
- •2.3.5Бесконечный цикл for
- •2.3.6Контрольные вопросы
- •Тема 2.4. Массивы
- •2.4.1Зачем нужны массивы?
- •2.4.2Объявление массива
- •2.4.3Работа с массивом заранее неизвестного размера
- •2.4.4Сравнение и присваивание массивов
- •2.4.5Вычисление суммы элементов массива
- •2.4.6Подсчет количества элементов с нужным свойством
- •2.4.7Поиск элемента в массиве
- •2.4.8Нахождение максимального элемента в массиве
- •2.4.9Контрольные вопросы
- •Тема 2.5. Обработка строк
- •2.5.1Подготовка к работе
- •2.5.2Поиск символа в строке
- •2.5.3Вывод символов с определенным свойством
- •2.5.4Контрольные вопросы
- •3Процедуры и функции Тема 3.1. Процедуры
- •3.1.1Подпрограммы, функции, процедуры
- •3.1.2Создание и вызов процедуры
- •3.1.3Пример создания процедуры
- •3.1.4Пример вызова процедуры
- •3.1.5Распространенная ошибка
- •3.1.6Процедуры с аргументами
- •3.1.7Название процедуры
- •3.1.8Формальные и фактические аргументы
- •3.1.9Тело процедуры
- •3.1.10Создание нескольких процедур
- •3.1.11Создание заголовочного файла
- •3.1.12Контрольные вопросы
- •Тема 3.2. Функции
- •3.2.1Возвращаемое значение
- •3.2.2Определение и вызов функции
- •3.2.3Название функции
- •3.2.4Формальные и фактические аргументы
- •3.2.9Контрольные вопросы
- •3.2.5Тело функции
- •3.2.6Оператор return
- •3.2.7Глобальные и локальные переменные
- •3.2.8Прототипы функций
- •Тема 3.3. Рекурсивные функции
- •3.3.1Понятие рекурсивной функции
- •3.3.2Рекурсивные процедуры
- •3.3.3Рекурсивные функции, принимающие более одного аргумента
- •3.3.4Контрольные вопросы
- •Тема 3.4. Логические функции
- •3.4.1Примеры громоздких логических конструкций
- •3.4.2Создание и вызов логической функции
- •3.4.3Сравнивать с true не обязательно
- •3.4.4Вызов логических функций внутри циклов
- •3.4.5Контрольные вопросы
- •Тема 3.5. Прикладной программный интерфейс (api)
- •3.5.1 Простой вложенный цикл
- •3.5.2Вынесение вложенного цикла в функцию
- •3.5.3Зависимость вложенных циклов
- •3.5.4 Два цикла, вложенные в третий
- •3.5.5Понятие api
- •3.5.6Вложенные циклы и вывод цифр
- •3.5.7Контрольные вопросы
- •4Простые структуры данных Тема 4.1. Матрицы
- •4.1.1Основные понятия
- •4.1.2Объявление матрицы
- •4.1.3Инициализация матрицы
- •4.1.4Вывод матрицы на экран
- •4.1.5Вывод ровных столбцов матрицы
- •4.1.6Заполнение матрицы в автоматическом режиме
- •4.1.7Работа с матрицей заранее не известного размера
- •4.1.8Заполнение матрицы случайными числами
- •4.1.9Заполнение матрицы с условием
- •4.1.10Обработка матрицы
- •4.1.11Обработка строк и столбцов
- •4.1.12Комбинированная обработка матрицы
- •4.1.13Контрольные вопросы
- •Тема 4.2. Массивы строк
- •4.2.1Объявление и инициализация массива строк
- •4.2.2Присвоение элементов массива строк
- •4.2.3Вывод и ввод массива строк
- •4.2.4Обращение к отдельным символам массива строк
- •4.2.5Сортировка массива строк
- •4.2.6Пример работы с массивом строк
- •4.2.7Контрольные вопросы
- •Тема 4.3. Файлы
- •4.3.1Запись информации в файл
- •4.3.2Чтение информации из файла
- •4.3.3Распространенная ошибка
- •4.3.4Контрольные вопросы
- •Тема 4.4. Структуры
- •4.4.1Причины использования структур
- •4.4.2Объявление структуры
- •4.4.3Обращение к полям структуры и оператор «точка»
- •4.4.4Ввод и вывод содержимого структуры
- •4.4.5Вложенные структуры
- •4.4.6Массив структур
- •4.4.7Вывод массива структур в виде таблицы
- •4.4.8Сортировка массива структур
- •4.4.9Передача структур в качестве аргументов функций
- •4.4.10Возврат структуры в качестве значения функции
- •4.4.11Контрольные вопросы
- •Тема 4.5. Реализация динамических структур данных на основе массива
- •4.5.1Пометка элементов
- •4.5.2Пометка элементов с оберткой
- •4.5.3Реализация стека на основе массива
- •4.5.4Реализация очереди на основе массива
- •4.5.5Реализация списка на основе массива
- •4.5.6Контрольные вопросы
- •Глоссарий
- •Литература
- •Основное (обязательное) обеспечение
- •Дополнительное обеспечение
1.2.2Оператор присваивания
Один из наиболее важных и часто применяемых операторов – это оператор присваивания. Задача данного оператора состоит в присвоении переменной определенного значения. При объявлении переменной происходит выделение ячейки памяти под эту переменную, а присвоение значения заключается в занесении значения в эту ячейку памяти. Символом оператора присваивания является знак «равно». Например, запись number = 10 означает, что переменной number присваивается значение 10.
Элемент слева от знака присваивания должен быть именем переменной, а значение справа – выражением. Причем в этом выражении может присутствовать и переменная, которой присваивается значение. В частности, для увеличения переменной x на единицу можно воспользоваться следующей записью: x=x+1.
1.2.3Приоритет операций
Рассмотрим следующий фрагмент кода:
result = 5*x*x – 2*y + 10/z;
Результат будет различным, если изменять порядок операций. Для примера положим, что x=2, y=3, а z=5. Если выполнить вначале все умножения и деление, а затем вычислить результаты сложения и вычитания, то переменная result будет равна 16, но, если вначале выполнить вычитание и сложение, то результат будет равен 0.
Рассмотренный пример говорит о том, что во избежание подобных неоднозначностей язык программирования должен иметь правило, регламентирующее порядок выполнения операций. Такое правило существуют, и основано оно на понятии приоритета операций. Правило заключается в том, что каждой операции назначается приоритет, и операции, имеющие более высокий приоритет, выполняются раньше. Если несколько операций имеют одинаковый приоритет, то они выполняются в установленном для них порядке. Приоритеты арифметических операций соответствуют правилам математики. Сменить приоритет можно с использованием скобок:
result = 5*x * (x–2)*(y+10)/z;
1.2.4Смешанные выражения и преобразование типов
Обычно в выражениях присутствуют переменные и константы одного типа, но некоторые выражения могут содержать переменные и константы разных типов; такие выражения называют смешанным. Для примера рассмотрим следующую задачу.
Задана цена булки хлеба в рублях и количество купленных булок хлеба; требуется вычислить стоимость всей покупки. В данной задаче цену следует объявить c вещественным типом, поскольку в дробную часть попадут копейки; в то же время количество булок хлеба является целым числом. Программа выглядит так:
//Цена булки составляет 12 рублей 50 копеек
double price = 12.5;
//Куплено 3 булки хлеба
int quantity = 3;
//Стоимость покупки
double total = price*quantity;
При обнаружении различных типов данных в одном выражении происходит автоматическое преобразование типов по определенным правилам. Основное правило заключается в том, что более узкие типы преобразуются к более широким. Например, если в выражении присутствуют переменные типов int и double, то результат будет иметь тип double.
1.2.5Явное преобразование типов
В смешанном выражении преобразование типов происходит автоматически согласно перечисленным правилам. Возможно также и ручное или явное преобразование типов, называемое по-другому приведение типов. Это означает, что программист сам указывает, к какому типу следует преобразовать выражения. Данная операция – операция явного преобразования типа – выглядит следующим образом:
(<тип>) <выражение>;
int x = (int) 13.67;
double y = 1/(double)7;
Рассмотрим один пример. Операция деления чисел, обозначаемая знаком /, является в некотором смысле интеллектуальной: дело в том, что способ выполнения данной операции зависит от типов ее операндов. Если провести аналогию с языком Pascal, то можно вспомнить, что в нем присутствует дополнительная операция деления нацело, обозначаемая через div. Эта операция применима только к целым числам, и ее результатом также является целое число. В языке C++ отсутствует аналог операции div, но, если оба операнда имеют целый тип, то операция / действует подобно div. Проблема возникает тогда, когда вы хотите поделить не нацело, а получить вещественный результат. Очевидный, казалось бы, способ проблему не решит:
double result = 10/3;
Результатом этой операции будет вещественное число 3.0, поскольку вначале выполнится деление нацело, и получится результат 3, а затем при помощи автоматического преобразования типов число 3 превратится в 3.0. Для того чтобы заставить операцию деления поделить так, как нам нужно, следует использовать явное преобразование типов:
double result= (double) 10/3;
Теперь получится 3.333333. Другим способом решить данную проблему является дописывание точки:
double result= 10.0/3;
