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

Поиск:

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


Новичок



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

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



Задача - решить систему линейных уравнений. Мне дана матрица коэффициентов.
Дана она мне в необычном виде. 
Исходная СЛУ
4x1 + 2x2 + 9x3 = 1
x2 + 6x3 = 7
4x1 + 2x3 = 0
коэффициенты исходной СЛУ
(1;4)(2;2)(3;9)
(2;1)(3;6)
(1;4)(3;2)
Каждая строка файла содержит информацию о ненулевых коэффициентах одного уравнения СЛУ.
Количество строк в файле соответствует количеству уравнений СЛУ.
Порядковый номер строки в файле соответствует номеру уравнения i.

Каждая строка файла состоит из групп чисел (j ; k(i;j))
•    Первое число в группе – это значение номера j коэффициента k(i;j) при неизвестном x(j) в уравнении i
•    Второе число в группе – это значение коэффициента k(i;j)

Количество таких групп в строке файла (т.е. количество ненулевых коэффициентов в уравнении) может быть любое – от 1 до n, где n – количество неизвестных в СЛУ. 

Но это все го лишь пример. У меня же матрица 3638 порядка. Написал рабочий код(тестил его на матрицах 3 и 4 порядков). Запускаю его на выполнение (для матрицы 3638 порядка) - стопариться программа. Стопарится она, даже если порядок систему 300. Как исправить, чтобы программа полностью решала задачу(для порядка 3638 например, хотя надо и больше) 
Не знаю что и делать. Программа прилагается.



Это сообщение отредактировал(а) hello19 - 19.7.2011, 14:38

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Programma.rar 25,84 Kb
PM MAIL WWW   Вверх
borisbn
Дата 19.7.2011, 14:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



hello19, что там у тебя на 5.25 МБ ???
Оставь только исходники (exe и obj не нужно) и залей архив прямо сюда на форум, а не на внешнее хранилище.


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


Эксперт
****


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

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



Приступим...
1. У тебя файл "Система.txt" сделан в UTF-8 (первые 3 байта EF BB BF), а читаешь ты его просто как ANSI
2. Когда я сделал из этого файла обычный ANSI, то программа стала падать на этой строке
Код

matrix[string][column] = stringMatrix[iter+1];

при этом column равен 5 (т.е. шестой элемент), а память ты выделяешь для 5-ти элементов
Цитата

    int const range = 5;
    double **matrix = new double*[range];
    for (int i = 0; i < range; i++) 
    {
        matrix[i] = new double[range];
    }


Хватит для начала. Вообще-то сильно не вникал в программу, но мне кажется, что ты что-то перемудрил.
Щаз немного времени нет... Попозже гляну. Ок ?


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


Эксперт
****


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

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



если поставить 
Код

int const range = 3638;

то программа отрабатывает до конца. да, действительно долго, ведь массив получается 3х3 тыс = 9 миллионов записей. Выходной файл 3.txt получается 185 МБ, и там явно какая-то фигня.
вот первая же строка
Цитата

1 -6.27744e+066 -6.27744e+066 ...

дальше до конца одни -6.27744e+066

скорее всего это происходит потому, что ты не обнуляешь массив matrix. после выделения памяти (new) в нём (вернее в ней - в памяти) лежит мусор.
Сделай обнуление
Код

    double **matrix = new double*[range];
    for (int i = 0; i < range; i++) 
    {
        matrix[i] = new double[range];
        memset( matrix[i], 0, range * sizeof( matrix[0][0] ) );
    }

А лучше пользуйся векторами
Код

std::vector< std::vector< double > > matrix( range, std::vector< double >( range, 0 ) );


P.S. Вот этот цикл
Цитата

    // Вывод матрицы коэффициентов
    for ( int p = 0; p < range; p++)
    {
        for ( int o = 0; o < range; o++)
        {
            ofs3 << matrix[p][o] << " ";
            if ( o == range-1 ) { ofs3 << endl; }
        }
    }

можно сделать попроще
Код

    // Вывод матрицы коэффициентов
    for ( int p = 0; p < range; p++)
    {
        for ( int o = 0; o < range; o++)
        {
            ofs3 << matrix[p][o] << " ";
        }
        ofs3 << endl;
    }



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

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

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

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

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


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

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


 




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


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

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