Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмизация и программирование на языке С++. Ч.1. Учебник
.pdf
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)
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
