Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 63

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

14.06.2011, 01:42. Показов 2434. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. У меня вопрос слегка необычный, а точнее просьба, у меня есть программа, которая работает как надо. Но я не могу разобраться в листинге программы, не могли бы вы мне написать комментарии к данной программе. Заранее огромное спасибо!
Условие задачи следующие: Подсчитать количество локальных минимумов заданной матрицы размером 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;
}
 Комментарий модератора 
Используйте теги форматирования кода!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.06.2011, 01:42
Ответы с готовыми решениями:

Подсчитать количество локальных минимумов заданной матрицы
Приветик всем!!! Мне тут подружка принесла задание с котрым я не могу справится,надо написать прогрмку на С++ Помогите...

Подсчитать количество локальных минимумов заданной матрицы
задание : подсчитать количество локальных минимумов заданной матрицы размером NxN.найти сумму модулей элементов,расположенных выше...

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

13
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
14.06.2011, 02:09
пошаговое исполнение программы вам в помощь
0
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 63
14.06.2011, 02:27  [ТС]
то есть каждую строчку отдельно запускать? Вы извините если я говорю глупости, просто я в программировании мало чего смыслю, в данном случае суть программы я понимаю так:вначале мы задаем массив, объявляем переменные, потом задаем рандомную матрицу, затем задаем цикл которой по элементно и построчно, ищет элементы локальных минимумов и потом сумму модулей элементов расположенных выше главной диагонали.
Мне не понятно
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, что она означает в данном случае?
0
68 / 55 / 11
Регистрация: 10.06.2011
Сообщений: 149
14.06.2011, 03:39
flag это не функция, а переменная принимающая только два значения истина/ложь
srand() rand() подлючение и использование генер. случ. чисел, используется в тексте прог. для заполнения матрицы случ. числами
iSummAbsUpMain - сумма элементов матрицы выше главной диагонали (как я понял)

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

ПС: признаюсь честно, этот код полное г.. врять хотябы то, что после любого flag = false можно было смело ставить break; прекращая дальнейшие проверки строки и переходить к следующей строке матрицы
0
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 63
14.06.2011, 04:15  [ТС]
tylix, и последний вопрос что означает iCountLM, почему когда мы задаем переменные мы ему присваиваем 0?
0
68 / 55 / 11
Регистрация: 10.06.2011
Сообщений: 149
14.06.2011, 04:52
издеваешься??
при объявлении переменной система ей выделит ячейку памяти, но значение при этом у этой переменой может оказаться каким угодно, а нам этого не нужно, поэтому мы ей присваеваем значение которое нужно нам!
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.06.2011, 05:57
Цитата Сообщение от nuri Посмотреть сообщение
C++
1
2
const int n=10, m=10;
int arr [n][m];
Разве так можно?
C++
1
int arr [n][m];
означает статический массив статических массивов, число которых и число их элементов должны быть константами, а не переменными.
0
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
14.06.2011, 05:58
так они и есть еонстанты
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.06.2011, 08:41
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от 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.
0
68 / 55 / 11
Регистрация: 10.06.2011
Сообщений: 149
14.06.2011, 08:46
Цитата Сообщение от nuri Посмотреть сообщение
Условие задачи следующие: Подсчитать количество локальных минимумов заданной матрицы размером 10 на 10. Найти сумму модулей элементов, расположенных выше главной диагонали
странно.. условие изначально было данно к листингу или это я такой слепой что только сейчас его заметил? )

ПС: хотя уже какая разница
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.06.2011, 09:03
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Ну тем более #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 - перевод строки
}// Конец тела функции
0
0 / 0 / 0
Регистрация: 01.05.2011
Сообщений: 63
15.06.2011, 02:27  [ТС]
Всем большое спасибо) очень помогли ваши объяснения)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.06.2011, 02:27
Помогаю со студенческими работами здесь

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

Подсчитать количество локальных минимумов заданной матрицы
Помогите пожалуйста решить задачку =) Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него...

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

Подсчитать количество локальных минимумов матрицы
Подсчитать количество локальных минимумов матрицы размерности 4х4. Локальный минимум - элемент, который меньше всех своих соседних...

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru