- •Этапы создания исполняемой программы
- •Идентификаторы
- •Ключевые слова
- •Комментарии
- •Структура программы
- •Вывод данных
- •Ввод данных
- •Вопросы для самоконтроля
- •Тема 1.1(2). Типы данных. Константы и переменные
- •Основные (стандартные) типы данных
- •Область действия переменных
- •1.3.1. Математические операции
- •1.3.2. Простое присваивание
- •1.3.3. Составное (сложное) присваивание
- •1.3.4. Операция приведения (преобразования) типов
- •1.3.5. Операции отношения
- •1.3.7. Операция sizeof
- •1.3.8. Операция "запятая" (,)
- •1.3.9. Условная операция (?:)
- •1.3.10. Указатель. Определение адреса переменной
- •1.3.11. Директива define
- •1.3.12. Директива include
- •1.3.13. Примеры программ
- •1.3.14. Вопросы для самоконтроля
- •Тема 1.3. Программирование алгоритмов различной структуры
- •Базовые конструкции структурного программирования
- •Операторы ветвления
- •1.4.1. Условный оператор if
- •If (условие) оператор_1; else оператор_2;
- •If (условие) оператор_1;
- •1.4.2. Оператор выбора switch
- •Операторы цикла
- •1.4.3. Оператор while
- •1.4.4. Оператор do...While
- •1.4.5. Оператор for
- •1.4.6. Функция exit(), операторы break, continue, return
- •Стандартные математические функции
- •Тема 1.4. Ввод-вывод данных
- •Функции get() и put()
- •Функция getch()
- •Функция printf
- •Функция sprintf()
- •Тема 1.5. Функции. Локальные и глобальные переменные. Способы передачи данных.
- •1.5.1. Видимость переменных
- •1.5.2. Определение функции
- •1.5.3. Функция main
- •1.5.4. Вызов функции
- •1.5.5. Способы передачи данных
- •1.5.6. Возвращаемые значения функции
- •1.5.7. Использование прототипов функций
- •Тема 1.6(1). Массивы и указатели
- •Объявление массива
- •Доступ к элементам массива
- •Многомерные массивы
- •Указатели
- •Тема 1.6(2). Структуры и строки
- •1.6.1. Структуры
- •1 Способ – по шаблону.
- •2 Способ – при объявлении (описании) шаблона.
- •1.6.2. Способы реализации строк
- •1.6.3. Строковые константы
- •1.6.4. Указатель на символьную строку
- •1.6.5. Массив символов
- •1.6.6. Некоторые функции для работы со строками
- •1.6.7. Некоторые функции проверки и преобразования символов
- •Тема 1.7. Работа с памятью
- •Функция malloc
- •Функция free
- •Операция new
- •Операция delete
- •Тема 1.10. Динамические структуры
- •Разновидности динамических структур
- •Примеры программ (фрагментов программ) для работы с динамическими структурами
Доступ к элементам массива
В языке C++ имя массива представляет собой не только имя, которое вы используете в своих программах, но и является адресом, по которому в памяти находится первый элемент массива. Поэтому к элементам массива можно обращаться двумя способами: по индексу элемента и по смещению относительно первого элемента.
Пример
int m[6] = {4, 3 , 1, 4, 7, 8 };
Обращение к 4-му элементу массива m:
m[3] – по индексу
(m + 3)[0] – по смещению относительно первого элемента
Возможны и другие варианты:
(m + 0)[3]
(m + 2)[1]
(m - 2)[5]
Наиболее полезно использовать такой подход к массивам, содержащим символьные строки.
Пример
char names [ ]={'Иван', 'Петр', 'Елена' }
Массив names будет выглядеть в памяти следующим образом:
0 |
И |
1 |
В |
2 |
А |
3 |
Н |
4 |
\0 |
5 |
П |
6 |
Е |
7 |
Т |
8 |
Р |
9 |
\0 |
10 |
Е |
11 |
Л |
12 |
Е |
13 |
Н |
14 |
А |
15 |
\0 |
Команды вывода дают следующий результат:
cout << names; // выводится «Иван» (до признака конца строки)
cout << names+5; // выводится «Петр»
Многомерные массивы
Многомерный массив – это массив, в котором элементы имеют более чем один индекс.
Чаще всего используются двумерные массивы.
При объявлении многомерного массива необходимо указать C++, что массив имеет более чем одно измерение.
Формат объявления двумерного массива:
<тип элементов массива> <имя массива>[количество строк][количество столбцов]
Пример 1
int t[3][4]; // описывается двумерный массив, состоящий из 3 строк и 4 столбцов
Элементы массива:
t[0][0] t[0][1] t[0][2] t[0][3]
t[1][0] t[1][1] t[1][2] t[1][3]
t[2][0] t[2][1] t[2][2] t[2][3]
При выполнении команды объявления массива под массив резервируется место. Элементы массива располагаются в памяти один за другим:
Пример 2
int temp [3] [15] [10]; // резервируется место под 3-х мерный массив
В памяти многомерные массивы представляются как одномерный массив, каждый из элементов которого, в свою очередь, представляет собой массив.
Рассмотрим на примере двумерного массива.
int a[3][2]={4, l, 5,7,2, 9};
Представляется в памяти:
a[0][0] |
заносится значение 4 |
a[0][1] |
заносится значение 1 |
a[1][0] |
заносится значение 5 |
a[1][1] |
заносится значение 7 |
a[2][0] |
заносится значение 2 |
a[2][1] |
заносится значение 9 |
Второй способ инициализации при объявлении массива
int а[3][2]={ {4,1}, {5, 7}, {2, 9} };
Обращение к элементу массива производится через индексы.
Примеры
cout<< а[0][0]; // выводится значение 4
cout << a[1][1]; // выводится знaчение 7
Пример
Программа, которая инициализирует массив и выводит его элементы на экран.
#include <iostream.h>
main ()
{
int a[3] [2]={ {1,2}, {3,4}, {5,6} };
int i,j;
for (i=0; i<=2; i++)
for(j=0;j<=l;j++)
cout <<"\n a["<< i <<"," << j <<"] ="<< a[i]|j];
return 0;
}
Для того чтобы убрать из программы явные значения размера и массива, можно воспользоваться директивой define:
#include < iostream.h>
#define I 3
#define J 2
main()
{
int a[I][J]={ {l,2}, {3,4}, {5,6} };
int i, j;
for ( i=0 ; i< I; i++)
for( j=0; j< J; j++)
\cout <<"\n a["<< i <<"," << j << "] ="<< a[i][j];
return 0;
}
При передаче массива в функцию всегда происходит передача его адреса. Т.о. в C++ все массивы передаются по адресу.
Пример
Вводится квадратная матрица с максимальным размером 10 на 10. Ввод матрицы оформлен в виде отдельной функции vvod. Программа заменяет все отрицательные числа их модулями.
#include <iostream.h>
void vvod (int u[10][10], int n)
{
int i,j;
for (i=0; i<n; i++)
{ cout <<"\nVvedi "<< i<<" stroky";
for (j=0; j< n; j++)
cin>> u[i][j];
}
}
void main()
{
int a[10][10];
int n,i,j,min;
cout<<"\nВведите количество строк и столбцов";
cin>>n;
vvod(a, n);
for (i=0; i< n; i++)
for (j=0; j< n; j++)
if (a[i][j] < 0) a[i][j]=-a[i][j];
// Вывод матрицы
cout <<"\n";
for (i=0; i< n; i++)
{
for (j=0; j< n; j++)
cout<< u[i][j]<<" ";
cout<<"\n";
}
}
Принимающая функция получает не весь массив, а только адрес первого элемента массива. Несмотря на то, что в блоке main массив называется а, а в функции vvod – u, это один и тот же массив.