Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Определить есть ли в массиве одинаковые строки


Автор: relike 9.12.2013, 19:29
Дан двумерный массив A размера m x n. Определить, есть ли в A одинаковые строки. Кто может помочь?
Вот бред моего производства...
Код

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int i, j, n, m, k; float **A, *c; bool b = true;
    cout<<"Vvedite kol-vo strok : "; cin>>n;
    cout<<"Vvedite kol-vo stolbcov : "; cin>>m;
    c = new float [m];
    A = new float *[n];
    for(i = 0; i<m; i++){
        A[i] = new float [m];
        }
        
    for(i = 0; i < n; i++){
        for(j = 0; j < m; j++){
            cout<<"A["<<i+1<<","<<j+1<<"] = "; cin>>A[i][j];
            }
        }
    for(i = 0; i < n; i++, cout<<"\n"){
        for(j = 0; j < m; j++, cout<<"\t"){
            cout<<A[i][j];
            }
        }
    for(i = 0; i<n; i++){
        for(j = 0; j<m; j++){
            for(k = 0; k < n; k++){
                c[k] = A[i][k];
            }
            if(c[j] == A[i+1][j]) {
            cout<<"\n"<<i<<"stroka ravna "<<i+1<<"stroke";
                }
            else {
                b = false;
                }
        }
    }
    if(!b) cout<<"Odinakovyh strok net.";
    cout<<"\n";
    system("pause");
    return EXIT_SUCCESS;
}



Автор: bsa 9.12.2013, 20:20
А std::string использовать нельзя?

Автор: feodorv 9.12.2013, 20:55
Цитата(bsa @  9.12.2013,  21:20 Найти цитируемый пост)
А std::string использовать нельзя?

В каком смысле?


Цитата(relike @  9.12.2013,  20:29 Найти цитируемый пост)
            for(k = 0; k < n; k++){
                c[k] = A[i][k];
            }

А зачем вообще нужен массив c? И почему у него размер m, тогда как ниже будет цикл от 0 до n???
И почему здесь i изменяется от 0 до m, хотя очевидно, что должно быть до n?
Цитата(relike @  9.12.2013,  20:29 Найти цитируемый пост)
    for(i = 0; i<m; i++){
        A[i] = new float [m];
        }




Цитата(relike @  9.12.2013,  20:29 Найти цитируемый пост)
    for(i = 0; i<n; i++){
        for(j = 0; j<m; j++){

Гм. А зачем одновременные циклы по строкам и столбцам???


Цитата(relike @  9.12.2013,  20:29 Найти цитируемый пост)
            if(c[j] == A[i+1][j])

Почему i+1? То есть сравнивается не какая-нибудь строка, а именно следующая за текущей? А при последней итерации цикла (когда i принимает значение n-1) у Вас очевидный выход за пределы массива A[n][...].


А что Вы делаете с переменной b? Почему изначально считается, что есть одинаковые строки, а потом при первом же неудачном сравнении значение переменной сбрасывается в false? Разве она когда-нибудь потом сможет стать true, хотя 


Итого: должно быть 2 цикла, оба по строкам. Первый соответствует строке, которую будем сравнивать, второй - с которой. Чтобы 10 раз не сравнивать одно и то же, второй цикл как раз будет отсчитываться от i+1:
Код
bool b = false;
for( i = 0; i < n; i++)
  for( k = i+1; k < n; i++)
  {
     for( j = 0; j < m; j++) if( A[i][j] != A[k][j] ) break;
     if( j == m ) 
     {
       cout << "Одинаковые строки номер " << i+1 << " и " << k+1 << endl;
       b = true;
    }
  }


Добавлено через 1 минуту и 27 секунд
Да, в условии не сказано же, что элементы массива должны быть именно float. Рекомендую перейти на int smile 

Автор: relike 9.12.2013, 21:19
feodorv, спасибо. Только у меня программа вылетает на вводе A[4,1]. В чем может быть проблема?

Автор: feodorv 9.12.2013, 23:54
Цитата(relike @  9.12.2013,  22:19 Найти цитируемый пост)
Только у меня программа вылетает на вводе A[4,1]. В чем может быть проблема? 

Не знаю. А какие n и m?

Вот это исправлено:
Цитата(relike @  9.12.2013,  20:29 Найти цитируемый пост)
    for(i = 0; i<m; i++){

???

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)