- •О.Л. Викентьева, А.Н. Гусин, O.A. Полякова
- •ПРОЕКТИРОВАНИЕ ПРОГРАММ И ПРОГРАММИРОВАНИЕ НА C++
- •1. СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ
- •10.1. Базовые конструкции структурного программирования
- •10.3. Составные операторы
- •10.4. Операторы выбора
- •10.5. Операторы циклов
- •10.6. Операторы перехода
- •11. ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ С ИСПОЛЬЗОВАНИЕМ ОСНОВНЫХ ОПЕРАТОРОВ C++
- •11.2. Программирование арифметических циклов
- •11.3. Программирование итерационных циклов
- •11.4. Программирование вложенных циклов
- •12. МАССИВЫ
- •12.1. Определение массива в C/C++
- •12.2. Примеры решения задач с использованием массивов
- •13. УКАЗАТЕЛИ
- •13.1. Понятие указателя
- •13.2. Динамическая память
- •13.3. Операции с указателями
- •14. ССЫЛКИ
- •15.3. Динамические массивы
- •СИМВОЛЬНАЯ ИНФОРМАЦИЯ И СТРОКИ
- •16.1. Представление символьной информации
- •16.2. Библиотечные функции для работы со строками
- •16.3. Примеры решения задач с использованием строк
- •17. ФУНКЦИИ В C++
- •17.1. Объявление и определение функций
- •17.2. Прототип функции
- •17.3. Параметры функции
- •17.4. Локальные и глобальные переменные
- •17.5. Функции и массивы
- •17.5.1. Передача одномерных массивов как параметров функции
- •17.5.2. Передача строк в качестве параметров функций
- •17.5.3. Передача многомерных массивов в функцию
- •17.6. Функции с начальными значениями параметров (по умолчанию)
- •17.7. Подставляемые (inline) функции
- •17.8. Функции с переменным числом параметров
- •17.9. Рекурсия
- •17.11. Шаблоны функций
- •17.12. Указатель на функцию
- •17.13. Ссылки на функцию
- •18. ТИПЫ ДАННЫХ, ОПРЕДЕЛЯЕМЫЕ ПОЛЬЗОВАТЕЛЕМ
- •18.1. Переименование типов
- •18.2. Перечисления
- •18.3. Структуры
- •18.3.1. Работа со структурами
- •18.3.2. Битовые поля
- •18.3.3. Объединения
- •19. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ
- •19.1. Создание элемента списка
- •19.2. Создание списка из п элементов
- •19.3. Перебор элементов списка
- •19.4. Удаление элемента с заданным номером
- •19.5. Добавление элемента с заданным номером
- •19.6. Двунаправленные списки
- •19.7. Очереди и стеки
- •19.8. Бинарные деревья
- •19.9. Обход дерева
- •19.10. Формирование дерева
- •19.11. Удаление элемента из дерева
- •19.12. Обработка деревьев с помощью рекурсивного обхода
- •20. ПРЕПРОЦЕССОРНЫЕ СРЕДСТВА
- •20.1. Стадии и команды препроцессорной обработки
- •20.2. Директива #define
- •20.3. Включение текстов из файлов
- •20.4. Условная компиляция
- •20.5. Макроподстановки средствами препроцессора
- •21.1. Проектирование программы
- •21.2. Кодирование и документирование программы
- •СПИСОК ЛИТЕРАТУРЫ
- •ПРОЕКТИРОВАНИЕ ПРОГРАММ И ПРОГРАММИРОВАНИЕ НА C++
for (int 1=0, k=0;Kstrlen (s) ;I++) if(find(gl, s[I])>0)k++;
printf("%d",k);
}
17.5.3. Передача многомерных массивов в функцию
При передаче многомерных массивов в функцию все размерности должны передаваться в качестве параметров. По определению много мерные массивы в С и C++ не существуют. Если мы описываем массив с несколькими индексами, например массив i n t mas [3] [4], то это означает, что мы описали одномерный массив mas, элементами кото
рого являются указатели на одномерные массивы i n t [ 4 ].
Рассмотрим функцию, которая решает задачу транспонирования квадратной матрицы (поворот матрицы на 90°). Если определить за головок функции как
v o i d t r a n s p ( i n t а [ ] [ ] , i n t n ){....},
то получится, что мы хотим передать массив с неизвестными размера ми. По определению, массив должен быть одномерным и его элементы должны иметь одинаковую длину. При передаче массива о размере элементов ничего не сказано, поэтому компилятор выдаст ошибку.
Самый простой вариант решения этой проблемы - определить функцию следующим образом:
/ /Т р а н с п о н и р о в а н и е к в а д р а т н о й матрицы
# i n c l u d e < i o s t r e a m . h >
/ ^ г л о б а л ь н а я п е р ем ен н а я, з а д а е т к о л и ч е с т в о
стр о к и |
столб ц ов в м а т р и ц е * / |
c o n s t i n t N=10; |
|
v o i d t r a n s p ( i n t a [ ] [ N ] , i n t n) |
|
{ |
|
i n t |
r ; |
f o r ( i n t 1 = 0 ; I < n ; I + + ) f o r ( i n t j = 0 ; j < n ; j + + ) i f ( I < j )
{
r = a [ I ] [ j] ;
a |
[I] |
[ j ] = a [ j ] [I] ; |
a |
[ j ] |
[ I ] = r ; |
} |
|
v o id m a i n ()
{
int mas[N][N];
for(int 1=0;I<N;I++) for(int j=0;j<Nlj++)
cin>>mas[I][j];
for(1=0;I<N;I++)
{
for(j=0;j<N;j++)
cout<<mas[I][j]
cout<<"\n";
}
transp(N,mas);
for(1=0;I<N;I++)
{
for(j=0;j<N;j++)
cout<<mas[I][j]
cout«"\n";
}
}
Также при передаче многомерных массивов можно интерпре тировать их как одномерные и внутри функции пересчитывать ин дексы (рис. 13):
//передача матрицы как одномерного массива
#include <iosream.h>
//передаем указатель на первый элемент матрицы void form_matr(int *matr, int n)
{
for (int i=0;i<n; int n) for(int j=0;j<n;j++)
matr[i*n+j]=rand()%10;//пересчитываем индекс //элемента
}
void print_matr(int *matr, int n)
{
for (int i=0;i<n; int n)
{
for(int j=0;j<n;j ++) cout<<matr[i*n+j]<<" cout<<"\n"
}
}
void main()
{
int matr [5] [Б] ;
/♦передаем адрес первого элемента матрицы как
фактический параметр*/ form_matr (&matr[0] [0] ,5) ; print_matr (&matr[0][0],5);
}
— ^ |
t |
Н Г |
+ |
4 |
matr[0] |
matr[ 1] |
matr[2] |
matr[3] |
matr[4] |
Рис. 13. Размещение двумерного массива в памяти
Вызов такой функции можно записать еще и следующим образом:
//выполняем приведение типов form_matr ((int*)matr,5); print__matr ((int*)matr,5) ;
17.6.Функции с начальными значениями параметров (по умолчанию)
Вопределении функции может содержаться начальное (умалчи^ ваемое) значение параметра. Это значение используется, если при вызове функции соответствующий параметр опущен. Все параметры, описанные справа от такого параметра, также должны быть умалчи ваемыми.
void print(char* пате="Номер дома: int value=l)
{
cout<<"\n"<<name<<value;
}
Вызовы:
1. print () ;
Вывод: Номер дома : 1