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

Определить количество строк матрицы, которые не содержат ни одного нулевого элемента - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
02.02.2014, 22:46     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #1
Пожалуйста помогите!
Данная прямоугольная целочисленная матрица. определить:
количество строк, которые не содержат ни одного нулевого элемента;
максимальное из чисел, встречающихся в заданной матрице более одного раза.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2014, 22:46     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента
Посмотрите здесь:

C++ Необходимо подсчитать количество строк матрицы, которые не содержат ни одного 0 элемента.
C++ Найти количество столбцов матрицы, которые не имеют ни одного нулевого элемента
Определить: количество строк, не содержащих ни одного нулевого элемента; C++
Определить количество строк матрицы, не содержащих ни одного нулевого элемента C++
Матрица: определить количество строк, не содержащих ни одного нулевого элемента C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
09.02.2014, 23:32     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #21
Цитата Сообщение от GuGo1991 Посмотреть сообщение
У меня работает корректно, не знаю чем помочь...
Алгоритм можно упростить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int repeat  = 0;
int maxElem = M[0][0];
for(int i = 0; i < H; ++i)
{
    for(int j = 0; j < W; ++j)
    {
        if(M[i][j] > maxElem)
        {
            maxElem = M[i][j];
            repeat = 1;
        }
        else if(M[i][j] == maxElem)
        {
            ++repeat;
        }
    }
}
При условии, что H и W больше 0.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
10.02.2014, 02:34     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #22
DrOffset, а вдруг не выполнится второе условие:
C++
1
2
3
4
else if(M[i][j] == maxElem)
{
    ++repeat;
}
Тогда у нас останется максимальный неповторяющийся элемент

Добавлено через 10 минут
Iryna_Light, у вас всё время неправильный ответ выдаёт или иногда?
Просто у меня всё работает... Напишите в личку мыло, пришлю свой откомпилированный .ехе
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
10.02.2014, 03:03     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #23
Цитата Сообщение от GuGo1991 Посмотреть сообщение
Тогда у нас останется максимальный неповторяющийся элемент
Ну и пусть остается. В задаче сказано, что надо вывести максимальный повторяющийся элемент.
C++
1
2
3
4
if(repeat > 1)
{
    // выводим
}
Добавлено через 10 минут
Хотя да. Невнимательно прочитал. Нужно вывести число максимальное из повторяющихся, а не максимальное и повторяющееся. Ночь.
Но ошибка в вашем алгоритме все равно есть. У меня воспроизводится так же, как и у ТС.

Добавлено через 5 минут
Вообще, с сортировкой эту задачу решить проще всего. Все попытки решить ее без сортировки будут в совокупности сложнее, чем реализация простейшей пузырковой сортировки (на данном этапе большее и не нужно).
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
10.02.2014, 03:16     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #24
DrOffset, была у меня с сортировкой, пришлось убрать по просьбе ТС.
Цитата Сообщение от DrOffset Посмотреть сообщение
У меня воспроизводится так же, как и у ТС.
Вот этого я никак не пойму... Почему у меня всё правильно?!
У вас иногда выбивает неверно или при каждом запуске?
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
10.02.2014, 10:27     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #25
Цитата Сообщение от GuGo1991 Посмотреть сообщение
У вас иногда выбивает неверно или при каждом запуске?

Не по теме:

Иногда, где-то 1 из 4х. Хотел поисследовать сам, но уже поздно было.

Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
10.02.2014, 11:07  [ТС]     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #26
я ничего не имела против сортировки, просто были вопросы по программе, чтобы лучше понять
И первый вариант проще, чем последний. Тем более в последнем выбивает ошибки. Лучше остановиться на первом (с сортировкой).
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
10.02.2014, 14:29     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #27
Цитата Сообщение от DrOffset Посмотреть сообщение
Иногда, где-то 1 из 4х. Хотел поисследовать сам, но уже поздно было.
Хоть раз у меня неправильно выбило бы, я с удовольствием поисследовал ))

Iryna_Light, для наглядности добавил вывод отсортированного массива (добавил комментарии).
Минус данного варианта, не сортируется динамический массив. Поэтому будет фиксированный 8х15.

Кликните здесь для просмотра всего текста
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <ctime>
#include <iomanip>
using namespace std;
 
int main()
{
    srand(time(0));
    const int H = 8, W = 15; 
    int M[H][W], counter = 0, max, result, row = 0;
    cout << "Matrix[H][W]";   
    cout << "\n\n";
    
    //ГЌГ*õîäèì ñòðîêè Г± Г*óëåâûìè ýëåìåГ*ГІГ*ìè
    for(int i = 0; i < H; i++)
    {
        for(int j = 0; j < W; j++)
        {
            M[i][j] = 100 - rand() % 200;
            cout << setw(4) << M[i][j];
            if(M[i][j] == 0)
                counter++;
        }
        cout << "\n\n";
        if(counter > 0)
            row++;
        counter = 0;
    }
    
    //Ñîðòèðóåì Г¬Г*Г±Г±ГЁГў
    for(int loop = 0; loop <= (H * W); loop++)
    {
        for(int i = 0; i < H; i++) //Ñîðòèðóåì ñòðîêè
        {
            for(int j = 0; j < W - 1; j++)
            {
                if(M[i][j] < M[i][j + 1])
                {
                    int temp = M[i][j];
                    M[i][j] = M[i][j + 1];
                    M[i][j + 1] = temp;
                }
            }
        }
        for(int i = 0; i < W; i++) //Ñîðòèðóåì ñòîëáöû
        {
            for(int j = 0; j < H - 1; j++)
            {
                if(M[j][i] < M[j][i + 1])
                {
                    int temp = M[j][i];
                    M[j][i] = M[j][i + 1];
                    M[j][i + 1] = temp;
                }
            }
        }
    }
    
    cout << "----------------------------" <<
            "--------------------------------\n\n";
    
    //Âûâîä îòñîðòèðîâГ*Г*Г*îé Г¬Г*òðèöû
    for(int i = 0; i < H; i++)
    {
        for(int j = 0; j < W; j++)
        {
            cout << setw(4) << M[i][j];
        }
        cout << "\n\n";
    }
    
    result = M[H - 1][W - 1]; //ÏîñëåäГ*ГЁГ© ýëåìåГ*ГІ Г¬Г*òðèöû (ïåðâûé ñëåâГ*), ГІ.ГҐ. Г¬Г*ГЄГ±ГЁГ¬Г*ëüГ*ûé
    
    //ГЌГ*õîäèì Г¬Г*ГЄГ±ГЁГ¬Г*ëüГ*ûé ïîâòîðÿþùèéñÿ ýëåìåГ*ГІ
    for(int i = 0; i < H; i++)
    {
        for(int j = 0; j < W; j++)
        {
            max = M[i][j];
            for(int i = 0; i < H; i++)
            {
                for(int j = 0; j < W; j++)
                {
                    if(max == M[i][j])
                        counter++;
                }
            }
            if(counter > 1 && result <= max)
                result = max;
            counter = 0;
        }
    }
    
    cout << "\nRows: " << H - row <<
            "\nMax element: ";
    //Åñëè Г§Г*Г*Г·ГҐГ*ГЁГҐ result Г*ГҐ èçìåГ*èëîñü, ïðîâåðÿåì Г§Г*Г*Г·ГҐГ*ГЁГҐ ñëåäóþùåãî ýëåìåГ*ГІГ*.
    //Åñëè Г®Г*ГЁ Г*ГҐ Г°Г*ГўГ*Г», ñëåäîâГ*òåëüГ*Г® Г¬Г*ГЄГ±ГЁГ¬Г*ëüГ*îãî ïîâòîðÿþùåãîñÿ ýëåìåГ*ГІГ* Г*ГҐГІ.
    //Г€Г*Г*Г·ГҐ âûâîäèì result.
    (result == M[H - 1][W - 1] &&
     result != M[H - 2][W - 2])? cout << "No such elements\n\n"
                               : cout << result << "\n\n";
    
    system("pause");
    return 0;
}
Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
10.02.2014, 22:19  [ТС]     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #28
GuGo1991, Огромное спасибо! а почему такой вид?
Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
10.02.2014, 22:25  [ТС]     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #29
такой вид
Миниатюры
Определить количество строк матрицы, которые не содержат ни одного нулевого элемента  
Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
10.02.2014, 22:39  [ТС]     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #30
и почему (строка 100) мы сравниваем с элем. соседним по диагонали M[H - 2][W - 2], а не соседним по строке?
gunslinger
случайный прохожий
 Аватар для gunslinger
1098 / 716 / 184
Регистрация: 20.07.2013
Сообщений: 1,973
11.02.2014, 00:33     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #31
Максимальное из чисел, встречающихся в заданной матрице более одного раза - без сортировки с использованием дополнительного линейного (одномерного) массива с учетом ситуации, когда нет повторяющихся элементов. Элементы неотрицательные, смотри начальное значение max_number (изначально оно меньше минимально возможного значения любого из элементов).
На Builder:
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
  const n = 10, m = 15;
  int i, j, k = 0, a[n][m], b[n*m], max_number = -1, IsMaxMultNum = 0;
  String res = "";
  randomize();
  for (i = 0; i < n; i++)
  {
    for (j = 0; j < m; j++)
    {
      a[i][j] = random(100);
      b[k] = a[i][j];
      res += (a[i][j] < 10 ? "0" : "") + String(a[i][j]) + "  ";
      k++;
    }
    res += "\n";
  }
