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

Работа со строками матрицы - C++

Восстановить пароль Регистрация
 
Merasada
0 / 0 / 0
Регистрация: 25.12.2013
Сообщений: 12
25.12.2013, 01:01     Работа со строками матрицы #1
Здравствуйте, помогите решить задачку с матрицами.
Две строки матрицы назовем похожими, если совпадают множества чисел, встречающихся в этих строках. Найти количество строк в максимальном множестве попарно похожих строк заданной матрицы.
(формулировка на русском этой задачи, просто сама не с первого раза поняла что делать)- Задается множество по парно не равных строк, надо найти количество равных строк. Описание строки является равной если состоит из тех же элементов. При этом матрицу нужно задавать в файле.

Пример матрицы
1 2 3 4
2 3 4 5
4 3 2 1
5 3 4 2 В этой матрице похожие строки 1 и 3
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2013, 01:01     Работа со строками матрицы
Посмотрите здесь:

C++ Работа со строками C++
C++ Работа со строками
Работа со строками. C++
Работа со строками C++
C++ Работа с строками
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6156 / 2885 / 281
Регистрация: 04.12.2011
Сообщений: 7,680
Записей в блоге: 3
25.12.2013, 03:50     Работа со строками матрицы #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
#include <iostream>
#include <set>
#include <Windows.h>//для руссификации (в свойствах окна консоли выберите шрифт lusinda))
using namespace std;
int main(){
SetConsoleCP (1251); SetConsoleOutputCP (1251);//для руссификации
 
set<int> first_set;//контейнер для выбранной строки-кандидата в чемпионы)
set<int> second_set;//контейнер для перебора и сравнения с остальными
 
//с сохранением и чтением маирицы из файла, думаю у Вас не будет проблем?
int matr[6][5]={
    {2,3,4,5,6},//less (2)
    {2,3,4,5,7},//min  (1)
    {1,2,3,4,5},//max  (3)
    {1,3,2,4,5},//max  (3)
    {1,3,4,2,5},//max  (3)
    {3,2,4,5,6}//less  (2)
};
 
int count_of_max_sets=0;//счётчик результата
int count_of_current_set=0;//счётчик текущего результата то есть для данной выбранной строки (с индесом i)
int num_row_of_max_set=0;//номер текущего (и в последствии окончательного) победителя
for(int i = 0; i < 5; ++i){
    first_set.clear();//очищаем
    for(int n = 0; n < 5; ++n)first_set.insert(matr[i][n]); //заполняем строкой-кандидатом
 
for(int j = 0; j < 5; ++j){
if(i == j)continue;//с собой не сравниваем
    second_set.clear();//очищаем
for(int n = 0; n < 5; ++n)second_set.insert(matr[j][n]);//заполняем остальными строками по очереди
if(first_set == second_set) count_of_current_set++;//сравниваем и в случае успеха увеличиваем счет  
if(count_of_current_set > count_of_max_sets){
count_of_max_sets = count_of_current_set;//если надо меняем победителя
num_row_of_max_set=i;//запоминаем номер победителя
}
}
count_of_current_set = 0;//сбрасываем результат для текущей i-строки, переходя к следующей
}
cout<<"Номер первой встреченной строки имеющей \"строки-побратимы\" равен "<<num_row_of_max_set<<endl;
cin.get();
return 0;
}


