![](/user_photo/2706_HbeT2.jpg)
- •1. Основные этапы решения задач на эвм
- •Формулировка задачи
- •Математическая постановка задачи
- •Разработка алгоритма решения задачи
- •Написание текста программы на языке программирования
- •Ввод текста программы в эвм
- •Поиск и устранение синтаксических ошибок
- •Тестирование программы. Поиск и устранение логических ошибок в программе
- •Этапы создания исполняемой программы
- •Базовые компоненты программ
- •Буквы и цифры
- •Пробельные символы
- •Знаки пунктуации и специальные символы
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Лексемы
- •Типы данных
- •Целые константы
- •Константы с плавающей точкой
- •Константа-символ
- •Строковые литералы
- •Универсальные функции ввода и вывода любых типов данных
- •Структуры и форма написания программы
- •Программирование разветвляющихся вычислительных процессов
- •Цикл while – цикл с предусловием.
- •Цикл do while – цикл с постусловием
- •Цикл for
- •Безусловная передача управления внутри цикла
- •Описание некоторых стандартов алгоритмов
- •Работа с файлами (функции ввода вывода верхнего уровня)
- •Указатели
- •Одномерные массивы Объявление массива.
- •Стандартные функции обработки строк
- •Многомерные массивы на примере двумерных
- •Классы памяти
- •Способы передачи данных в функцию
- •Функции и строки
- •Функции и одномерные числовые массивы
- •Функции и двумерные массивы
- •Функции с параметрами по умолчанию
- •Перегрузка функции
- •Шаблоны функции
- •Типы данных, определяемые пользователем
- •4.1. Структуры
- •Шаблон структуры
- •Структурные переменные
- •Инициализация структуры
- •Доступ к полям структуры
- •Массив структур
- •Вложенные структуры
- •Битовые поля структур
- •Передача структуры в функцию
- •Двоичный ввод-вывод структур
- •Функции двоичного ввода-вывода
- •Динамические структуры данных
- •4.2. Объединения
- •4.3. Перечисления
- •Файловые операции ввода/вывода
- •Файловый ввод/вывод с прямым доступом
Способы передачи данных в функцию
Данные в функции передаются по значению, адресу или ссылке.
При передачи по значению исходные данные из функции main заносятся в параметры функции. Функция производит действия над параметрами, а, следовательно, над копиями исходных данных, передаваемых из функции main. Следовательно, изнутри мы не можем изменить исходные данные. Обратной связи нет.
Передача данных по адресу.
Адрес – уникальная и однозначная характеристика данного. Зная адрес данного, можно извлечь данное по адресу или изменить данное по адресу. В функцию через параметр мы можем передать адрес данного, объявленного в функции main. Внутри функции мы можем извлечь данное по адресу или изменить данное по адресу. Этот механизм используется для передачи из функции результатов, если их больше чем один.
Данное, переданное по адресу, можно использовать внутри функции и изменять.
Вывод: Данное, переданное по значению, оказывается защищенным от изменений внутри функции. Если данные не должны быть изменены, они должны передаваться по значению. Если данные хотим изменить внутри функции, они передаются по адресу (например, передача двух и более результатов из функции).
Механизм передачи второго, третьего ……. Результата из функции.
Пусть из функции необходимо предать через параметры результат целого типа.
Необходимо:
Объявить в функции main переменную целого типа под результат.
В функции main в операторе вызова этой функции в качестве соответствующего аргумента передать адрес объявленной переменной.
В имени функции и в прототипе объявить параметр указатель на целый тип.
Внутри функции вычислить результат и записать его значение по указанному в параметре адресу.
То же самое схематично:
# include…..
void func (…, int*p);
void main (void)
{……………………….
Int res; //переменная целого типа под результат.
…………………………
…………………………
… func (…, & res); // передали в функцию адрес переменной res.
Printf (“res=%d\n”, res); //вывели полученный из функции результат
}
… funs (…, int*p)
{……………………….
Int res; //объявили переменную под результат
……………………….
Res=…; //вычислили результат
*p=res; // возвратили результат функции через параметр
return…;
}
Передавая адрес аргумента мы открываем из функции прямой доступ к аргументу, экономя при этом память.
Запретить изменение аргумента, при передаче адреса можно, для этого надо объявить параметр const int *p;
Передача аргумента по ссылке
Ссылка – псевдоним какого-либо данного. При объявлении ссылки она обязательно инициализируется именем другого объекта (адресата) и с этого момента становится альтернативным именем адресата. Все что делается со ссылкой, происходит и с самим объектом. Ссылку нельзя переназначать. Ссылка только ссылается на один объект.
Int SomeInt;
int & rSomeInt=SomeInt;
При передаче по ссылке экономится память и есть прямой доступ к аргументу. При необходимости аргумент можно защитить от изменения:
const int & Ra;
Написать программу с функцией вычисляющей корни квадратного уравнения
Анализ характеристик функции
1. Название функции: kvadr
2. Исходные данные (коэффициенты double a,b,c)
3. Результаты (через return передаем результат типа bool(который true-false))
корень x1: double &x1;
x2: double &x2;
// kvadr.cpp
#include <math.h>
bool kdvadr(double a, double b, double c, double &x1, double &x2)
{
double d;
d = b*b-4*a*c;
if (d>=0)
{
x1=(-b+sqrt(d))/(2*a)
x2=(-b-sqrt(d))/(2*a)
return true;
}
else { return false; }
}
// kvadr.h
#ifndef KVADR_H
#define KVADR_H
bool kdvadr(double a, double b, double c, double &x1, double &x2);
#endif
// main.cpp
#include<iostream> //подключение системных средств для
using namespace std; //возможности использовать потоки ввода-вывода
#include «kvadr.h»
int main (void) {
double a, b, c, x1, x2;
bool result;
cout << “\nВведите коэффициенты” << endl;
cin >> a >> b >> c;
result = kdvadr (a,b,c, x1, x2);
if (result == true) {
cout << “\nx1=” << x1 << “\nx2=” << x2 << endl;
} else { cout << “\nНет корней” << endl; }
return 0;
}
Выводы:
1. Если аргумент не меняется внутри функции и занимает немного оперативной памяти – передача по значению
2. Если аргумент не должен изменяться, но занимает много оперативной памяти – передача по ссылке на неизменяемый объект или через указатель на неизменяемый объект
3. Если аргумент должен изменяться внутри функции – передача по ссылке или через указатель
4. Любой массив передается через указатель