Консультация № 172875
04.10.2009, 09:31
0.00 руб.
0 15 1
Здравствуйте, уважаемые эксперты!
У меня вот такая просьба...Помогите, пожалуйста, написать программы в C++:
1. Элемент матрицы называется локальным, если он строго меньше всех имеющихся у него соседей. Подсчитать количество локальных минимумов заданной матрицы размером 10 на 10.
2. Найти сумму модулей элементов, расположенных выше главной диагонали.
Вот такие указали мне требования:
1. Меню программы - двумерный массив;
2. Ручная и автоматическая генерация.
С этим языком столкнулась в первый раз, поэтому прошу полностью написать решение задач.

Обсуждение

Неизвестный
04.10.2009, 11:25
общий
Искужина Светлана Юлаевна:
Добрый день, Светлана Юлаевна!

1. Правильно ли я понял сценарий?
При запуске программы должно стартовать меню 2*2
Далее следует выбор пункта. При этом запускается некоторая функция, результат, и т.д. , кнопка, "Esc", например - выход

вид задачи ручная автоматическая
===================================
локальный элемент
сумма модулей

2. Что Вы уже изучали: указатели на функции, например? Классы? Перегрузку? Или меню нерасширяемое, и функции жестко закреплены за пунктами меню?
Неизвестный
04.10.2009, 11:34
общий
Да, сценарий Вы поняли правильно.
На счет того, что мы изучали... Мы абсолютно ничего вещественно еще не изучали, но сделать нужно, как полагается. В общем, как считаете нужным и правильным делайте
Огромное спасибо заранее, за помощь :)
Неизвестный
04.10.2009, 13:17
общий
А почему меню - двумерный массив?
Неизвестный
04.10.2009, 13:18
общий
Точнее, что должно быть его содержимым? Ведь всего 3, максимум, 4 пункта?
Неизвестный
04.10.2009, 13:34
общий
Boriss:
Даже не знаю, что Вам ответить...
Я слово в слово написала задание, ничего не упуская... Я, конечно, спросила бы у преподавателя, но он к сожалению, бывает он только один раз в неделю в университете, и то, когда пара.
Неизвестный
04.10.2009, 14:01
общий
Ладно, видимо, задание на создание многомерных массивов. Полагаю, что leonid59 пишет ответ. Если нет, то напишу
Неизвестный
04.10.2009, 14:08
общий
Boriss:
Буду очень Вам признательна :)
Неизвестный
04.10.2009, 15:16
общий
Boriss:
Уважаемый Boriss! Я смогу приступить только вечером! Если есть у Вас такая возможность - я также буду признателен :)
Неизвестный
05.10.2009, 18:13
общий
Искужина Светлана Юлаевна:
Добрый день, Светлана Юлаевна! Пока готова только часть, рассчитывающая количество локальных элементов, проверено в MS VC++ 6, посему направляю Вам исходник в виде сообщения в форуме.

/*
1. Элемент матрицы называется локальным, если он строго меньше всех имеющихся
у него соседей. Подсчитать количество локальных минимумов заданной матрицы
размером 10 на 10.
*/

#include <iostream>
#include <cstdlib>
#include <iomanip>
using namespace std;

void crea2d(int **mat, const int rows, const int cols);
void init2d(int **mat, const int rows, const int cols, const int value);
void input2d(int **mat, const int rows, const int cols);
void print2d(int **mat, const int rows, const int cols);
int calc_locals(int **mat, int **calc_mat, const int rows, const int cols);
int main()
{

int rows, cols;
int r;

int **data;
int **locals;

cout << "rows = ";
cin >> rows;

cout << "cols = ";
cin >> cols;

// ----- выделяем память для матрицы data ----- //
data= new int* [rows];
for (r=0; r<rows; ++r)
data[r] = new int [cols];

// ----- выделяем память для матрицы locals ----- //
locals= new int* [rows];
for (r=0; r<rows; ++r)
locals[r] = new int [cols];

crea2d( data, rows, cols );
print2d( data, rows, cols );

init2d( locals, rows, cols, 1 );
print2d( locals, rows, cols );
cout << "locals=" << calc_locals( data, locals, rows, cols ) << endl;
print2d( locals, rows, cols );

// ----- освобождаем память, занятую матрицей data ----- //
for (r=0; r<rows; ++r)
delete[] data[r];
delete[] data;

// ----- освобождаем память, занятую матрицей locals ----- //
for (r=0; r<rows; ++r)
delete[] locals[r];
delete[] locals;
return 0;
}


void crea2d( int** mat, const int rows, const int cols )
{
srand(50);
for ( int r = 0; r<rows; ++r )
{
for ( int c=0; c<cols; ++c )
{
mat[r][c] = rand();
}
}
}

void init2d( 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;
}
}
}

void input2d( 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 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 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;
}

Неизвестный
06.10.2009, 14:25
общий
leonid59:
Спасибо огромное, Вам!:) Вы мне очень-очень помогли!
Жду Вашего следующего сообщения, с нетерпением! :)
Неизвестный
06.10.2009, 15:38
общий
Искужина Светлана Юлаевна:
Добрый день, Светлана Юлаевна! Добавляете прототип функции, возвращающей сумму абсолютных значений элементов выше главной диагонали. По определению, главная диагональ в принципе относится к квадратной матрице, поэтому один параметр size.
int sum_upper_left(int **mat, const int size);

и реализацию функции
int sum_upper_left(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;
}
давно
Старший Модератор
17042
808
07.10.2009, 16:31
общий
leonid59:
Не забудьте только сообщения в минифоруме обобщить в форме ответа, а то два дня осталось до окончания срока вопроса.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
07.10.2009, 21:53
общий
Dr_Andrew:
Я не вижу, куда "приткнуть" двумерный массив.
Два одномерных - это понятно, меню на их пересечении, и каждому пункту соответствует функция
char *arr_items[] = {"locals", "left_upper_sum"};
char *arr_methods[] = {"manual", "random"};
Если массив указателей на функции - то трехмерный. Поделитесь идеей, если есть
Неизвестный
07.10.2009, 22:43
общий
Dr_Andrew:
Вопрос снимаю. Главное меню - пункты "операция", "вид заполнения". Подмассив - подменю.
давно
Академик
320937
2216
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>
Форма ответа