Форум программистов, компьютерный форум CyberForum.ru

Подсчитать количество локальных минимумов заданной матрицы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
nuri
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 63
14.06.2011, 01:42     Подсчитать количество локальных минимумов заданной матрицы #1
Здравствуйте. У меня вопрос слегка необычный, а точнее просьба, у меня есть программа, которая работает как надо. Но я не могу разобраться в листинге программы, не могли бы вы мне написать комментарии к данной программе. Заранее огромное спасибо!
Условие задачи следующие: Подсчитать количество локальных минимумов заданной матрицы размером 10 на 10. Найти сумму модулей элементов, расположенных выше главной диагонали
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "math.h"
#include "iostream.h"
#include "stdlib.h"
#include "time.h"
void main ()
{
const int n=10, m=10;
int arr [n][m];
int i, j;
int iCountLM=0;
bool flag;
int iSummAbsUpMain=0;
srand(time(NULL));
cout << "\n matrica randomnay obyknovennaya\n";
for (i=0 ; i<n; i++)
{
for (j=0; j<m; j++)
{
arr[i][j]= -100+rand()%201;
cout << arr[i][j] << " ";
}
cout << endl;
}
for (i=0 ; i<n; i++)
{
for (j=0; j<m; j++)
{
flag = true; 
if (!(i-1<0))
{
if (arr[i][j]>=arr[i-1][j-1]) flag = false;
}
// up
if (!(i-1<0))
{
if (arr[i][j]>=arr[i-1][j]) flag = false;
}
//right up
if (!(j>m-1))
{
if (arr[i][j]>=arr[i-1][j+1]) flag = false;
}
//right
if (!(j+1>m-1))
{
if (arr[i][j]>=arr[i][j+1]) flag = false;
}
//ritht down
if (!(j+1>m-1))
{
if (arr[i][j]>=arr[i+1][j+1]) flag = false;
}
//down
if (!(i+1>n-1))
{
if (arr[i][j]>=arr[i+1][j]) flag = false;
}
//left down
if (!(i+1>n-1))
{
if (arr[i][j]>=arr[i+1][j-1]) flag = false;
}
//left
if (!(j<0))
{
if (arr[i][j]>=arr[i][j-1]) flag = false;
}
if (flag) iCountLM+=1;
}
}
cout << "\n koli4estvo lok min  " << iCountLM<< endl;
for (i=0; i<n; i++)
{
for (j=0; j<m; j++)
{
if (j>i) iSummAbsUpMain+=abs(arr[i][j]);
}
}
cout << "\n summa nad glav diagon  " << iSummAbsUpMain<< endl;
}
 Комментарий модератора 
Используйте теги форматирования кода!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2011, 01:42     Подсчитать количество локальных минимумов заданной матрицы
Посмотрите здесь:

C++ Подсчитать количество локальных минимумов заданной матрицы
C++ Подсчитать количество локальных минимумов матрицы
C++ Подсчитать количество локальных минимумов заданной матрицы
Подсчитать количество локальных минимумов заданной матрицы размером 10 на 10 C++
Подсчитать количество локальных минимумов матрицы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.06.2011, 02:09     Подсчитать количество локальных минимумов заданной матрицы #2
пошаговое исполнение программы вам в помощь
nuri
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 63
14.06.2011, 02:27  [ТС]     Подсчитать количество локальных минимумов заданной матрицы #3
то есть каждую строчку отдельно запускать? Вы извините если я говорю глупости, просто я в программировании мало чего смыслю, в данном случае суть программы я понимаю так:вначале мы задаем массив, объявляем переменные, потом задаем рандомную матрицу, затем задаем цикл которой по элементно и построчно, ищет элементы локальных минимумов и потом сумму модулей элементов расположенных выше главной диагонали.
Мне не понятно
C++
1
2
3
4
int iCountLM=0;
bool flag;
int iSummAbsUpMain=0;
srand(time(NULL));
что это означает. И функция flag.

Добавлено через 10 минут
Maxwe11,
Мне не понятно
C++
1
2
3
4
int iCountLM=0;
bool flag;
int iSummAbsUpMain=0;
srand(time(NULL));
что это означает. И функция flag, что она означает в данном случае?
tylix
68 / 55 / 6
Регистрация: 10.06.2011
Сообщений: 149
14.06.2011, 03:39     Подсчитать количество локальных минимумов заданной матрицы #4
flag это не функция, а переменная принимающая только два значения истина/ложь
srand() rand() подлючение и использование генер. случ. чисел, используется в тексте прог. для заполнения матрицы случ. числами
iSummAbsUpMain - сумма элементов матрицы выше главной диагонали (как я понял)

