Int Минимум_столбца (int Столбец)
Каждая из этих функций возвращает соответствующее значение из указанной параметром функции строки или столбца. Если эти функции у нас будут, то функция Это_седловая_точка будет выглядеть так:
bool Это_седловая_точка(int Строка, int Столбец)
{
return ((A[Строка][Столбец] == Максимум_строки(Строка)) &&
(A[Строка][Столбец] == Минимум_столбца(Столбец))) ||
((A[Строка][Столбец] == Минимум_строки(Строка)) &&
(A[Строка][Столбец] == Максимум_столбца(Столбец)));
}
Теперь реализуем оставшиеся 4 функции по определению максимальных и минимальных значений элементов:
int Максимум_строки(int Строка)
{
int Максимум = A[Строка][0];
for (int i = 1; i < n; ++i)
if (A[Строка][i] > Максимум)
Максимум = A[Строка][i];
return Максимум;
}
int Минимум_строки(int Строка)
{
int Минимум = A[Строка][0];
for (int i = 1; i < n; ++i)
if (A[Строка][i] < Минимум)
Минимум = A[Строка][i];
return Минимум;
}
int Максимум_столбца(int Столбец)
{
int Максимум = A[0][Столбец];
for (int i = 1; i < n; ++i)
if (A[i][Столбец] > Максимум)
Максимум = A[i][Столбец];
return Максимум;
}
int Минимум_столбца(int Столбец)
{
int Минимум = A[0][Столбец];
for (int i = 1; i < n; ++i)
if (A[i][Столбец] < Минимум)
Минимум = A[i][Столбец];
return Минимум;
}
Теперь подкорректируем главную функцию нашей программы для возможности многократного повторения выполнения программы с разными исходными данными (это необходимо сделать, поскольку получить случайную матрицу с седловыми точками иногда бывает не так просто):
int _tmain(int argc, _TCHAR* argv[])
{
char c;
setlocale(0, "");
do
{
Подготовка_данных();
Решение_и_вывод_результатов();
}
while (cout << "\n\t\t\tПродолжим? (нет - Esc)", c = _getch(),
cout << "\n\n", c != 27);
return 0;
}
Итак, получена следующая рабочая программа:
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <conio.h>
using namespace std;
const int n = 5, m = 5; // n - количество строк, m - количество столбцов матрицы
int A[n][m]; // А - исходная матрица
void Заполнение_массива()
{
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
A[i][j] = rand() % 3;
}
void Вывод_массива()
{
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
cout << setw(4) << right << A[i][j];
cout << endl;
}
}
void Подготовка_данных()
{
Заполнение_массива();
Вывод_массива();
}
int Максимум_строки(int Строка)
{
int Максимум = A[Строка][0];
for (int i = 1; i < m; ++i)
if (A[Строка][i] > Максимум)
Максимум = A[Строка][i];
return Максимум;
}
int Минимум_строки(int Строка)
{
int Минимум = A[Строка][0];
for (int i = 1; i < m; ++i)
if (A[Строка][i] < Минимум)
Минимум = A[Строка][i];
return Минимум;
}
int Максимум_столбца(int Столбец)
{
int Максимум = A[0][Столбец];
for (int i = 1; i < n; ++i)
if (A[i][Столбец] > Максимум)
Максимум = A[i][Столбец];
return Максимум;
}
int Минимум_столбца(int Столбец)
{
int Минимум = A[0][Столбец];
for (int i = 1; i < n; ++i)
if (A[i][Столбец] < Минимум)
Минимум = A[i][Столбец];
return Минимум;
}
bool Это_седловая_точка(int Строка, int Столбец)
{
return ((A[Строка][Столбец] == Максимум_строки(Строка)) &&
(A[Строка][Столбец] == Минимум_столбца(Столбец))) ||
((A[Строка][Столбец] == Минимум_строки(Строка)) &&
(A[Строка][Столбец] == Максимум_столбца(Столбец)));
}
void Решение_и_вывод_результатов()
{
cout << endl;
int Счетчик = 0; // Количество седловых точек
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
if (Это_седловая_точка(i, j))
// Выводим индексы i и j седловой точки и увеличиваем
// количество седловых точек на 1
{
cout << setw(4) << i << setw(4) << j << endl;
++ Счетчик;
}
cout << "\nКоличество седловых точек: " << Счетчик << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
char c;
setlocale(0, "");
do
{
Подготовка_данных();
Решение_и_вывод_результатов();
}
while (cout << "\n\t\t\tПродолжим? (нет - Esc)", c = _getch(),
cout << "\n\n", c != 27);
return 0;
}
А вот фрагмент результатов ее работы:
Здесь мы получили матрицу с 4-мя седловыми точками – выделены красным.
Проанализируем ход проектирования программы.
Использованный метод проектирования называется проектированием “сверху вниз” или методом пошаговой детализации. Этот метод основан на последовательном разбиении решения задачи на более простые функционально независимые подзадачи. Такая детализация продолжается до тех пор, пока реализация очередной подзадачи в виде исполняемой программы не становится очевидной. Естественным способом реализации этого метода является представление каждой подзадачи в виде функций, взаимодействующих между собой на уровне данных. Основная часть разработки программы проводилась на чисто логическом уровне, практически без использования инструкций языка программирования. Постепенное дробление алгоритма на более простые подзадачи привело к тому, что реализация каждой из функции, соответствующих этим подзадачам уже не вызывает никаких затруднений при их реализации на языке программирования. Дальнейшая модификация программы (например, реализация ручного ввода исходных данных) связана с коррекцией отдельных функций и не влечет за собой переделки всей программ. Отладка разработанных по такой методике программ может осуществляться по частям (на уровне отдельных функций). Разработку различных частей программы (отдельных ее функций) можно поручить различным исполнителям. Таким образом, использование функций приводит к очевидным преимуществам.
Дата добавления: 2019-02-07; просмотров: 243;