- •Понятие алгоритма. Свойства алгоритмов. Основные этапы решения задач
- •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
- •Вложенные циклы.
- •Указатели и адреса: описание, инициализация и операции с указателями. Применение указателей при программировании.
- •Статические строки
- •Динамические строки
- •Стандартный цикл обработки строки
- •Одномерные числовые массивы
- •Статические массивы
- •Динамические массивы
- •Динамические матрицы
- •Циклы перебора матрицы
- •Программирование с использованием функций пользователя. Принципы построения функций.
- •Механизм вывода функции
- •Передача значения простого аргумента в функцию. Способы передачи простых данных в функцию
- •Передача в функцию значения аргумента
- •Рекурсивная функция
- •Передача функции в другую функцию через указатель. Параметр функции. Указатель на функцию.
- •Перегрузка функций.
- •Функции с параметрами по умолчанию
- •Шаблоны функций.
- •Формат функции шаблона
- •Механизм шаблона
- •Особенности проекта с функциями-шаблонами
Механизм вывода функции
При выполнении оператора вызова функции, управление передается на заголовок этой функции, создаются параметры функции, которые тут же инициализируются аргументами.
Затем выполняется тело функции, где параметры уже действительно имеют свое значение.
При выполнении оператора return управление передается назад – в место вызова. Передаваемый результат подставится вместо вызова и присвоится указанной переменной.
Выводы
Для написания собственной функции необходимо:
определить функцию(написать заголовок и тело)
объявить функцию(написать прототип)
в нужном месте программы организовать вызов функции.
Основные принципы построения функции:
Каждая функция решает одну подзадачу.
Исходные данные всегда передаются через параметры. (за незначительным исключением)
Результат всегда передается из функции с помощью оператора return или другими средствами.
+
Передача значения простого аргумента в функцию. Способы передачи простых данных в функцию
Данные в функции передаются по значению, адресу.
Любое данное имеет текущее значение и адрес.
Если из вызывающей функции передается текущее значение аргумента в пользовательскую функцию, то его можно анализировать(if, switch,циклы) или использовать в вычислениях.
Если из вызывающей функции передается адрес аргумента в пользовательскую функцию, то можно анализировать текущее значение аргумента, использовать в вычислениях или изменять аргумент.
Передача в функцию значения аргумента
Пусть в функцию хотим передать значение int
… func(int a,…)
{
// используем a для анализа или вычисления
return …;
}
int main(void)
{
int A;// объявили аргумент
cin>>A;// определили аргумент
… func(A);// передали текущее значение аргумента
…
}
// При передачи по значению исходные данные из функции main заносятся в параметры функции. Функция производит действия над параметрами, => над копиями исходных данных, передаваемых из функции main. Следовательно, изнутри мы не можем изменить исходные данные. Обратной связи нет.
Задача: написать программу с функцией, вычисляющей S треугольника по формуле Герона.
Анализ характеристик функций:
1) название функции – Geron
2) исходные данные: a, b, c
типы исходных данных -> double a, double b, double c
3) результат функции S -> double
Geron.cpp:
#include<math.h>
double Geron(double a, double b, double c) // копирование значений А, B и C
{
double S, P;
P=(a+b+c)/2;
S=sqrt(P*(P-a)*(P-b)*(P-c));
return S;
}
Geron.h:
#ifndef GERON_H
#define GERON_H
double Geron(double a, double b, double c);
#endif
main.cpp:
#include<iostream>
using namespace std;
#include “Geron.h”
int main(void)
{
double A, B, C, S;
cin>>A>>B>>C;
S=Geron(A,B,C);
cout<<S<<endl;
return 0;
}
+
Передача из функции пользователя двух и более результатов. Написать схематично программу с функцией, возвращающей результат (целое число) через параметр - ссылку.
Передача исходных данных в функцию ссылки на аргумент
Ссылка – константный адрес другой переменный или альтернативное имя другой переменной.
int &rA=A;// объявляется ссылка rA, которая сразу инициализируется переменной А
Если ссылка – параметр функции, то после вызова её ссылка инициализируется аргументом.
Имя ссылки и аргумент указывают на одну и ту же область памяти: изменяется ссылка–> изменяется аргумент.
Ссылка часто используется для передачи из функции дополнительных результатов.
//
При объявлении ссылки она обязательно инициализируется именем другого объекта (адресата) и с этого момента становится альтернативным именем адресата. Ссылку нельзя переназначать. Ссылка только ссылается на один объект.
При передаче по ссылке экономится память и есть прямой доступ к аргументу. При необходимости аргумент можно защитить от изменения:
const int &rA;
//
Пусть из функции необходимо передать дополнительный результат целого типа.
… func(…, ТипРезультата &result) // создается &result=result,
{
…
result=результату; // передача результата
…
}
int main(void)
{
ТипРезультата result;
…
… func(…, result);
cout<<result<<endl;
…
return 0;
}
Написать программу, в которой для данного прямоугольника вычисляется периметр и площадь.
double Pram(double a, double b, double &S)
{
double P;
P=2*(a+b);
S=a*b;// вычислили и передали площадь
return P;
}
int main(void)
{
double A, B, P, S;
cin>>A>>B;
P=Pram(A,B,S);
cout<<”S=”<<S<<endl;
cout<<”P=”<<P<<endl;
return 0;
}
Задача: переписать функцию swap с применением ссылок
void swap(int &rA, int &rB)
{
int x;
x=rA;
rA=rB;
rB=x;
}
int main(void)
{
int A, B;
cin>>A>>B;
swap(A,B);
cout<<A<<B;
return 0;
}
Выводы:
1) в функцию передаем значение аргумента, если в ней не надо изменять аргумент и он занимает небольшой объем памяти
2) в функцию передаем ссылку на её константный объект, если аргумент не надо изменять в функции, но он занимает большой объем памяти
3) в функцию передаем ссылку или адрес аргумента(через указатель), если аргумент внутри функции необходимо изменить (для передачи дополнительного результата)
+
Передача адреса простого аргумента в функцию. Написать схематично программу с функцией, возвращающей результат (вещественное число) через параметр - указатель.
Передача в функцию адреса аргумента
Передавая адрес аргумента, мы можем не только извлекать текущее значение аргумента и выполнять с ним действия, но и изменять аргумент. Этот механизм используется для передачи из функции дополнительных результатов.
Передача данных по адресу.
Пусть из функции необходимо передать результат целого типа
Необходимо:
Объявить в функции main переменную целого типа под результат.
В функции main в операторе вызова этой функции в качестве соответствующего аргумента передать адрес объявленной переменной.
В имени функции и в прототипе объявить параметр указатель на целый тип.
Внутри функции вычислить результат и записать его значение по указанному в параметре адресу.
… func(…, int *result) // параметр является указателем, *result=&result
{
…
*result=результату;// возвратили результат функции через параметр
return;
}
int main(void)
{
int result; //переменная целого типа под результат.
…
… func(…, &result); // передали в функцию адрес переменной res
cout<<result<<endl;
…
return 0;
}
Написать функцию, в которой две переменные обмениваются своими значениями.
void Swap(int *p1, int *p2)
{
int a;
a=*p1;
*p1=*p2;
*p2=a;
return;
}
int main(void)
{
int A, B;
cin>>A>>B;
Swap(&A, &B);
cout<<A<<’ ‘<<B<<endl;
return 0;
}
Передача одномерных массивов в функцию. Написать схематично программу с функцией, использующей одномерный числовой массив с десятичной точкой в качестве исходного данного.
… func(const double *p, int n)
{
// алгоритм обработки исходного массива
}
Если исходное данное – одномерный числовой массив типа double с const, говоря о том, что массив не изменим. Цикл перебора. Элементы массива можем анализировать и использовать при вычислениях в правой части. Изменять не можем.
Выделение памяти под массив-результат функции пользователя в функции main(). Написать схематично программу с функцией пользователя, в которой на основе исходного одномерного числового массива формируется массив-результат.
Выделение памяти под массив-результат внутри функции пользователя. Написать схематично программу с функцией, формирующей строку-результат.
Передача многомерных массивов в функцию (на примере двумерных). Написать схематично программу с функцией, использующей целый двумерный числовой массив в качестве исходного данного.
Использование const при объявлении параметров функции.
+
Рекурсивные функции языка С++ и их применение при программировании.