Добавлено через 18 минут
Вначале матрица была 5х5, а потом добавилась ещё строчка, но забыл скорректировать.
Цитата Сообщение от IGPIGP Посмотреть сообщение
C++
1
for(int i = 0; i < 5; ++i){
нужно бы в 24-й строке:
C++
1
for(int i = 0; i < 6; ++i){
Merasada
0 / 0 / 0
Регистрация: 25.12.2013
Сообщений: 12
25.12.2013, 12:34  [ТС]     Работа со строками матрицы #3
IGPIGP, Нужно количество равных строк вывести
пример, перенесенный из паскаля..

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
#include<iostream>
#include<ctime>
#include<conio.h>
#include<stdio.h>
using namespace std;
 
 
#define s 4
#define c 4
 
int main(){
    int a[s][c]={{1,2,3,4},{1,2,1,2},{4,3,2,1},{1,3,2,4}};
    int i,j,k,t,b;
    for (i=0; i<s; i++){
        for (j=0; j<c; j++)
            for (k=0; c-j; k++)
                if (a[i][k]>a[i][k+1]){
                    t=a[i][k];
                    a[i][k]=a[i][k+1];
                    a[i][k+1]=t;}
    }
    for (i=0; i<s; i++){
        for (j=0; j<c; j++)
            printf("%5d\n",a[i][j]);}
    //_getch();
    t=1;
    for (i=0; i<s-1; i++){
        for (k=i+1; k<s; k++){
            //b=1; //типо строки равны
            return true;
            for (j=1; j=c; j++)
                if (a[i][j]!=a[k][j]){
                    //b=2; //типо строки разные
                    return false;
                    break;}
        }
        if  (true)
            t=t+1;
        }
    printf("%d",t);
    _getch();
}
в первых циклах зависает и дальше не продвигается... подскажите как исправить?..
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6156 / 2885 / 281
Регистрация: 04.12.2011
Сообщений: 7,680
Записей в блоге: 3
25.12.2013, 13:16     Работа со строками матрицы #4
Цитата Сообщение от Merasada Посмотреть сообщение
Нужно количество равных строк вывести
равных же если набор значений в них одинаков? Смотрите:
Цитата Сообщение от Merasada Посмотреть сообщение
Найти количество строк в максимальном множестве попарно похожих строк заданной матрицы.
Запустите предложенный пример. Получите ответ:
Номер первой встреченной строки имеющей "строки-побратимы" равен 2
это индекс третьей строчки. То есть правильный это ответ.

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

Не по теме:

Слово "попарно" - тавтология. По другому строки не сравниваются. В математике такого полно. Но если у Вас есть множество из n прямых, k из которых "попарно" параллельны, то можно сказать, что у Вас есть k параллельных прямых. А попарно или взаимо, это уже беллетристика.



Добавлено через 18 минут
Кажется понял. Замените вывод на:
C++
1
cout<<"Максимальное количество  \"строк-побратимов\" равено "<<count_of_max_sets<<endl;
Merasada
0 / 0 / 0
Регистрация: 25.12.2013
Сообщений: 12
25.12.2013, 13:34  [ТС]     Работа со строками матрицы #5
IGPIGP, ошибочка вышла..
"Найти количество равных строк в максимальном множестве попарно непохожих строк"

Работа со строками матрицы
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6156 / 2885 / 281
Регистрация: 04.12.2011
Сообщений: 7,680
Записей в блоге: 3
25.12.2013, 13:45     Работа со строками матрицы #6
Цитата Сообщение от Merasada Посмотреть сообщение
IGPIGP, ошибочка вышла..
"Найти количество равных строк в максимальном множестве попарно непохожих строк"
Это Вы теперь легко исправите сами.
Для предложенного вначале задания вот так может быть:
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
#include <iostream>
#include <set>
#include <Windows.h>//для руссификации (в свойствах окна консоли выберите шрифт lusinda))
using namespace std;
int main(){
SetConsoleCP (1251); SetConsoleOutputCP (1251);//для руссификации
 
set<int> first_set;//контейнер для выбранной строки-кандидата в чемпионы)
set<int> second_set;//контейнер для перебора и сравнения с остальными
 
//с сохранением и чтением маирицы из файла, думаю у Вас не будет проблем?
int matr[7][5]={
    {2,3,4,5,6},//less (2)
    {1,2,3,4,5},//max  (3)
    {2,3,4,5,7},//min  (1)
    {1,3,2,4,5},//max  (3)
    {1,3,4,2,5},//max  (3)
    {1,3,4,2,5},//max  (3)
    {3,2,4,5,6}//less  (2)
};
 
cout<<"Введена матрица"<<endl;
for(int i = 0; i < 7; ++i){
for(int j = 0; j < 5; ++j){
cout<< matr[i][j]<<" ";
}
cout<<endl;
}
 
int count_of_max_sets=0;//счётчик результата
int count_of_current_set=0;//счётчик текущего результата то есть для данной выбранной строки (с индесом i)
int num_row_of_max_set=0;//номер текущего (и в последствии окончательного) победителя
for(int i = 0; i < 7; ++i){
    first_set.clear();//очищаем
    for(int n = 0; n < 5; ++n)first_set.insert(matr[i][n]); //заполняем строкой-кандидатом
 
    for(int j = 0; j < 7; ++j){
if(i == j)continue;//с собой не сравниваем
    second_set.clear();//очищаем
for(int n = 0; n < 5; ++n)second_set.insert(matr[j][n]);//заполняем остальными строками по очереди
if(first_set == second_set) count_of_current_set++;//сравниваем и в случае успеха увеличиваем счет  
if(count_of_current_set > count_of_max_sets){
count_of_max_sets = count_of_current_set;//если надо меняем победителя
num_row_of_max_set=i;//запоминаем номер победителя
}
}
count_of_current_set = 0;//сбрасываем результат для текущей i-строки, переходя к следующей
}
cout<<"Номер первой встреченной строки имеющей максимум \"строк-побратимов\" равен "<<num_row_of_max_set+1<<endl;
cout<<"Количество её \"строк-побратимов\" равено "<<count_of_max_sets<<endl;
cin.get();
return 0;
}
так как скорректировать размер нужно было и в строке 28 первого предложенного кода (для индекса j).
Merasada
0 / 0 / 0
Регистрация: 25.12.2013
Сообщений: 12
25.12.2013, 13:59  [ТС]     Работа со строками матрицы #7
IGPIGP, Благодарю Спасли душу..)
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6156 / 2885 / 281
Регистрация: 04.12.2011
Сообщений: 7,680
Записей в блоге: 3
25.12.2013, 14:35     Работа со строками матрицы #8
Цитата Сообщение от Merasada Посмотреть сообщение
IGPIGP, Благодарю Спасли душу..)
Чью? Вот по "уточнённому" варианту:
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
#include <iostream>
#include <set>
#include <Windows.h>//для руссификации (в свойствах окна консоли выберите шрифт lusinda))
using namespace std;
int main(){
SetConsoleCP (1251); SetConsoleOutputCP (1251);//для руссификации
 
set<int> first_set;//контейнер для выбранной строки-кандидата в чемпионы)
set<int> second_set;//контейнер для перебора и сравнения с остальными
 
//с сохранением и чтением маирицы из файла, думаю у Вас не будет проблем?
int matr[7][5]={
    {2,3,4,5,6},//less (2)
    {1,2,3,4,5},//max  (3)
    {2,3,4,5,7},//min  (1)
    {1,3,2,4,5},//max  (3)
    {1,3,4,2,5},//max  (3)
    {1,3,4,2,5},//max  (3)
    {3,2,4,5,6}//less  (2)
};
 
cout<<"Введена матрица"<<endl;
for(int i = 0; i < 7; ++i){
for(int j = 0; j < 5; ++j){
cout<< matr[i][j]<<" ";
}
cout<<endl;
}
 
int count_of_max_sets=0;//счётчик результата
int count_of_current_set=0;//счётчик текущего результата то есть для данной выбранной строки (с индесом i)
int num_row_of_max_set=0;//номер текущего (и в последствии окончательного) победителя
for(int i = 0; i < 7; ++i){
    first_set.clear();//очищаем
    for(int n = 0; n < 5; ++n)first_set.insert(matr[i][n]); //заполняем строкой-кандидатом
 
    for(int j = 0; j < 7; ++j){
if(i == j)continue;//с собой не сравниваем
    second_set.clear();//очищаем
for(int n = 0; n < 5; ++n)second_set.insert(matr[j][n]);//заполняем остальными строками по очереди
if(first_set != second_set) count_of_current_set++;//сравниваем и в случае успеха увеличиваем счет  
if(count_of_current_set > count_of_max_sets){
count_of_max_sets = count_of_current_set;//если надо меняем победителя
num_row_of_max_set=i;//запоминаем номер победителя
}
}
count_of_current_set = 0;//сбрасываем результат для текущей i-строки, переходя к следующей
}
cout<<"Номер первой встреченной строки имеющей минимум \"строк-побратимов\" равен "<<num_row_of_max_set+1<<endl;
cout<<"Количество её \"строк-непобратимов\" равено "<<count_of_max_sets<<endl;
cin.get();
return 0;
}
Учитесь и будьте внимательней. Такие задачки не дают в техникумах по благоустройству...
Merasada
0 / 0 / 0
Регистрация: 25.12.2013
Сообщений: 12
29.12.2013, 18:42  [ТС]     Работа со строками матрицы #9
IGPIGP, неудобно снова к Вам обращаться на счет этой темы, но я дура-дурой не могу сделать чтобы прога работала через считывания с файла(точнее что в интернете не читала всё прям такое не понятное))
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6156 / 2885 / 281
Регистрация: 04.12.2011
Сообщений: 7,680
Записей в блоге: 3
29.12.2013, 19:12     Работа со строками матрицы #10
Цитата Сообщение от Merasada Посмотреть сообщение
IGPIGP, неудобно снова к Вам обращаться на счет этой темы
Цитата Сообщение от Merasada Посмотреть сообщение
IGPIGP, ошибочка вышла..
Merasada, посмотрите как Вы выкладываете условие. Вначале одно, потом другое... О хранении в файле тоже потом выясняется. Может покажете оригинальное условие? На каком оно языке?
Грустно другое. Это задачка где нужно повозиться, если делать руками как в коде на Pascal (не всматривался) и это предполагает, что такую незатею, как считывание и сохранение в файл Вы должны делать легко.
Убедить меня в том, что поиск не то что в сети, а на этом форуме не даёт результатов по этому вопросу невозможно. Просто это похоже на стиль отношения к заданию, начиная от постановки вопроса и заканчивая отдельными этапами решения.
Merasada
0 / 0 / 0
Регистрация: 25.12.2013
Сообщений: 12
29.12.2013, 20:04  [ТС]     Работа со строками матрицы #11
Цитата Сообщение от IGPIGP Посмотреть сообщение
Merasada, посмотрите как Вы выкладываете условие. Вначале одно, потом другое... О хранении в файле тоже потом выясняется. Может покажете оригинальное условие? На каком оно языке?
Грустно другое. Это задачка где нужно повозиться, если делать руками как в коде на Pascal (не всматривался) и это предполагает, что такую незатею, как считывание и сохранение в файл Вы должны делать легко.
Убедить меня в том, что поиск не то что в сети, а на этом форуме не даёт результатов по этому вопросу невозможно. Просто это похоже на стиль отношения к заданию, начиная от постановки вопроса и заканчивая отдельными этапами решения.


