- •Оглавление
- •1.2. Свойства языков программирования
- •1.3. Основные парадигмы программирования Процедурное программирование
- •Модульное программирование
- •Абстракция данных
- •Объектно-ориентированное программирование
- •Непечатные символы
- •Тема 2 Типы данных
- •2.1. Понятие переменной и объявление переменных
- •Объявление переменных
- •Встроенные типы данных
- •Размер памяти, выделяемой под встроенные типы данных
- •2.2. Константы и перечисления Константные переменные
- •Перечисления
- •2.3. Операции и выражения
- •Мультипликативные операции
- •Операции сравнения
- •Побитовые логические операции
- •Побитовые операции
- •Комментарии
- •Оператор while(пока)
- •Оператор do/while(выполнять/пока)
- •Оператор for(цикл)
- •Оператор множественного выбора switch
- •Операторы breakиcontinue
- •Тема 4 Массивы
- •4.1.Определение, объявление и инициализация массивов
- •Объявления и инициализация массивов в программе
- •4.2. Сортировка массивов Пузырьковая сортировка
- •Сортировка вставками
- •4.3. Поиск в массивах Линейный поиск
- •Двоичный поиск
- •4.4. Многомерные массивы
- •Тема 5 Указатели Объявления и инициализация переменных указателей
- •5.1. Операции над указателями
- •5.2. Выражения и арифметические действия с указателями
- •5.3. Взаимосвязи между указателями и массивами
- •5.4. Массивы указателей
- •5.5. Динамическое выделение памяти под массивы
- •Тема 6 Функции
- •6.2. Определения функций
- •Генерация случайных чисел
- •6.3. Классы памяти и область действия Классы памяти
- •Область действия
- •6.4. Рекурсия
- •6.5. Ссылки и ссылочные параметры
- •Вызов функций по ссылке с аргументами указателями
- •6.6. Использование спецификатораconstс указателями
- •6.7. Перегрузка функций
- •Аргументы по умолчанию
- •6.8. Передача массивов в функции
- •6.9. Указатель на функцию
- •6.10. Командная строка аргументов
- •6.11 Неопределенное количество аргументов
- •Тема 7 Введение в обработку строк
- •7.1. Работа со строками в с
- •Понятие символов и строк в с
- •Функции для работы со строками
- •Определение длины строки
- •Сложение двух строк (конкатенация)
- •Добавление к исходной строке указанного количества символов.
- •Копирование строки в другую строку
- •Сравнение строк
- •Получение строки от пользователя
- •Тема 8 Работа с файлами
- •Открытие файла
- •Чтение из файла символа или строки символов
- •Запись символа или строки символов в файл
- •Смещение внутри файла
- •Значения параметра fromwhereфункцииfseek
- •Закрытие файла
- •Тема 9 Компоновка программ и препроцессор
- •9.1. Компоновка программ
- •Проблема использования общих функций и имен
- •Использование включаемых файлов
- •9.2. Препроцессор
- •Определение макросов
- •Условная компиляция
- •Дополнительные директивы препроцессора
- •Тема 10 Структуры
- •10.1. Определение структур и доступ к элементам
- •Доступ к элементам структур
- •Использование структур
- •10.2. Битовые поля
- •10.3. Объединения
- •10.4. Построение связных списков на основе структур с самоадресацией
- •Создание простого связного списка
- •Очереди
- •Деревья
- •Список рекомендуемой литературы
Тема 6 Функции
6.1. Программные модули в С++
Большинство компьютерных программ, решающих реальные практические задачи, намного превышают по объему те программы, которые были представлены ранее [1]. Экспериментально доказано, что наилучшим способом создания и поддержки больших программ является их конструирование из маленьких фрагментов или модулей, каждый из которых более управляем, чем сложная программа. Эта техника называется «разделяй и властвуй».
Модули в С++ называются функциямииклассами.
Функция– это именованный блок программы, созданный для решения одной небольшой задачи.Класс– это абстрактный тип данных. Обычно программы на С++ пишутся путем объединения новых функций, которые пишет сам программист, с функциями, уже имеющимися в стандартной библиотеке С, и путем объединения новых классов, которые пишет сам программист, с классами, уже имеющимися в различных библиотеках классов.
Стандартная библиотека С обеспечивает широкий набор функций для выполнения типовых математических расчетов, операций со строками, с символами, ввода-вывода, проверки ошибок и многих других полезных операций. Если возможно, нужно использовать стандартную библиотеку ANSI С вместо того, чтобы писать новые функции.
Рис. 6.1. Вызовы функций
Программист может написать функции, чтобы определить, какие-то специфические задачи, которые можно использовать в разных местах программы. Эти функции называют функциями, определенными пользователем. Операторы, реализующие данную функцию, пишутся только один раз и скрыты от других функций.
Функция активизируется(т.е. начинает выполнять запроектированную для нее задачу) путемвызова функции.В вызове функции указывается ее имя и дается информация (в видеаргументов), необходимая вызываемой функции для ее работы.
Начальник (вызывающая функция или вызывающий оператор) просит подчиненного (вызываемую функцию) выполнить задание и возвратить (т.е. сообщить) результаты после того, как задание выполнено (см. рис. 6.1.). Функция-начальник не знает, как функция-подчиненный выполняет порученное ей задание.
6.2. Определения функций
Рассмотрим программу, которая использует функцию squareдля вычисления квадратов целых чисел от 1 до 10 (см. рис. 6.2.).
Функция создает копию значения хв параметреу. Затемsquareвычисляету*у. Результат передает в ту точкуmain, из которой была вызванаsquare, и затем этот результат выводится на экран.
Описание squareпоказывает, что эта функция ожидает передачи в нее целого параметрау. Ключевое словоint, предшествующее имени функции указывает, чтоsquareвозвращает целый результат. Операторreturnвsquareпередает результат вычислений обратно в вызывающую функцию.
Функция не может быть определена внутри другой функции.
#include <iostream>
using namespace std;
int square (int);
int main()
{
for (int x = 1; x<=10; x++)
cout << square (x) << " ";
cout << endl;
return 0;
}
int square (int y)
{
return y*y;
}
Рис. 6.2. Программа, вычисляющая квадраты целых чисел
Строка
int square (int);
называется прототипом функции. Прототип функции указывает компилятору тип данных, возвращаемых функцией, количество параметров, которое ожидает функция, тип параметров и ожидаемый порядок их следования. Компилятор использует прототип функции для проверки правильности вызовов функции. Вызов функции, который не соответствует прототипу функции, ведет к синтаксической ошибке.
Другой важной особенностью прототипов функций является приведение типов аргументов, т.е. задание аргументам подходящего типа. Например, оператор
cout << sqrt (4);
правильно вычисляет и печатает значение квадратного корня 4. Функцияsqrtбиблиотеки математических функций принимает значение типаdouble. Прототип функции заставляет компилятор преобразовать целое значение4в значение4.0типаdouble, прежде чем значение будет передано вsqrt.
Преобразования типов могут привести к неверным результатам, если не руководствоваться правилами приведения типовС++. Правила приведения определяют, как типы могут быть преобразованы в другие типы без потерь.
Правила приведения типов применяются к выражениям, содержащим значения двух или более типов данных; такие выражения относятся к выражениям смешанного типа. Тип каждого значения в выражениях смешанного типа приводится к «наивысшему» типу, имеющемуся в выражении (на самом деле создается и используется временная копия выражения – истинные значения остаются неизменными).
Задача. Определить максимальное из трех чисел (рис. 6.3.).
#include <iostream>
using namespace std;
int maximum (int, int, int);
int main(){
int a,b,c;
cout << "Enter 3 integers: ";
cin >> a >> b >>c;
cout << "Maximum is: " << maximum(a,b,c) << endl;
return 0;}
int maximum (int x, int y, int z){
int max = x;
if (y > max) max = y;
if (z>max) max = z;
return max;
}
Рис. 6.3. Программа, вычисляющая максимальное из трех чисел