Где много много много условий, идет проверка матрицы на отсутсвие чего-то по-строчно, и если все условия для строки соблюдены тогда увел. iCountLM , а нафига, не знаю... нужно думать.. проверять.. смотреть..
nuri
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 63
14.06.2011, 03:50  [ТС]     Подсчитать количество локальных минимумов заданной матрицы #5
tylix, если я правильно понимаю переменная flag в моем случае используется для сортировки элементов, чтобы отделить локальные минимумы от модулей, или я совсем не так понимаю?
tylix
68 / 55 / 6
Регистрация: 10.06.2011
Сообщений: 149
14.06.2011, 04:08     Подсчитать количество локальных минимумов заданной матрицы #6
Цитата Сообщение от nuri Посмотреть сообщение
tylix, если я правильно понимаю переменная flag в моем случае используется для сортировки элементов, чтобы отделить локальные минимумы от модулей, или я совсем не так понимаю?
Сортировки никакой нет! там ни что ни кому не присваивается!
Просто идет проверка каждой строки на отсутствие определенных значений, и если этих значений нет, увеличивается iCountLM и просто выводится на экран

ПС: признаюсь честно, этот код полное г.. врять хотябы то, что после любого flag = false можно было смело ставить break; прекращая дальнейшие проверки строки и переходить к следующей строке матрицы
nuri
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 63
14.06.2011, 04:15  [ТС]     Подсчитать количество локальных минимумов заданной матрицы #7
tylix, и последний вопрос что означает iCountLM, почему когда мы задаем переменные мы ему присваиваем 0?
tylix
68 / 55 / 6
Регистрация: 10.06.2011
Сообщений: 149
14.06.2011, 04:52     Подсчитать количество локальных минимумов заданной матрицы #8
издеваешься??
при объявлении переменной система ей выделит ячейку памяти, но значение при этом у этой переменой может оказаться каким угодно, а нам этого не нужно, поэтому мы ей присваеваем значение которое нужно нам!
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.06.2011, 05:57     Подсчитать количество локальных минимумов заданной матрицы #9
Цитата Сообщение от nuri Посмотреть сообщение
C++
1
2
const int n=10, m=10;
int arr [n][m];
Разве так можно?
C++
1
int arr [n][m];
означает статический массив статических массивов, число которых и число их элементов должны быть константами, а не переменными.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
14.06.2011, 05:58     Подсчитать количество локальных минимумов заданной матрицы #10
так они и есть еонстанты
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.06.2011, 08:41     Подсчитать количество локальных минимумов заданной матрицы #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от nuri Посмотреть сообщение
if (arr[i][j]>=arr[i-1][j-1]) flag = false;
выход за передлы массива: массивы индексируются с ноля, цикл по j начинается ноля, тогда первое значение j-1 равно -1 (минус один), значит j-1<0, то есть второй индекс меньше ноля.

