Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмизация и программирование на языке С++. Ч.1. Учебник

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
8. Массивы
141
} cout << endl; }
int L=1; for(int i=0; i<n; i++)
{
for(int j=m-1; j>=L+1; j--)
{
Arr10[i][j] = Arr10[i][j-1];
} }
// Изменения матрицы при последовательных сдвигах (начинаем с «хвоста») {'a', 'b', 'c', 'Z'}, {'a', 'b', 'c', 'Z'}, {'a', 'b', 'c', 'Z'}
1th {'a', 'b', 'c', 'c'}, {'a', 'b', 'c', 'c'}, {'a', 'b', 'c', 'c'} 2th {'a', 'b', 'b', 'c'}, {'a', 'b', 'b', 'c'}, {'a', 'b', 'b', 'c'}
cout << "\nСдвинули \n"; for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{ cout.width(2); cout << Arr10[i][j] << " "; } cout << endl; }
for(int i=0; i<n; i++)
142
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
Arr10[i][L] = Ins10[i];
cout << "\nЗаменили \n"; for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{ cout.width(2); cout << Arr10[i][j] << " "; } cout << endl; }
Результат выполнения программы приведен на рис. 8.27.
Рис. 8.27. Добавляем столбец в таблицу
Программа будет работать правильно для любого коррект­ного значения L. Результаты включения на место первого и последнего столбцов приведены на рис. 8.28, а и 8.28, б соот­ветственно.
Покажем, как проверять номер столбца, вводящийся с клавиатуры. Это выполняется в цикле, и после ввода значения оно проверяется на допустимость. Если ввод верный, то цикл прекращается. В противном случае выводится сообщение об ошибке, и цикл повторяется. Таким образом, цикл не завер­шится, пока не будет задано корректное значение (рис. 8.29).
8. Массивы
143
б а
Рис. 8.28. Добавляем столбец в таблицу:
аL = 0 – первый столбец; бL = 3 – последний столбец
Рис. 8.29. Проверка корректности ввода номера столбца
bool TF = true; int L;
while (TF) {
cout << "Введите номер столбца от 0 до 3" << endl; cin >> L; f ( (0<=L) & (L<=3) )
{
TF = false;
break; }
144
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
else
cout << "Ввод не верен\n" << endl;
}
cout << " L= " << L << endl;
Следующая программа объединяет два массива в один. Оба содержат по 4 столбца и 2 строки. А в результирующем масси­ве будет 4 строки и 4 столбца.
const int n=4; const int m=2;
int Arr11a[n][m] { { 1, 2}, { 1, 2}, { 1, 2}, { 1, 2} };
int Arr11b[n][m]
{ { 4, 5}, { 4, 5}, { 4, 5}, { 4, 5}
};
int Arr11ab[n][n] { { 0, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 0}, { 0, 0, 0, 0}, };
// Объединим в одном массиве
for(int i=0; i<n; i++) for(int j=0; j<m; j++)
{
Arr11ab[i][j]=Arr11a[i][j]; Arr11ab[i][j+m]=Arr11b[i][j];
8. Массивы
145
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
cout << Arr11ab[i][j] << " "; cout << endl; }
В результате (рис. 8.30) не выведены исходные массивы.
Рис. 8.30. Последовательное объединение двух таблиц
А теперь покажем, как решить задачу нахождения суммы элементов квадратной матрицы, расположенных строго ниже ее главной диагонали, не включая диагональ. В табл. 8.1 со­держатся индексы всех элементов матрицы размером 4×4, а последнем столбце перечислены индексы элементов, соответ­ствующих условию задачи.
Индексы элементов, расположенных ниже главной диагонали
0,0 0,1 0,2 0,3 1,0 1,1 1,2 1,3 1,0
2.0 2,1 2,2 2,3 2,0; 2,1 3,0 3,1 3,2 3,3 3,0; 3,1; 3,2
Вот текст программы, решающей задачу.
const int n=4;
int Arr12[n][n] { { 10, 0, 0, 0}, { 1, 10, 0, 0},
Таблица 8.1
146
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
{ 1, 1, 10, 0}, { 1, 1, 1, 10} };
cout << "Исходный массив:" << endl; for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{ cout.width(3); cout << Arr12[i][j]; } cout << "\n"; }
int S=0; for(int i=1; i<n; i++) for(int j=0; j<i; j++)
{
S=S+Arr12[i][j];
}
cout << "Сумма " << S << endl;
Результат выполнения программы приведен на рис. 8.31.
Рис. 8.31. Сумма элементов ниже главной диагонали
Если в цикле программе заменить неравенство на нестрогое:
for(int i=1; i<n; i++) for(int j=0; j<=i; j++) // Заменено < на <=
{
8. Массивы
147
S=S+Arr12[i][j];
}
то будет подсчитана сумма элементов квадратной матрицы, расположенных ниже ее главной диагонали, включая диаго­наль (рис. 8.32).
Рис. 8.32. Сумма элементов главной диагонали и ниже
Рассмотрим такую задачу. Пусть задан массив
{ 1, 5, 0, 0},
{ 2, 6, 0, 0}, { 3, –7, 0, 0}, { 4, 8, 0, 0}
Надо обходить матрицу по столбцам и вывести номер первого встретившегося отрицательного элемента. Обход по столбцам предполагает следующую последовательность эле­ментов: 0,0; 1,0; 2,0; 3,0; 0,1; … и т.д. В табл. 8.2 указаны порядковые номера элементов с соответствующими индекса­ми при таком обходе.
Порядок обхода элементов таблицы по столбцам
1) 0,0 5) 0,1 9) 0,2 13) 0,3
2) 1,0 6) 1,1 10) 1,2 14) 1,3
3) 2,0 7) 2,1 11) 2,2 15) 2,3
4) 3,0 8) 3,1 12) 3,2 16) 3,3
const int n=4;
Таблица 8.2
148
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
const int m=4;
int Arr13[n][m]
{ { 1, 5, 0, 0},
{ 2, 6, 0, 0}, { 3, –7, 0, 0}, { 4, 8, 1, 0}, };
cout << "Исходный массив:" << endl; for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{ cout.width(3); cout << Arr13[i][j] ; } cout << "\n"; }
int ni, nj, L=0; ni=-1; for(int j=0; j<m; j++) for(int i=0; i<n; i++) { L=L+1; cout << L << " i= " << i << " j= " << j << " Arr[i,j]= " << Arr13[i][j] <<endl;
if ( Arr13[i][j] < 0 ) {
ni=i; nj=j; goto L1;
} }
L1: if ( ni >= 0 ) cout << "L = " << L << " i,j "<< ni << " "<< nj << endl;
else
cout << " NOT <0" << endl;
Результат работы программы представлен на рис. 8.33.
8. Массивы
Рис. 8.33. Обход таблицы по столбцам до первого
отрицательного элемента
149
В данной программе использована инструкция безуслов-
goto
ного перехода
. Однако его использование часто подверга­ют критике (см. раздел 7), вслед за автором идеи структурно­го программирования Э. Дейкстры.
goto
Покажем, как такую задачу решать без
в одном варианте используем два цикла
for
, а в другом
, для этого
while
Результаты работы этих двух программ будут такими же.
Фрагмент программы с двумя циклами по счетчику.
int Arr13[n][m]
{ { 1, 5, 0, 0},
{ 2, 6, 0, 0}, { 3, –7, 0, 0}, { 4, 8, 1, 0}, };
for(int j=0; j<m; j++)
{
for(int i=0; i<n; i++) { L=L+1; cout << L << " i= " << i << " j= " << j << " Arr13[i,j]= " << Arr13[i][j] <<endl;
if ( Arr13[i][j] < 0 ) {
.
150
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
ni=i; nj=j; break;
} }
if ( ni >= 0 ) break;
}
if ( ni >= 0 ) cout << "L = " << L << " i,j "<< ni << " "<< nj << endl;
else
cout << " NOT <0" << endl;
Фрагмент программы с использованием
while
.
int Arr13[n][m]
{ { 1, 5, 0, 0},
{ 2, 6, 0, 0}, { 3, –7, 0, 0}, { 4, 8, 1, 0}, };
bool TF1=true; bool TF2; int i, j=0;
while ( TF1 )
{ i=0; TF2 = true;
while ( TF2 )
{ L=L+1; cout << L << " i= " << i << " j= " << j << " Arr[i,j]= " << Arr13[i][j] <<endl;
if ( Arr13[i][j] < 0 ) {
ni=i; nj=j; TF1=false; TF2=false;
} else
i=i+1; if ( i == n) TF2=false;
}
j=j+1; if ( j == m)
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]