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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите написать код! 
:(
    Опции темы
hello19
Дата 4.8.2011, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хай! Тут такое дело... В матрице есть несколько нулевых строчек и нулевых столбцов. Надо их "вычеркнуть" из матрицы и вывести полученный результат. Вот например так:
Из такой вот матрицы:   
1 2 0 3
4 5 0 6
0 0 0 0 
7 8 0 9
Получить такую:
1 2 3
4 5 6
7 8 9
Что то не соображу как.. помогите с кодом.
PM MAIL WWW   Вверх
bsa
Дата 4.8.2011, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



а какие собственно проблемы? пишешь двойной цикл (с конца в начало), в нем проверяешь элементы каждой строки(столбца) на близость к нулю (ты же float/double используешь!). Если хоть один элемент не соответствует условию, то переходишь на следующую строку (столбец). Если все соответствуют, то строку(столбец) удаляешь.
PM   Вверх
hello19
Дата 4.8.2011, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну помогите с написанием то кода.. уже давно сижу.. чет не работает(

Добавлено через 13 минут и 36 секунд
Вот мой код:
Код

int main()
{
    int range = 5;

    // Allocate memory to matrix
    double **matrix = new double*[range];
    for (int i = 0; i < range; i++) 
    {
        matrix[i] = new double[range];
    }


    // reading from file
    ifstream ifs("aa.txt");
    double q;
    int i = 0;
    int j = 0;
    while ( ifs >> q )
    {
        matrix[i][j] = q;
        j++;
        if ( j % range == 0 ) { i++; j = 0;}
    }
    ifs.close();


    // delete nessesary colums and rows

    // счетчит количества нулевых строк/столбцов
    int k = 0;
    ofstream inf("inf.txt");
    while ( i < range )
    {
        while ( j < range )
        //for ( int j = 0; j < range; j ++ )
        {
            if ( (matrix[i][j]==0) && (i==j) )
            {
                k++;
                inf << i << " " << matrix[i][j] << endl;
                // Сдвигаем столбец
                for ( int t = i; t < range; t++ )
                {
                    for ( int w = 0; w < range; w++ )
                    {
                        matrix[t][w] = matrix[t][w+1];
                    }
                    if ( t == range-k ){return 0;}

                }
                // Сдвигаем строчку
                for ( int t = j; t < range; t++ )
                {
                    for ( int r = 0; r < range-k; r++)
                    {
                        matrix[t][j] = matrix[t+1][j];
                    }
                    if ( t == range - k ){return 0;}
                }
            }
            j++;
        }
        j = 0;
        i++;
    }
    inf.close();

    // output matrix 
    ofstream ofs("bb.txt");
    for (int i = 0; i < range-k; i ++)
    {
        for (int j = 0; j < range-k; j++)
        {
            ofs << matrix[i][j] << " ";
        } ofs << endl;
    }
}


пока что тестю вот на такой матрице
1 2 0 3 5
4 5 0 6 5
0 0 0 0 0
7 8 0 9 5
5 5 0 5 5
PM MAIL WWW   Вверх
hello19
Дата 4.8.2011, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Косяк в том, что не заходит в ту часть хода, где как раз и удаляю строку и столбец. 
На самом деле ничего не удаляю.. просто переношу.
PM MAIL WWW   Вверх
xvr
Дата 4.8.2011, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Вопрос на засыпку - что по твоему делает return 0; в твоей программе в строках 48 и 58?  smile 

PM MAIL   Вверх
hello19
Дата 4.8.2011, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пордонте... это результат частых исправлений кода... не успел убрать

Добавлено через 1 минуту и 23 секунды
Код

int main()
{
        int range = 5;
 
        // Allocate 2 matrix
        double **matrix = new double*[range]();
        for (int i = 0; i < range; i++) 
        {
                matrix[i] = new double[range]();
        }
 
        // reading from file
        ifstream ifs("aa.txt");
        double q;
        int i = 0;
        int j = 0;
        while ( ifs >> q )
        {
                matrix[i][j] = q;
                j++;
                if ( j % range == 0 ) { i++; j = 0;}
        }
        ifs.close();
        // delete nessesary colums and rows
 
        // счетчик количества нулевых строк/столбцов
        int k = 0;
        ofstream inf("inf.txt");
 
        // Тут я просто хочу удалить из массива нулевую строчку\столбец.
        for ( int i = 0; i < range; i++ )
        {
                if ( matrix[i][i] == 0 )
                {
                        inf << i << endl;
                        k++;
                        delete matrix[i];
                }
        }
        inf.close();
 
        // output matrix 
        ofstream ofs("bb.txt");
        for (int i = 0; i < range-k; i ++)
        {
                for (int j = 0; j < range-k; j++)
                {
                        ofs << matrix[i][j] << " ";
                } ofs << endl;
        }
        for ( int i =0; i < range-k; i++)
        delete[] matrix[i];
        delete[] matrix;
 

Я хочу просто удалять из матрицы необходимую строчку и столбец... По ходу - косяк в коде.
PM MAIL WWW   Вверх
xvr
Дата 4.8.2011, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(hello19 @  4.8.2011,  11:39 Найти цитируемый пост)
        for ( int i = 0; i < range; i++ )
        {
                if ( matrix[i][i] == 0 )

Тут вы пробегаетесь по диагонали матрицы, а вовсе не по строкам/столбцам

Цитата(hello19 @  4.8.2011,  11:39 Найти цитируемый пост)
                       delete matrix[i];

Это тоже строку/столбец не удалит - только освободит память, где она лежала. Но все указатели (и место в массиве под нее) останется, в результате получим слом на попытке прочесть оттуда (если повезет  smile )

Совет - заведите битовые шкалы ненулевых строк/столбцов (до размера матрицы 32х32 будет достаточно 2х int'ов) и разметьте в них все ненулевые элементы. Физически удалять строки/столбцы из матрицы не надо, достаточно при выводе результата пропустить (не выводить) нулевые строки/столбцы

PM MAIL   Вверх
hello19
Дата 4.8.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вообщем, если я встречаю нулевой элемент на диагонали, то удаляю строчку и столбец его содержащие... Вот за этим то и нужны эти строчки

Добавлено через 7 минут и 57 секунд
Вообщем, если я встречаю нулевой элемент на диагонали, то удаляю строчку и столбец его содержащие... Вот за этим то и нужны эти строчки
 
PM MAIL WWW   Вверх
hello19
Дата 4.8.2011, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Кстати, знаю, что не удалит. Но при выводе матрицы можно вот так писать:
Код

        for (int i = 0; i < range-k; i ++)
        {
                if ( matrix[i][i]!=NULL)
                {
                        for (int j = 0; j < range-k; j++)
                        {
                                ofs << matrix[i][j] << " ";
                        } ofs << endl;
                }
        }

Т.е. мы просто не выводим пустые строчки....
Вроде неплохая идея(это намного производительней, чем сдвигать строчки\столбцы), а вот реализация хромает.. падает прога
PM MAIL WWW   Вверх
borisbn
Дата 4.8.2011, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

#include <vector>
#include <iostream>

const int range = 5;

int main(int argc, char *argv[])
{
    std::vector< std::vector< double > > matrix( range, std::vector< double >( range ) );
    matrix[0][0]=1; matrix[0][1]=2; matrix[0][2]=0; matrix[0][3]=3; matrix[0][4]=5;
    matrix[1][0]=4; matrix[1][1]=5; matrix[1][2]=0; matrix[1][3]=6; matrix[1][4]=5;
    matrix[2][0]=0; matrix[2][1]=0; matrix[2][2]=0; matrix[2][3]=0; matrix[2][4]=0;
    matrix[3][0]=7; matrix[3][1]=8; matrix[3][2]=0; matrix[3][3]=9; matrix[3][4]=5;
    matrix[4][0]=5; matrix[4][1]=5; matrix[4][2]=0; matrix[4][3]=5; matrix[4][4]=5;

    for ( int i = 0; i < range; i++ ) {
        for ( int j = 0; j < range; j++ )
            std::cout << matrix[ i ][ j ] << "  ";
        std::cout << std::endl;
    }

    // сначала по строкам
    for ( int i = 0; i < matrix.size(); ) {
        bool allZeros = true;
        for ( int j = 0; j < range; j++ ) {
            if ( matrix[ i ][ j ] != 0 ) { // лучше переделать на fabs( matrix[ i ][ j ] ) > epsilon
                allZeros = false;
                break;
            }
        }
        if ( allZeros ) {
            matrix.erase( matrix.begin() + i );
        }
        else
            i++;
    }
    
    if ( matrix.empty() )
    {
        std::cout << "The whole matrix is zero" << std::endl;
        return 1;
    }

    // теперь по столбцам
    for ( int j = 0; j < matrix[ 0 ].size(); ) {
        bool allZeros = true;
        for ( int i = 0; i < matrix.size(); i++ ) {
            if ( matrix[ i ][ j ] != 0 ) { // лучше переделать на fabs( matrix[ i ][ j ] ) > epsilon
                allZeros = false;
                break;
            }
        }
        if ( allZeros ) {
            for ( int i = 0; i < matrix.size(); i++ ) {
                matrix[ i ].erase( matrix[ i ].begin() + j );
            }
        }
        else
            j++;
    }

    std::cout << "--------------------" << std::endl;

    for ( int i = 0; i < matrix.size(); i++ ) {
        for ( int j = 0; j < matrix[ i ].size(); j++ )
            std::cout << matrix[ i ][ j ] << "  ";
        std::cout << std::endl;
    }
}

http://liveworkspace.org/code/c1ab7b319267...0d4b78dce411ead


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


Новичок



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

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



Отличный код!
Вот только сейчас переделывать буду. Просто мне надо работать с матрицей порядка 4000. По этому вектор не годиться... Сгодиться динамический массив. А так все супер!
А как удалить строчку из двумерного динамического массива грамотно?

Это сообщение отредактировал(а) hello19 - 4.8.2011, 13:20
PM MAIL WWW   Вверх
bsa
Дата 4.8.2011, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(hello19 @  4.8.2011,  13:16 Найти цитируемый пост)
По этому вектор не годиться...

почему?!?  smile 
От обычного динамического массива в релизной сборке он не отличается (разве что вместо одного указателя на массив хранятся три)!
PM   Вверх
hello19
Дата 4.8.2011, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Стека не хватит, чтобы считаться матрицу даблов порядка 4000... это же 4000*4000 даблов...
PM MAIL WWW   Вверх
borisbn
Дата 4.8.2011, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(hello19 @  4.8.2011,  13:27 Найти цитируемый пост)
Стека не хватит

читай внимательно !
Цитата(bsa @  4.8.2011,  13:25 Найти цитируемый пост)
От обычного динамического массива в релизной сборке он не отличается

вектор (вернее его содержимое) создаётся не на стеке, а в динамической памяти - куче.


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


found myself
****


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

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



При работе с вектором векторов в студии я как-то наблюдал очень много лишних копирований. Так что тут спорно. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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