Добавлено через 2 часа 40 минут
Цитата Сообщение от nuri Посмотреть сообщение
Подсчитать количество локальных минимумов заданной матрицы размером 10 на 10. Найти сумму модулей элементов, расположенных выше главной диагонали
Разве это так делается?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "math.h"
#include "iostream.h"
#include "stdlib.h"
#include "time.h"
#define n 10
#define m 10
int main ()//Точка входа в программу перед первой операцией этой функции
{// Начало тела функции
 int a[n][m]; // сам массив. На c/c++ многомерные массивы заменяются массивами массивов, здесь декларирован массив из n элементов, каждый из которых есть массив из m элементов типа int. На тех языках, которые поддерживают многомерные массивы, многомерный массив есть массив массивов. Учитывая такую синонимичность, можно считать наш массив представлением двумерного массива n на m элментов типа int
 int i, j; // Основные индексы для перебора элементов
 int i1, j1; // Дополниетльные индексы для перебора соседних элементов
 int i1min, i1max, j1min, j1max; // Крайние значения дополниетльных индексов для перебора соседних элементов
 bool f; // Флаг. Если он true, то данный элмент - локальный минимуму
 srand(time(NULL)); // Инициируем генератор псевдослучайных чисел
 std::cout<<"рандомная матрица:"<<endl; // Вывод текста, endl - перевод строки
 for (i=0; i<n; ++i) // Цикл по i
 {// Начало тела цикла
  for (j=0; j<m; ++j) // Цикл по j
  {// Начало тела цикла
   a[i][j]=-100+rand()%201; // Пишем случайное число, отмасштабированное на диапазон (% - остаток, имеет диапазон от ноля до 201-1=200) и сдвинутое вычитанием в j-ый член i-го массива-члена массива a, то есть в элемент передставляемого им двумерного массива с индексами i,j
   std::cout<<a[i][j]<<" "; // Выводим этоn элемент и пробел
  }//Конец тела цикла
  std::cout<endl; // Перевод строки
 }//Конец тела цикла
 std::cout<<"минимуммы:"<<endl; // Вывод текста, endl - перевод строки
 for (i=0; i<n; ++i) // Цикл по i, перебираем элементы-кандидаты
 {// Начало тела цикла
  if (i==0)// Выше нет элементов?
  {// Выше нет элементов
   i1min=i;
  }// Выше нет элементов
  else// Выше есть элементы?
  {// Выше есть элементы
   i1min=i-1;
  }// Выше есть элементы
  if (i==n)// Ниже нет элементов?
  {// Ниже нет элементов
   i1min=i;
  }// Ниже нет элементов
  else// Ниже есть элементы?
  {// Ниже есть элементы
   i1max=i+1;
  }// Ниже есть элементы    
  for (j=0; j<m; ++j) // Цикл по j, перебираем элементы-кандидаты
  {// Начало тела цикла
   if (j==0)// Левее нет элементов?
   {// Левее нет элементов
    j1min=j;
   }// Левее нет элементов
   else// Левее есть элементы?
   {// Левее есть элементы
    j1min=j-1;
   }// Левее есть элементы
   if (j==m)// Правее нет элементов?
   {// Правее нет элементов
    j1min=j;
   }// Правее нет элементов
   else// Правее есть элементы?
   {// Правее есть элементы
    j1max=j+1;
   }// Правее есть элементы
   for (i1=i1min, flag=true; i1<=i1max; ++i1) // Цикл по i1, перебираем элементы, соседние с i,j. По-умолчанию считаем, что это искомый минимум
   {//Начало тела цикла
    for (j1=j1min; j1<=j1max; ++j1) // Цикл по i1, перебираем элементы, соседние с i,j. По-умолчанию считаем, что это искомый минимум
    {//Начало тела цикла
     if (a[i][j]>a[i1][j1]) // Рядом есть меньший элемент?
     {// Рядом есть меньший элемент
      flag=false; // Значит это не минимум
     }// Рядом есть меньший элемент 
    }//Конец тела цикла
   }//Конец тела цикла
   if (flag) // эквивалентно if (flag!=false), true по определению !=false. В нашем случае несёт семантику if (данный элемент - локалтьный минимум)
   {//данный элемент - локалтьный минимум
    std::cout<<"a["<<i<<", ""<j<<]="<<a[i][j]<<" "<<endl;// Вывод текста
   }//данный элемент - локалтьный минимум
  }//Конец тела цикла
 }//Конец тела цикла
}// Конец тела функции
Добавлено через 1 минуту
Цитата Сообщение от pito211 Посмотреть сообщение
так они и есть еонстанты
Извини, не увидел const.
tylix
68 / 55 / 6
Регистрация: 10.06.2011
Сообщений: 149
14.06.2011, 08:46     Подсчитать количество локальных минимумов заданной матрицы #12
Цитата Сообщение от nuri Посмотреть сообщение
Условие задачи следующие: Подсчитать количество локальных минимумов заданной матрицы размером 10 на 10. Найти сумму модулей элементов, расположенных выше главной диагонали
странно.. условие изначально было данно к листингу или это я такой слепой что только сейчас его заметил? )

