- •Понятие алгоритма. Свойства алгоритмов. Основные этапы решения задач
- •1. Формулировка задачи
- •2. Математическая постановка задачи
- •3. Разработка алгоритма
- •4. Написание текста и ввод программы
- •5. Выполнение программы. Поиск и устранение синтаксических ошибок
- •6. Тестирование программы. Поиск и устранение логических ошибок в программе
- •Этапы создания исполняемой программы (загрузочного модуля).
- •Структуры и формы написания программы
- •Внутреннее представление данных
- •Классы памяти
- •Обмен данными через внешние переменные
- •Статические переменные
- •Стандартный ввод/вывод данных через потоки
- •Ввод данных
- •Вывод данных
- •Специфические операции
- •Операции присваивания
- •Некоторые нетрадиционные (унарные) операции
- •Условные выражения
- •Операция условия ?:
- •Выражения (в том числе и условные). Порядок выполнения операций в выражении. Таблица приоритетов.
- •Условный оператор if и его применение при программировании. Сокращенная форма оператора if
- •Полная форма оператора if
- •Множественный выбор else-if
- •Оператор выбора switch и его применение при программировании.
- •Циклические вычислительные процессы
- •Оператор цикла while и его применение при программировании. Цикл while – цикл с предусловием.
- •Оператор цикла do while и его применение при программировании. Цикл do while – цикл с постусловием
- •Оператор цикла for и его применение при программировании. Цикл for – цикл с предусловием
- •Операторы break, goto, continue их применение при программировании. Операторы передачи управления
- •Оператор break
- •Оператор continue
- •Оператор goto
- •Вложенные циклы.
- •Указатели и адреса: описание, инициализация и операции с указателями. Применение указателей при программировании.
- •Статические строки
- •Динамические строки
- •Стандартный цикл обработки строки
- •Одномерные числовые массивы
- •Статические массивы
- •Динамические массивы
- •Динамические матрицы
- •Циклы перебора матрицы
- •Программирование с использованием функций пользователя. Принципы построения функций.
- •Механизм вывода функции
- •Передача значения простого аргумента в функцию. Способы передачи простых данных в функцию
- •Передача в функцию значения аргумента
- •Рекурсивная функция
- •Передача функции в другую функцию через указатель. Параметр функции. Указатель на функцию.
- •Перегрузка функций.
- •Функции с параметрами по умолчанию
- •Шаблоны функций.
- •Формат функции шаблона
- •Механизм шаблона
- •Особенности проекта с функциями-шаблонами
Рекурсивная функция
Если функция вызывает саму себя, то возникает рекурсия.
Рекурсия – мощный инструмент разработки программ, когда большие объемы действий могут быть записаны кратко.
Рекурсию можно рассматривать как еще одну управляющую структуру – управление из точки рекурсивного вызова передается на начало функции.
Ключевым фактором обеспечения рекурсии является использование стека. Стек – особое устройство оперативной памяти по принципу: последним пришел – первым вышел.
При выполнении программы в стек сохраняются параметры функции, внутренние локальные переменные и адреса возврата при завершении функции.
При рекурсии функция, не завершив своего выполнения, вызывается снова и снова. Стек постоянно пополняется, не освобождаясь, и может переполниться. Этого допустить нельзя.
Поэтому при написании рекурсивной функции мы должны стремиться к минимизации количества параметров, количества локальных переменных, количества рекурсивных вызовов или к их оптимальному соотношению.
Числа Фибоначчи
,
n>2
a=0, b=1, c=a+b, a=b, b=c
int Fib(int n)
{
if(n==0)
return 0;
else if(n==1)
return 1;
else
return Fib(n-2)+Fib(n-1);
}
int main(void)
{
cout<<Fib(5)<<endl;
return 0;
}
Задача: вычислить факториал числа N
N!=N*(N-1)
int fakt(int n)
{
if ((n==1)or(n==0))
return n;
else
return fakt(n-1)*n;
}
+
Передача функции в другую функцию через указатель. Параметр функции. Указатель на функцию.
Для передачи функции в функцию пользователя необходимо уметь:
1) объявить параметр – указатель на функцию
2) внутри функции, опираясь на указатель, вызвать переданную функцию при переданном аргументе
3) вызывая функцию, передать адрес конкретной функции для соответствующего аргумента
Как объявить указатель на функцию?
void (*f1)(void); // объявлена переменная f1 – указатель на тип void, не имеющую параметров.
int (*f2)(int, double); // объявлена переменная f2 – указатель на тип int, имеющая два параметра: на тип int и double
double (*f)(double); // объявлена переменная f – указатель на тип double, имеет один параметр типа double
Отсюда видно, что при объявлении указателя на функцию важны характеристики функции: тип функции, количество и порядок следования параметров.
Как поместить в указатель конкретное значение?
В указатель на функцию можно поместить адрес конкретной функции с соответствующими характеристиками.
double (*f)(double);
double sin(double);
f=sin;
Имя конкретной функции – ее адрес.
Как вызвать функцию, опираясь на адрес?
double rez=f(M_PI/2);
Написать
функцию вычисления интеграла
Integral
double (*f)(double);
double a, double b
int n
#include<iostream>
using namespace std;
double Integral(double (*f)(double) … ?
{
int i;
double h=(b-a)/n, integ=0;
for (i=0; i<n, i++)
integ+=f(a+i*h);
return h*integ;
}
double func(double x)
{
return x*x-1;
}
#include <math.h>
int main(void)
{
double rez;
rez=Integral(sin,0,3.14,10000);
cout<<rez<<endl;
rez=Integral(func,0,2,10000);
cout<<rez<<endl;
return 0;
}
+
