Автор: GelarX 25.6.2011, 9:06
Условие звучит так:
Задана матрица целых чисел. Найти номера строк, элементы в каждой из которых одинаковы. Использовать функции.
..
Вроде бы и не сложная задача.. но вот уже часа полтора ее "кручу" и ничего не выходит..
С кодом блока проверки извращался по разному - даже встраивал туда новый создаваемый массив..и даже двумерный))
Вообще мысль была такая - берется 1 число из первой строчки. Подсчитывается количество таких же чисел в этой же строке. После ищется такое же количество символов в следующей строке, проверяется на сходность. Если нет - то ищется такое же количество символов в следующей строке.. и так до последней строки.. после чего результаты записываются.. выглядеть это должно было так: если скажем в первой строке 2 числа 3, в 3, и скажем в 9 - то это запоминается путем присваивания новой переменной. После чего берется следующий символ в 1-й строке(если такой есть).. ну и так далее..
В конце выводятся все результаты проверки..ну а в блоке вывода поставить фильтр.. У меня у меня уже мозг за разум выходит
И вообще мне кажется, что программа должна реализовываться несколько проще..
Короче - компилятор все пишет всякую ересь.. Может у кого получится - заранее благодарен ))
Код
#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 25.6.2011, 12:01
Появилась мысль вставки в блок проверки цикла сортировки элементов..скажем по возрастанию.. а потом можно символьно сравнить строки через strcmp ! И как я раньше то не дошел !?
попытаюсь реализовать..))
Автор: граф Монте-Кристо 25.6.2011, 12:12
На мой взгляд, нужно для каждой строки создать упорядоченный массив без повторений. Потом сравнить все массивы друг с другом.
Автор: Vahappaday 25.6.2011, 19:17
Хм... .
а строчки
1 4 6
и
6 4 1 - одинаковые?
Автор: граф Монте-Кристо 25.6.2011, 21:01
Смотря что понимать под словом "одинаковые". Состоят из одних и тех же чисел - тогда да. Но они не равны в том смысле, под которым понимается равенство строк.
Автор: Vahappaday 27.6.2011, 14:00
Код
#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, сравнивает два целых. Вторая сравнивает две строки целых (предполагается, что к моменту вызова они уже отсортированы).
Правда, сейчас она выводит даже те строки, у которых "похожих" нет, но это легко поправить. Перед циклом поиска идентичных строк обнуляем флажок, которые будет ответственным за наличие уже найденных повторных строк. Если нашли повторную строку и флажок опущен, то поднимаем флажок и выводим перед номером найденной строки, номер "базовой строки", то есть той, с которой мы всё сравниваем. Как-то так)