- •3.8. Упражнения 49
- •Введение
- •1. Базовые элементы
- •1.1. Комментарии
- •1.2. Функция «main»
- •1.3. Идентификаторы и пространства имен
- •1.4. Типы
- •1.5. Переменные
- •1.6. Преобразование типов
- •1.7. Константы
- •1.8. Потоковый ввод – вывод
- •1.9. Операции
- •1.9.1. Арифметические операции
- •1.9.2. Поразрядные операции
- •1.9.3. Условный оператор
- •1.9.4. Операции отношения
- •1.9.5. Логические операции
- •1.10. Стандартные математические функции
- •1.11. Упражнения
- •2. Базовые конструкции
- •2.1 Ветвление
- •2.1.1. Конструкция «if – else»
- •2.1.2. Конструкция «switch»
- •2.2. Циклы
- •2.2.1. Цикл «for»
- •2.2.2. Цикл «while»
- •2.2.3. Цикл «do – while»
- •2.2.4. Операторы циклов
- •2.2.5. Вложенность
- •2.3. Упражнения
- •2.3.1. Ветвления
- •2.3.2. Циклы
- •2.3.3. Вложенность
- •3. Указатели. Массивы. Структуры
- •3.1. Указатели
- •3.2. Массивы
- •3.2.1. Статические массивы
- •3.2.2. Динамические массивы
- •3.4. Ссылки
- •3.5. Структуры
- •3.6. Объединение
- •3.7. Переопределение типов
- •3.8. Упражнения
- •3.8.1. Статические и динамические массивы
- •3.8.2. Многомерные массивы
- •3.8.3. Строки
- •4. Функции
- •4.1. Простые функции
- •4.2. Рекурсия
- •4.3. Указатели и ссылки
- •4.3.1. Передаваемые параметры
- •4.3.2. Возвращаемые значения
- •4.3.3. Ссылки и структуры в функциях
- •4.3.4. Указатели и массивы в функциях
- •4.3.5. Указатели и ссылки на функцию
- •4.4. Шаблоны функций
- •4.5. Упражнения
- •4.5.1. Простые функции
- •4.5.2. Параметры – ссылки и параметры — указатели
- •5. Стандартные классы
- •5.1. Класс «pair»
- •5.2. Класс «complex»
- •5.3. Класс «string»
- •5.4. Контейнеры. Алгоритмы. Итераторы
- •5.5. Класс «vector»
- •5.6. Упражнения
- •5.6.1. Класс «string»
- •5.6.2. Класс «vector»
- •6. Файловый ввод – вывод
- •6.1. Операции
- •6.2. Методы
- •6.3. Флаги
- •6.4. Двоичный режим
- •6.5. Упражнения
- •Ллитература
4.3.3. Ссылки и структуры в функциях
Следующий листинг демонстрирует применение механизма ссылок при работе со структурами.
Листинг 4.8. Указатели и структуры в функциях.
#include <iostream>
#include <string>
using namespace std;
//запись;
struct Record
{
int number;
string name;
string surname;
};
//функция создания записи;
void MakeRecord (Record& newrec)
{
cin >> newrec.number;
cin >> newrec.name;
cin >> newrec.surname;
}
//функция вывода записи на экран;
void PrintRecord (Record & outrec)
{
cout << outrec.number << ". " << outrec.name << " " << outrec.surname;
}
int main (void)
{
Record rec;
MakeRecord(rec);
PrintRecord(rec);
cout << endl;
return 0;
}
4.3.4. Указатели и массивы в функциях
Следующий листинг демонстрирует применение механизма указателей при работе с динамическими массивами.
Листинг 4.9. Указатели и массивы в функциях.
#include <iostream>
using namespace std;
/* создание массива;
* входные параметры – размеры и значение элемента;
* возвращается указатель на массив указателей;
*/
int ** new_array (int nsize, int msize, int init_val = 0)
{
int **pinta = new int*[nsize];
for (int i = 0; i < nsize; i++) {
pinta[i] = new int[msize];
for (int j = 0; j < msize; j++)
pinta[i][j] = init_val;
}
return pinta;
}
/* вывод массива;
* входные параметры – массив и размеры;
*/
void out_array (int **pinta, int nsize, int msize)
{
for (int i = 0; i < nsize; i++) {
for (int j = 0; j < msize; j++)
cout << pinta[i][j] << " ";
cout << endl;
}
}
/* освобождение памяти;
* параметры – массив и количество подмассивов;
*/
void del_array (int **pinta, int nsize)
{
for (int i = 0; i < nsize; i++)
delete[] pinta[i];
delete[] pinta;
}
int main(void)
{
int n, m;
cin >> n >> m;
int **array = new_array(n, m); //создание массива;
out_array(array, n, m); //вывод массива;
del_array(array, n); //удаление массива;
return 0;
}
4.3.5. Указатели и ссылки на функцию
Указатели и ссылки могут адресовать не только переменные, но и функции. Такой прием чаще применяется совместно с использованием массива, элементы которого и адресуют различные функции. В следующем примере циклически будет сортироваться один и тотже массив в соответствии с функциями сравнения из массива, элементы которого их и адресуют.
Листинг 4.10. Указатели и ссылки на функции.
#include <iostream>
using namespace std;
typedef int (*cmp) (int &, int &);
//функции сравнения «<», «<=», «>», «>=»;
inline int cmp_small (int & cmpv1, int & cmpv2) { return cmpv1 < cmpv2?1:0;}
inline int cmp_small_eq (int & cmpv1, int & cmpv2) { return cmpv1 <= cmpv2?1:0;}
inline int cmp_great (int & cmpv1, int & cmpv2) { return cmpv1 > cmpv2?1:0;}
inline int cmp_great_eq (int & cmpv1, int & cmpv2) { return cmpv1 >= cmpv2?1:0;}
/* функция сортировки;
* входные параметры – сортируемый массив, его размер и функция сравнения;
*/
void sorts (int ar[], const int size, cmp compare)
{
int tmpv;
for (int j = 0; j < size; j++)
for (int i = 0; i < size-1; i++) {
//сравнение и обмен элементов;
if (compare( ar[i], ar[i+1] )) {
tmpv = ar[i];
ar[i] = ar[i+1];
ar[i+1] = tmpv;
}
}
}
int main (void)
{
//сортируемый массив;
const int iar_size = 15;
int iar[iar_size] = { 44, 12, 35, 13, 44, 95, 17, 58, 76, 60, 29, 41, 48, 76, 67 };
//массив функций сравнения;
const int fiar_size = 4;
cmp fiar[fiar_size] = { cmp_small, cmp_great, cmp_small_eq, cmp_great_eq };
for (int i = 0; i < iar_size; i++)
cout << iar[i] << " ";
cout << endl << endl;
//сортировка и вывод результата сортировки;
for (int j = 0; j < fiar_size; j++)
{
sorts( iar, iar_size, fiar[j] );
for (int i = 0; i < iar_size; i++)
cout << iar[i] << " ";
cout << endl;
}
return 0;
}