/*// вывод массива b (нужно лишь для проверки)
  for (i = 0; i < k; i++)
    res += (b[i] < 10 ? "0" : "") + String(b[i]) + "  ";
  res += "\n";*/
  for (i = 0; i < n*m; i++)
  {
    for (j = i+1; j < n*m; j++)
      if (b[j] == b[i])
      {
        IsMaxMultNum = 1;
        if (b[j] > max_number)
          max_number = b[j];
      }
  }
  res += "Максимальное из чисел, встречающихся более одного раза: ";
  if (IsMaxMultNum)
    res += String(max_number);
  else
    res += "отсутствует.";
  ShowMessage(res);
Миниатюры
Определить количество строк матрицы, которые не содержат ни одного нулевого элемента  
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
11.02.2014, 03:17     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #32
Iryna_Light, это я для наглядности оставил, можете убрать строки 59-70.

Цитата Сообщение от Iryna_Light Посмотреть сообщение
и почему (строка 100) мы сравниваем с элем. соседним по диагонали M[H - 2][W - 2], а не соседним по строке?
Здесь извиняйте, машинально написал. Вы правы, надо сравнивать с соседним по строке.
Ещё кое-что подправил в комментариях:

Кликните здесь для просмотра всего текста
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <ctime>
#include <iomanip>
using namespace std;
 
int main()
{
    srand(time(0));
    const int H = 8, W = 15; 
    int M[H][W], counter = 0, max, result, row = 0;
    cout << "Matrix[H][W]";   
    cout << "\n\n";
    
    //Находим строки с нулевыми элементами
    for(int i = 0; i < H; i++)
    {
        for(int j = 0; j < W; j++)
        {
            M[i][j] = 100 - rand() % 200;
            cout << setw(4) << M[i][j];
            if(M[i][j] == 0)
                counter++;
        }
        cout << "\n\n";
        if(counter > 0)
            row++;
        counter = 0;
    }
    
    //Сортируем массив
    for(int loop = 0; loop <= (H * W); loop++)
    {
        for(int i = 0; i < H; i++) //Сортируем строки
        {
            for(int j = 0; j < W - 1; j++)
            {
                if(M[i][j] < M[i][j + 1])
                {
                    int temp = M[i][j];
                    M[i][j] = M[i][j + 1];
                    M[i][j + 1] = temp;
                }
            }
        }
        for(int i = 0; i < W; i++) //Сортируем столбцы
        {
            for(int j = 0; j < H - 1; j++)
            {
                if(M[j][i] < M[j][i + 1])
                {
                    int temp = M[j][i];
                    M[j][i] = M[j][i + 1];
                    M[j][i + 1] = temp;
                }
            }
        }
    }
    
    cout << "----------------------------" <<
            "--------------------------------\n\n";
    
    //Вывод отсортированной матрицы
    for(int i = 0; i < H; i++)
    {
        for(int j = 0; j < W; j++)
        {
            cout << setw(4) << M[i][j];
        }
        cout << "\n\n";
    }
    
    result = M[H - 1][H - 1]; //Последний элемент матрицы (нижний справа), т.е. минимальный
    
    //Находим максимальный повторяющийся элемент
    for(int i = 0; i < H; i++)
    {
        for(int j = 0; j < W; j++)
        {
            max = M[i][j];
            for(int i = 0; i < H; i++)
            {
                for(int j = 0; j < W; j++)
                {
                    if(max == M[i][j])
                        counter++;
                }
            }
            if(counter > 1 && result <= max)
                result = max;
            counter = 0;
        }
    }
    
    cout << "\nRows: " << H - row <<
            "\nMax element: ";
    //Если значение result не изменилось, проверяем значение следующего элемента.
    //Если они не равны, следовательно максимального повторяющегося элемента нет.
    //Иначе выводим result.
    (result == M[H - 1][W - 1] &&
     result != M[H - 1][W - 2])? cout << "No such elements\n\n"
                               : cout << result << "\n\n";
    
    system("pause");
    return 0;
}
Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
11.02.2014, 13:00  [ТС]     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #33
GuGo1991, Спасибо, наконец поняла,
А как сделать чтобы в результате выводило полностью матрицу, а не строку (как на скриншоте)
как без отсортированной матрицы, то норм. выводит, а если с ней, то только строку.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2014, 16:11     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента
Еще ссылки по теме:

C++ Определить количество строк не содержащих ни одного нулевого элемента
C++ Определить количество строк, не содержащих ни одного нулевого элемента
Определить количество строк, не содержащих ни одного нулевого элемента C++

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

Или воспользуйтесь поиском по форуму:
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
11.02.2014, 16:11     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента #34
Iryna_Light, скорее всего в Borland фиксированный вывод, так что выводится определённое
количество строк, удаляя предидущие. Сам с этой средой дело не имел, может можно изменить настройки
Yandex
Объявления
11.02.2014, 16:11     Определить количество строк матрицы, которые не содержат ни одного нулевого элемента
Ответ Создать тему
Опции темы

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