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

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

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

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

02.02.2014, 22:46. Просмотров 1990. Ответов 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++
Дана целочисленная прямоугольная матрица. Определить: количество строк, не содержащих ни одного нулевого элемента;

33
Mendow
1 / 1 / 0
Регистрация: 31.07.2013
Сообщений: 13
03.02.2014, 03:22 #2
Цикл обхода строки с условием на нахождение не нулевого элемента ,если находиться элемент не равный нулю сразу переходить на новую строку ,если же дошли до конца строки счетчик строк увеличить на один.

Пока обходите массив. находить самый большой элемент и далее сравниваете его с встречающимися если находите заканчиваете цикл .
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
03.02.2014, 06:22 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Iryna_Light
Кликните здесь для просмотра всего текста
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
#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;
                }
            }
        }
    }
    
    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;
                        break;
                    }
                }
            }          
            counter = 0;
        }
    }
    
    cout << "\nRows: " << H - row <<
            "\nMax element: " << result << "\n\n";
    
    system("pause");
    return 0;
}


Добавлено через 2 часа 28 минут
Кликните здесь для просмотра всего текста
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
#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;
                }
            }
        }
    }
    
    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 << "\n\n";
    
    system("pause");
    return 0;
}

Второй вариант правильный.
1
Xopecc
33 / 28 / 2
Регистрация: 13.09.2013
Сообщений: 250
03.02.2014, 08:29 #4
Iryna_Light, GuGo1991, Вариант в 57 строк:
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
#include<conio.h>
#include<iostream>
#include<iomanip>
#include<time.h>
#include<Windows.h>
using namespace std;
 
int main(){
    setlocale(LC_ALL, "Russian");
    srand(time(NULL));
    int a, b;
    cout << "Введите размеры матрицы: ";
    cin >> a >> b;
    int **M = new int*[a];
    for (int i(0); i < a; i++)
        M[i] = new int[b];
    for (int i(0); i < a; i++){
        for (int j(0); j < b; j++){
            M[i][j] = 99 - rand() % 198;
            cout << setw(5) << M[i][j];
        }
        cout << endl;
    }
    int Zero(0), Count(a), Max, MaxCount(0), Max2(0), C(0);
    
    for (int i(0); i < a; i++){
        for (int j(0); j < b; j++){
            if (M[i][j] == 0)
                Zero++;
            if (C == 0){
                Max = M[i][j];
                C++;
            }
            if (M[i][j] == Max)
                MaxCount++;
            if (MaxCount >= 2){
                Max2 = Max;
                MaxCount = 0;
            }
            if (M[i][j] > Max)
                Max = M[i][j];
        }
        if (Zero != 0){
            Zero = 0;
            Count--;
        }
    }
    cout << endl << "Количество строк, которые не содержат ни одного нулевого элемента: " << Count;
    if (Max2 == 0) cout << "Нет чисел, встречающихся более одного раза!";
    else cout << endl << "Максимальное из чисел, встречающихся в заданной матрице более одного раза: " << Max2;
    for (int i(0); i < a; i++)
        delete[] M[i];
    delete[] M;
    cout << "\n\nДля выхода нажмите любую клавишу...";
    _getch();
    return 0;
}
0
Ev[G]eN
iOS/Android Developer
Эксперт С++
5097 / 1535 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
03.02.2014, 12:15 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include <algorithm>
#include <iterator>
#include <iostream>
#include <iomanip>
#include <random>
#include <vector>
 
int main()
{
    std::default_random_engine generator;
    std::uniform_int_distribution <> distribution(-25, 25);
 
    size_t rowsCount;
    std::cout << "N: ";
    std::cin >> rowsCount;
 
    size_t colsCount;
    std::cout << "M: ";
    std::cin >> colsCount;
 
    size_t rowsWithoutZero = 0;
    std::vector <std::vector <int>> matrix(rowsCount, std::vector <int> (colsCount, 0));
    std::cout << "Matrix: " << std::endl;
    for (auto &currentMatrixRow : matrix) {
        for (auto &currentRowElement : currentMatrixRow) {
            std::cout << std::setw(5) << (currentRowElement = distribution(generator));
        }
        rowsWithoutZero += (!std::count(currentMatrixRow.begin(), currentMatrixRow.end(), 0));
        std::cout << std::endl;
    }
    std::cout << "Rows without zero elements: " << rowsWithoutZero << std::endl;
    
    bool isFind = false;
    int resultMaximal = 0;
    size_t currentRowIndex = 0;
    while (!isFind) {
        size_t currentMaximalCounter = 0;
        auto currentMaximal = std::max_element(matrix.at(currentRowIndex).begin(), matrix.at(currentRowIndex).end());
        for (size_t i = 0; i < rowsCount; i++) {
            currentMaximalCounter += std::count(matrix.at(i).begin(), matrix.at(i).end(), *currentMaximal);
        }
        if (currentMaximalCounter > 1) {
            isFind = true;
            resultMaximal = *currentMaximal;
        } else {
            if (matrix.at(currentRowIndex).size() != 0) {
                matrix.at(currentRowIndex).erase(currentMaximal);
            } else {
                currentRowIndex++;
            }
        }
    }
    std::cout << "Maximal, that repeat more than 1 time: " << resultMaximal << std::endl;
    
    std::system("pause");
    return 0;
}
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
03.02.2014, 16:30 #6
Xopecc, ваш код пропустит максимальный отрицательный элемент, если такой имеется.
0
Xopecc
33 / 28 / 2
Регистрация: 13.09.2013
Сообщений: 250
03.02.2014, 17:01 #7
GuGo1991, проверял достаточное кол-во раз, все правильно выводится
0
Ev[G]eN
iOS/Android Developer
Эксперт С++
5097 / 1535 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
03.02.2014, 17:07 #8
Xopecc, делать подобные "предположения", в принципе неправильно..
Цитата Сообщение от Xopecc Посмотреть сообщение
C++
1
Max(-200)
откуда эти -200? с головы?
0
Xopecc
33 / 28 / 2
Регистрация: 13.09.2013
Сообщений: 250
03.02.2014, 17:10 #9
Цитата Сообщение от Ev[G]eN Посмотреть сообщение
Xopecc, делать подобные "предположения", в принципе неправильно..

откуда эти -200? с головы?
-200 там не нужно; я в начале по другому принципу считал максимальное из чисел, встречающихся в заданной матрице более одного раза. Потом нашел более простой способ, а эти -200 забыл убрать, сейчас поправлю код в посте выше
ну, поправил если можешь убери -200 из поста с кодом
0
Ev[G]eN
iOS/Android Developer
Эксперт С++
5097 / 1535 / 381
Регистрация: 23.01.2011
Сообщений: 3,148
03.02.2014, 17:12 #10
Цитата Сообщение от Xopecc Посмотреть сообщение
если можешь убери -200 из поста с кодом
отредактировал
1
Xopecc
33 / 28 / 2
Регистрация: 13.09.2013
Сообщений: 250
03.02.2014, 17:18 #11
GuGo1991, стоп, а зачем вообще нам нужен максимальный отрицательный элемент?
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
03.02.2014, 17:26 #12
Xopecc, ну а вдруг положительных повторяющихся нет или же все элементы отрицательные и
имеется повторяющийся отрицательный
0
Xopecc
33 / 28 / 2
Регистрация: 13.09.2013
Сообщений: 250
03.02.2014, 17:34 #13
GuGo1991, Ах да, в ручную проверил, например, если есть матрица 2х2(-3;-2;-3;0), то он считал максимальным повторяющимся элементом -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
#include<conio.h>
#include<iostream>
#include<iomanip>
#include<time.h>
#include<Windows.h>
using namespace std;
 
int main(){
    setlocale(LC_ALL, "Russian");
    srand(time(NULL));
    int a, b;
    cout << "Введите размеры матрицы: ";
    cin >> a >> b;
    int **M = new int*[a];
    for (int i(0); i < a; i++)
        M[i] = new int[b];
    for (int i(0); i < a; i++){
        for (int j(0); j < b; j++){
            M[i][j] = 99 - rand() % 198;
            cout << setw(5) << M[i][j];
        }
        cout << endl;
    }
    int Zero(0), Count(a), Max(0), MaxCount(0), Max2(0), C(0);
    
    for (int i(0); i < a; i++){
        for (int j(0); j < b; j++){
            if (M[i][j] == 0)
                Zero++;
            if (C == 0){
                Max = M[i][j];
                C++;
            }
            if (M[i][j] == Max)
                MaxCount++;
            if (MaxCount >= 2){
                Max2 = Max;
                MaxCount = 0;
            }
            if (abs(M[i][j]) > abs(Max))
                Max = M[i][j];
        }
        if (Zero != 0){
            Zero = 0;
            Count--;
        }
    }
    cout << endl << "Количество строк, которые не содержат ни одного нулевого элемента: " << Count << endl;
    if (Max2 == 0) cout << "Нет чисел, встречающихся более одного раза!";
    else cout << endl << "Максимальное из чисел, встречающихся в заданной матрице более одного раза: " << Max2;
    for (int i(0); i < a; i++)
        delete[] M[i];
    delete[] M;
    cout << "\n\nДля выхода нажмите любую клавишу...";
    _getch();
    return 0;
}
0
Iryna_Light
0 / 0 / 0
Регистрация: 15.12.2013
Сообщений: 41
04.02.2014, 23:24  [ТС] #14
Xopecc, а можно подробнее строки30-43. спасибо

Добавлено через 5 минут
GuGo1991, а без сортировки никак? и это сортировка по убывающей?
немного не понимаю сортировки и нахождение макс. элемента
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
05.02.2014, 00:27 #15
Iryna_Light, заодно заменил массив на динамический и добавил проверку.
Если что не ясно пишите.
Кликните здесь для просмотра всего текста
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;
}
0
05.02.2014, 00:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2014, 00:27
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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