Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 5.00
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
#1

Нужно ускорить код - C++

16.09.2011, 19:08. Просмотров 1200. Ответов 20
Метки нет (Все метки)

Мне нужно написать программу, для преобразования коэффициентов системы и столбца свободных членов к виду, необходимому для импорта в матпакет.


Приведу наглядный пример на системе из 2-х уравнений:
х_1 + 345,45х_2 = 6,3
х_2 = 4
Матрица коэффициентов в этом случае выглядит вот так:
(1;1)(2;345,45)
(2;1)
Столбец свободных членов выглядит вот так:
6,3
4

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

Мне же надо разбить эту матрицы на 2 текстовых файла - в одном - координаты неотрицательных элементов, в другом - значения коэффициентов перед соответствующими переменными. Попутно нужно заменять запятые - точками. А в 3-ий просто переписать столбец свободных членов, но уже заменив все запятые на точки

Вот что должно получиться к приведенному выше примеру:
а-1 - координаты коэффициента
1 1
1 2
2 1

а-2 - значения соответствующих коэффициентов:
1
345.45
1

Столбец свободных членов:
6.3
4

Вот сам код:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <iterator>
#include <iomanip>
 
using namespace std;
 
int main()
{
    //-------------------------------------------------------------
    // Приведение столбца свободных членов к виду, необходимому для
    // импорта в SCILab
    // b.txt - исходный столбец
    // bb.txt - искомый столбец
    //-------------------------------------------------------------
    ifstream ifsb ("b.txt");
    ofstream ofsb ("bb.txt");
    char q;
    while( !ifsb.eof() )
    {
        q = ifsb.get();
        if ( ifsb.eof() ) break;
        if ( q == ',' ) { ofsb << "."; }
        else { ofsb << q; }
    }
    ifsb.close();
    ofsb.close();
    //------------------------------------------------------------
    // Приведение матрицу коэффициентов к виду, необходимому для 
    // импорта в матпакет.
    // a.txt - исходная матрица коэффициентов
    // a-1.txt - содержит координаты ненулевых членов
    // а-2.txt - соджержит соотвествующие коэффициенты
    //------------------------------------------------------------
    
    ifstream ifsa ("a.txt");
    ofstream ofsa_1 ("a-1.txt");
    ofstream ofsa_2 ("a-2.txt");
 
    char w;
    int stroka = 1;
    int k = 0;
    ofstream* ptr = &ofsa_1;
    std::string t = "1234567890";
    while ( !ifsa.eof() )
    {
        w = ifsa.get();
        if ( ifsa.eof() ) break;
        if ( w == '(' ) { ptr = &ofsa_1; *ptr << stroka << " "; continue; }
        if ( w == ')' ) { ofsa_2 << endl; }
        if ( w == ',' ) { ofsa_2 << "."; } 
        if ( w == '\n' ) { stroka++; }
        if ( w == ';' ) { *ptr << endl; ptr = &ofsa_2; }
        if ( t.find(w) != t.npos ) 
        { 
            *ptr << w; 
        }
    }
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2011, 19:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужно ускорить код (C++):

Гипотеза Коллатца(ускорить код) - C++
Существует вот такая вот гипотеза Коллатца(https://ru.wikipedia.org/wiki/Гипотеза_Коллатца), которую я отобразил в следующей функции: int...

Деление больших чисел (нужно ускорить) - C++
Ребятки, помогите ускорить. Уж очень медленно. Класс совсем простой(вектор со знаком): static const unsigned long long BASE =...

Код написан в Dev C. Не работает в Visual. Как нужно переделать код? - C++
Здравствуйте. Столкнулась с такой проблемой: код был написан в Dev C, но в Visual он выдаёт ошибку. ...

Нужно засунуть код инструкции в 4 char'a так, чтобы в памяти это был код инструкции. - C++
Доброго времени суток. Есть дизассемблированный код. Нужно засунуть код иструкции в 4 чара так, чтобы в памяти это был код инструкции. Как...

Нужно подправить код - C++
Здравствуйте. Нужно, что бы после завершения программы, оно не выходило, а что бы появилась надпись: Хотите сыграть еще? И если нажать на...

Нужно поправить код - C++
Вобщем есть файл txt с парами областей вот пример кусочек Volynska Rivnenska Volynska Lvivska Lvivska Volynska Lvivska...

20
Evg
Эксперт CАвтор FAQ
18377 / 6424 / 441
Регистрация: 30.03.2009
Сообщений: 17,822
Записей в блоге: 28
16.09.2011, 19:25 #2
А что тут ускорять? И главное, зачем?
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 19:33  [ТС] #3
Может есть способы оптимизировать работу кода? Мне нужно максимально быстрое время работы программы..
0
-=ЮрА=-
Заблокирован
Автор FAQ
16.09.2011, 20:28 #4
Цитата Сообщение от hello19 Посмотреть сообщение
Может есть способы оптимизировать работу кода? Мне нужно максимально быстрое время работы программы..
- неужели всё с той СЛАУ бьёшся???
1
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 20:30  [ТС] #5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- неужели всё с той СЛАУ бьёшся???
ну не над той)
0
-=ЮрА=-
Заблокирован
Автор FAQ
16.09.2011, 20:33 #6
Цитата Сообщение от hello19 Посмотреть сообщение
ну не над той)
- а можешь своими словами суть проблеммы рассказать???
Может этого Гаусса в разработку возьмёшь???
Методом Гаусса решить систему n линейных алгебраических уравнений
1
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 20:37  [ТС] #7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- а можешь своими словами суть проблеммы рассказать???
Может этого Гаусса в разработку возьмёшь???
Методом Гаусса решить систему n линейных алгебраических уравнений
В принципе можно поробовать)
Ну а теперь непосредственно про проблему: я нашел отличный матпакет, который помогает решить систему уравнений довольно быстро... НО! для этого ему нужно, чтобы исходные данные имели определенный вид. Собственно для этого то я и написал прогу, приведенную в топике. Вот только нужно, чтобы скорость ее работы была как можно быстрее...

Думаю, алгоритм, который я реализовал - не самый быстрый. Я просто прохожу по каждому элементу, а это накладно виду огромного количества коэффициентов. Да и не уверен я, что реализация алгоритма самая шустрая... Так что вот.
0
-=ЮрА=-
Заблокирован
Автор FAQ
16.09.2011, 20:44 #8
Цитата Сообщение от hello19 Посмотреть сообщение
для этого ему нужно, чтобы исходные данные имели определенный вид.
Какой??Как те коэффициенты матрицы А в СЛАУ, давай я сейчас тоже подумаю, просто твой алгоритм уже рабочий, думаю врядли его ускоришь, нужен концептуально другой подход
1
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 20:45  [ТС] #9
Рабочий это да.. вот только может реализация алгоритма не самая шустрая...
Новый подход? мб мб.. хотя хз хз)
0
-=ЮрА=-
Заблокирован
Автор FAQ
16.09.2011, 20:54 #10
Цитата Сообщение от hello19 Посмотреть сообщение
х_1 + 345,45х_2 = 6,3
- мне не понятна запись, ошибки нет???

Добавлено через 1 минуту

Цитата Сообщение от hello19 Посмотреть сообщение
х_1 + 345,45х_2 = 6,3
- ааа всё допёр
1*х1 + 345,45*х2 = 6,3, ок сейчас поколдую
2
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 20:57  [ТС] #11
а что не так? Что не понятно?

