Алгоритмические основы информатики. Учебное пособие
.pdf}
void output_m(int a[n_max][m_max],int n){ for (int i=0;i<n;i++){
for (int j=0;j<n;j++) cout<<a[i][j]<<"\t"; cout<<"\n";
}
}
int summa_diag(int a[n_max][m_max],int n){ int s=0;
for (int i=0;i<n;i++) s+=a[i][i]+a[i][n-1-i]; return s;
}
Пример 11. В заданном целочисленном массиве A(n, n) найти сумму элементов, лежащих выше главной и побочной диагоналей и на них.
/* В заданном целочисленном массиве A(n,n) найти сумму элементов, лежащих выше главной и побочной диагоналей и на них */
#include <iostream> #include <math.h> using namespace std; const int n_max=30, m_max=30;
void input_m(int a[n_max][m_max],int &n); void output_m(int a[n_max][m_max],int n); int summa_diags(int a[n_max][m_max],int n); bool prime(int n);
int main(){
int a[n_max][m_max]; int n,s; input_m(a,n); cout<<endl; output_m(a,n);
81
cout<<endl; s=summa_diags(a,n); cout<<endl; cout<<"s= "<<s; return 0;
}
void input_m(int a[n_max][m_max],int &n){ cout<<"n= ";cin>>n;
for (int i=0;i<n;i++) for (int j=0;j<n;j++){
cout<<"a["<<i+1<<"]["<<j+1<<"]= "; cin>>a[i][j];
}
}
void output_m(int a[n_max][m_max],int n){ for (int i=0;i<n;i++){
for (int j=0;j<n;j++) cout<<a[i][j]<<"\t"; cout<<"\n";
}
}
bool prime(int n){ double m=sqrt(n); int d=2;
while (d<=m&& n%d!=0) d++;
return d>m;
}
int summa_diags(int a[n_max][m_max],int n){ int s=0;
int m=(n+1)/2;
for (int i=0;i<=m;i++) for(int j=i;j<=n-1-i;j++) if (prime(a[i][j])) s+=a[i][j];
return s;
}
82
Пример 12. Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик.
/*Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов. Переставляя столбцы заданной матрицы расположить их в соответствии с ростом характеристик */
#include <iostream> #include <math.h> using namespace std; const int n_max=30, m_max=30;
void input_m(int a[n_max][m_max],int &n); void output_m(int a[n_max][m_max],int n);
int main(){
int a[n_max][m_max],b[n_max]; int n,s;
input_m(a,n); cout<<endl; output_m(a,n); cout<<endl;
for (int j=0;j<n;j++){ b[j]=0;
for (int i=0;i<n;i++)
if ((a[i][j]<0) && (abs(a[i][j])%2==1)) b[j]+=abs(a[i][j]);
}
for (int i=0;i<n-1;i++) for (int j=i+1;j<n;j++) if (b[i]>b[j]){
swap(b[i],b[j]);
for (int k=0;k<n;k++) swap(a[k][i],a[k][j]);
}
cout<<endl;
for (int i=0;i<n;i++) cout<<b[i]<<" ";
83
cout<<endl; output_m(a,n); return 0;
}
void input_m(int a[n_max][m_max],int &n){ cout<<"n= ";cin>>n;
for (int i=0;i<n;i++) for (int j=0;j<n;j++){
cout<<"a["<<i+1<<"]["<<j+1<<"]= "; cin>>a[i][j];
}
}
void output_m(int a[n_max][m_max],int n){ for (int i=0;i<n;i++){
for (int j=0;j<n;j++) cout<<a[i][j]<<"\t"; cout<<"\n";
}
}
Пример 13. Верно ли, что заданный целочисленный массив А(n, n)
– это магический квадрат.
/*Верно ли, что заданный целочисленный массив A(n,n)- это магический квадрат */
#include <iostream> #include <math.h> using namespace std; const int n_max=30;
void input_m(int a[n_max][n_max],int &n); void output_m(int a[n_max][n_max],int n);
void prov_diag(int a[n_max][n_max],int &n,int &s1,int &s);
int main()
{
int a[n_max][n_max],b[n_max]; int n,s,s1;
//ввод элементов массива input_m(a,n); cout<<endl;
//вывод элементов массива на экран
84
output_m(a,n); prov_diag(a,n,s1,s);
if (s==s1)
{
//находим суммы по столбцам bool pr=true;int j=0; while (j<n && pr)
{
s1=0;
for(int i=0;i<n;i++) s1+=a[i][j]; if (s1!=s) pr=false; else j++;
}
if (pr)
{
// находим суммы по строкам int i=0;
while (i<n && pr){ s1=0;
for(int j=0;j<n;j++) s1+=a[i][j]; if (s1!=s) pr=false; else i++;
}
if (pr) cout<<"yes"; else {cout<<"no"; return 0;}
}
else {cout<<"no"; return 0;}
}
else cout<<"no"; cout<<endl;
return 0;
}
//функция ввода элементов одномерного массива void input_m(int a[n_max][n_max],int &n){ cout<<"n= ";cin>>n;
for (int i=0;i<n;i++) for (int j=0;j<n;j++){
cout<<"a["<<i+1<<"]["<<j+1<<"]= "; cin>>a[i][j];
}
}
// функция вывода на экран элементов двумерного массива void output_m(int a[n_max][n_max],int n){
for (int i=0;i<n;i++){
85
for (int j=0;j<n;j++) cout<<a[i][j]<<"\t"; cout<<"\n";
}
}
//сравниваем суммы элементов по диагоналям
//функция возвращает сумму элементов главной диагонали s1 и сумму элементов побочной диагонали s.
void prov_diag(int a[n_max][n_max],int &n,int &s1,int &s){ s1=0;s=0;
for (int i=0;i<n;i++){
s1+=a[i][i]; //суммируются элементы главной диагонали
s+=a[i][n-1-i]; |
//суммируются элементы побочной диа- |
гонали
}
}
Контрольные вопросы
1.Описание двумерных массивов.
2.Инициализация двумерных массивов.
3.Способы обработки данных двумерных массивов.
4.Дать определение двумерного массива?
5.Что является аналогом двумерного массива в математике?
6.Назвать способы объявления двумерного массива.
7.Как осуществляетсяобращениек элементам двумерного массива?
8.Назвать способы инициализации двумерного массива?
9.Какие значения принимают элементы двумерного массива при отсутствии в его объявлении инициализатора?
10.Можно ли изменить размер двумерного массива после его соз-
дания?
11.Допустимо ли динамическое определение размера массива?
12.Какорганизовать ввод/выводмассиваразмеромN×Mэлементов?
13.Объяснить основные правила организации вложенных циклов, перечислите способы выхода из внутреннего цикла.
14.Что произойдет с программой, если индексы двумерного массива выйдут за объявленные границы?
15.Какое значение имеют индексы при обращении к первому элементу двумерного массива?
86
Упражнения
1.Составить трассировочную таблицу для задач обработки двумерных массивов, приведенных выше (Примеры 1–12).
2.Составить систему тестов для задач, приведенных выше (При-
меры 1–12).
Задачи Уровень сложности 1
1.Ввести целочисленные элементы матрицы N × N. Утроить значение каждого элемента матрицы, который больше 4.
2.Найти сумму элементов столбца и строки матрицы, на пересечении которых находится максимальный элемент матрицы.
3.В квадратной таблице (любые целые числа) поменять местами элементы строки и столбца, на пересечении которых находится первый минимальный элемент из положительных чисел.
4.Дана квадратная матрица. Составить программу, которая прибавила бы каждому элементу данной строки элемент, принадлежащий этой строке и главной диагонали.
5.Дан двумерный массив. Найти максимальный элемент и заполнить строку и столбец в которых он расположен нулями.
6.Дан двумерный массив. Найти сумму всех элементов главной диагонали.
7.Дан двумерный массив. Переставить местами элементы на диагоналях (построчно)
8.Дан двумерный массив. Переставить местами максимальный
иминимальный элемент.
9.Дана целочисленная матрица размера 6 × 9. Найти матрицу, получающуюся из данной перестановкой столбцов – первого с последним, второго с предпоследним и т. д.
10.Дана целочисленная матрица размера 5 × 8. Найти матрицу, получающуюся из данной перестановкой строк – первой с последней, второго с предпоследней и т. д.
11.Дана действительная матрица размера N × M (N > 3, M > 3). Поменять местами строки с номерами 2 и N – 1.
12.Дана действительная матрица размера N × M (N > 3, M > 3). Поменять местами строки с номерами 3 и N – 2.
87
13. Дана действительная матрица размера N × M. Заменить в матрице строку с номером i на сумму строк с номерами i и j.
Уровень сложности 2
1.Даны целые положительные числа M и N. Сформировать целочисленную матрицу размера M × N, у которой все элементы i-й строки имеют значение 10× i (i = 1, ..., M).
2.Даны целые положительные числа M и N. Сформировать целочисленную матрицу размера M × N, у которой все элементы j-го столбца имеют значение 5 × j (j = 1, …, N).
3.Даны целые положительные числа M, N и набор из M чисел. Сформировать матрицу размера M × N, у которой в каждом столбце содержатся все числа из исходного набора (в том же порядке).
4.Даны целые положительные числа M, N и набор из N чисел. Сформировать матрицу размера M × N, у которой в каждой строке содержатся все числа из исходного набора (в том же порядке).
5.Даны целые положительные числа M, N, число D и набор из M чисел. Сформировать матрицу размера M × N, у которой первый столбец совпадает с исходным набором чисел, а элементы каждого следующего столбца равны сумме соответствующего элемента предыдущего столбца и числа D (в результате каждая строка матрицы будет содержать элементы арифметической прогрессии).
6.Даны целые положительные числа M, N, число D и набор из N чисел. Сформировать матрицу размера M × N, у которой первая строка совпадает с исходным набором чисел, а элементы каждой следующей строки равны соответствующему элементу предыдущей строки, умноженному на D (в результате каждый столбец матрицы будет содержать элементы геометрической прогрессии).
7.Дана матрица размером M × N и целое число K (1 < K < M). Вывести элементы K-й строки данной матрицы.
8.Дана матрица размером M × N и целое число K (1 < K < N). Вывести элементы K-го столбца данной матрицы.
9.Дана матрица размером M × N. Вывести ее элементы, расположенные в строках с чётными номерами (2, 4, …). Вывод элементов производить по строкам, условный оператор не использовать.
10.Дана матрица размером M × N. Вывести ее элементы, расположенные в столбцах с нечётными номерами (1, 3, ...). Вывод элементов производить по столбцам, условный оператор не использовать.
88
11.Даны целые числа А1, …, А10, целочисленная квадратная матрица по 30 рядка N. Заменить нулями в матрице те элементы с четной сумной индексов, для которых имеются равные среди А1, …, А10.
12.Дана матрица размером M × N. Подсчитать количество различных элементов матрицы.
13.Дана матрица размером M × N. Определить в матрице строку
снаименьшей суммой элементов.
14.Дана матрица размером M × N. Определить в матрице строки, в которых отрицательных элементов больше, чем положительных.
15.Дана квадратная матрица размером N × N. Найти максимальное значение из элементов, расположенных ниже главной диагонали.
Уровень сложности 3
1.Дана матрица размером M × N. Для каждого столбца матрицы с четным номером (2, 4, ...) найти сумму его элементов. Условный оператор не использовать.
2.Дана матрица размером M × N. В каждой строке матрицы найти минимальный элемент.
3.Дана матрица размером M × N. В каждом столбце матрицы найти максимальный элемент.
4.Дана матрица размером M × N. Найти номер ее строки с наибольшей суммой элементов и вывести данный номер, а также значение наибольшей суммы.
5.Дана матрица размером M × N. Найти номер ее столбца с наименьшим произведением элементов и вывести данный номер, а также значение наименьшего произведения.
6.Дана матрица размером M × N. Найти максимальный среди минимальных элементов ее строк.
7.Дана матрица размером M × N. Найти минимальный среди максимальных элементов ее столбцов.
8.Дана матрица размером M × N. В каждой ее строке найти количество элементов, меньших среднего арифметического всех элементов этой строки.
9.Дана матрица размером M × N. В каждом ее столбце найти количество элементов, больших среднего арифметического всех элементов этого столбца.
89
10.Дана матрица размером M × N. Найти номера строки и столбца для элемента матрицы, наиболее близкого к среднему значению всех ее элементов.
11.Дана матрица размером M × N. Найти максимальное из чисел, которое встречается в данной матрице более одного раза.
12.Дана матрица размером M × N. Найти максимальное значение среди минимальных по строкам.
13.Дана целочисленная матрица размером M × N. Среди столбцов матрицы, которые содержат только чётные числа, найти столбец с максимальной суммой элементов.
14.Для заданной целочисленной матрицы найти максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы.
15.Дана целочисленная матрица размером N × N. Две строки матрицы называются похожими, если совпадают множество чисел этих строк. Найти пару строк, у которых количество непохожих элементов максимально.
16.Дана целочисленная матрица размером N × N. Найти максимум среди сумм элементов диагоналей, параллельных главной.
17.Характеристикой строки целочисленной матрицы назовем сумму ее положительных четных элементов. Переставляя строки заданной матрицы, расположить их в соответствии с ростом характеристик.
Уровень сложности 4
1.Дана матрица размером M×N. Упорядочить ее столбцы так, чтобы их максимальные элементы образовывали возрастающую последовательность.
2.Дана квадратная матрица A порядка M. Найти сумму элементов
ееглавной диагонали.
3.Дана квадратная матрица A порядка M. Найти среднее арифметическое элементов её побочной диагонали.
4.Дана квадратная матрица порядка M. Обнулить элементы матрицы, лежащиенижеглавнойдиагонали.Условныйоператор неиспользовать.
5.Дана квадратная матрица порядка M. Обнулить элементы матри-
цы, лежащие выше побочной диагонали. Условный оператор не использовать.
6. Дана квадратная матрица порядка M. Обнулить элементы матрицы, лежащие на побочной диагонали и ниже неё. Условный оператор не использовать.
90
