Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удалить нулевые строки/столбцы в матрице 
:(
    Опции темы
TermosS
Дата 15.1.2013, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.1.2013

Репутация: нет
Всего: нет



Удалить нулевые строки/столбцы в матрице заданной с разной длиной строк.
По условию задачи реализовал удаление, но программа в выводе ответа показывает набор символов, вместо введённых значений и удаляет неправильно строки со столбцами. Подскажите, где нужно исправить код?
Код


#include <iostream>
#include <conio.h>
#include <math.h>

using namespace std;
 
int **mas, n, m, temp, i,j, y, t;
int main ()
{

        int  *a;
                cout<<"Vvedite kol-vo strok: ";
                cin>>n;
                                printf("\n"); 
                mas=new int*[n];
                a=new int[n];
                for(i=0; i<n; i++)
                {
                        cout<<"Dlina "<<i+1<<" stroki =";
                    cin>>temp;
                        mas[i]=new int[temp];
                        a[i]=temp;
                }
 
                printf("\n"); 
   
    cout << "Vvedite matricu:\n";
    for ( i=0; i<n; i++) {
        for ( j=0; j<a[i]; j++) {
            cin>>mas[i][j];
                        }}
        for(i=0; i<n; i++)
        {
                t=0;
                for(j=0; j<a[i]; j++)
                        if(mas[i][j]!=0)
                                t=1;
                if(t==0)
                {
                        for(y=i; y<n-1; y++)
                                for(j=0; j<a[i]; j++)
                                        mas[y][j]=mas[y+1][j];
                        n--;
i=0;
                }
        }
        for(i=0; i<n; i++)
        {
                t=0;
                for(j=0; j<a[i]; j++)
                        if(mas[j][i]!=0)
                                t=1;
                if(t==0)
                {
                        for(y=i; y<a[i]-1; y++)
                                for(j=0; j<a[i]; j++)
                                        mas[j][y]=mas[j][y+1];
                        m--;
i=0;
                }
        }
        cout<<endl;
        cout<<"polychennyi massiv"<<endl;
        for(i=0; i<n; i++)
        {
       for(j=0; j<a[i]; j++)
          cout<<mas[i][j]<<"  ";
                cout<<endl;
        }
        cout<<endl;
        getch();
         return 0;
}

PM MAIL   Вверх
borisbn
Дата 15.1.2013, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(TermosS @  15.1.2013,  15:35 Найти цитируемый пост)
 for(i=0; i<n; i++)
        {
                t=0;
                for(j=0; j<a[i]; j++)
                        if(mas[j][i]!=0)
                                t=1;

так нельзя. переставив местами индексы ты не меняешь строки со столбцами...

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

Добавлено @ 16:43
И ещё. Дай переменным нормальные имена. Например для a - rowLengths, для t - areAllZero, для n - rowCount Понятней же будет

Это сообщение отредактировал(а) borisbn - 15.1.2013, 16:43


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
TermosS
Дата 15.1.2013, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.1.2013

Репутация: нет
Всего: нет



Ага:) Данный код нельзя преобразовать в рабочий?
Вы правильно заметили, что алгоритм удаления строк разной длины нужен, но я не знаю как его реализовать, вот программа и работает неправильно.

Например, при вводе строк с разной длиной нули удаляет неправильно, или вместо введённых значений показывает ересь.
Не имеет смысла переименовывать переменные - преподаватель требует простые латинские буквы)

PM MAIL   Вверх
borisbn
Дата 15.1.2013, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



можно попробовать такой вариант: вычислить макс. длину строки. идти по столбцам до этой длины и смотреть, что если очередная строка уже "закончилась", то пропускать её. Если нет - то смотреть 0 ли там.
Цитата(borisbn @  15.1.2013,  16:37 Найти цитируемый пост)
со строками у тебя, вроде, правильно

это я погорячился. у тебя и со строками неправильно.
в общем, лови (ввод и вывод матрицы я убрал
Код

for(i=0; i<n; i++)
        {
                t=0;
                for(j=0; j<a[i]; j++)
                        if(mas[i][j]!=0)
                                t=1;
                if(t==0)
                {
                        for(y=i; y<n-1; y++) 
                        {
                                // !!!
                                delete []mas[ y ];
                                mas[ y ] = new int[ a[y+1] ];

                                for(j=0; j<a[ y + 1] /* !!! */; j++)
                                {
                                        mas[y][j]=mas[y+1][j];
                                        a[y] = a[y+1]; // !!!
                                }
                        }
                        n--;
                        i=0;
                }
        }
        
        int maxLen = 0;
        for(i=0; i<n; i++) {
           if ( a[ i ] > maxLen ) {
              maxLen = a[ i ];
           }
        }
        for(j=0; j<maxLen; j++)
        {
                t=0;
                for(i=0; i<n; i++)
                {
                     if ( j >= a[ i ] ) {
                        continue;
                     }
                     if(mas[i][j]!=0) {
                        t=1;
                        break;
                     }
                }
                if(t==0)
                {
                        for(i=0; i<n; i++)
                        {
                             if ( j >= a[ i ] ) {
                                continue;
                             }
                            for ( y = j; y < a[ i ] - 1; y++ )
                            {
                                mas[j][y]=mas[j][y+1];
                            }
                            a[ i ]--; // !!!
                        }
                }
        }

http://liveworkspace.org/code/29peMt$9

обрати внимание на места, помеченные !!!


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
TermosS
Дата 15.1.2013, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.1.2013

Репутация: нет
Всего: нет



Я правильно понимаю, что помеченные места - это мы повышаем на единицу строку и столбец и работаем уже с ней,  последующей?
PM MAIL   Вверх
borisbn
Дата 15.1.2013, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



не совсем. что значит
Цитата(TermosS @  15.1.2013,  18:07 Найти цитируемый пост)
работаем уже с ней

здесь:
Цитата(borisbn @  15.1.2013,  18:05 Найти цитируемый пост)
 for(j=0; j<a[ y + 1] /* !!! */; j++)

берётся длина следующей строки, чтобы скопировать её всю в текущую (которую удаляем).
а здесь:
Цитата(borisbn @  15.1.2013,  18:05 Найти цитируемый пост)
   mas[y][j]=mas[y+1][j];

"работается" с обеими строками

а здесь
Цитата(borisbn @  15.1.2013,  18:05 Найти цитируемый пост)
a[ i ]--; // !!!

после сдвига всех столбцов влево на один количество столбцов в данной строке уменьшаем

Добавлено через 1 минуту и 34 секунды
кстати, не помешало бы удалять (delete) выделенную память (как для каждой строки, так и для массива указателей)


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
TermosS
Дата 15.1.2013, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.1.2013

Репутация: нет
Всего: нет



Да, теперь понятно. Спасибо!

Добавлено через 7 минут и 25 секунд
Начал проверять код и выскочила ошибка. При вводе матрицы с длинами строк 4,3,1,2 по порядку и вводом данных (0005),(300),(4),(00) соответственно, полученный  массив не тот,который нужно. В нём ячейка, где не было элементов матрицы, заполнена большим числом.
PM MAIL   Вверх
borisbn
Дата 17.1.2013, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Ага. Ошибочка.
Цитата(borisbn @  15.1.2013,  18:05 Найти цитируемый пост)
        for(j=0; j<maxLen; j++)
        {
                t=0;
                for(i=0; i<n; i++)
                {
                     if ( j >= a[ i ] ) {
                        continue;
                     }
                     if(mas[i][j]!=0) {
                        t=1;
                        break;
                     }
                }
                if(t==0)
                {
                        for(i=0; i<n; i++)
                        {
                             if ( j >= a[ i ] ) {
                                continue;
                             }
                            for ( y = j; y < a[ i ] - 1; y++ )
                            {
                                mas[j][y]=mas[j][y+1];  // <------- д.б. не j, а i
                            }
                            a[ i ]--; // !!!
                        }
                }
        }

но и это ещё не всё. если удалить какую-нибудь колонку, то все сдвинутся влево, и на следующем шаге цикла мы сдвинем j на следующий столбец, пропустив текущий
Цитата(borisbn @  15.1.2013,  18:05 Найти цитируемый пост)
 for(j=0; j<maxLen; j++)

Чтобы этого не происходило, нужно проходить столбцы справа налево
Код

        int maxLen = 0;
        for(i=0; i<n; i++) {
           if ( a[ i ] > maxLen ) {
              maxLen = a[ i ];
           }
        }
        for( j = maxLen - 1; j > 0 ; j-- )
        {
                t=0;
                for(i=0; i<n; i++)
                {
                     if ( j >= a[ i ] ) {
                        continue;
                     }
                     if(mas[i][j]!=0) {
                        t=1;
                        break;
                     }
                }
                if(t==0)
                {
                        for(i=0; i<n; i++)
                        {
                             if ( j >= a[ i ] ) {
                                continue;
                             }
                            for ( y = j; y < a[ i ] - 1; y++ )
                            {
                                mas[i][y]=mas[i][y+1];
                            }
                            a[ i ]--;
                        }
                }
        }


http://liveworkspace.org/code/29peMt$24


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
TermosS
Дата 17.1.2013, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.1.2013

Репутация: нет
Всего: нет



Сделано,спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1291 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.