- •О.Л. Викентьева, А.Н. Гусин, 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++
17.5.Функции и массивы
17.5.1.Передача одномерных массивов как параметров функции
При использовании массива как параметра функции в функцию передается указатель на его первый элемент, т.е. массив всегда пере дается по адресу. При этом теряется информация о количестве эле ментов в массиве, поэтому размерность массива следует передавать как отдельный параметр. Так как в функцию передается указатель на начало массива (передача по адресу), массив может быть изменен за счет операторов тела функции.
//Удалить из массива все четные элементы
#include ciostream.h> #include <stdlib.h>
//формирование массива //массив передается в функцию по адресу int formfint *а)
{
int n;
cout<<"\nEnter n"; cin>>n;
for(int i=0;i<n;i++) a[i]=rand()%100;
//возвращается количество элементов в массиве return n;
//печать массива
void print(int *a,int n)
{
for(int i=0;i<n;i++) cout<<a[i]<<"
cout«"\n" ;
}
/^удаление четных элементов из массива, массив передается по адресу, количество элементов переда ется по адресу как ссылка*/
void del(int *а, int& n)
{
int j=0,i,b[100]; for(i=0;i<n;i++)
if(a[i]%2!=0)
{
b [j ] = a [ i ] ;
j++;
n=D;
for(i=0;i<n;i++)
a [i ] = b [i ]
}
void main()
{
int a [100]; int n;
n=form(a);//вызов функции формирования //массива
print(a,n);//вызов функции печати массива del(а,п);//вызов функции удаления элементов
//массива
print(а,п);//вызов функции печати массива
}
При использовании динамических массивов в функцию передается указатель на область динамической памяти, в которой размещаются элементы массива. Функция также может возвращать указатель на об ласть динамической памяти, в которой размешаются элементы массива.
/^Удалить из массива все элементы, совпадающие
с первым элементом, используя динамическое выделе
ние памяти.*/
#include <iostream.h>
#include <stdlib.h>
/Сформирование массива, количество элементов массива передается по адресу как ссылка, функция
возвращает указатель на динамический массив*/ int* form(int& n)
{
cout«"\nEnter n"; cin»n;
//выделить динамическую область памяти под //массив
int* a=new int[n]; for(int i=0;i<n;i++)
a[i]=rand()%100; //заполнить массив //вернуть указатель на динамическую область
//памяти return а;
}
void print(int*a,int n)//печать массива
/*в функцию передается указатель на массив и количество элементов в массиве*/
{
for(int i=0;i<n;i++) cout<<a[i]<<"
c o u t « ,f\nlf;
}
/*удаление из массива в функцию передается указатель на массив и количество элементов в мас
сиве по адресу, как ссылка*/ int* del(int* a,int& n)
{
int k,j,i;
//считаем количество элементов в новом массиве for(k=0,i=0;i<n;i++)
if(a [i] !=a[0])k++;
int* b;
//выделяем память под вспомогательный массив b=new int[k];
/*переписываем элементы из старого массива во вспомогательный*/
for(j=0,i=0;i<n;i++)
if(a[i]!=a[0])
|
{ |
b [ j ] = a [i |
] ; |
|
|
|
|
|
|
||
j + + ; |
|
|
|
|
|
|
} |
|
|
|
|
|
п=к; |
/ / м е н я е м |
к о л и ч е с т в о эл е м ен то в |
||
//во звр ащ аем новый м ассив |
как |
р е з у л ь т а т функции |
|||
r e t u r n |
b; |
|
|
|
|
} |
|
|
|
|
|
v o i d m a i n () |
|
|
|
|
|
i n t * |
а; |
//у к а з а т е л ь |
на |
динамический массив |
|
i n t n; |
/ / к о л и ч е с т в о эл е м ен то в в м а с с и в е |
||||
a = f o r m ( n ) ; |
//ф о р м и р у ем м асси в |
||||
p r i n t ( a , n ) ; |
/ / п е ч а т а е м |
м асси в |
|||
a = d e l ( a , n ) ; |
/ / у д а л я е м |
элем ен ты |
|||
p r i n t ( a , n ) ; |
/ / п е ч а т а е м |
м асси в |
17.5.2. Передача строк в качестве параметров функций
Строки при передаче в функции могут передаваться как одно мерные массивы типа char или как указатели типа c h a r * . В отличие от обычных массивов в функции не указывается длина строки, так
как в конце строки есть признак конца строки ' \ 0 ' |
|
||||
//Н а й т и |
к о л и ч е ст в о гл асн ы х |
букв в |
с т р о к е |
||
//Функция |
п о и ска з а д а н н о г о |
си м вола |
в с т р о к е |
||
i n t f i n d ( c h a r * s , c h a r с) |
|
|
|||
{ |
|
|
|
|
|
f o r |
( i n t |
1=0; K s t r l e n (s) ; I++) |
|
||
i f ( s [ I ] = = c ) r e t u r n I ; |
|
|
|||
r e t u r n |
- 1 |
|
|
|
|
} |
|
|
|
|
|
v o i d |
m a i n () |
|
|
||
{ |
|
|
|
|
|
c h a r |
s [2 5 5 ] ; |
|
|
||
g e t s |
(s) |
|
|
|
|
c h a r |
g l = " a o u i e y " ; / / с т р о к а , |
к о т о р а я |
содерж ит |
/ / гласные