
- •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*.