Форум программистов, компьютерный форум, киберфорум
D (DLang)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/104: Рейтинг темы: голосов - 104, средняя оценка - 4.68
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446

Возможно ли написать калькулятор на D почти в одну строчку?

13.03.2015, 00:31. Показов 23342. Ответов 102
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я экспериментировал с типом данных TypeTuple и решил попробовать написать с помощью него простой калькулятор, который смог бы парсить скобки и вычислять значение выражений.
C++
1
2
3
4
5
6
7
8
9
import std.stdio;
import std.typetuple;
 
void main() {
 
    auto a = TypeTuple!(2 * (2 + 1));
 
    writeln(a); // prints 6
}
Но я столкнулся с проблемой ввода данных для TypeTuple:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
import std.stdio;
import std.typetuple;
 
void main() {
 
    string s;
 
    readf(" %s\n", &s);
 
    auto a = TypeTuple!(s);
 
    writeln(a); // prints 2 * (2 + 1)
}
Возможно ли как-то "срезать" кавычки со строки s?
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.03.2015, 00:31
Ответы с готовыми решениями:

Калькулятор в одну строчку
Нашел на Форуме. Немного переделал, добавил и изменил. В функциях Cos,Sin,Tan вместо Radian, градусы. С уважением,...

Одну строчку немогу написать
Объявлены структура, описывающая точку в пространстве TPoint и массив точек Points: struct TPoint { int X; int Y; ...

написать одну строчку кода:
Сам пример на рисунке: я не понимаю как написать верхнюю и нижнюю строку там где X^2 надо куда то втулить j+1 я не знаю как записать сам...

102
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
03.04.2015, 23:23  [ТС]
Студворк — интернет-сервис помощи студентам
Собственно, вот вам и калькулятор почти в одну (точнее, 66 ) строчку:
Package pegged version 0.2.1 - Parsing Expression Grammar (PEG) generator
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
import std.stdio;
import pegged.grammar;
 
mixin(grammar(`
Arithmetic:
    Term     < Factor (Add / Sub)*
    Add      < "+" Factor
    Sub      < "-" Factor
    Factor   < Primary (Mul / Div)*
    Mul      < "*" Primary
    Div      < "/" Primary
    Primary  < Parens / Neg / Number / Variable
    Parens   < :"(" Term :")"
    Neg      < "-" Primary
    Number   < ~([0-9]+)
    Variable <- identifier
`));
 
float interpreter(string expr)
{
    auto p = Arithmetic(expr);
    
    //writeln(p);
    
    float value(ParseTree p)
    {
        switch (p.name)
        {
            case "Arithmetic":
                return value(p.children[0]);
            case "Arithmetic.Term":
                float v = 0.0;
                foreach(child; p.children) v += value(child);
                return v;
            case "Arithmetic.Add":
                return value(p.children[0]);
            case "Arithmetic.Sub":
                return -value(p.children[0]);
            case "Arithmetic.Factor":
                float v = 1.0;
                foreach(child; p.children) v *= value(child);
                return v;
            case "Arithmetic.Mul":
                return value(p.children[0]);
            case "Arithmetic.Div":
                return 1.0/value(p.children[0]);
            case "Arithmetic.Primary":
                return value(p.children[0]);
            case "Arithmetic.Parens":
                return value(p.children[0]);
            case "Arithmetic.Neg":
                return -value(p.children[0]);
            case "Arithmetic.Number":
                return to!float(p.matches[0]);
            default:
                return float.nan;
        }
    }
    
    return value(p);
}
 
void main()
{
    writeln(interpreter("(3 + 5) * 2 - (2 * 3)")); // prints 10
}
P.S. Жаль, что в стандартную библиотеку ещё не добавили.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38207 / 21139 / 4311
Регистрация: 12.02.2012
Сообщений: 34,751
Записей в блоге: 14
04.04.2015, 15:15
А интересно, вот такое выражение "3+6*5" вычислит? Какой будет результат?
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
05.04.2015, 20:42  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
А интересно, вот такое выражение "3+6*5" вычислит?
Вычислит.
Цитата Сообщение от Catstail Посмотреть сообщение
Какой будет результат?
33.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38207 / 21139 / 4311
Регистрация: 12.02.2012
Сообщений: 34,751
Записей в блоге: 14
05.04.2015, 21:01
Dennis Ritchie, а интересно, где в коде отражаются приоритеты операций?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33441 / 21543 / 8245
Регистрация: 22.10.2011
Сообщений: 36,982
Записей в блоге: 12
05.04.2015, 21:06
Catstail, приоритеты первых строк ниже, чем последующих. То есть, Add/Sub имеет минимальный приоритет, а унарный минус - максимальный
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38207 / 21139 / 4311
Регистрация: 12.02.2012
Сообщений: 34,751
Записей в блоге: 14
05.04.2015, 21:08
volvo, занятно! Мог бы сам догадаться...
0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
06.04.2015, 16:02
Catstail,
Цитата Сообщение от http://dlang.org/mixin.html
Mixins (not to be confused with template mixins) enable string constants to be compiled as regular D code and inserted into the program. Combining this with compile time manipulation of strings enables the creation of domain-specific languages.
Нужное подчеркнул. С интерпретацией в рантайме это связано чуть менее чем никак.

Добавлено через 3 минуты
там же
Superficially, since D mixins can manipulate text and compile the result, it has some similar properties to the C preprocessor. But there are major, fundamental differences:
1
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
06.04.2015, 22:02  [ТС]
Цитата Сообщение от castorsky Посмотреть сообщение
С интерпретацией в рантайме это связано чуть менее чем никак.
А кто говорил про рантайм?
2.3.4.2. Выражение mixin
Если бы выражения были отвертками разных видов, выражение mixin было бы электрической отверткой со сменными насадками, регулятором скоростей, адаптером для операций на мозге, встроенной беспроводной камерой и функцией распознавания речи. Оно на самом деле такое мощное.

Короче говоря, выражение mixin позволяет вам превратить строку в исполняемый код. Синтаксис выражения выглядит как mixin(выражение), где выражение должно быть строкой, известной во время компиляции. Это ограничение исключает возможность динамически создавать программный код, например читать строку с терминала и интерпретировать ее. Нет, D – не интерпретируемый язык, и его компилятор не является частью средств стандартной библиотеки времени исполнения. Хорошие новости заключаются в том, что D на самом деле запускает полноценный интерпретатор во время компиляции, а значит, вы можете собирать строки настолько изощренными способами, насколько этого требуют условия вашей задачи.

Возможность манипулировать строками и преобразовывать их в код во время компиляции позволяет создавать так называемые предметно-ориентированные встроенные языки программирования, которые их фанаты любовно обозначают аббревиатурой DSEL1. Типичный DSEL, реализованный на D, принимал бы инструкции в качестве строковых литералов, обрабатывал их в процессе компиляции, создавал соответствующий код на D в виде строки и с помощью mixin преобразовывал ее в готовый к исполнению код на D. Хорошим примером полезных DSEL могут служить SQL-команды, регулярные выражения и спецификации грамматик (а-ля yacc). На самом деле, даже вызывая printf, вы каждый раз используете DSEL. Спецификатор формата, применяемый функцией printf, – это настоящий маленький язык, ориентированный на описание шаблонов для текстовых данных.

D позволяет вам создать какой угодно DSEL без дополнительных инструментов (таких как синтаксические анализаторы, сборщики, генераторы кода и т. д.); например, функция bitfields из стандартной библиотеки (модуль std.bitmanip) принимает определения битовых полей и генерирует оптимальный код на D для их чтения и записи, хотя сам язык не поддерживает битовые поля.

-----
1 Domain-specific embedded language (DSEL) – предметно-ориентированный встроенный язык. – Прим. пер.

Не по теме:

Думаю, что вам будет интересно прочитать:
Мощность Lisp является его злейшим врагом

0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
06.04.2015, 22:25
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А кто говорил про рантайм?
название темы " Возможно ли написать калькулятор на D почти в одну строчку? ". Для справки, калькулятор - интерпретатор языка математики.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
06.04.2015, 22:31  [ТС]
Цитата Сообщение от castorsky Посмотреть сообщение
Для справки, калькулятор - интерпретатор языка математики.
А кто говорил, что интерпретация должна выполняться в рантайме?
0
06.04.2015, 22:41

Не по теме:

у тебя было два яблока...

0
06.04.2015, 22:48  [ТС]

Не по теме:

Цитата Сообщение от castorsky Посмотреть сообщение
у тебя было два яблока...
Ты их съел. Сколько морковок у тебя осталось?

0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
06.04.2015, 23:00
А я могу калькулятор в два символа написать.
Bash
1
bc
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
08.04.2015, 05:18  [ТС]
Для тех, кто не любит использовать стандартные функции, можно использовать вариант не в одну строчку:
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
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
import std.stdio, std.string, std.ascii, std.conv, std.array, std.exception, std.traits;
 
struct Stack(T) {
    T[] data;
    alias data this;
    void push(T top) pure nothrow @safe { data ~= top; }
    
    T pop(bool discard = true)() pure @nogc @safe {
        immutable static exc = new immutable(Exception)("Stack Empty");
        if (data.empty)
            throw exc;
        auto top = data[$ - 1];
        static if (discard)
            data.popBack;
        return top;
    }
}
 
enum Type {         Num, OBkt, CBkt, Add, Sub, Mul, Div }
immutable opChar = ["#", "(",  ")",  "+", "-", "*", "/"];
immutable opPrec = [ 0,  -9,   -9,    1,   1,   2,   2];
 
abstract class Visitor { void visit(XP e) pure @safe; }
 
final class XP {
    immutable Type type;
    immutable string str;
    immutable int pos; // Optional, to dispaly AST struct.
    XP LHS, RHS;
    
    this(string s=")", int p = -1) pure nothrow @safe {
        str = s;
        pos = p;
        auto localType = Type.Num;
        foreach_reverse (immutable t; [EnumMembers!Type[1 .. $]])
            if (opChar[t] == s)
                localType = t;
        this.type = localType;
    }
    
    override int opCmp(Object other) pure @safe {
        auto rhs = cast(XP)other;
        enforce(rhs !is null);
        return opPrec[type] - opPrec[rhs.type];
    }
    
    void accept(Visitor v) pure @safe { v.visit(this); }
}
 
final class AST {
    XP root;
    Stack!XP opr, num;
    string xpr, token;
    int xpHead, xpTail;
    
    void joinXP(XP x) pure @safe {
        x.RHS = num.pop;
        x.LHS = num.pop;
        num.push(x);
    }
    
    string nextToken() pure @safe {
        while (xpHead < xpr.length && xpr[xpHead] == ' ')
            xpHead++; // Skip spc.
        xpTail = xpHead;
        if (xpHead < xpr.length) {
            token = xpr[xpTail .. xpTail + 1];
            switch (token) {
                case "(", ")", "+", "-", "*", "/": // Valid non-number.
                    xpTail++;
                    return token;
                default: // Should be number.
                    if (token[0].isDigit) {
                        while (xpTail < xpr.length && xpr[xpTail].isDigit())
                            xpTail++;
                        return xpr[xpHead .. xpTail];
                    } // Else may be error.
            } // End switch.
        }
        if (xpTail < xpr.length)
            throw new Exception("Invalid Char <" ~ xpr[xpTail] ~ ">");
        return null;
    } // End nextToken.
    
    AST parse(in string s) /*@safe*/ {
        bool expectingOP;
        xpr = s;
        try {
            xpHead = xpTail = 0;
            num = opr = null;
            root = null;
            opr.push(new XP); // CBkt, prevent evaluate null OP precedence.
            while ((token = nextToken) !is null) {
                XP tokenXP = new XP(token, xpHead);
                if (expectingOP) { // Process OP-alike XP.
                    switch (token) {
                        case ")":
                            while (opr.pop!false.type != Type.OBkt)
                                joinXP(opr.pop);
                            opr.pop;
                            expectingOP = true;
                            break;
                        case "+", "-", "*", "/":
                            while (tokenXP <= opr.pop!false)
                                joinXP(opr.pop());
                            opr.push(tokenXP);
                            expectingOP = false;
                            break;
                        default:
                            throw new Exception("Expecting Operator or ), not <"
                                ~ token ~ ">");
                    }
                } else { // Process Num-alike XP.
                    switch (token) {
                        case "+", "-", "*", "/", ")":
                            throw new Exception("Expecting Number or (, not <"
                                ~ token ~ ">");
                        case "(":
                            opr.push(tokenXP);
                            expectingOP = false;
                            break;
                        default: // Number.
                            num.push(tokenXP);
                            expectingOP = true;
                    }
                }
                xpHead = xpTail;
            } // End while.
            
            while (opr.length > 1) // Join pending Op.
                joinXP(opr.pop);
        } catch(Exception e) {
            writefln("%s\n%s\n%s^", e.msg, xpr, " ".replicate(xpHead));
            root = null;
            return this;
        }
        
        if (num.length != 1) { // Should be one XP left.
            "Parse Error...".writefln;
            root = null;
        } else {
            root = num.pop;
        }
        return this;
    } // End Parse.
}  // End class AST.
 
// To display AST fancy struct.
void ins(ref char[][] s, in string v, in int p, in int l)
pure nothrow @safe {
    if (l + 1 > s.length)
        s.length++;
    while (s[l].length < p + v.length + 1)
        s[l] ~= " ";
    s[l][p .. p + v.length] = v[];
}
 
final class CalcVis : Visitor {
    int result, level;
    string resultStr;
    char[][] Tree;
    
    static void opCall(AST a) @safe {
        if (a && a.root) {
            auto c = new CalcVis;
            a.root.accept(c);
            foreach (immutable i; 1 .. c.Tree.length) { // More fancy.
                bool flipflop = false;
                enum char mk = '.';
                foreach (immutable j; 0 .. c.Tree[i].length) {
                    while (j >= c.Tree[i - 1].length)
                        c.Tree[i - 1] ~= " ";
                    immutable c1 = c.Tree[i][j];
                    immutable c2 = c.Tree[i - 1][j];
                    if (flipflop && (c1 == ' ') && c2 == ' ')
                        c.Tree[i - 1][j] = mk;
                    if (c1 != mk && c1 != ' ' &&
                        (j == 0 || !isDigit(c.Tree[i][j - 1])))
                        flipflop = !flipflop;
                }
            }
            foreach (const t; c.Tree)
                t.writefln;
            writefln("\n%s ==>\n%s = %s", a.xpr, c.resultStr, c.result);
        } else
            "Evalute invalid or null Expression.".writefln;
    }
    
    // Calc. the value, display AST struct and eval order.
    override void visit(XP xp) @safe {
        ins(Tree, xp.str, xp.pos, level);
        level++;
        if (xp.type == Type.Num) {
            resultStr ~= xp.str;
            result = xp.str.to!int;
        } else {
            resultStr ~= "(";
            xp.LHS.accept(this);
            immutable int lhs = result;
            resultStr ~= opChar[xp.type];
            xp.RHS.accept(this);
            resultStr ~= ")";
            switch (xp.type) {
                case Type.Add: result = lhs + result; break;
                case Type.Sub: result = lhs - result; break;
                case Type.Mul: result = lhs * result; break;
                case Type.Div: result = lhs / result; break;
                default: throw new Exception("Invalid type");
            }
        }
        level--;
    }
}
 
void main(string[] args) /*@safe*/ {
    immutable exp0 = "1 + 2*(3 - 2*(3 - 2)*((2 - 4)*5" ~
        " - 22/(7 + 2*(3 - 1)) - 1)) + 1";
    immutable exp = (args.length > 1) ? args[1 .. $].join(' ') : exp0;
    new AST().parse(exp).CalcVis; // Should be 60.
}
Output:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   ........................................................+.
 .+..                                                        1
1    *...
    2   .-..........
       3     .......*................................
            *...                 ....................-.
           2   .-.            ..-...                   1
              3   2       ...*      /...
                        .-.   5   22   .+..
                       2   4          7    *...
                                          2   .-.
                                             3   1
 
1 + 2*(3 - 2*(3 - 2)*((2 - 4)*5 - 22/(7 + 2*(3 - 1)) - 1)) + 1 ==>
((1+(2*(3-((2*(3-2))*((((2-4)*5)-(22/(7+(2*(3-1)))))-1)))))+1) = 60
Ссылка на исходный код

-----
Чтобы программа могла считывать выражения из консоли, нужно заменить в функции main() эту строку:
C++
1
2
immutable exp0 = "1 + 2*(3 - 2*(3 - 2)*((2 - 4)*5" ~
        " - 22/(7 + 2*(3 - 1)) - 1)) + 1";
на эту:
C++
1
immutable exp0 = readln.strip;
1
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
08.04.2015, 13:02
Молодец, Дениска. Значит выражение таки надо сначала разбирать. Можешь сюда заглянуть.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
08.04.2015, 13:37  [ТС]
Цитата Сообщение от castorsky Посмотреть сообщение
Можешь сюда заглянуть.
Хочешь сказать, что лиспОвАя программа выдаст мне 60, если я введу что-нибудь подобное:
Code
1
2
3
4
5
6
7
8
9
10
11
12
                   +
         +               1
      1      *
                2 -
                      3                 *
                                *                                                    -
                              2   -                             -                      1
                                3   2                  *                 /
                                                     -     5           22     +
                                                  2   4                      7   *
                                                                                   2    -
                                                                                       3   1
0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
08.04.2015, 14:50
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Хочешь сказать, что лиспОвАя программа выдаст мне 60, если я введу что-нибудь подобное
В приведенных примерах не сумел деревья увидеть?
0
1075 / 968 / 113
Регистрация: 04.11.2012
Сообщений: 1,013
08.04.2015, 15:00
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
лиспОвАя программа выдаст мне 60, если я введу что-нибудь подобное:
если ввести вот это
Lisp
1
(+ (+ 1 (* 2 (- 3 (* (* 2 (- 3 2)) (- (- (* (- 2 4) 5) (/ 22 (+ 7 (* 2 (- 3 1))))) 1))))) 1)
http://xuanji.appspot.com/isicp/1-1-elements.html
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
08.04.2015, 15:01  [ТС]
Цитата Сообщение от castorsky Посмотреть сообщение
В приведенных примерах не сумел деревья увидеть?
Это не дерево, это инфиксная запись:
Lisp
1
(calc-expr (+ (/ 4 2) (- (* 3 4) 7 8 9)))
0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
08.04.2015, 15:04
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Это не дерево, это инфиксная запись
это не инфиксная запись. Вот инфиксная запись: / + * 2 3 1 4 => (1 + 2 * 3) / 4 . А это и есть дерево вида '(root leaf ... leaf)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.04.2015, 15:04
Помогаю со студенческими работами здесь

Возможно ли на vbs написать калькулятор?
Всем привет! Я не силен в этой сфере,но хотелось бы участвовать или наблюдать процесс написания,дабы получить в будующем возможность...

Js в одну строчку
Подскажите готовые сервисы через которые можно пропустить js и получить на выходе js код в одну строчку.

перевести одну строчку на с++
case (operation_list.ItemIndex) of 0: ..............

Перевести одну строчку с С++ в С
помогите перевести cout &lt;&lt; (i == 0 || j == 0 || i == N + 1 || j == M + 1 ? (char)178 : a) &lt;&lt; (j &lt;= M ? &quot;&quot; : &quot;\n&quot;); С++ не проходила,...

Текст в одну строчку
Можно ли весь код сайта начиная от &lt;!DOCTYPE html&gt;&lt;html&gt; и кончая &lt;/body&gt;&lt;/html&gt; вывести в одну строчку. Как например это сделано у Яндекс?...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru