Форум программистов, компьютерный форум CyberForum.ru

Стопариться программа - C++

Войти
Регистрация
Восстановить пароль
 
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
19.07.2011, 11:23     Стопариться программа #1
Задача - решить систему линейных уравнений. Мне дана матрица коэффициентов.
Дана она мне в необычном виде.
Исходная СЛУ
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 например, хотя надо и больше)
Не знаю что и делать. Программа прилагается.
Вложения
Тип файла: rar 3.rar (5.25 Мб, 10 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.07.2011, 11:49     Стопариться программа #2
(34;22995,59)
вообще-то числа дожны быть через точку, а не запятую

Добавлено через 14 минут
вот этот кусок не имеет смысла
C++
1
2
3
4
5
6
7
for ( int i = 0; i < range; i++)
    {
            for ( int j = 0; j < range; j++)
            {
                matrix[i][j] = 0;           
            }
    }
достаточно объявить массив вот так
C++
1
double matrix[range][range] = { 0 };
считывать посимвольно из одного файла, убирать скобочки, записывать потом опять считывать тожене айс
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
19.07.2011, 11:51  [ТС]     Стопариться программа #3
Не имеет? Как раз наоборот. Это пока что матриц, полностью состоящая из нулей. Но, в последствии, она заполниться коэффициентами системы.
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.07.2011, 11:52     Стопариться программа #4
при таком объявленни массива
C++
1
double matrix[range][range] = { 0 };
он уже заполнен нулями
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
19.07.2011, 11:54  [ТС]     Стопариться программа #5
Исправил предыдущую ошибку - заменил запятые на точки. Вот только теперь программа округляет
Вместо 22995,56 пишет 22995,6. Как заставить её забыть про округление?

И Вы сказали, что запись.считывание из файла "не айсово". А как по другому? Да и потом, даже если это и исправлю, то, мне кажется, программа будет по прежнему стопариться.
Вообще складывается такое ощущение, что просто очень большой массив чисел. Но ведь так не должно быть... Это ведь зависит лишь от ресурса памяти.
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.07.2011, 12:09     Стопариться программа #6
а свободные члены СЛАУ откуда считываються?
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
19.07.2011, 12:15  [ТС]     Стопариться программа #7
Пока что неоткуда. Просто эта часть программы делает из данной матрицы коэффициентов нормальную ( квадратного вида). Пока что не писал код для решения системы.
Вылезает непонятная ошибка, которая прекращает работу программы. Не знаете, что с ней делать?
Вылезает окно, предлагающее "debug" или "close programm". Не пойму что делать. На маленьких системах все работает. А поставишь порядок - 400, так все перестает работать
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.07.2011, 12:41     Стопариться программа #8
как-то так, с 1.txt работает нормально
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <algorithm>
#include <fstream>
#include <sstream>
#include <vector>
 
int main()
{
    // Удаление ненужных разделителей  "(", ")", ";"
    // Добавление последним элементом строки - "0"
    std::vector<std::string> vec;
    std::string tmp;
    std::ifstream fin1 ("1.txt");
    while (!fin1.eof())
    {
        std::getline(fin1, tmp, '\n');
        std::replace(tmp.begin(), tmp.end(), '(', ' ');
        std::replace(tmp.begin(), tmp.end(), ')', ' ');
        std::replace(tmp.begin(), tmp.end(), ';', ' ');
        vec.push_back(tmp);
    }
    fin1.close(); 
    
    // Построение нулевой матрицы
    const int range = 100;
    double matrix[range][range] = { 0 };
        
    for(int i = 0, size = vec.size(); i < size; ++i)
    {
        int tmp_index;
        std::stringstream ss(vec[i]);
        while(ss >> tmp_index)
        {
            double val;
            ss >> val;
            matrix[i][tmp_index] = val;
        }
    }
    std::ofstream ofs("2.txt");
    for (int i = 0; i < range; ++i)
    {
    for (int j = 0; j < range; ++j)
    {
        ofs << matrix[i][j] << " ";
               if (j == range - 1) 
                ofs << std::endl; 
    }
    }
}
Добавлено через 7 минут
с 4.txt и матрицой на 4000 элементов уже идет переполнение стека, для таких систем, тем более разреженых нужно использовать адаптивные методы, а вместо матрицы использовать связный список, чтоб не хранить ноли, но я пока еще на практике таких задач не решал
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
19.07.2011, 12:45  [ТС]     Стопариться программа #9
Просто передо мной стоит задача - решить систему, порядок матрицы которой - около 100 000
А пока что мне дали одну из самых маленьких матриц - порядок лишь 3500.
Спасибо за помощь!
Yandex
Объявления
19.07.2011, 12:45     Стопариться программа
Ответ Создать тему
Опции темы

Текущее время: 20:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru