Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313

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

16.09.2011, 19:08. Показов 2307. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.09.2011, 19:08
Ответы с готовыми решениями:

Нужно ускорить код. Буду очень благодарен
Условие задачи: Вводиться число n, затем вводятся n чисел. Нужно с последней введенной цифры до первой вывести число, и сколько раз оно...

Как ускорить код?
Есть код : #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;memory.h&gt; #include &lt;iostream&gt; using namespace std; const int N =...

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

20
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
16.09.2011, 19:25
А что тут ускорять? И главное, зачем?
0
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 19:33  [ТС]
Может есть способы оптимизировать работу кода? Мне нужно максимально быстрое время работы программы..
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
16.09.2011, 20:28
Цитата Сообщение от hello19 Посмотреть сообщение
Может есть способы оптимизировать работу кода? Мне нужно максимально быстрое время работы программы..
- неужели всё с той СЛАУ бьёшся???
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 20:30  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- неужели всё с той СЛАУ бьёшся???
ну не над той)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
16.09.2011, 20:33
Цитата Сообщение от hello19 Посмотреть сообщение
ну не над той)
- а можешь своими словами суть проблеммы рассказать???
Может этого Гаусса в разработку возьмёшь???
Методом Гаусса решить систему n линейных алгебраических уравнений
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 20:37  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- а можешь своими словами суть проблеммы рассказать???
Может этого Гаусса в разработку возьмёшь???
Методом Гаусса решить систему n линейных алгебраических уравнений
В принципе можно поробовать)
Ну а теперь непосредственно про проблему: я нашел отличный матпакет, который помогает решить систему уравнений довольно быстро... НО! для этого ему нужно, чтобы исходные данные имели определенный вид. Собственно для этого то я и написал прогу, приведенную в топике. Вот только нужно, чтобы скорость ее работы была как можно быстрее...

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

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

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

Добавлено через 2 минуты
Кстати - тут немного времени потратил на то, чтобы узнать, как быстрее выводить в файл - с помощью printf или ofstream. Вообщем к конечному выводу так и не пришел... говорят, что printf по шустрее.. хз... насколько я понял, методы ofsteram реализованы через prinf... может это что нить значит?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
16.09.2011, 20:58
hello19, жди я в работе
0
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
16.09.2011, 20:59  [ТС]
спасибо, конечно.. но мне тоже хочется попрогать)))))
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
16.09.2011, 21:29
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);
        }
    }
}
Вложения
Тип файла: txt A.txt (62 байт, 8 просмотров)
Тип файла: txt a-1.txt (105 байт, 8 просмотров)
Тип файла: txt a-2.txt (215 байт, 7 просмотров)
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
22.09.2011, 16:03  [ТС]
ну как оно???
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
22.09.2011, 16:13
Цитата Сообщение от hello19 Посмотреть сообщение
ну как оно???
-всмысле???)
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
22.09.2011, 17:11  [ТС]
спокойно))) просто не разглядел кода.. не выспался....

Добавлено через 48 минут
слушай, ты не знаешь как грамотно можно засечь время работы кода??
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
22.09.2011, 17:43
Цитата Сообщение от hello19 Посмотреть сообщение
слушай, ты не знаешь как грамотно можно засечь время работы кода??
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
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
 
void sort(int [],int);
void print(int [], int);
 
int main()
{
    time_t start;
    time_t end;
 
    int i,n;
    double s=1;
    srand(time(0));
 
    cout<<"Enter size of array: ";
    cin>>n;
 
    n=((n>0 && n<=100) ? n : 5);
 
    int *arr=new int [n-1];
    
    time(&start);
    tm * ptm = localtime(&start);
    printf("ALGORITHM START AT : %s\r\n",asctime(ptm));
    for(i=0;i<n;i++)
        arr[i]=1+rand()%20;
 
    print(arr,n);
    sort(arr,n);
    print(arr,n);
 
    for(i=1;i<n-1;i++)
        s=s*arr[i];
 
    cout<<"\nS = "<<s<<endl;
 
    time(&end);
    ptm = localtime(&end);
    printf("ALGORITHM ENDS AT : %s\r\n",asctime(ptm));
    printf("DIFERENTS IN CLOCKS_PER_SEC : %d\r\n",end - start);
    printf("NUM OPERATIONS / CLOCKS_PER_SEC %lf\r\n",1.0*(i + 2)/CLOCKS_PER_SEC);
    printf("Press any key to continue\r\n");
    getch();
    return 0;
}
 
void sort(int a [],int size)
{
    int temp;
    for (int i = 0; i < size-1; i++)        // Проход всего массива кроме последнего элемента
    for (int j = i + 1; j <= size-1; j++)   // Проход оставшейся части массива
        if (a[i] > a[j])
        {
            // Сравнение текущего элемента с элементом из оставшейся части.
            temp = a[i]; // Обмен значений элементов если они стоят в неправильном порядке
            a[i] = a[j];
            a[j] = temp;
        }
}
 
void print(int b[], int x)
{
    cout<<endl;
 
    for(int i=0;i<x;i++)
        cout<<b[i]<<" ";
    cout<<endl;
}
1
3 / 4 / 1
Регистрация: 13.07.2011
Сообщений: 313
22.09.2011, 17:45  [ТС]
уже сделал что то подобное...
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
22.09.2011, 17:49
Цитата Сообщение от hello19 Посмотреть сообщение
уже сделал что то подобное...
и ???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.09.2011, 17:49
Помогаю со студенческими работами здесь

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

Код работает долго, нужно ускорить
Программа считает, сколько в среднем времени занимает процедура. На 1 000 итераций и массиве в 1 000 000 элементов работает слишком долго....

Нужно ускорить или уменьшить код
Программа находит определенное количество подмножеств заданного множества Нужно ее либо ускорить либо уменьшить количество...

Нужно ускорить процесс
Делаю фильтр к таблице AdvStringGrid, на подобии Excel. При открытии фильтра нужно пробежаться по всем записям запроса, а внутри еще один...

Ускорить код)
Есть одна олимпиада на codeforces, но не в том дело. Так вот, одно из заданий (есть во вложениях) требует найти количество пар чисел из...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru