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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Ксения love
0 / 0 / 0
Регистрация: 23.12.2012
Сообщений: 21
#1

Сравнение двумерных матриц - разобрать код - C++

19.08.2014, 19:21. Просмотров 1464. Ответов 27
Метки нет (Все метки)

Разобрать суть кода, что в нем описанно, функций

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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
int** create_matrix(int n, int m,int tip)
{
    int**variable= NULL; //переменная
    variable = (int**)malloc(sizeof(int*)*n);
    for(int i=0;i<n;i++)
        variable[i]=(int*)malloc(sizeof(int)*m);
    printf("Matrix_successfully_created\n",n,m);//матрицу успешно созданно
    rand_value(variable,n,m); //рандомное значение
    return variable;
}
//----------------------------------------------------------------------------------
void free_memory(int*** matrix,int n)
{
    if((*matrix==NULL) || (matrix == NULL))
    {
        printf("memory_deleted");
    }else
    {
        for(int i=0;i < n;i++)
        {
            free(matrix[i]);
        }
        free(*matrix);
        *matrix=NULL;
    }
}
//----------------------------------------------------------------------------------
int** rand_value(int** matrix, int n, int m)
{
    srand(time(NULL));
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            matrix[i][j]=rand()%20;
    check (matrix,n,m);
    return matrix;
}
//----------------------------------------------------------------------------------
int* find_max_min(int** matrix,int n,int m)
{
    if((matrix==NULL)||(n==0)||(m==0))
    {
        printf("First_create_a_matrix");// сначала создайте матрицу
        return NULL;
    } else
    {
        int max=matrix[0][0];
        int max_k_n=0,max_k_m=0;
        int min=matrix[0][0];
        int min_k_n=0,min_k_m=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(matrix[i][j] > max)
                {
                    max = matrix[i][j];
                    max_k_n=i;
                    max_k_m=j;
                }
                if(matrix[i][j] < min)
                {
                    min = matrix[i][j];
                    min_k_n=i;
                    min_k_m=j;
                }
            }
        }
        int *return_matrix = (int*)malloc(sizeof(int)*4);
        return_matrix[0]=max_k_n;
        return_matrix[1]=max_k_m;
        return_matrix[2]=min_k_n;
        return_matrix[3]=min_k_m;
        return return_matrix;
    }
}
//----------------------------------------------------------------------------------
void find_value(int** matrix, int n, int m, int value)
{
    if((matrix==NULL)||(n==0)||(m==0))
    {
        printf("First_create_a_matrix");
    } else
    {
        int find=0;
        int index=0;
        int** variable;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(matrix[i][j] == value)
                    find++;
        variable = (int**)malloc(sizeof(int*)*find);
        for(int i=0;i<find;i++)
            variable[i]=(int*)malloc(sizeof(int)*2);
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(matrix[i][j] == value)
                {
            variable[index][0]=i;
            variable[index][1]=j;
            index++;
        }
        for(int i=0;i<find;i++)
            printf("n=%d,m=%d\n",variable[i][0],variable[i][1]);
    }
}
//----------------------------------------------------------------------------------
int** compare(int** matrix,int** matrix2,int n,int m)
{
    if((matrix==NULL)||(n==0)||(m==0))
    {
        printf("First_create_a_matrix");
        return NULL;
    } else
    {
        int** matrix3 = create_matrix(n,m,1);
        printf("First_matrix:\n");//первая
        check(matrix,n,m);
        printf("second:\n");//вторая
        check(matrix2,n,m);
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
            if(matrix[i][j] > matrix2[i][j])
            {
                matrix3[i][j]=matrix[i][j];
            }else
            {
                matrix3[i][j]=matrix3[i][j];
            }
        }
        printf("The_compare_is_successful\n"); //Сравнение прошло успешно.
        return matrix3;
    }
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2014, 19:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сравнение двумерных матриц - разобрать код (C++):

Сравнение двух двумерных массивов - C++
Всем привет ) Только начинаю работать с С++. Помогите разобраться с задачей, нужно сравнить два двумерных массива, то есть если в массивах...

Перегрузка сложения для двумерных матриц - C++
Имеется класс для работы с матрицами размера 3 на 3: class Matrix{ private: int aMas ; public: Matrix(){} void...

Сравнение элементов двух двумерных массивов - C++
Нужна очень ваша помощь!!!!не могу разобраться с двумерными массивами!!помогите!!Люди!!помогите с двумерным массивом!!!вообще не могу...

Сравнение элементов двух двумерных массивов - C++
Прошу помощи в написании данной задачи. Написал сам все что мог, выдает ошибку error C2447: '{' : missing function header (old-style formal...

Матрицы: сложения двух матриц (двумерных массивов) - C++
Необходимо написать программу сложения двух матриц (двумерных массивов) на языке СИ++. Даны матрицы A и B. Надо их объявить и заполнить...

Объявить два двумерных массива (матрицы) и подсчитать сумму этих матриц - C++
Объявить два двумерных массива (матрицы) и подсчитать сумму этих матриц.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gru74ik
Модератор
Эксперт CЭксперт С++
4151 / 1777 / 197
Регистрация: 20.02.2013
Сообщений: 4,900
Записей в блоге: 21
23.08.2014, 23:33 #16
Цитата Сообщение от gru74ik Посмотреть сообщение
C++
1
int index = 0; // индекс "рядов" (rows) матрицы variable
Здесь rows (ряды или строки) - это абстракция, как и columns (колонки). Имеется ввиду представление двумерных массивов в виде таблицы:
Миниатюры
Сравнение двумерных матриц - разобрать код  
gru74ik
Модератор
Эксперт CЭксперт С++
4151 / 1777 / 197
Регистрация: 20.02.2013
Сообщений: 4,900
Записей в блоге: 21
24.08.2014, 00:11 #17
Цитата Сообщение от gru74ik Посмотреть сообщение
C++
1
2
        int** variable; // создаём матрицу, которая будет хранить индексы
                        // найденных совпадений с нашим "поисковым запросом"
Точнее, создаём указатель на указатель (или, ещё можно сказать - указатель на массив указателей).

Добавлено через 32 минуты
Ну и последняя (шестая) функция:
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
//===================================  6  ======================================
// Определение функции compare(). Назначение функции - сравнивать две матрицы
// и возвращать болшую из них. Функция принимает четыре аргумента -
// указатель на первую матрицу типа int, указатель на вторую матрицу типа int,
// и две целочисленные переменные, задающие размер матриц.
//
// Возвращаемое значение - указатель на указатель на тип int (иными словами,
// указатель на массив указателей). Хитрый трюк, позволяющий, по сути, сделать
// возвращаемым значением матрицу.
//==============================================================================
int** compare(int** matrix, int** matrix2, int n, int m)
{
    // Если память для матрицы не выделена (матрица не существует) или если
    // в матрице нет значений (точнее, если вместо значений - нули)
    if ((matrix==NULL)||(n==0)||(m==0))
    {
        // то вывести на экран сообщение "First_create_a_matrix"
        printf("First_create_a_matrix");
        return NULL;    // Гррррррр >:(
    }
    
    else    // иначе
    {
        // Вызвать функцию create_matrix() и результат её работы присвоить
        // указателю второго уровня matrix3. Проще говоря, создаём третью
        // матрицу (то есть matrix3[n][m]):
        int** matrix3 = create_matrix(n,m,1);
        printf("First_matrix:\n");  // вывод на экран сообщения "Первая матрица:"
        check(matrix,n,m);  // какая-то функция (судя по названию, проверяющая
                            // матрицы по каким-то своим критериям)
        printf("second:\n");    // вывод на экран сообщения "Вторая матрица:"
        check(matrix2,n,m); // проверяем вторую матрицу
        
        // Пробегаем по матрицам двумя вложенными циклами for:
        for (int i=0; i<n; i++)
            for (int j=0; j<m; j++)
            {
                // Если первая матрица больше второй
                if (matrix[i][j] > matrix2[i][j])
                // то копируем первую матрицу в третью 
                    matrix3[i][j] = matrix[i][j]; 
                else
                // иначе,
                    matrix3[i][j] = matrix3[i][j]; // тут ошибка, судя по всему.
                // Скорее всего, должно быть так:
                //  matrix3[i][j] = matrix2[i][j];
            }
        // Вывести сообщение ""The_compare_is_successful"
        printf("The_compare_is_successful\n"); //Сравнение прошло успешно.
        
        // Вернуть указатель на массив указателей matrix3 (то есть 
        // вернуть бОльшую матрицу):
        return matrix3; 
    }
}
gru74ik
Модератор
Эксперт CЭксперт С++
4151 / 1777 / 197
Регистрация: 20.02.2013
Сообщений: 4,900
Записей в блоге: 21
25.08.2014, 08:27 #18
Сидел, думал. Сам уже запутался.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//===================================  1  =====================================
int** create_matrix(int n, int m, int tip)
{
    int**variable = NULL;   //переменная
    variable = (int**)malloc(sizeof(int*)*n);
    
    for (int i=0; i<n; i++)
        variable[i] = (int*)malloc(sizeof(int)*m);
    printf("Matrix_successfully_created\n", n, m); //матрица успешно создана
    rand_value(variable, n, m); //рандомное значение
    
    return variable;
}
Зачем нужен третий аргумент? Вот этот, который int tip? Что с помощью него делается?

Добавлено через 28 минут

Похоже, Ксения love, не всё нам рассказала! Если я правильно понял, скорее всего, задание заключалось не только в том, чтобы прокомментировать код и рассказать, что происходит в функциях, но и найти ошибки. Тогда всё это обретает смысл и прототип первой функции должен вылядеть как-то так:
C++
1
int** create_matrix(int row, int col, int** matrix);
А определение, соответственно, как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//===================================  1  =====================================
int** create_matrix(int n, int m, int** variable)
{
    int** variable = NULL;
    variable = (int**)malloc(sizeof(int*)*n);
    
    for (int i=0; i<n; i++)
        variable[i] = (int*)malloc(sizeof(int)*m);
    printf("Matrix_successfully_created\n", n, m); //матрица успешно создана
    rand_value(variable, n, m); //рандомное значение
    
    return variable;
}
Algoritmer
155 / 95 / 13
Регистрация: 07.03.2013
Сообщений: 480
Записей в блоге: 1
25.08.2014, 11:40 #19
По ходу да. Третий аргумент действительно не использ.
gru74ik
Модератор
Эксперт CЭксперт С++
4151 / 1777 / 197
Регистрация: 20.02.2013
Сообщений: 4,900
Записей в блоге: 21
25.08.2014, 11:56 #20
Цитата Сообщение от Algoritmer Посмотреть сообщение
По ходу да. Третий аргумент действительно не использ.
Вот и я так подумал:
  • если variable - это указатель, который передаётся извне в функцию качестве параметра, то понятно зачем третий аргумент (но тогда в загаловке функции ошиблись и с типом и с именем третьего аргумента);
  • если третий аргумент вовсе избыточен, тогда область видимости variable - тело функции create_matrix(), а ведь функция его возращает (может она делает копию перед уничтожением локальной variable?);
  • если в заголовке функции нет ошибки и в качестве параметра действительно передаётся какая-то целочисленная переменная tip, то где она в реализации (в теле функции)? Или variable - это она и есть? Но почему тогда не совпадают имена? И почему не совпадает тип (неявное приведение типов?);

P.S. Поначалу я так и думал, что просто ошибка. Но потом засомневался. В 6-м примере идёт создание матрицы как раз с помощью функции create_matrix() из первого примера. И там передаётся в функцию три аргумента (строка 27 в шестом примере).
gru74ik
Модератор
Эксперт CЭксперт С++
4151 / 1777 / 197
Регистрация: 20.02.2013
Сообщений: 4,900
Записей в блоге: 21
25.08.2014, 12:44 #21
Цитата Сообщение от gru74ik Посмотреть сообщение
если третий аргумент вовсе избыточен, тогда область видимости variable - тело функции create_matrix(), а ведь функция его возращает
Дядя Стёпа предостерегает от таких ошибок:
Миниатюры
Сравнение двумерных матриц - разобрать код  
Ксения love
0 / 0 / 0
Регистрация: 23.12.2012
Сообщений: 21
27.09.2014, 10:45  [ТС] #22
Извините что долго не отвечала, хотела поблагодарить, спасибо огромное, спасибо что нашли для меня время, я очень благодарна что еще есть такие люди)
gru74ik
Модератор
Эксперт CЭксперт С++
4151 / 1777 / 197
Регистрация: 20.02.2013
Сообщений: 4,900
Записей в блоге: 21
27.09.2014, 13:51 #23
Цитата Сообщение от Ксения love Посмотреть сообщение
Извините что долго не отвечала, хотела поблагодарить, спасибо огромное, спасибо что нашли для меня время, я очень благодарна что еще есть такие люди)
Ух ты, а вот благодарность в наше время ещё более редкая вещь, чем (почти) бескорыстная помощь!
Ксения love
0 / 0 / 0
Регистрация: 23.12.2012
Сообщений: 21
06.10.2014, 20:34  [ТС] #24
Можете еще помочь в этом же?))только в других функциях
gru74ik
Модератор
Эксперт CЭксперт С++
4151 / 1777 / 197
Регистрация: 20.02.2013
Сообщений: 4,900
Записей в блоге: 21
06.10.2014, 20:44 #25
Цитата Сообщение от Ксения love Посмотреть сообщение
Можете еще помочь в этом же?))только в других функциях
Да, только с одним условием. Поскольку раздел всё-таки плюсовый (и Си я знаю ещё меньше, чем С++), то давайте пользоваться плюсовым вводом-выводом, плюсовым выделением памяти и т.п.
Ксения love
0 / 0 / 0
Регистрация: 23.12.2012
Сообщений: 21
06.10.2014, 20:54  [ТС] #26
я конечно мало поняла)
gru74ik
Модератор
Эксперт CЭксперт С++
4151 / 1777 / 197
Регистрация: 20.02.2013
Сообщений: 4,900
Записей в блоге: 21
07.10.2014, 16:39 #27
Цитата Сообщение от Ксения love Посмотреть сообщение
я конечно мало поняла)
Чтобы вывести сообщение на экран монитора, в языке Си используются функция форматированного вывода printf (подробнее см. раз, два, три), в то время как в C++ используется для подобных целей объект cout (подробнее раз, два, три, четыре).
Пример:
C
1
2
3
4
5
6
#include <stdio.h>
int main(void)
{
    printf("Hello, World!\n");
    return 0;
}
C++
1
2
3
4
5
6
#include <iostream>
int main()
{
    std::cout << "Hello, world!" << std::endl;
    return 0;
}
То же самое с вводом. В языке Си для ввода (например, чтобы пользователь мог ввести какие-то значения с клавиатуры) используется функция scanf (подробнее раз, два, три), в то время как в C++ для подобных целей используется объект cin (подробнее тут).

Цитата Сообщение от gru74ik Посмотреть сообщение
давайте пользоваться плюсовым выделением памяти
В языке программирования С++ для выделения памяти используется оператор new, для освобождения памяти - оператор delete (подробнее: раз и два).
В то время как в Си для подобных целей используются, соответственно, функции malloc() и free() (подробнее: "Динамическое выделение памяти в C").

Добавлено через 23 минуты
P.S. А вообще, чтобы нам хоть как-то понимать друг друга, я бы посоветовал найти одну из этих книг и почитать основы (как правило, это первые 300 страниц книги):
  • Стивен Прата - Язык программирования С++ (2012, 6-е изд.)
  • Стенли Б. Липпман, Жози Лажойе, Барбара Э. Му - Язык программирования C++. Базовый курс (2014, 5-е изд.)
  • Харви М. Дейтел, Пол Дж. Дейтел - Как программировать на C++ (2008, 5-е изд.)
Времени займёт часа два-три вдумчивого чтения (ну, может и немного дольше, не беда - посвятите этому пару вечеров), зато насколько повысится самооценка и самоуважение!
Algoritmer
155 / 95 / 13
Регистрация: 07.03.2013
Сообщений: 480
Записей в блоге: 1
16.10.2014, 17:24 #28
Цитата Сообщение от gru74ik Посмотреть сообщение
зато насколько повысится самооценка и самоуважение!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2014, 17:24
Привет! Вот еще темы с ответами:

Сравнение матриц в бинарных файлах - C++
Добрый вечер, хотел бы задать немного вопросов по своей задачке. Сама задачка: Есть 2 файла, в первом - N матриц, во втором - M...

Разобрать код с++ - C++
Всем доброго времени суток. Дело такое нужно разобрать код явных ошибок нету но при компиляции вижуалка вылетает с ошибкой вроде в хидере...

Разобрать код - C++
Помогите разобраться с кодом!Можите рассписать где что находится пожалуйста! #include &quot;stdafx.h&quot; #include&lt;iostream&gt; #include...

Разобрать код - C++
Всем привет помогите разобрать код, программа создана для подсчета что вот это вот означает? double s = 1.0 / 6.0, e, t = 1.0 /...


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

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

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