![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
GelarX |
![]() ![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 2 Регистрация: 18.6.2011 Город: Москва Вы: студент ![]() |
Условие звучит так:
Задана матрица целых чисел. Найти номера строк, элементы в каждой из которых одинаковы. Использовать функции. .. Вроде бы и не сложная задача.. но вот уже часа полтора ее "кручу" и ничего не выходит.. С кодом блока проверки извращался по разному - даже встраивал туда новый создаваемый массив..и даже двумерный)) Вообще мысль была такая - берется 1 число из первой строчки. Подсчитывается количество таких же чисел в этой же строке. После ищется такое же количество символов в следующей строке, проверяется на сходность. Если нет - то ищется такое же количество символов в следующей строке.. и так до последней строки.. после чего результаты записываются.. выглядеть это должно было так: если скажем в первой строке 2 числа 3, в 3, и скажем в 9 - то это запоминается путем присваивания новой переменной. После чего берется следующий символ в 1-й строке(если такой есть).. ну и так далее.. В конце выводятся все результаты проверки..ну а в блоке вывода поставить фильтр.. У меня у меня уже мозг за разум выходит (IMG:style_emoticons/default/smile.gif) И вообще мне кажется, что программа должна реализовываться несколько проще.. (IMG:style_emoticons/default/rolleyes.gif) Короче - компилятор все пишет всякую ересь.. Может у кого получится - заранее благодарен )) Код #include <conio.h> #include <iostream.h> #include <stdlib.h> #include <time.h> #include <iomanip.h> void generate_matrix(int a[10][10], int n, int m) { srand((unsigned)time(NULL)); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) a[i][j] = rand()%10; } void print_matrix(int a[10][10], int n, int m) { cout << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) cout << setw(4) << a[i][j]; cout << endl << endl; } } void check(int a[10][10], int n,int m) { int i,j,z,k,p,q; for(i=0;i<n;i++) { for(q=0;q<n;q++) { for(j=0;j<m;j++) { for(z=0;z<m;z++) { if(a[i][j]==a[i][z]) { k++; } if(a[i][j]==a[q][z]) { p++; } } if(p!=k) { break; break; } } if(p==k) { cout<<j<<" "<<z; cout>>checka); } } } } void main() { clrscr(); int n,m; int k = 0; int a[10][10]; cout << " Vvedite kol-vo strok matritzi: "; cin >> n; cout << " Vvedite kolichestvo stolbcov matritzi: "; cin >> m; generate_matrix(a,n,m); print_matrix(a,n,m); cout << endl << " Nomera strok, vse elementi kotorix odinakovi: " << endl; /*for (int i = 0; i < n; i++) if (check(a,n,m) !=0) { cout << i+1 << endl; }*/ check(a,n,m); /*else cout <<"takix net.";*/ getch(); } |
![]() ![]() |
GelarX |
![]()
Сообщение
#2
|
Новичок ![]() Группа: Пользователи Сообщений: 2 Регистрация: 18.6.2011 Город: Москва Вы: студент ![]() |
Появилась мысль вставки в блок проверки цикла сортировки элементов..скажем по возрастанию.. а потом можно символьно сравнить строки через strcmp ! И как я раньше то не дошел !?
попытаюсь реализовать..)) |
граф Монте-Кристо |
![]()
Сообщение
#3
|
Доцент ![]() ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 3 840 Регистрация: 27.9.2007 Из: Старый Оскол Город: Москва Учебное заведение: МФТИ/МАИ Вы: другое ![]() |
На мой взгляд, нужно для каждой строки создать упорядоченный массив без повторений. Потом сравнить все массивы друг с другом.
|
Vahappaday |
![]()
Сообщение
#4
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Хм... .
а строчки 1 4 6 и 6 4 1 - одинаковые? |
граф Монте-Кристо |
![]()
Сообщение
#5
|
Доцент ![]() ![]() ![]() ![]() ![]() ![]() Группа: Преподаватели Сообщений: 3 840 Регистрация: 27.9.2007 Из: Старый Оскол Город: Москва Учебное заведение: МФТИ/МАИ Вы: другое ![]() |
Смотря что понимать под словом "одинаковые". Состоят из одних и тех же чисел - тогда да. Но они не равны в том смысле, под которым понимается равенство строк.
|
Vahappaday |
![]()
Сообщение
#6
|
Аспирант ![]() ![]() ![]() Группа: Продвинутые Сообщений: 334 Регистрация: 26.4.2009 Город: Липецк Учебное заведение: ЛГТУ Вы: студент ![]() |
Код #include <conio.h> #include <iostream> //originally "#include <iostream.h>" #include <stdlib.h> #include <time.h> #include <iomanip> //originally "#include <iomanip.h>" using namespace std; void generate_matrix(int **a, int n, int m) { srand((unsigned)time(NULL)); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) a[i][j] = rand()%10; } void print_matrix(int **a, int n, int m) { cout << endl; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) cout << setw(4) << a[i][j]; cout << endl << endl; } } int compareIntegers(const void* a, const void* b) //сравнение целых для qsort { return (*((int *)a)-*((int *)b)); } bool isEqualStringsOfIntegers(int *a, int* b, int n) //сравнение массивов целых чисел (которые уже отсортированы) { if(n==0) return true; if(*a!=*b) return false; return isEqualStringsOfIntegers(a+1,b+1,n-1); } void main() { //clrscr(); - borland specific int n,m; int **a; cout << " Vvedite kol-vo strok matritzi: "; cin >> n; cout << " Vvedite kolichestvo stolbcov matritzi: "; cin >> m; a = new int *[n]; for(int i=0;i<n;i++) { a[i] = new int[m]; } generate_matrix(a,n,m); print_matrix(a,n,m); //теперь сортируем каждую строку, нам ведь не надо их больше выводить? //если же было бы нужно, то можно скопироать на новое место for(int i=0;i<n;i++) { qsort(a[i],m,sizeof(int),compareIntegers); } bool *marked = new bool[n]; //массив, в котором мы будем отмечать строки, которые уже вошли в какую-либо группу for(int i=0;i<n;i++) { marked[i] = false; } cout << endl << " Nomera strok, vse elementi kotorix odinakovi: " << endl; for(int i=0;i<n-1;i++) { if(marked[i]) continue; cout << i+1 << " "; for(int j=i+1;j<n;j++) { if(isEqualStringsOfIntegers(a[i],a[j],m)) { marked[j] = true; cout << j+1 << " "; } } cout << endl; } for(int i=0;i<n;i++) { delete[] a[i]; } delete[] a; getch(); } Ну, как-то так. 1. Адаптировал под Visual Studio (заголовочные файлики смените обратно, если нужно, и clrscr() я оставил закоментированным). 2. Добавил динамическое выделение памяти. А то как-то нехорошо было. 3. Добавил 2 функции: одна для qsort, сравнивает два целых. Вторая сравнивает две строки целых (предполагается, что к моменту вызова они уже отсортированы). Правда, сейчас она выводит даже те строки, у которых "похожих" нет, но это легко поправить. Перед циклом поиска идентичных строк обнуляем флажок, которые будет ответственным за наличие уже найденных повторных строк. Если нашли повторную строку и флажок опущен, то поднимаем флажок и выводим перед номером найденной строки, номер "базовой строки", то есть той, с которой мы всё сравниваем. Как-то так) |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.5.2025, 16:42 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru