Дан двумерный массив. найти: а) минимальную сумму элементов строки; б) максимальную сумму элементов столбца. обе решить двумя с использованием дополнительного одномерного массива; 2) без использования дополнительного одномерного массива.
/ PascalABC.NET 3.3, сборка 1573 от 04.11.2017 // Внимание! Если программа не работает, обновите версию!
1. Со вс массивом
begin var (n,m):=ReadInteger2('Количество строк и столбцов в массиве:'); var a:=MatrRandom(n,m,-99,99); Writeln('*** Исходный массив ***'); a.Println(4); Writeln(4*a.ColCount*'-'); var min:=integer.MaxValue; var b:array of integer; for var i:=1 to a.RowCount-1 do begin b:=a.Row(i); // строка в одномерном массиве var s:=b.Sum; if s<min then min:=s; end; var max:=integer.MinValue; for var j:=1 to a.ColCount-1 do begin b:=a.Col(j); // колонка в одномерном массиве var s:=b.Sum; if s>max then max:=s; end; Writeln('Минимальная сумма по строкам ',min); Writeln('Максимальная сумма по колонкам ',max); end.
Минимальная сумма по строкам -131 Максимальная сумма по колонкам 139
2. Без вс массива
begin var (n,m):=ReadInteger2('Количество строк и столбцов в массиве:'); var a:=MatrRandom(n,m,-99,99); Writeln('*** Исходный массив ***'); a.Println(4); Writeln(4*a.ColCount*'-'); Writeln('Минимальная сумма по строкам ', a.Rows.Select(row->row.Sum).Min); Writeln('Максимальная сумма по колонкам ', a.Cols.Select(col->col.Sum).Max); end.
#include <iostream> using namespace std; int minSumRow1(int ** const a, const int N, const int M) { int sum = 0; int *buff = new int[N]; for (size_t i = 0; i < N; ++i) { buff[i] = 0; for (size_t j = 0; j < M; ++j) buff[i] += a[i][j]; } sum = buff[0]; for (size_t i = 1; i < N; ++i) if (sum > buff[i]) sum = buff[i]; return sum; } int minSumRow2(int ** const a, const int N, const int M) { int sum, buff; bool flag = true; for (size_t i = 0; i < N; ++i) { buff = 0; for (size_t j = 0; j < M; ++j) buff += a[i][j]; if (flag || buff < sum) { flag = false; sum = buff; } } return sum; } int maxSumCol1(int ** const a, const int N, const int M) { int sum = 0; int *buff = new int[M]; for (size_t j = 0; j < M; ++j) { buff[j] = 0; for (size_t i = 0; i < N; ++i) buff[j] += a[i][j]; } sum = buff[0]; for (size_t j = 1; j < M; ++j) if (sum < buff[j]) sum = buff[j]; return sum; } int maxSumCol2(int ** const a, const int N, const int M) { int sum, buff; bool flag = true; for (size_t j = 0; j < M; ++j) { buff = 0; for (size_t i = 0; i < N; ++i) buff += a[i][j]; if (flag || buff > sum) { flag = false; sum = buff; } } return sum; } int main() { setlocale(LC_ALL, "Russian"); const size_t N = 5, M = 6; int **a = new int*[N]; cout << "Массив" << endl; for (size_t i = 0; i < N; ++i){ a[i] = new int[M]; for (size_t j = 0; j < M; ++j){ a[i][j] = 1 + rand() % 9; cout << a[i][j] << " "; } cout << endl; } cout << endl;
cout << minSumRow1(a, N, M) << endl; cout << minSumRow2(a, N, M) << endl;
cout << maxSumCol1(a, N, M) << endl; cout << maxSumCol2(a, N, M) << endl; system("pause"); return 0; }
// Внимание! Если программа не работает, обновите версию!
1. Со вс массивом
begin
var (n,m):=ReadInteger2('Количество строк и столбцов в массиве:');
var a:=MatrRandom(n,m,-99,99);
Writeln('*** Исходный массив ***'); a.Println(4);
Writeln(4*a.ColCount*'-');
var min:=integer.MaxValue;
var b:array of integer;
for var i:=1 to a.RowCount-1 do begin
b:=a.Row(i); // строка в одномерном массиве
var s:=b.Sum;
if s<min then min:=s;
end;
var max:=integer.MinValue;
for var j:=1 to a.ColCount-1 do begin
b:=a.Col(j); // колонка в одномерном массиве
var s:=b.Sum;
if s>max then max:=s;
end;
Writeln('Минимальная сумма по строкам ',min);
Writeln('Максимальная сумма по колонкам ',max);
end.
Пример
Количество строк и столбцов в массиве: 5 8
*** Исходный массив ***
-89 16 35 74 -76 -3 -3 -25
54 -24 12 13 63 -60 4 92
74 82 12 12 -1 11 -29 -19
-72 -79 -3 -22 71 -53 57 -30
65 -25 2 -25 82 -73 4 -23
Минимальная сумма по строкам -131
Максимальная сумма по колонкам 139
2. Без вс массива
begin
var (n,m):=ReadInteger2('Количество строк и столбцов в массиве:');
var a:=MatrRandom(n,m,-99,99);
Writeln('*** Исходный массив ***'); a.Println(4);
Writeln(4*a.ColCount*'-');
Writeln('Минимальная сумма по строкам ',
a.Rows.Select(row->row.Sum).Min);
Writeln('Максимальная сумма по колонкам ',
a.Cols.Select(col->col.Sum).Max);
end.
Пример
Количество строк и столбцов в массиве: 7 4
*** Исходный массив ***
-44 32 -66 -71
56 -99 83 27
-30 39 -65 -95
-40 6 37 37
75 23 -86 80
-12 98 -65 28
47 -85 25 -6
Минимальная сумма по строкам -151
Максимальная сумма по колонкам 52
#include <iostream>
using namespace std;
int minSumRow1(int ** const a, const int N, const int M) {
int sum = 0;
int *buff = new int[N];
for (size_t i = 0; i < N; ++i) {
buff[i] = 0;
for (size_t j = 0; j < M; ++j)
buff[i] += a[i][j];
}
sum = buff[0];
for (size_t i = 1; i < N; ++i)
if (sum > buff[i])
sum = buff[i];
return sum;
}
int minSumRow2(int ** const a, const int N, const int M) {
int sum, buff;
bool flag = true;
for (size_t i = 0; i < N; ++i) {
buff = 0;
for (size_t j = 0; j < M; ++j)
buff += a[i][j];
if (flag || buff < sum) {
flag = false; sum = buff;
}
}
return sum;
}
int maxSumCol1(int ** const a, const int N, const int M) {
int sum = 0;
int *buff = new int[M];
for (size_t j = 0; j < M; ++j) {
buff[j] = 0;
for (size_t i = 0; i < N; ++i)
buff[j] += a[i][j];
}
sum = buff[0];
for (size_t j = 1; j < M; ++j)
if (sum < buff[j]) sum = buff[j];
return sum;
}
int maxSumCol2(int ** const a, const int N, const int M) {
int sum, buff;
bool flag = true;
for (size_t j = 0; j < M; ++j) {
buff = 0;
for (size_t i = 0; i < N; ++i)
buff += a[i][j];
if (flag || buff > sum) {
flag = false;
sum = buff;
}
}
return sum;
}
int main() {
setlocale(LC_ALL, "Russian");
const size_t N = 5, M = 6;
int **a = new int*[N];
cout << "Массив" << endl;
for (size_t i = 0; i < N; ++i){
a[i] = new int[M];
for (size_t j = 0; j < M; ++j){
a[i][j] = 1 + rand() % 9;
cout << a[i][j] << " ";
}
cout << endl;
}
cout << endl;
cout << minSumRow1(a, N, M) << endl;
cout << minSumRow2(a, N, M) << endl;
cout << maxSumCol1(a, N, M) << endl;
cout << maxSumCol2(a, N, M) << endl;
system("pause");
return 0;
}
Кодяра выше