Хм... сама задача верна. Да, там не сказано что нужно работать с файлами. Но, после показа работы мне говорят " А вот через считывание файла сделайте". И как то не волнует как да что я буду делать, ведь нам этого просто не объясняли.

Добавлено через 29 минут
IGPIGP, косяк мой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2013, 04:51     Работа со строками матрицы
Еще ссылки по теме:

C++ Работа со строками
C++ Работа со строками
работа со строками C++

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6156 / 2885 / 281
Регистрация: 04.12.2011
Сообщений: 7,680
Записей в блоге: 3
30.12.2013, 04:51     Работа со строками матрицы #12
Цитата Сообщение от Merasada Посмотреть сообщение
И как то не волнует как да что я буду делать, ведь нам этого просто не объясняли.
Преподаватели склонны к садизму? Перечитывая тему верю безоговорочно.
Цитата Сообщение от Merasada Посмотреть сообщение
" А вот через считывание файла сделайте"
Дык и вопрос тогда по другому стоял бы и в другой теме.
Раз основное решено, то осталось: Как записать/считать последовательность целых чисел из/в файл/а?
Информации полно, даже если книжки нет никакой. И главное, делается это легче лёгкого.

Добавлено через 7 часов 57 минут
Merasada, ловите
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>
#include <fstream>
#include <set>
#include <Windows.h>//для руссификации (в свойствах окна консоли выберите шрифт lusinda))
using namespace std;
int main(){
SetConsoleCP (1251); SetConsoleOutputCP (1251);//для руссификации
 
const int rows=7;
const int columns=5;
//с сохранением и чтением маирицы из файла, думаю у Вас не будет проблем?
int source_matr[rows][columns]={
    {2,3,4,5,6},//less (2)
    {1,2,3,4,5},//max  (3)
    {2,3,4,5,7},//min  (1)
    {1,3,2,4,5},//max  (3)
    {1,3,4,2,5},//max  (3)
    {1,3,4,2,5},//max  (3)
    {3,2,4,5,6}//less  (2)
};
 
const char* filename = "Matrix_file";
ofstream out_file(filename, ios::out);
if(!out_file){
cout<<"Не удалось открыть файл!";
}else{
for(int i = 0; i < rows; ++i){
for(int j = 0; j < columns; ++j){
out_file<<source_matr[i][j]<<'\n';
}
}
out_file.close();
}
 
int matr[rows][columns]={0};
 
ifstream input_file(filename, ios::in);
if(!input_file){
cout<<"Не удалось открыть файл!";
}else{
for(int i = 0; i < rows; ++i){
for(int j = 0; j < columns; ++j){
input_file>>matr[i][j];
 
}
}
input_file.close();
}
 
cout<<"Введена матрица"<<endl;
for(int i = 0; i < rows; ++i){
for(int j = 0; j < columns; ++j){
cout<< matr[i][j]<<" ";
}
cout<<endl;
}
 
set<int> first_set;//контейнер для выбранной строки-кандидата в чемпионы)
set<int> second_set;//контейнер для перебора и сравнения с остальными
 
int count_of_max_sets=0;//счётчик результата
int count_of_current_set=0;//счётчик текущего результата то есть для данной выбранной строки (с индесом i)
int num_row_of_max_set=0;//номер текущего (и в последствии окончательного) победителя
for(int i = 0; i < rows; ++i){
    first_set.clear();//очищаем
    for(int n = 0; n < columns; ++n)first_set.insert(matr[i][n]); //заполняем строкой-кандидатом
 
    for(int j = 0; j < rows; ++j){
if(i == j)continue;//с собой не сравниваем
    second_set.clear();//очищаем
for(int n = 0; n < columns; ++n)second_set.insert(matr[j][n]);//заполняем остальными строками по очереди
if(first_set != second_set) count_of_current_set++;//сравниваем и в случае успеха увеличиваем счет  
if(count_of_current_set > count_of_max_sets){
count_of_max_sets = count_of_current_set;//если надо меняем победителя
num_row_of_max_set=i;//запоминаем номер победителя
}
}
count_of_current_set = 0;//сбрасываем результат для текущей i-строки, переходя к следующей
}
cout<<"Номер первой встреченной строки имеющей минимум \"строк-побратимов\" равен "<<num_row_of_max_set+1<<endl;
cout<<"Количество её \"строк-непобратимов\" равно "<<count_of_max_sets<<endl;
cin.get();
return 0;
}

Не по теме:


и помните, внимательное отношение к предмету, это лучший способ избежать вспышек немотивированного насилия со стороны преподавателей.

Yandex
Объявления
30.12.2013, 04:51     Работа со строками матрицы
Ответ Создать тему
Опции темы

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