Добавлено через 2 минуты
Кстати - тут немного времени потратил на то, чтобы узнать, как быстрее выводить в файл - с помощью printf или ofstream. Вообщем к конечному выводу так и не пришел... говорят, что printf по шустрее.. хз... насколько я понял, методы ofsteram реализованы через prinf... может это что нить значит?
0
-=ЮрА=-
Заблокирован
Автор FAQ
16.09.2011, 20:58 #12
hello19, жди я в работе
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 20:59  [ТС] #13
спасибо, конечно.. но мне тоже хочется попрогать)))))
0
-=ЮрА=-
Заблокирован
Автор FAQ
16.09.2011, 21:29 #14
hello19, пробуй(как по мне так на лету всё делается, привожу исходную А и полученные а-1(2))
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <windows.h>
#include <stdio.h>
 
void UpdateString(FILE *f1, FILE *f2, char * s, long lRow);
 
int main()
{
    char * str, *buf;
    long sLen,lRow = 1;
    FILE * f = fopen("A.txt","rb+");
    FILE * f1, *f2;
    if(!f)
        printf("Error open A.txt\r\n");
    else
    {
        //Получаю длину файла
        fseek(f,0,SEEK_END);
        sLen = ftell(f);
        fseek(f,0,SEEK_SET);
        if(!(str = (char *)malloc((sLen + 1)*sizeof(char))))
            printf("Allocation memory error\r\n");
        else
        {
            fread(str,sLen,1,f);
            str[sLen] = '\0';
        }
        fclose(f);
        if(str)
        {
            f1 = fopen("a-1.txt","wb+");
            f2 = fopen("a-2.txt","wb+");
            if(!f1 || !f2)
                printf("Error open a-1(2).txt\r\n");
            else
            {
                buf = strrchr(str,'\n');//Разбиваю str на строки
                sLen = 1;//Тут уже юзаю sLen как счётчик строк
                while(buf)
                {
                    UpdateString(f1, f2, buf, lRow);
                    str[sLen - strlen(buf)] = '\0';
                    sLen = strlen(str);
                    buf = strrchr(str,'\n');
                    lRow++;
                }
                if(str)
                    UpdateString(f1, f2, buf, lRow);
                fclose(f1);
                fclose(f2);
                printf("Transforming complete\r\n");
            }
        }
    }
    return 0;
}
 
void UpdateString(FILE *f1, FILE *f2, char * s, long lRow)
{
    long sLen,lCol = 1;
    char * str, *buf;
    char delim[] = " ;";
    double val;
    if(s)
    {
        sLen = strlen(s);
        str = (char *)malloc((sLen + 1)*sizeof(char));
        sprintf(str,"%s",s);
        str[sLen] = '\0';
 
        buf = strtok(str,delim);
        while(buf)
        {
            if((val = atof(buf)) != 0)
            {
                fprintf(f1,"%u %u\r\n",lRow,lCol);
                fprintf(f2,"%lf\r\n",val);
            }
            lCol++;
            buf = strtok(NULL,delim);
        }
    }
}
1
Вложения
Тип файла: txt A.txt (62 байт, 7 просмотров)
Тип файла: txt a-1.txt (105 байт, 7 просмотров)
Тип файла: txt a-2.txt (215 байт, 6 просмотров)
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
22.09.2011, 16:03  [ТС] #15
ну как оно???
0
22.09.2011, 16:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2011, 16:03
Привет! Вот еще темы с ответами:

Нужно исправить код - C++
Нужно исправить код. Ошибку выдаёт. #include&lt;iostream&gt; #include&lt;cmath&gt; using namespace std; int main() { double x,y,b; ...

Нужно исправить код - C++
Здравствуйте. Я занимаюсь по книге и в задании привели не сосем правильный код. Привожу; #include &lt;iostream&gt; using namespace...

Нужно улучшить код - C++
Нужно улучшить код. 1)Отсортировать таблицу(если ввести Hello World,то буква &quot;l&quot; должна быть на 1 месте так как она встречается 3...

Нужно дописать код на С++ - C++
Мне дана лабораторная работа, где нужно написать программу слияние трех массивов. Например даны массивы A,B,I нужно написать программу их...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.