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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
#1

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

02.02.2014, 22:46. Просмотров 1936. Ответов 33
Метки нет (Все метки)

Пожалуйста помогите!
Данная прямоугольная целочисленная матрица. определить:
количество строк, которые не содержат ни одного нулевого элемента;
максимальное из чисел, встречающихся в заданной матрице более одного раза.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2014, 22:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определить количество строк матрицы, которые не содержат ни одного нулевого элемента (C++):

Необходимо подсчитать количество строк матрицы, которые не содержат ни одного 0 элемента. - C++
Ребята, помогите пожалуйста разобраться с задачкой. Дана целочисленная матрица nxm. Необходимо подсчитать количество строк, которые не...

Определить количество строк матрицы, не содержащих ни одного нулевого элемента - C++
помогите пожалуйста с задачкой разобраться, задание следующее - "Используя обьявления массивов через указатели на тип, шаблоны функций и...

Определить количество строк матрицы, не содержащих ни одного нулевого элемента - C++
Ввести с клавиатуры вещественную матрицу размерностью 5х5. Определить количество строк, не содержащих ни одного нулевого элемента. ...

Определить количество строк матрицы, не содержащих ни одного нулевого элемента - C++
Дана целочисленная прямоугольная матрица.Определить: 1)Количество строк ,не содержащих ни одного нулевого элемента. 2)...

Определить количество строк матрицы, не содержащих ни одного нулевого элемента - C++
Дана целочисленная квадратная матрица. Определить: • количество строк, не содержащих ни одного нулевого элемента; • максимальное из...

Определить количество строк матрицы не содержащих ни одного нулевого элемента - C++
Дана целочисленная прямоугольная матрица. Определить: количество строк, не содержащих ни одного нулевого элемента;

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
05.02.2014, 22:56  [ТС] #16
GuGo1991,
а если в строке будет два нулевых элементы, то что будет тогда считаться две строки вместо одной?
и что-то не понимаю отыскания макс. элем.
причем например min_counter
любой элемент может быть больше за мин.элем.
и при выполнении вывело НЕ макс. а мин. элемент.
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
05.02.2014, 23:33 #17
Цитата Сообщение от Iryna_Light Посмотреть сообщение
а если в строке будет два нулевых элементы, то что будет тогда считаться две строки вместо одной?
Нет, одна.
Цитата Сообщение от Iryna_Light Посмотреть сообщение
и что-то не понимаю отыскания макс. элем.
Строки 62 - 79. Берём первый элемент матрицы (с индексами [0][0]). Проходим по всей матрице и проверяем
имеется ли такой же элемент. Один раз он точно будет, столкнется сам с собой, поэтому проверяем
значение counter больше 1 и сравниваем значение result с этим элементом (result всегда будет меньше или равно
потому что мы ему присвоили значение min до начала цикла, это необходимо чтобы не потерять повторяющиеся отрицательные элементы,
если нет положительных).
Цитата Сообщение от Iryna_Light Посмотреть сообщение
причем например min_counter
min_counter проверяет сколько минимальных элементов имеется. В случае если нет повторяющихся
максимальных элементов (положительных и отрицательных) и минимальный элемент один, тогда повторяющихся
элементов нет. А если минимальных элементов больше одного, программа выведет его.
Грубо говоря, это страховка.
Цитата Сообщение от Iryna_Light Посмотреть сообщение
и при выполнении вывело НЕ макс. а мин. элемент.
Скопируйте вывод программы, сомневаюсь в ошибке
0
Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
09.02.2014, 20:27  [ТС] #18
GuGo1991, Максимальное из чисел, встречающихся в заданной матрице более одного раза, неправильно определено. Правильный ответ должен быть 100
0
Миниатюры
Определить количество строк матрицы, которые не содержат ни одного нулевого элемента  
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
09.02.2014, 21:35 #19
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <ctime>
#include <iomanip>
using namespace std;
 
int main()
{
    srand(time(0)); 
    int H, W, counter = 0, max, min, 
        min_counter = 0, result, row = 0;
    cout << "Matrix[H][W]\n";
    cout << "Enter H: "; cin >> H;
    cout << "Enter W: "; cin >> W;
    cout << "\n\n";
    int** M = new int*[H];
    for(int i = 0; i < H; i++)
        M[i] = new int[W];
    
    //Находим строки с нулевыми элементами
    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;
    }
    
    min = M[0][0];
    
    //Находим минимальный элемент
    for(int i = 0; i < H; i++)
    {
        for(int j = 0; j < W; j++)
        {
            if(M[i][j] < min)
            {
                min = M[i][j];
            }
        }
    }
    
    //min_counter понадобится в дальнейшем
    for(int i = 0; i < H; i++)
    {
        for(int j = 0; j < W; j++)
        {
            if(min == M[i][j])
                min_counter++;
        }
    }
    
    result = min;
    
    //Находим максимальный повторяющийся элемент
    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;
    cout << "\nMax element: ";
    
    //Если значение result не изменилось и min_counter равен 1,
    //то есть значение min не повторяется, значит максимального
    //повторяющегося элемента нет. Иначе выводим result.
    (result == min && min_counter == 1)? cout << "No such element!\n"
                                       : cout << result << endl;
     
    for(int i = 0; i < H; i++)
    {
        delete [] M[i];
    }      
    
    delete [] M;
    
    system("pause");
    return 0;
}


Iryna_Light, точно этот код компилируете? У меня работает корректно, не знаю чем помочь...
0
Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
09.02.2014, 22:39  [ТС] #20
GuGo1991, так же он
0
DrOffset
7142 / 4283 / 966
Регистрация: 30.01.2014
Сообщений: 7,086
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.
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, у вас всё время неправильный ответ выдаёт или иногда?
Просто у меня всё работает... Напишите в личку мыло, пришлю свой откомпилированный .ехе
0
DrOffset
7142 / 4283 / 966
Регистрация: 30.01.2014
Сообщений: 7,086
10.02.2014, 03:03 #23
Цитата Сообщение от GuGo1991 Посмотреть сообщение
Тогда у нас останется максимальный неповторяющийся элемент
Ну и пусть остается. В задаче сказано, что надо вывести максимальный повторяющийся элемент.
C++
1
2
3
4
if(repeat > 1)
{
    // выводим
}
Добавлено через 10 минут
Хотя да. Невнимательно прочитал. Нужно вывести число максимальное из повторяющихся, а не максимальное и повторяющееся. Ночь.
Но ошибка в вашем алгоритме все равно есть. У меня воспроизводится так же, как и у ТС.

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

Не по теме:

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

0
Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
10.02.2014, 11:07  [ТС] #26
я ничего не имела против сортировки, просто были вопросы по программе, чтобы лучше понять
И первый вариант проще, чем последний. Тем более в последнем выбивает ошибки. Лучше остановиться на первом (с сортировкой).
0
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;
}
1
Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
10.02.2014, 22:19  [ТС] #28
GuGo1991, Огромное спасибо! а почему такой вид?
0
Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
10.02.2014, 22:25  [ТС] #29
такой вид
0
Миниатюры
Определить количество строк матрицы, которые не содержат ни одного нулевого элемента  
Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
10.02.2014, 22:39  [ТС] #30
и почему (строка 100) мы сравниваем с элем. соседним по диагонали M[H - 2][W - 2], а не соседним по строке?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2014, 22:39
Привет! Вот еще темы с ответами:

Определить количество строк матрицы, в которых нет ни одного нулевого элемента - C++
Помагите если не сложно. Дана матрица размером МxN. Определить количество строк, в которых нет ни одного нулевого элемента.

Определить количество строк не содержащих ни одного нулевого элемента - C++
создать в динамической памяти двумерный массив целых чисел. Определить количество строк не содержащих ни одного нулевого элемента

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

Определить количество строк, не содержащих ни одного нулевого элемента - C++
Заполнить целочисленный двухмерный массив размера NN случайными числами в диапазоне от -18 до 20 . Определить количество строк, не...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.02.2014, 22:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru