- •1.2Типы данных
 - •1.2.1Объявление переменной
 - •1.2.2Категории типов данных
 - •1.2.3Целый тип данных
 - •1.2.4Данные с плавающей точкой (вещественные типы)
 - •1.3Знаки операций
 - •1.3.3Простое присваивание
 - •1.3.4Составное присваивание
 - •1.3.5Приоритеты операций и порядок вычислений
 - •1.4Структура и компоненты программы на языке си
 - •1.5Организация ввода-вывода в стиле си
 - •1.6.1 Манипуляторы и форматирование ввода-вывода
 - •1.7Математические функции
 - •2Алгоритм. Элементы структурного программирования
 - •2.1Понятие алгоритма
 - •2.2Основные требования к алгоритмам
 - •2.3Элементы структурного программирования
 - •3Программирование алгоритмов линейной структуры
 - •4Алгоритмы и программы ветвящейся структуры. Условный оператор if. Переключатель switch
 - •4.1Алгоритмы и программы ветвящейся структуры
 - •4.1.1Условный оператор if
 - •If (выражение) оператор1;
 - •4.1.2Логические операции
 - •4.2Примеры составления алгоритмов и программ с использованием условного оператора If
 - •4.3Переключатель switch
 - •5Алгоритмы и программы циклической структуры
 - •5.1 Понятие цикла. Разновидности циклов
 - •5.3Оператор while
 - •5.4Оператор do while
 - •5.5Оператор continue
 - •6Регулярные типы данных. Массивы
 - •6.1 Понятие регулярного типа
 - •6.2Алгоритмы сортировки массивов
 - •6.3 Постановка задачи сортировки и методы её решения
 - •6.4Алгоритм прямого упорядочения (Алгоритм сортировки выбором элемента)
 - •6.5Алгоритм попарного сравнения соседних элементов («пузырьковая» сортировка)
 - •6.6Алгоритм сортировки выбором элемента
 - •6.7Методы доступа к элементам массивов, использование указателей
 - •6.8Организация многомерных массивов. Указатели на многомерные массивы
 - •7.1Описание и определение функции
 - •7.2Вызов функции
 - •7.3Передача параметров в функцию
 - •7.4Описание прототипа функции
 - •7.5Функция с переменным количеством параметров
 - •7.6Понятие сигнатуры функции
 - •7.7Подставляемые (встраиваемые) функции
 - •7.8Передача параметров в главную функцию
 - •7.9Рекурсивные вызовы функции
 - •7.10Примеры составления функций
 - •8Указатели
 - •8.1Понятие указателя
 - •8.2Инициализация указателей
 - •8.3Операции с указателями
 - •8.4Ссылки
 - •9Структуры (struct)
 - •10Динамические структуры данных
 - •3.1 Односвязные списки
 - •Д обавление в начало списка.
 - •2 ) Добавление в середину списка.
 - •У даление первого элемента списка.
 - •3 )Удаление элемента из середины списка.
 - •Int Data; //поле данных
 - •If (!q) //...И он первый в списке
 - •3.2 Стек
 - •3.3 Очередь
 - •11Динамические массивы
 - •12Функции и массивы
 - •13Указатели на функции
 - •14.1Файловый ввод/вывод с помощью потоков
 - •14.2 Дополнительные функции файлового ввода/вывода
 - •14.3Режимы файлов
 - •14.4 Двоичные файлы
 - •14.5Произвольный доступ к файлам
 - •Список использованных источников
 
12Функции и массивы
Параметрами функции могут быть массивы, и функции могут возвращать указатель на массив в качестве результата. При передаче массивов через механизм параметров возникает задача определения в теле функции количество элементов массива, использованного в качестве фактического параметра.
Если массив-параметр фиксированного размера, то проблем тоже нет, иначе необходимо передать в функцию количество параметров основным способом. Так как имя массива есть указатель, который связывается с началом массива, то любой массив может быть изменен за счет выполнения операторов тела функции. Например, функция, формирующая новый массив на основание двух целочисленных массивов, элементы в каждом из которых упорядочены по возрастанию. Новый массив должен включать все элементы двух исходных массивов таким образом, чтобы они оказались упорядоченными по возрастанию.
#include <iostream.h>
int *fusion(int n, int *a, int m, int *b)
{int *x=new int[n+m];
int ia=0, ib=0, ix=0;
while (ia<n && ib<m)
if (a[ia]=b[ib]) x[ix++]=b[ib++];
else x[ix++]=a[ia++];
if (ia>=n)
while (ib<m) x[ix++]=b[ib++];
else
while (ia<n) x[ix++]=a[ia++];
return x;
}
void main(void)
{ int c[]={1,3,5,7,9};
int d[]={0,2,4,5,};
int *h;
int kc=sizeof(c)/sizeof(c[0]);
int kd=sizeof(d)/sizeof(d[0]);
h=fusion(kc,c,kd,d);
cout<<"\n Объединенный массив \n";
for (int i=0; i<kc+kd; i++)
cout << " " << h[i];
delete[]h;
}
Результат
Объединенный массив
0 1 2 3 4 5 5 7 9
По определению многомерных массивов в С++ не существует. Описание double prim[6][4][2]; описывает одномерный массив с именем prim, включающий 6 элементов, каждый из которых имеет тип double[4][2]. В свою очередь, каждый из этих элементов есть одномерный массив из двух элементов типа double.
При описании массива (или спецификации массива-параметра) неопределенным может быть только первый размер. Для избавления от фиксации количества элементов многомерного массива при передаче параметров используются следующие пути:
подмена многомерного массива одномерным и имитация внутри функции доступа к многомерному массиву;
использование вспомогательных массивов указателей на массив.
Рассмотрим представление и передачу матриц с использованием вспомогательных массивов указателей на одномерные массивы:
#include <iostream.h>
void trans(int n, double *p[])
{double x;
for (int i=0; i<n-1; i++)
for (int j=i+1; j<n; j++)
{ x=p[i][j];
p[i][j]=p[j][i];
p[j][i]=x;
}
}
void main ()
{ double a[4][4]={11,12,13,14,
21,22,23,24,
31,32,33,34,
41,42,43,44};
double *prt[]={(double *) & a[0],(double *) & a[1],
(double *) & a[1],(double *) & a[3]}
int n=4;
trans(n, ptr);
for (int i=0; i<n; i++)
{cout << "\n строка" << (i+1)<<":";
for(int j=0; j<n; j++)
cout << "\t" << a[i][j];
}
}
Результат:
Строка 1: 11 21 31 41
Строка 2: 12 22 32 42
Строка 3: 13 23 33 43
Строка 4: 14 24 34 44
Функция trans() выполняет транспонирование квадратной матрицы, определенной вне тела функции в виде двухмерного массива. Параметры int n - порядок матрицы, double *p[i]-массив указателей на одномерные массивы элементов типа double. В основной программе матрица представлена двухмерным массивом с фиксированным размером double a[4][4]. Такой массив нельзя передавать в качестве фактического параметра. Поэтому вводим дополнительный массив указателей double *ptr[]. В качестве начальных значений элементов этого массива присваиваются адреса строк матрицы, преобразованные к типу double*.
