- •ОГЛАВЛЕНИЕ
- •ВВЕДЕНИЕ
- •1. ЯЗЫК ПРОГРАММИРОВАНИЯ C++
- •1.1. Нововведения C++ в сравнении с C
- •1.3. Технический обзор
- •2. ЛАБОРАТОРНАЯ РАБОТА № 1 «Знакомство с языком C++. Основные функции»
- •2.1. Методические указания
- •2.1.1. Алфавит C++
- •2.1.2. Этапы создания исполняемой программы
- •2.1.3. Типы данных C++
- •2.1.3.1. Концепция типа данных
- •2.1.3.2. Простые типы данных
- •2.1.4. Структура программы на языке C++
- •2.1.5. Директивы препроцессора
- •2.1.5.1. Директива #include
- •2.1.5.2. Директива #define
- •2.1.6. Предварительные замечания о функциях ввода/вывода
- •2.1.7. Переменные и выражения
- •2.1.7.1. Переменные
- •2.1.7.2. Операции
- •2.1.7.3. Выражения
- •2.1.8. Основные функции
- •2.1.8.1. Математические функции
- •2.1.8.2. Функции обработки сигналов
- •2.1.8.3. Функции ввода-вывода в стиле C
- •2.1.8.4. Функция работы с датой и временем
- •2.1.8.5. Функции локализации
- •2.1.8.6. Функции классификации и преобразования символов
- •2.1.8.7. Функции управления программой
- •2.1.8.8. Различные функции в стиле C
- •2.2. Примеры программ для выполнения лабораторной работы № 1
- •2.3. Вопросы для самоконтроля
- •3. ЛАБОРАТОРНАЯ РАБОТА № 2 «Программирование с использованием основных операторов языка C++. Работа с массивами»
- •3.1. Методические указания
- •3.1.1. Основные операторы языка С++
- •3.1.1.1. Базовые конструкции структурного программирования
- •3.1.1.2. Составные операторы
- •3.1.1.3. Операторы выбора
- •3.1.1.4. Операторы циклов
- •Цикл с предусловием (while)
- •Цикл с постусловием (do while)
- •Цикл с параметром (for)
- •3.1.1.5. Операторы передачи управления
- •Оператор goto
- •Оператор break
- •Оператор continue
- •Оператор return
- •3.1.2. Одномерные массивы
- •3.1.2.1. Описание массива в C/C++
- •3.1.2.2. Обработка одномерных массивов
- •3.1.2.3. Перебор массива по одному элементу
- •3.1.2.4. Датчика случайных чисел для формирования массива.
- •3.1.3. Многомерные массивы
- •3.2. Примеры программ для лабораторной работы № 2
- •3.3. Вопросы для самоконтроля
- •3.4. Варианты заданий к лабораторной работе № 2
- •4. КУРСОВАЯ РАБОТА «Создание собственной функции»
- •4.1. Методические указания
- •4.1.1. Объявление и определение функций
- •Глобальные переменные
- •Возвращаемое значение
- •4.1.2. Параметры функции
- •4.2. Вопросы для самоконтроля
- •4.3. Варианты заданий курсовой работы
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Список литературы
- •Направление – _____________________________________________
- •Кафедра –
- •Выполнил студент гр. _______ __________ _______ ______________
- •Направление – ________________________________________________
- •Выполнил студент гр. _______ __________ _______ __________
4.1. Методические указания
Общие методические указания по определению вариантов курсовой работы и сами варианты приведены в методических указаниях для студентов ИДО, обучающихся по направлению 220700 «Автоматизация технологических процессов и производств» по курсу «Информатика». В данном учебно-методическом пособии представлены общие теоретические и практические сведения для выполнения курсовой работы. Следует напомнить, что отчёт по курсовой работе должен состоять из следующих пунктов:
1)титульный лист;
2)цель работы;
3)формулировку заданий;
4)теоретическую часть;
5)код программы на C++;
6)алгоритм программы, представленный в виде блок-схемы;
7)результаты работы программы;
8)выводы по работе;
9)список литературы.
Шаблон титульного листа пояснительной записки к курсовой работе представлен в Приложении B. Каждый вариант ИДЗ состоит из одного задания на создание собственной функции.
Для курсовой работы имеется 10 вариантов. Вариант задания выбирается в соответствии с последней цифрой шифра зачетной книжки студента, 0 соответствует 10-му варианту. Например, для шифра З-8А11/01 должен быть выбран вариант 1, а для шифра З-8А10/10 – вариант 10.
4.1.1. Объявление и определение функций
Функция – это именованная последовательность описаний и операторов, выполняющая какое-либо законченное действие. Функция может принимать параметры и возвращать значение [4].
С помощью функций задача может быть разделена на более простые и обозримые, после чего программу можно рассматривать в более укрупненном виде – на уровне взаимодействия функций. Использование функций является первым шагом к повышению степени абстракции программы и ведет к упрощению ее структуры.
Разделение программы на функции позволяет также избежать избыточности кода, поскольку функцию записывают один раз, а вызывать ее на выполнение можно из разных точек программы многократно.
95
Процесс отладки программы, содержащей функции, можно лучше структурировать. Часто используемые функции можно помещать в библиотеки. Таким образом создаются более простые в отладке и сопровождении программы
Любая программа на С++ состоит из функций, одна из которых должна иметь имя main (с нее начинается выполнение программы).
Функция начинает выполняться в момент вызова. Любая функция должна быть объявлена и определена. Как и для других величин, объявлений может быть несколько, а определение только одно.
Объявление функции должно находиться в тексте раньше ее вызова для того, чтобы компилятор мог осуществить проверку правильности вызова.
Объявление функции (прототип, заголовок, сигнатура) задает ее имя, тип возвращаемого значения и список передаваемых параметров.
Определение функции содержит, кроме объявления, тело функции, представляющее собой последовательность операторов и описаний в фигурных скобках [6]:
[ класс ] тип имя ([ список_параметров ])[throw ( исключения )] { тело функции }
Рассмотрим составные части определения.
∙ С помощью необязательного модификатора класс можно явно задать область видимости функции, используя ключевые слова extern и static:
extern – глобальная видимость во всех модулях программы (по умолчанию);
static – видимость только в пределах модуля, в котором определена функция.
∙Тип возвращаемого функцией значения может быть любым, кроме массива и функции (но может быть указателем на массив или функцию). Если функция не должна возвращать значение, указывается тип void.
∙Список параметров определяет величины, которые требуется передать в функцию при ее вызове. Элементы списка параметров разделяются запятыми. Для каждого параметра, передаваемого в функцию, указывается его тип и имя (в объявлении имена можно опускать).
В определении, в объявлении и при вызове одной и той же функции типы и порядок следования параметров должны совпадать.
На имена параметров ограничений по соответствию не накладывается.
Функцию можно определить как встроенную с помощью модификатора inline, который рекомендует компилятору вместо обращения к
96
функции помещать ее код непосредственно в каждую точку вызова. Модификатор inline ставится перед типом функции. Он применяется для коротких функций, чтобы снизить накладные расходы на вызов.
Директива inline носит рекомендательный характер и выполняется компилятором по мере возможности.
Тип возвращаемого значения и типы параметров совместно определяют тип функции.
Для вызова функции в простейшем случае нужно указать ее имя, за которым в круглых скобках через запятую перечисляются имена передаваемых аргументов.
Вызов функции может находиться в любом месте программы, где по синтаксису допустимо выражение того типа, который формирует функция. Если тип возвращаемого функцией значения не void, она может входить в состав выражений или, в частном случае, располагаться в правой части оператора присваивания.
Пример 48. Функция, возвращающая сумму двух целых величин.
#include <iostream.h>
int sum(int a, int b); // объявление функции int main()
{
int a = 2, b = 3, c, d;
c = sum(a, b);//вызов функции cin >> d;
cout << sum(c, d); // вызов функции
}
int sum(int a, int b)// определение функции
{
return (a+b);
}
Пример 49. Функция, выводящая на экран поля переданной ей
структуры.
#include <iostream.h> struct Worker
{
char fio[30]; int date, code; float salary;
};
void print_worker(Worker);//объявление функции int main()
97
{
Worker stuff[100];
/* формирование массива stuff */ for(int i=0;i<100; i++)
print_worker(stuff[i]);/*вызов функции */
}
void print_worker(Worker w)//определение функции
{
cout<<w.fio<<' '<<w.date<<' '<<w.code<<' '<< w.salary;
}
Все величины, описанные внутри функции, а также ее параметры, являются локальными. Областью их действия является функция. При вызове функции, как и при входе в любой блок, в стеке выделяется память под локальные автоматические переменные.
При выходе из функции соответствующий участок стека освобождается, поэтому значения локальных переменных между вызовами одной и той же функции не сохраняются. Если этого требуется избежать, при объявлении локальных переменных используется модификатор static [1].
Пример 50
#include <iostream.h> void f(int a)
{
cout << "n m\n"; while (a--)
{
static int n = 0; int m = 0;
cout << n++ << ' ' << m++ << '\n';
}
}
int main()
{
f(3);
}
Статическая переменная n примера 50 размещается в сегменте данных и инициализируется один раз при первом выполнении оператора, содержащего ее определение. Программа выведет на экран:
98