ПС: хотя уже какая разница
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.06.2011, 09:03     Подсчитать количество локальных минимумов заданной матрицы #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну тем более #include "math.h"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "iostream.h"
#include "stdlib.h"
#include "time.h"
#define n 10
#define m 10
int main ()//Точка входа в программу перед первой операцией этой функции
{// Начало тела функции
 int a[n][m]; // сам массив. На c/c++ многомерные массивы заменяются массивами массивов, здесь декларирован массив из n элементов, каждый из которых есть массив из m элементов типа int. На тех языках, которые поддерживают многомерные массивы, многомерный массив есть массив массивов. Учитывая такую синонимичность, можно считать наш массив представлением двумерного массива n на m элментов типа int
 int i, j; // Основные индексы для перебора элементов
 int i1, j1; // Дополниетльные индексы для перебора соседних элементов
 int i1min, i1max, j1min, j1max; // Крайние значения дополниетльных индексов для перебора соседних элементов
 int count; // Счтёчик минимумов
 int summ; // Сдесь будет накоплена сумма
 bool f; // Флаг. Если он true, то данный элмент - локальный минимуму
 srand(time(NULL)); // Инициируем генератор псевдослучайных чисел
 std::cout<<"рандомная матрица:"<<endl; // Вывод текста, endl - перевод строки
 for (i=0; i<n; ++i) // Цикл по i
 {// Начало тела цикла
  for (j=0; j<m; ++j) // Цикл по j
  {// Начало тела цикла
   a[i][j]=-100+rand()%201; // Пишем случайное число, отмасштабированное на диапазон (% - остаток, имеет диапазон от ноля до 201-1=200) и сдвинутое вычитанием в j-ый член i-го массива-члена массива a, то есть в элемент передставляемого им двумерного массива с индексами i,j
   std::cout<<a[i][j]<<" "; // Выводим этоn элемент и пробел
  }//Конец тела цикла
  std::cout<endl; // Перевод строки
 }//Конец тела цикла
 for (i=0, count=0, summ=0; i<n; ++i) // Цикл по i, перебираем элементы-кандидаты, минимумы ещё не найдены, сумму тоже сбрасываем в ноль
 {// Начало тела цикла
  if (i==0)// Выше нет элементов?
  {// Выше нет элементов
   i1min=i;
  }// Выше нет элементов
  else// Выше есть элементы?
  {// Выше есть элементы
   i1min=i-1;
  }// Выше есть элементы
  if (i==n)// Ниже нет элементов?
  {// Ниже нет элементов
   i1min=i;
  }// Ниже нет элементов
  else// Ниже есть элементы?
  {// Ниже есть элементы
   i1max=i+1;
  }// Ниже есть элементы    
  for (j=0; j<m; ++j) // Цикл по j, перебираем элементы-кандидаты
  {// Начало тела цикла
   if (j==0)// Левее нет элементов?
   {// Левее нет элементов
    j1min=j;
   }// Левее нет элементов
   else// Левее есть элементы?
   {// Левее есть элементы
    j1min=j-1;
   }// Левее есть элементы
   if (j==m)// Правее нет элементов?
   {// Правее нет элементов
    j1min=j;
   }// Правее нет элементов
   else// Правее есть элементы?
   {// Правее есть элементы
    j1max=j+1;
   }// Правее есть элементы
   for (i1=i1min, flag=true; i1<=i1max; ++i1) // Цикл по i1, перебираем элементы, соседние с i,j. По-умолчанию считаем, что это искомый минимум
   {//Начало тела цикла
    for (j1=j1min; j1<=j1max; ++j1) // Цикл по i1, перебираем элементы, соседние с i,j. По-умолчанию считаем, что это искомый минимум
    {//Начало тела цикла
     if (a[i][j]>a[i1][j1]) // Рядом есть меньший элемент?
     {// Рядом есть меньший элемент
      flag=false; // Значит это не минимум
     }// Рядом есть меньший элемент 
    }//Конец тела цикла
   }//Конец тела цикла
   if (i>0) // Данный элемент выше главной диагонали?
   {// Данный элемент выше главной диагонали
    summ+=abs(a[i][j]); // Инкпремент суммы на модель элемента
   }// Данный элемент выше главной диагонали
   if (flag) // эквивалентно if (flag!=false), true по определению !=false. В нашем случае несёт семантику if (данный элемент - локалтьный минимум)
   {//данный элемент - локалтьный минимум
    ++count; // Найден один минимум, инкремент их счётчика
   }//данный элемент - локалтьный минимум
  }//Конец тела цикла
 }//Конец тела цикла
 std::cout<count<<"локальных минимумов"<<endl; // Вывод текста, endl - перевод строки
 std::cout<"сумма модулей элементов над главной диагональю"<<summ<<endl; // Вывод текста, endl - перевод строки
}// Конец тела функции
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2011, 02:27     Подсчитать количество локальных минимумов заданной матрицы
Еще ссылки по теме:

C++ Подсчитать количество локальных минимумов заданной матрицы
Подсчитать количество локальных минимумов заданной матрицы C++
C++ Подсчитать количество локальных минимумов матрицы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
nuri
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 63
15.06.2011, 02:27  [ТС]     Подсчитать количество локальных минимумов заданной матрицы #14
Всем большое спасибо) очень помогли ваши объяснения)))
Yandex
Объявления
15.06.2011, 02:27     Подсчитать количество локальных минимумов заданной матрицы
Ответ Создать тему
Опции темы

Текущее время: 00:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru