Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
4 / 2 / 2
Регистрация: 13.11.2018
Сообщений: 22

Быстрая сортировка текстового файла по алфавиту за строками

19.10.2020, 04:28. Показов 4550. Ответов 34

Студворк — интернет-сервис помощи студентам
Здравствуйте. Проблема с сортировкой файла. Задача. У вас слабая машинка с ограниченной оперативной памятью (нужно вложиться в 2мб), отсортировать строки по алфавиту из документа (макс. размер строки равен 10000). Сортировать не содержимое строк, а их самих.
Мой план заключался в использовании алгоритма qsort. Что бы не затрачивать лишнюю память записью всего документа в динамический массив строк, я решил их разбирать по очереди и сортировать именно их номера. Когда мы получаем новые значения номеров, то отправляем их в функцию и переписываем содержимое файла, и так далее.
Проблема в том, что сама функция переписи работает, а вот мне кажется проблема в самой функции qs. Подскажите, что не так. Хочу разобраться во всем. Заранее спасибо!

Код:
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#define _CRT_SECURE_NO_WARNINGS
 
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <fstream>
using namespace std;
 
int comp_by_n(int f_num, int s_num)
{
    FILE* read;
    read = fopen("D:\\F1.txt", "rt");
    char* f_str = new char[10000];
    char* s_str = new char[10000];
    char* temp = new char[10000];
    int i = 0;
    while (fgets(temp, 10000, read))
    {
        if (i == f_num) strcpy(f_str, temp);
        if (i == s_num) strcpy(s_str, temp);
        i++;
    }
    fclose(read);
    return _stricmp(f_str, s_str);
 
}
 
void write_str(int* num_str, int end)
{
    const static int BUF_SIZE = 10000;
    FILE* read;
    FILE* write;
    read = fopen("D:\\F1.txt", "rt");
    write = fopen("D:\\F2.txt", "wt");
    char* temp = new char[10000];
    int k = 0;
    for (int i = 0; i < end; i++)
    {
        k = 0;
        fseek(read, 0, SEEK_SET);
        while (fgets(temp, BUF_SIZE, read))
        {
            
            if (num_str[i] == k)
                fprintf(write, temp, "%s");
        
            k++;
        }
    }
    fclose(read);
    fclose(write);
    std::ifstream in("D:\\F2.txt", ios_base::in | ios_base::binary);
    std::ofstream out("D:\\F1.txt", ios_base::out | ios_base::binary);
    char buf[BUF_SIZE];
    do {
        in.read(&buf[0], BUF_SIZE);
        out.write(&buf[0], in.gcount());
    } while (in.gcount() > 0);
 
    in.close();
    out.close();
 
}
 
void qs(int start, int end, int* num_str)
{
    int R, L;
    int a ;
    int seredina, temp;
    R = end;
    L = start;
    seredina = (L + R) / 2;
    do
    {
        while (comp_by_n(seredina, L) > 0) {  L++;  }
        while (comp_by_n(R, seredina) > 0) {  R--; }
        if (L <= R)
        {
            temp = num_str[L];
            num_str[L] = num_str[R];
            num_str[R] = temp;
            write_str(num_str, end);
            L++;
            R--;
        }
    } while (L < R);
    if (start < R) qs(start, R, num_str);
    if (L < end) qs(L, end, num_str);
}
 
int main()
{
    setlocale(0, ".1251");
    int k = 0,i=0,start,end;
    FILE* read;
    FILE* write;
    char* temp = new char[10000];
    read = fopen("D:\\F1.txt", "rt");
    while (fgets(temp, 10000, read)) k++;
    int* num_str = new int[k];
    start = 0;
    end = k;
    k = 0;
    fseek(read, 0, SEEK_SET);
    while (fgets(temp, 10000, read))
    {
            num_str[k] = k;
            k++;
    }
    fclose(read);
    int a = 0;
    qs(start,end,num_str);
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.10.2020, 04:28
Ответы с готовыми решениями:

Сортировка из текстового файла по алфавиту
Помогите составить программу на паскале, которая сортирует слова из файла.txt в алфавитном порядке, но в обратном порядке, от Я до А. ...

Сортировка данных по алфавиту из текстового файла
1. Помогите написать программу для сортировки по алфавиту данных из текстового файла 2. Написать программу для вычисления числа Pi (ПИ)....

Быстрая сортировка строк по алфавиту
Помогите написать пожалуйста программу с быстрой сортировкой строк по алфавитному порядку, строки вводятся в ручную

34
4 / 2 / 2
Регистрация: 13.11.2018
Сообщений: 22
20.10.2020, 10:47  [ТС]
Студворк — интернет-сервис помощи студентам
Спасибо, попробую разобраться)
0
 Аватар для igorrr37
2898 / 2045 / 992
Регистрация: 21.12.2010
Сообщений: 3,793
Записей в блоге: 9
20.10.2020, 11:18
Замеры показывают что текстовый файл размером 50 мб сортирует за 11 сек, 100 мб - за 44 сек, 200 мб - за 176 сек, т.е. при увеличении файла в 2 раза время растёт в 4 раза. Файл размером 800 мб будет сортировать чуть меньше 48 минут

Добавлено через 4 минуты
Возможно, переход на сишные FILE придаст скорости
1
4 / 2 / 2
Регистрация: 13.11.2018
Сообщений: 22
20.10.2020, 11:33  [ТС]
Цитата Сообщение от igorrr37 Посмотреть сообщение
Замеры показывают что текстовый файл размером 50 мб сортирует за 11 сек, 100 мб - за 44 сек, 200 мб - за 176 сек, т.е. при увеличении файла в 2 раза время растёт в 4 раза. Файл размером 800 мб будет сортировать чуть меньше 48 минут

Добавлено через 4 минуты
Возможно, переход на сишные FILE придаст скорости
Мне надо за 2 сек, может по твоему так сказать шаблону применить другой тип сортировки?
0
 Аватар для igorrr37
2898 / 2045 / 992
Регистрация: 21.12.2010
Сообщений: 3,793
Записей в блоге: 9
20.10.2020, 11:52
Мне кажется здесь всё упирается не в сортировку а в количество обращений к диску. Оперативки то нет ни фига. Вот и лезем на диск. Бутылочное горлышко

Добавлено через 10 минут
Цитата Сообщение от never_more Посмотреть сообщение
Мне надо за 2 сек
У меня i5-4670k и 16 гб оперативки. Файл 800 мб копируется 5 секунд. Как можно на 2 мб оперы за 2 сек его скопировать да ещё отсортировать успеть?
0
4 / 2 / 2
Регистрация: 13.11.2018
Сообщений: 22
20.10.2020, 16:01  [ТС]
Цитата Сообщение от igorrr37 Посмотреть сообщение
Мне кажется здесь всё упирается не в сортировку а в количество обращений к диску. Оперативки то нет ни фига. Вот и лезем на диск. Бутылочное горлышко

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

У меня i5-4670k и 16 гб оперативки. Файл 800 мб копируется 5 секунд. Как можно на 2 мб оперы за 2 сек его скопировать да ещё отсортировать успеть?
Видел сортировку flashshort. Там мало именно сравнений и быстрее сортирует. Буду разбирать твой код и пробовать. А вот мне интересно как работает сортировка в проводнике виндовс, у меня была папка где много файлов. Сортирует быстро.
0
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
20.10.2020, 16:59
Цитата Сообщение от never_more Посмотреть сообщение
А вот мне интересно как работает сортировка в проводнике виндовс, у меня была папка где много файлов. Сортирует быстро.
Ну так ему и не нужно все разом сортировать, ему достаточно отсортировать только ту часть, которую будет видеть пользователь, и сразу же ее отобразить. А уж остальные файлы сортировать за кадром. И это только первая хитрость разрабов которая приходит в голову.
0
4 / 2 / 2
Регистрация: 13.11.2018
Сообщений: 22
20.10.2020, 17:42  [ТС]
Цитата Сообщение от assemberist Посмотреть сообщение
Ну так ему и не нужно все разом сортировать, ему достаточно отсортировать только ту часть, которую будет видеть пользователь, и сразу же ее отобразить. А уж остальные файлы сортировать за кадром. И это только первая хитрость разрабов которая приходит в голову.
Да звучит логично.
0
4 / 2 / 2
Регистрация: 13.11.2018
Сообщений: 22
20.10.2020, 23:49  [ТС]
Цитата Сообщение от igorrr37 Посмотреть сообщение
Мне кажется здесь всё упирается не в сортировку а в количество обращений к диску. Оперативки то нет ни фига. Вот и лезем на диск. Бутылочное горлышко

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

У меня i5-4670k и 16 гб оперативки. Файл 800 мб копируется 5 секунд. Как можно на 2 мб оперы за 2 сек его скопировать да ещё отсортировать успеть?
Нашел подходящий алгоритм сортировки по разрядам АBC. Токо не знаю как реализовать с большим количеством строк.
0
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
21.10.2020, 03:41
алгоритм сортировки по разрядам АBC
radix sort

Цитата Сообщение от never_more Посмотреть сообщение
Токо не знаю как реализовать с большим количеством строк.
У вас может быть 20к строк на каждый мегабайт кода, это 20кк для гигабайтового файла. Мне кажется, что вы не сможете засунуть таблицу "трекера слов" в 2 мегабайта. Может быть смотреть в сторону блочной сортировки?
Цитата Сообщение от igorrr37 Посмотреть сообщение
Замеры показывают что текстовый файл размером 50 мб сортирует за 11 сек, 100 мб - за 44 сек, 2
сейчас глубокая ночь и, наверное, я туплю. Но 1 Мб фаил не может разжевать уже минут 20.
0
4 / 2 / 2
Регистрация: 13.11.2018
Сообщений: 22
21.10.2020, 03:59  [ТС]
Может мое задание из вида невыполнимых? В блочном тоже сравнения тоже много времени. Хотя бы добиться при таких условиях сортировки за 2 сек 100мб файла
0
 Аватар для igorrr37
2898 / 2045 / 992
Регистрация: 21.12.2010
Сообщений: 3,793
Записей в блоге: 9
21.10.2020, 11:00
Переделал на сишные FILE, на удивление время только выросло, причём ровно в 1.65 раза: файл 50 мб - 18сек против 11сек на с++ потоках, файл 100 мб - 73сек против 44сек на с++ потоках
Кликните здесь для просмотра всего текста
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#include <string>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <chrono>
#include <utility>
#include <filesystem>
#include <system_error>
#include <cstdlib>
#include <functional>
#include <cstdio>
#include <cstring>
namespace fs = std::filesystem;
 
 
int main()
{
    std::system("chcp 1251");
    fs::remove("result.txt");
    auto t1 = std::chrono::system_clock::now();
    std::FILE* ifs = fopen("in.txt", "rt"), * ofs = fopen("otmp.txt", "wt");
    if (ifs && ofs)
    {
        char* parr[200]{};
        for (auto& p : parr)
        {
            p = (char*)malloc(10'003);
        }
        int i = 0;
        for (; i < 200 && !feof(ifs); ++i)
        {
            auto p = fgets(parr[i], 10'003, ifs);
            if (!p)
            {
                break;
            }
            if (p[strlen(p) - 1] == '\n')
            {
                p[strlen(p) - 1] = '\0';
            }
        }
        std::sort(parr, parr + i, [](char* a, char* b)
            {
                int num = strcmp(a, b);
                return num < 0;
            });
        for (int j = 0; j < i; ++j)
        {
            fprintf(ofs, "%s\n", parr[j]);
        }
        i = 0;
        fclose(ofs);
        std::error_code ec;
        fs::rename("otmp.txt", "itmp.txt", ec);
        if (ec)
        {
            std::cerr << "fs::rename fails with ec: " << ec.message() << std::endl;
            ec.clear();
        }
        char stmp[10'003];
        while (!feof(ifs))
        {
            for (; i < 200 && !feof(ifs); ++i)
            {
                if (!fgets(parr[i], 10'003, ifs))
                {
                    break;
                }
                if (parr[i][strlen(parr[i]) - 1] == '\n')
                {
                    parr[i][strlen(parr[i]) - 1] = '\0';
                }
            }
            std::sort(parr, parr + i, [](char* a, char* b)
                {
                    int num = strcmp(a, b);
                    return num > 0;
                });
 
            std::FILE* ifsTmp = fopen("itmp.txt", "rt"), * ofsTmp = fopen("otmp.txt", "wt");
            if (ifsTmp && ofsTmp)
            {
                for (; i != 0 && !feof(ifsTmp); )
                {
                    if (!fgets(stmp, 10'003, ifsTmp))
                    {
                        break;
                    }
                    if (stmp[strlen(stmp) - 1] == '\n')
                    {
                        stmp[strlen(stmp) - 1] = '\0';
                    }
                    while (true)
                    {
                        auto pr = std::minmax((char*)stmp, parr[i - 1], [](char* a, char* b)
                            {
                                int num = strcmp(a, b);
                                return num < 0;
                            });
                        fprintf(ofsTmp, "%s\n", pr.first);
                        if (pr.first == parr[i - 1])
                        {
                            --i;
                            if (i == 0)
                            {
                                break;
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                if (feof(ifsTmp) && i != 0)
                {
                    for (int j = i - 1; j >= 0; --j)
                    {
                        fprintf(ofsTmp, "%s\n", parr[j]);
                    }
                }
                else if (!feof(ifsTmp) && i == 0)
                {
                    while (!feof(ifsTmp))
                    {
                        if (!fgets(stmp, 10'003, ifsTmp))
                        {
                            break;
                        }
                        if (stmp[strlen(stmp) - 1] == '\n')
                        {
                            stmp[strlen(stmp) - 1] = '\0';
                        }
                        fprintf(ofsTmp, "%s\n", stmp);
                    }
                }
                i = 0;
                fclose(ofsTmp);
                fclose(ifsTmp);
 
                fs::remove("itmp.txt", ec);
                if (ec)
                {
                    std::cerr << "fs::remove fails with ec: " << ec.message() << std::endl;
                    ec.clear();
                }
                fs::rename("otmp.txt", "itmp.txt", ec);
                if (ec)
                {
                    std::cerr << "fs::rename fails with ec: " << ec.message() << std::endl;
                    ec.clear();
                }
                //std::cout << "file_size: " << fs::file_size("itmp.txt") << std::endl;;
            }
            else
            {
                std::cerr << "Unable to open temporary file\n";
            }
        }
        fclose(ifs);
        fs::rename("itmp.txt", "result.txt", ec);
        if (ec)
        {
            std::cerr << "fs::rename fails with ec: " << ec.message() << std::endl;
            ec.clear();
        }
    }
    else
    {
        std::cerr << "Unable to open file\n";
    }
    auto t2 = std::chrono::system_clock::now();
    std::cout << "seconds: " << std::chrono::duration_cast<std::chrono::seconds>(t2 - t1).count() << std::endl;
    //std::system("pause");
}
0
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
21.10.2020, 14:55
igorrr37, пожалуйста, при следующем улучшении, замените имена фаилов переменными и вынесите их вверх. А то для прогона приходится по всему коду автозаменой лазить.

Цитата Сообщение от never_more Посмотреть сообщение
. Хотя бы добиться при таких условиях сортировки за 2 сек 100мб файла
Так какая задача в итоге? Звучали 2МБ рамы, потом выяснилось, что фаилы в гигабайт, потом в ограничение в 2 секунды времени. Вы с ТЗ определитесь. Кстати, фаилы на диске можно в любом количестве создавать?
Цитата Сообщение от never_more Посмотреть сообщение
В блочном тоже сравнения тоже много времени.
Если количество карманов велико, а данные случайны - будут очень хорошие показатели.

Для подготовки тесовых данных делал так:
Python
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
#!/usr/bin/env python3
#coding -*- UTF8 -*-
import string
from random import choices, randint
import os
 
fpath = "R:/randstring_data.txt"    # Путь к фаилу в который сложить случайные строки
target_size = 10*1024              # желаемый итоговый размер фаила в байтах
max_len = 100                       # максимальная длинна строки
 
""" Генерирует случайную строку случайной длинны """
def randstring():
    #len = randint(1,max_len)
    return "".join(choices(string.digits+string.ascii_letters, k=randint(1,max_len)))
 
def main():
    fname = os.path.normpath(fpath)
    with open(fname, "w") as fd:
        str_count = 0
        while (os.stat(fname).st_size < target_size):
            fd.write(randstring()+'\n')
            str_count += 1
        print("записано {0} строк, размер {1} Кбайт".format(str_count, round(os.stat(fname).st_size/1024)))
            
 
if __name__ == "__main__":
    main()
Добавлено через 2 минуты
получается примерно 2к строк на 1 кб
0
4 / 2 / 2
Регистрация: 13.11.2018
Сообщений: 22
21.10.2020, 18:50  [ТС]
Цитата Сообщение от Vladimir. Посмотреть сообщение
igorrr37, пожалуйста, при следующем улучшении, замените имена фаилов переменными и вынесите их вверх. А то для прогона приходится по всему коду автозаменой лазить.


Так какая задача в итоге? Звучали 2МБ рамы, потом выяснилось, что фаилы в гигабайт, потом в ограничение в 2 секунды времени. Вы с ТЗ определитесь. Кстати, фаилы на диске можно в любом количестве создавать?
Если количество карманов велико, а данные случайны - будут очень хорошие показатели.

Для подготовки тесовых данных делал так:
Python
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
#!/usr/bin/env python3
#coding -*- UTF8 -*-
import string
from random import choices, randint
import os
 
fpath = "R:/randstring_data.txt"    # Путь к фаилу в который сложить случайные строки
target_size = 10*1024              # желаемый итоговый размер фаила в байтах
max_len = 100                       # максимальная длинна строки
 
""" Генерирует случайную строку случайной длинны """
def randstring():
    #len = randint(1,max_len)
    return "".join(choices(string.digits+string.ascii_letters, k=randint(1,max_len)))
 
def main():
    fname = os.path.normpath(fpath)
    with open(fname, "w") as fd:
        str_count = 0
        while (os.stat(fname).st_size < target_size):
            fd.write(randstring()+'\n')
            str_count += 1
        print("записано {0} строк, размер {1} Кбайт".format(str_count, round(os.stat(fname).st_size/1024)))
            
 
if __name__ == "__main__":
    main()
Добавлено через 2 минуты
получается примерно 2к строк на 1 кб
Файлы да скоко хош. По тз 2мб оп, 2 сек и хотя бы 100мб сортировочного файла.
0
 Аватар для igorrr37
2898 / 2045 / 992
Регистрация: 21.12.2010
Сообщений: 3,793
Записей в блоге: 9
21.10.2020, 19:19
Цитата Сообщение от never_more Посмотреть сообщение
2мб оп, 2 сек и хотя бы 100мб сортировочного файла
https://www.youtube.com/watch?v=oOe8WxwXXlU
1
4 / 2 / 2
Регистрация: 13.11.2018
Сообщений: 22
21.10.2020, 19:24  [ТС]
Ахахах ладно буду закрывать тему. Буду отталкиваться от вашего кода.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.10.2020, 19:24

Быстрая сортировка строк по алфавиту
Всем привет не спящим нужно написать курсовую на утро)))) нашел код один и изменил саму сортировку на быструю(правильно неправильно я тут...

Разбиение текстового файла по алфавиту
Здравствуйте, не могу додумать программу. Прога делит текстовый документ на части с учетом алфавита (условно алфавит разделен на 5 частей)....

Работа со строками текстового файла
Добрый вечер уважаемые участники. Хотел попросить у Вас помощи, часть программы сделал, а часть никак, может время позднее влияет...Буду...

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

Из исходного текстового файла создать список слов по алфавиту
Надо из исходного текстового файла создать список из слов по алфавиту. вот моя программа что то работать не хочет ( руки опущены не знаю...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru