08.10.2009, 16:47
общий
это ответ
Здравствуйте, Искужина Светлана Юлаевна. Ответ в приложении (MS Visual C++ 6). Программа, по-моему, достаточна "сырая" и не до конца распроцедурена. Жду замечаний и пожеланий.
Приложение:
/*
1. Элемент матрицы называется локальным, если он строго меньше всех имеющихся
у него соседей. Подсчитать количество локальных минимумов заданной матрицы
размером 10 на 10.
2. Найти сумму модулей элементов, расположенных выше главной диагонали.
Меню программы - двумерный массив;
Ручная и автоматическая генерация.
*/
#include <iostream>
#include <cstdlib>
#include <iomanip>
using namespace std;
const items = 2;
const popup = 2;
char * items_mnu[items] = {"crea_kind", "operation"};
char * main_mnu[items][popup] = {{"manual", "random"}, {"upper_right", "locals"}};
void getsize2d( int &rows, int &cols);
int ** crea2d(const int rows, const int cols);
void init2d_val(int **mat, const int rows, const int cols, const int value);
void init2d_rnd(int **mat, const int rows, const int cols);
void init2d_man(int **mat, const int rows, const int cols);
void print2d(int **mat, const int rows, const int cols);
void free2d(int **mat, const int rows);
int sum_upper_right(int **mat, const int size);
int calc_locals(int **mat, int **calc_mat, const int rows, const int cols);
int main()
{
bool exists_locals = false;
bool exists_data = false;
int rows, cols;
int **data;
int **locals;
int it;
int sub_it;
int crea_choice;
int oper_choice;
/// do_menu();
crea_choice = 1;
oper_choice = 1;
do
{
for (it=0; it<items; it++)
{
for (sub_it=0; sub_it<popup; sub_it++)
{
cout << it+1 << "." << sub_it+1 << ".";
cout << main_mnu[0][it] << "-" <<main_mnu[1][sub_it] << endl;
}
}
cout << items_mnu[0] << " ";
cin >> crea_choice;
if (crea_choice ==0)
{
cout << "good luck" << endl;
if (exists_data)
free2d(data, rows);
if (exists_locals)
free2d(locals, rows);
break;
}
else if ((crea_choice==1) || (crea_choice==2))
{
getsize2d(rows, cols);
if (!(exists_data))
{
data = crea2d(rows, cols);
exists_data = true;
}
if (crea_choice == 1)
{
init2d_man(data, rows, cols);
}
else if (crea_choice == 2)
{
init2d_rnd(data, rows, cols);
}
print2d(data,rows,cols);
cout << items_mnu[1] << " ";
cin >> oper_choice;
if (oper_choice == 1)
{
cout << "upper right sum is " << sum_upper_right(data, rows) << endl;
}
else if (oper_choice == 2)
{
if (!(exists_locals))
{
locals = crea2d(rows, cols);
exists_locals = true;
}
init2d_val(locals, rows, cols, 1);
cout << "locals = " << calc_locals(data, locals, rows, cols) << endl;
}
else
{
cout << "it's a wrong choice, once again, please.." << endl;
}
}
else
{
cout << "it's a wrong choice, once again, please.." << endl;
}
}
while (crea_choice != 0 && oper_choice != 0);
return 0;
}
void print2d( int** mat, const int rows, const int cols )
{
for ( int r = 0; r<rows; ++r) {
for ( int c = 0; c<cols; ++c )
cout << setw(6) << mat[r][c];
cout << endl;
}
}
int sum_upper_right(int **mat, const int size)
{
int s = 0;
for (int r = 0; r<size-1; ++r)
{
for (int c = r+1; c<size; ++c)
{
s += abs(mat[r][c]);
}
}
return s;
}
int calc_locals(int **mat, int **calc_mat, const int rows, const int cols)
{
int qty;
int r;
int c;
// 0-я строка
for (c=1; c<cols; ++c)
{
// по строке с левыми
if (mat[0][c] > mat[0][c-1])
calc_mat[0][c] = 0;
else if (mat[0][c] < mat[0][c-1])
calc_mat[0][c-1] = 0;
else
calc_mat[0][c-1] = calc_mat[0][c] = 0;
}
// 0-й столбец
for (r=1; r<rows; ++r)
{
// по столбцу с верхними
if (mat[r][0] > mat[r-1][0])
calc_mat[r][0] = 0;
else if (mat[r][0] < mat[r-1][0])
calc_mat[r-1][0] = 0;
else
calc_mat[r-1][0] = calc_mat[r][0] = 0;
// по диагонали с верхними правыми
if (mat[r][0] > mat[r-1][1])
calc_mat[r][0] = 0;
else if (mat[r][0] < mat[r-1][1])
calc_mat[r-1][1] = 0;
else
calc_mat[r-1][1] = calc_mat[r][0] = 0;
}
// правый столбец (c==cols-1)
for (r=1; r<rows; ++r)
{
// по столбцу с верхними
if (mat[r][cols-1] > mat[r-1][cols-1])
calc_mat[r][cols-1] = 0;
else if (mat[r][cols-1] < mat[r-1][cols-1])
calc_mat[r-1][cols-1] = 0;
else
calc_mat[r-1][cols-1] = calc_mat[r][cols-1] = 0;
// по диагонали с верхними левыми
if (mat[r][cols-1] > mat[r-1][cols-2])
calc_mat[r][cols-1] = 0;
else if (mat[r][cols-1] < mat[r-1][cols-2])
calc_mat[r-1][cols-2] = 0;
else
calc_mat[r-1][cols-2] = calc_mat[r][cols-1] = 0;
}
// все остальное
for (r=1; r<rows; ++r)
{
for (c=1; c<cols-1; ++c)
{
// по строке с левыми
if (mat[r][c] > mat[r][c-1])
calc_mat[r][c] = 0;
else if (mat[r][c] < mat[r][c-1])
calc_mat[r][c-1] = 0;
else
calc_mat[r][c-1] = calc_mat[r][c] = 0;
// по столбцу с верхними
if (mat[r][c] > mat[r-1][c])
calc_mat[r][c] = 0;
else if (mat[r][c] < mat[r-1][c])
calc_mat[r-1][c] = 0;
else
calc_mat[r-1][c] = calc_mat[r][c] = 0;
// по диагонали с верхними левыми
if (mat[r][c] > mat[r-1][c-1])
calc_mat[r][c] = 0;
else if (mat[r][c] < mat[r-1][c-1])
calc_mat[r-1][c-1] = 0;
else
calc_mat[r-1][c-1] = calc_mat[r][c] = 0;
// по диагонали с верхними правыми
if (mat[r][c] > mat[r-1][c+1])
calc_mat[r][c] = 0;
else if (mat[r][c] < mat[r-1][c+1])
calc_mat[r-1][c+1] = 0;
else
calc_mat[r-1][c+1] = calc_mat[r][c] = 0;
}
}
qty = 0;
for ( r = 0; r<rows; ++r) {
for ( c = 0; c<cols; ++c )
qty += calc_mat[r][c];
}
return qty;
}
void getsize2d( int &rows, int &cols)
{
cout << "rows = ";
cin >> rows;
cout << "cols = ";
cin >> cols;
}
int ** crea2d(const int rows, const int cols)
{
int ** mat = new int* [rows];
for (int r=0; r<rows; ++r)
mat[r] = new int [cols];
return mat;
}
void init2d_rnd(int **mat, const int rows, const int cols)
{
int seed;
cout << "seed";
cin >> seed;
srand(seed);
for ( int r = 0; r<rows; ++r )
{
for ( int c=0; c<cols; ++c )
{
mat[r][c] = rand();
}
}
}
void free2d(int **mat, const int rows)
{
for (int r=0; r<rows; ++r)
delete[] mat[r];
delete[] mat;
}
void init2d_man(int **mat, const int rows, const int cols)
{
for ( int r = 0; r<rows; ++r )
for ( int c=0; c<cols; ++c ) {
cout << "mat[" << r << "][" << c << "]=";
cin >> mat[r][c];
}
}
void init2d_val(int **mat, const int rows, const int cols, const int value)
{
for ( int r = 0; r<rows; ++r )
{
for ( int c=0; c<cols; ++c )
{
mat[r][c] = value;
}
}
}
5
Спасибо огромное, Леониду! <br>