- •1.1. Элементы языка программирования
- •Основные правила записи программы:
- •1.2. Алфавит языка
- •1.3. Лексемы
- •1.4. Концепция данных
- •2.2. Операции
- •2.2.1. Арифметические операции
- •2.2.2. Операции присваивания
- •2.2.3. Операции отношения
- •2.2.4. Логические операции
- •2.2.5. Поразрядные операции
- •2.2.6. Вычисление выражений
- •3. Структурное программирование
- •3.1. Общая характеристика операторов
- •3.2. Оператор-выражение
- •3.3. Условный оператор
- •3.4. Составной оператор
- •3.5. Операторы для программирования циклов
- •3.5.1. Оператор цикла for
- •3.5.2. Оператор цикла while
- •3.5.3. Оператор цикла do while
- •3.5.4. Оператор break
- •3.5.5. Оператор continue
- •3.6. Оператор goto
- •3.7. Пустой оператор
- •3.8. Оператор switch
- •3.9. Оператор return
- •4. Массивы
- •4.1. Объявление массива
- •4.2. Обращение к элементам массива
- •4.3. Типовые алгоритмы работы с массивами
- •4.4. Многомерные массивы
- •5. Строки
- •5.1. Объявление строки
- •5.2. Посимвольная обработка строк
- •5.3. Ввод строк
- •5.4. Библиотечные функции для работы с текстом
- •6. Указатели
- •6.1. Объявление указателей
- •6.2. Операции над указателями
- •6.3. Связь между указателями и массивами
- •6.4. Функция strtok для выделения лексем из текста
- •6.5. Динамические массивы
- •7. Структуры и объединения
- •7.1. Объявление структуры
- •Компонент структуры может быть любого типа, кроме типа объявляемой структуры.
- •7.2. Операции над структурами
- •7.3. Объявление объединения
- •8. Модульное программирование
- •8.1. Нисходящее проектирование и программирование
- •8.2. Определение и вызов функции
- •8.3. Место определения функции в программе
- •8.4. Обмен данными между функциями
- •8.4.1. Использование глобальных переменных
- •8.4.2. Использование аппарата формальных и фактических параметров
- •8.4.3. Передача массивов в функцию
- •8.5. Перегрузка функции
- •8.6. Шаблон функции
- •8.7. Рекурсивные функции
- •8.8. Функции с параметрами по умолчанию
- •8.9. Передача в функцию другой функции
- •9. Работа с файлами
- •9.1. Текстовые и двоичные файлы
- •9.2. Объявление файловых переменных
- •9.3. Чтение текстового файла
- •9.4. Создание текстового файла
- •9.5. Изменение данных в текстовом файле
- •9.6. Вывод в двоичный файл
- •9.7. Чтение данных из двоичного файла
- •9.8. Изменение данных двоичного файла
- •9.9. Организация файла с произвольным доступом
- •10. Данные с динамической структурой
- •10.1. Линейный список
- •10.1.1. Специальные типы линейных списков
- •10.1.2. Реализация линейного списка с помощью массива
- •10.1.3. Реализация линейного списка с помощью связанного однонаправленного списка
- •10.1.4. Реализация линейного списка с помощью связанного двунаправленного списка
- •10.2. Деревья
- •10.2.1. Основная терминология
- •10.2.2. Реализация двоичных деревьев поиска Для реализации дерева поиска используются массивы и связанные указателями элементы [3, 4].
- •10.2.3. Сбалансированные деревья
- •Основные достоинства в-дерева:
- •10.3. Графы
- •10.3.1. Определения
- •10.3.2. Реализация графа с помощью списков смежности
- •10.3.3. Реализация графа с помощью матрицы смежности
- •10.3.4. Поиск кратчайших путей. Алгоритм Дейкстры
- •10.3.5. Матрица достижимости. Алгоритм Уоршалла
8.9. Передача в функцию другой функции
Существует множество алгоритмов, особенно в вычислительной математике, результат которых зависит не только от значений входных данных, но и от вида функции, которую использует алгоритм. Например, в алгоритмах вычисления определенных интегралов или производных алгоритм не зависит от подынтегральной или дифференцируемой функции, а результат зависит от вида этих функции. Таким образом, функцию можно рассматривать как данное, от которого зависит результат другой функции. В С++ для передачи функции в качестве аргумента другой функции используется адрес функции (адрес кода функции). В языке С++ имя функции является ее адресом. Например, если в программе определена функция:
float f1(float x)
{ return x*sin(x); }
то ее адресом является f1. Формальный параметр функции, через который в функцию передается адрес кода другой функции, должен быть указателем на функцию.
Синтаксис объявления указателя на функцию:
тип результата функции (*имя указателя)
([список типов формальных параметров функции])
или
тип результата функции (*имя указателя)
([список формальных параметров функции])
Пример объявления указателя f на функцию с одним вещественным параметром, которая возвращает вещественное число:
float(*f) (float x);
Пример прототипа функции вычисления определенного интеграла:
float integ (float a, float b, int n, float (*f)(float x));
В этом объявлении: integ –имя функции вычисления значения интеграла, a и b – пределы интегрирования, n –количество разбиений отрезка интегрирования [a,b], f – указатель на функцию с одним вещественным параметром, которая возвращает значение подынтегральной функции в точке х. f - указатель, через который передается в функцию адрес конкретной подынтегральной функции.
Пример программы вычисления двух интегралов
и методом левых прямоугольников для заданного количества разбиений отрезка интегрирования. Для приближенного вычисления интеграла с пределами интегрирования a и b в программе используется формула левых прямоугольников:
,
где h=(b-a)/n.
#include <iostream.h>
#include <math.h>
#include <conio.h>
float f1(float x); //подынтегральная функция 1 интеграла
float f2(float x); //подынтегральная функция 2 интеграла
//Вычисление интеграла методом левых прямоугольников
float integ(float a,float b,int n, float (*f)(float x));
void main()
{
int n; //количество разбиений
cout<<"n? "; cin>>n;
cout<<"integ1="<<integ(0,M_PI_2,n,f1)<<endl;
cout<<"integ2="<<integ(10.5,1,n,f1);
getch();
}
float integ(float a, float b, int n, float (*f)(float x))
{
float h, x; //длина элементарного отрезка и левая граница отрезка
float s; //сумма
int i; //номер отрезка
h=(b-a)/n;
s=0;
x=a;
for (i=1; i<=n; i++)
{
s=s+f(x);
x=x+h;
}
return s*h;
}
float f1(float x)
{
return x*x*cos(x*x);
}
float f1(float x)
{
return log(sqrt(1/x));
}
9. Работа с файлами
Переменные и массивы предназначены для временного хранения данных. Для постоянного хранения данных используются файлы. Файл имеет имя и место хранения. Например, файл с именем a.txt может храниться на диске с в папке user. В этом случае c:\user\a.txt – это полное имя файла.
С файлами можно выполнять операции:
чтение;
создание;
запись в конец, в начало, в середину;
исключение части данных;
поиск;
вывод;
изменение данных;
копирование;
переименование;
удаление;
другие операции.
Некоторые операции с файлами можно выполнять как средствами операционной системы, так и с помощью прикладных программ. Существуют операции, которые можно выполнить только с помощью программирования. С++ имеет языковые средства для программирования любых операций с файлами.