- •1.1. Идентификаторы
- •1.5. Структура программы С++
- •1.6. Директивы препроцессора
- •1.8. Функции библиотеки math.h
- •1.9. Форматированный ввод/вывод данных
- •2.3. Целый тип данных
- •2.4. Символьный тип данных
- •2.8. Явное преобразование типов
- •3.2. Операция присваивания
- •3.7. Использование блоков
- •4.1. Оператор условной передачи управления if
- •5.4.4. Функция exit
- •5.4.5. Функция abort
- •6.3. Многомерные массивы
- •7.2.1. Унарные операции
- •7.2.2. Арифметические операции и операции сравнения
- •7.3. Инициализация указателей
- •7.4. Работа с динамической памятью
- •7.5. Создание одномерного динамического массива
- •8.2.2. Передача параметров по ссылке
- •8.2.3. Передача параметров по указателю
- •8.2.6. Передача переменного числа параметров
- •8.3. Встраиваемые функции
- •9.2. Функции для работы со строками
- •9.3. Алгоритмы работы со строками
- •10.2. Объявление и использование объединений
- •11.2. Функции для работы с файлами
- •13.3. Целесообразность использования рекурсии
- •14.1. Простые методы сортировки
- •14.1.1. Метод пузырька
- •14.2. Улучшенные методы сортировки
- •14.2.1. Метод Шелла
- •15.2. Поиск делением пополам
- •15.3. Интерполяционный поиск
- •17.2. Использование древовидных структур
- •19.6. Хеш-таблица на основе связанных списков
- •19.7. Метод блоков
- •3. Программирование циклических алгоритмов
- •5. Использование двумерных массивов
- •7. Программирование с использованием строк
- •9. Программирование с использованием файлов
- •12. Поиск по ключу в одномерном массиве
- •15. Работа с древовидными структурами данных
- •16. Вычисление алгебраических выражений
- •2. Выполнение программы
- •3. Отладка программы
if (a[i] > max) max = a[i];
}
Пример 6.4. Удаление из одномерного массива всех отрицательных элементов.
for (i=0; i<n; i++) if (a[i] < 0)
|
{ |
|
|
|
|
|
|
|
|
|
|
|
Р |
|
for (j=i+1; j<n; j++) a[j-1]=a[j]; |
|
|
|
|||||||||
|
|
|
|
|
|||||||||
|
n--; |
|
i--; |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
У |
|
|
|
|
|
|
|
6.3. Многомерные массивы |
|
|||||||
|
|
|
|
|
|
И |
|||||||
Объявление одномерного массива: |
|
Г |
|||||||||||
тип |
|
|
|
|
|
|
|
|
Б |
|
|
|
|
|
имя_массива [размер_1] [размер 2] … [размер_N]; |
||||||||||||
Пример объявления двумерного массива: |
|
|
|
|
|||||||||
int m[4][5]; |
|
|
|
|
а |
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
||
Здесь объявлен двумерный массив из 4 · 5 = 20 элементов. |
|
||||||||||||
|
|
|
|
|
|
|
|
к |
|
|
|
|
|
Можно одновременно с объявлением иници лизировать элементы массива: |
|||||||||||||
|
|
|
|
|
|
|
авляет |
|
|
|
|
|
|
|
int s[2][3] = { {3, 4, 2}, {6, 3, 4} }; |
|
|
|
|
||||||||
В одномерном массиве п рвый инде с является номером строки, а вто- |
|||||||||||||
|
|
|
|
|
|
т |
|
|
|
|
|
|
|
рой – номером столбца. Поэтому, наприм р, значение элемента s[1][0] равно 6. |
|||||||||||||
Математически массив s предс |
|
собой матрицу вида |
|
|
|||||||||
|
|
3 4 |
2 |
о |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
6 8 |
и |
|
|
|
|
|
|
|
|
||
|
|
5 |
|
|
|
|
|
|
|
|
|
||
|
|
|
л |
|
|
|
|
|
|
|
|
|
|
В памяти компьютера такой массив располагается последовательно по |
|||||||||||||
строкам (рис. 6.2). |
|
|
|
|
|
|
|
|
|
|
|||
|
б |
|
|
|
|
|
|
|
|
|
|
||
и |
|
|
|
|
|
|
|
|
|
|
|
||
Б |
|
|
|
|
|
|
|
Рис. 6.2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Обращение к элементу двумерного массива происходит через указание имени массива и в квадратных скобках номеров строк и столбцов массива. Например:
38
x = s[0][2];
s[1][2] = m[3][2] + s[0][1];
6.4. Алгоритмы работы с двумерными массивами
Пример 6.5. Ввод и вывод двумерного массива целых чисел.
|
// |
Ввод двумерного массива |
|
|
|
|
|||||
cout << "Vvedite razmer n m" << endl; |
|
|
|
|
|||||||
cin >> n >> m; |
|
|
|
|
|
|
|
Р |
|||
for (i=0; i<n; i++) |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
И |
|||||
for (j=0; j<m; j++) |
|
|
|
|
|
У |
|
||||
{ |
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
cout << "Vvedite s[" << i << "][" << j << "]: " ; |
|
|
|
||||||||
cin >> s[i][j]; |
|
|
|
|
|
Б |
|
|
|
||
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Г |
|
|
||
|
// |
Вывод двумерного массива |
|
|
|||||||
for (i=0; i<n; i++) |
|
|
|
а |
|
|
|
||||
{ |
|
|
|
|
|
к |
|
|
|
|
|
|
|
|
|
е |
|
|
|
|
|
||
} |
|
|
|
|
|
|
|
|
|
||
for (j=0; j<m; j++) |
|
|
|
|
|
|
|
|
|||
cout << setw (9) << s[i][j] << " "; |
|
|
|
|
|
||||||
cout << endl; |
|
т |
|
|
|
|
|
|
|||
|
|
|
о |
|
|
|
|
|
|
|
|
Пример 6.6. Выв д двумерного массива из действительных чисел. |
|||||||||||
|
|
и |
|
|
|
|
|
|
|
|
|
for (i=0; i<n; i++) |
|
|
|
|
|
|
|
|
|||
{ |
л |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (j=0; j<m; j++) |
|
|
|
|
|
|
|
|
||
|
cout << setiosflags (ios :: fixed) << |
|
|
|
|
||||||
и |
|
|
|
|
|
|
|
|
|
|
|
Б |
setw(10) << setprecision(3)<< s[i][j] << " "; |
|
|
|
|||||||
coutб<< endl; |
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
}
Пример 6.7. Заполнение двумерного массива случайными действительными числами из диапазона nmin…nmax.
Для генерации случайных чисел используют функции библиотеки stdlib.lib:
rand() – генерирует псевдослучайное число из диапазона 0…RAND_MAX
(32767).
39
srand() – устанавливает аргумент для создания новой последовательности псевдослучайных целых чисел, возвращаемых функцией rand().
srand( time( NULL ) ); for (i=0; i<n; i++) for (j=0; j<m; j++)
s[i][j] = static_cast <double> (rand()) /
(RAND_MAX + 1) * (nmax - nmin) + nmin;
|
|
|
|
|
|
|
|
|
|
|
|
|
Р |
Пример 6.8. Нахождение суммы элементов, лежащих на побочной диаго- |
|||||||||||||
нали. |
|
|
|
|
|
|
|
|
|
|
|
И |
|
s = 0; |
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
||
for (i=0; i<n; i++) |
s += a[i][n-i-1]; |
|
У |
|
|||||||||
|
{ |
|
|
|
|
|
|
|
|
|
|
||
Пример 6.9. |
Перестановка строк с номерами k1 и k2. |
|
|
||||||||||
for (j=0; j<m; j++) |
|
|
|
|
Г |
|
|
||||||
|
|
|
|
|
|
|
|
||||||
|
t = a[k1][j]; |
|
|
|
|
|
а |
|
|
|
|||
|
a[k1][j] = a[k2][j]; |
|
|
|
|
|
|
||||||
|
|
|
|
|
Б |
|
|
|
|||||
|
a[k2][j] = t; |
|
|
|
|
|
к |
|
|
|
|||
|
} |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Пример 6.10. Нахождение суммы элементов, лежащих выше главной |
|||||||||||||
диагонали. |
|
|
|
|
т |
|
|
|
|
|
|
||
s = 0; |
|
|
о |
е |
|
|
|
|
|
||||
for (i=0; i<n-1; i++) |
|
|
|
|
|
|
|
|
|||||
|
|
и |
|
|
|
|
|
|
|
|
|||
|
for (j=i+1; |
j<m; |
j++) |
|
|
|
|
|
|
|
|||
|
s += a[i][j]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
л |
|
|
|
|
|
|
|
|
|
|
||
|
б |
|
Упорядочение столбцов матрицы по неубыванию их мак- |
||||||||||
Пример 6.11. |
|||||||||||||
симальных э ементов. |
|
|
|
|
|
|
|
|
|
|
|||
Б |
for (i=0; i<n; i++) |
|
|
|
|
|
|
|
|
||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
иb[i] = a[i][0]; |
|
|
|
|
|
|
|
|
|
|
|
for (j=1; j<m; j++)
if (a[i][j] > b[i]) b[i] = a[i][j];
}
for (i=0; i<n-1; i++) for (j=i+1; j<m; j++)
40
if (b[i] > b[j])
{
t = b[i]; b[i] = b[j]; b[j] = t;
for (k=0; k<m; k++)
{ |
|
|
t = a[i][k]; |
Р |
|
a[i][k] = a[j][k]; |
||
a[j][k] = t; |
||
} |
||
} |
||
И |
||
|
||
Пример 6.12. Получение из матрицы n-го порядка матрицы порядка n–1 |
путем удаления из исходной матрицы строк и столбцов, на пересечении кото- |
||||||||||
рых расположен элемент с наименьшим значением |
|
У |
||||||||
Г |
||||||||||
imin=jmin=0; |
|
|
|
|
||||||
|
|
|
Б |
|
||||||
for (i=0; i<n; i++) |
|
|
|
|
||||||
|
for (j=0; j<m; j++) |
|
|
|
|
|||||
|
|
|
|
|
|
|
||||
|
if (a[i][j] < a[imin][jmin]) {imin = i; jmin = j;} |
|
||||||||
|
|
|
|
|
|
а |
|
|
||
for (i=0; i<n; i++) |
|
к |
|
|
|
|||||
е |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|||
|
for (j=jmin; j<m-1; j++) a[i][j] = a[i][j+1]; |
|
|
|||||||
|
m--; |
|
т |
|
|
|
|
|
||
for (j=0; j<m; j++) |
|
|
|
|
|
|||||
|
for (i=imin; i<nо-1; i++) a[i][j] = a[i+1][j]; |
|
|
|||||||
|
n--; |
|
и |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
л |
|
|
|
|
|
|
||
|
б |
|
|
|
|
|
|
|
||
и |
|
|
|
|
|
|
|
|
||
Б |
|
|
|
|
|
|
|
|
|
41