Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/51: Рейтинг темы: голосов - 51, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 16.04.2012
Сообщений: 29

Написать синтаксический анализатор-калькулятор

16.04.2012, 23:35. Показов 9815. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача заключается в том что надо написать программу "калькулятор" на языке С Sharp. Калькулятор должен уметь синтаксически анализировать выражения: вычитание, сложение, умножение, тангенс, синус и действительные числа. Подскажите пожалуйста советами или примерами, где можно найти информацию на эту задачу.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.04.2012, 23:35
Ответы с готовыми решениями:

Синтаксический анализатор
Здравствуйте ! Прошу Вашей помощи в составлении , точнее советах по составлению Синтаксического анализатора дифференциальных...

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

Нужно разработать синтаксический анализатор
Разработать синтаксический анализатор для понятия «скалярный_тип»: скалярный_тип ::= {имя_константы {, имя_константы}*} | {константа...

11
ѪѦѢ
 Аватар для SlavAz
599 / 168 / 5
Регистрация: 19.08.2011
Сообщений: 665
Записей в блоге: 3
17.04.2012, 00:06
Может регулярные выражения?
0
1 / 1 / 0
Регистрация: 16.04.2012
Сообщений: 29
17.04.2012, 00:17  [ТС]
Цитата Сообщение от SlavAz Посмотреть сообщение
Может регулярные выражения?
нет именно синтаксический анализатор, или как по другому говорят "парсер"
0
ѪѦѢ
 Аватар для SlavAz
599 / 168 / 5
Регистрация: 19.08.2011
Сообщений: 665
Записей в блоге: 3
17.04.2012, 00:23
не, ну я понял о чём ты.

Я говорю может регулярные выражения тебе помогут. Узнаешь из чего состоит выражение, т.е. есть ли там скобки или нет...что считать первым вообщем.
0
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
17.04.2012, 01:51
EVGENYM, Почитайте алгоритм обратной польской записи,с помощью неё можно несложно это реализовать(http://ru.wikipedia.org/wiki/%... 1%81%D1%8C). Правда давно сам я изобретал велосипед)). Так же можно сделать методом рекурсивного спуска. Этот алгоритм(точнее метод и код) описан в книге "Г.Шилдт - Полный справочник по С#" в самом конце.
2
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.04.2012, 02:54
Цитата Сообщение от SlavAz Посмотреть сообщение
Может регулярные выражения?
регулярный выражения можно применять для лексического анализа, синтаксический анализ вы никак не сделаете регулярками
1
1 / 1 / 0
Регистрация: 16.04.2012
Сообщений: 29
17.04.2012, 13:42  [ТС]
Цитата Сообщение от NowMatrix Посмотреть сообщение
EVGENYM, Почитайте алгоритм обратной польской записи,с помощью неё можно несложно это реализовать(http://ru.wikipedia.org/wiki/%... 1%81%D1%8C). Правда давно сам я изобретал велосипед)). Так же можно сделать методом рекурсивного спуска. Этот алгоритм(точнее метод и код) описан в книге "Г.Шилдт - Полный справочник по С#" в самом конце.
Набрал код по книге "Г.Шилдт - Полный справочник по С#". Выходит ошибка с выражение "exp". Посмотри пожалуйста в чем ошибка. Может я не правильно строю консольное приложение?
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
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
//класс исключающий для ошибок для анализатора
    class ParserException : ApplicationException
    {
        public ParserException(string str) : base(str) { }
        public override string ToString()
        { return Message; }
    }
 
    class Parser
    {
        //перчисляем типы лексем.
        enum Types { NONE, DELIMITER, VARIABLE, NUMBER };
        // Перечисляем типы ошибок.
        enum Errors { SYNTAX, UNBALPARENS, NOEXP, DIVBYZERO };
 
        string ехр; // Ссылка на строку выражения,
        int expIdx; // Текущий индекс в выражении,
        string token; // Текущая лексема.
        Types tokType; // Тип лексемы.
 
        // Массив для переменных,
        double[] vars = new double[26];
 
        public Parser()
        {
            // Инициализируем переменные нулевыми значениями.
            for (int i = 0; i < vars.Length; i++)
                vars[i] = 0.0;
        }
        // Входная точка анализатора.
        public double Evaluate(string expstr)
        {
            double result;
            exp = expstr;
            expIdx = 0;
            try
            {
                GetToken();
                if (token == "")
                {
                    SyntaxErr(Errors.NOEXP); // Выражение отсутствует,
                    return 0.0;
                }
                EvalExp1(out result); // В этом варианте анализатора
                // сначала вызывается
                // метод EvalExpl().
                if (token != "") // Последняя лексема должна
                    // быть нулевой.
                    SyntaxErr(Errors.SYNTAX);
                return result;
            }
            catch (ParserException exc)
            {
                // При желании добавляем здесь обработку ошибок.
                Console.WriteLine(exc);
                return 0.0;
            }
        }
 
        // Обрабатываем присвоение,
        void EvalExp1(out double result)
        {
            int varIdx;
            Types ttokType;
            string temptoken;
            if (tokType == Types.VARIABLE)
            {
                // Сохраняем старую лексему,
                temptoken = String.Copy(token);
                ttokType = tokType;
                // Вычисляем индекс переменной,
                varIdx = Char.ToUpper(token[0]) - 'A';
                GetToken();
                if (token != "=")
                {
                    PutBack();// Возвращаем текущую лексему в поток
                    //и восстанавливаем старую,
                    // поскольку отсутствует присвоение.
                    token = String.Copy(temptoken);
                    tokType = ttokType;
                }
                else
                {
                    GetToken();// Получаем следующую часть
                    // выражения ехр.
                    EvalExp2(out result);
                    vars[varIdx] = result;
                    return;
                }
            }
 
            EvalExp2(out result);
        }
 
        // Складываем или вычитаем два члена выражения.
        void EvalExp2(out double result)
        {
            string op;
            double partialResult;
 
            EvalExp3(out result);
            while ((op = token) == "+" || op == "-")
            {
                GetToken();
                EvalExp3(out partialResult);
                switch (op)
                {
                    case "-":
                        result = result - partialResult;
                        break;
                    case "+":
                        result = result + partialResult;
                        break;
                }
            }
        }
 
        // Выполняем умножение или деление двух множителей.
        void EvalExp3(out double result)
        {
            string op;
            double partialResult = 0.0;
            EvalExp4(out result);
            while ((op = token) == "*" || op == "/" || op == "%")
            {
                GetToken();
                EvalExp4(out partialResult);
                switch (op)
                {
                    case "*":
                        result = result * partialResult;
                        break;
                    case "/":
                        if (partialResult == 0.0)
                            SyntaxErr(Errors.DIVBYZERO);
                        result = result / partialResult;
                        break;
                    case "%":
                        if (partialResult == 0.0)
                            SyntaxErr(Errors.DIVBYZERO);
                        result = (int)result % (int)partialResult;
                }
            }
        }
 
        // выполняем возведение в степень
        void EvalExp4(out double result)
        {
            double partialResult, ex;
            int t;
            EvalExp5(out result);
            if (token == "^")
            {
                GetToken();
                EvalExp4(out partialResult);
                ex = result;
                if (partialResult == 0.0)
                {
                    result = 1.0;
                    return;
                }
                for (t = (int)partialResult - 1; t > 0; t--)
                    result = result * (double)ex;
            }
        }
        // Выполненяем операцию унарного + или -.
        void EvalExp5(out double result)
        {
            string op;
 
            op = "";
            if ((tokType == Types.DELIMITER) && token == "+" || token == "-")
            {
                op = token;
                GetToken();
            }
            EvalExp6(out result);
            if (op == "-") result = -result;
        }
 
        // обрабатываем выражение в круглых скобках
        void EvalExp6(out double result)
        {
            if ((token == "("))
            {
                GetToken();
                EvalExp2(out result);
                if (token != ")")
                    SyntaxErr(Errors.UNBALPARENS);
                GetToken();
            }
            else Atom(out result);
        }
        // Получаем значение числа или переменной.
        void Atom(out double result)
        {
            switch (tokType)
            {
                case Types.NUMBER:
                    try
                    {
                        result = Double.Parse(token);
                    }
                    catch (FormatException)
                    {
                        result = 0.0;
                        SyntaxErr(Errors.SYNTAX);
                    }
                    GetToken();
                    return;
                case Types.VARIABLE:
                    result = FindVar(token);
                    GetToken();
                    return;
                default:
                    result = 0.0;
                    SyntaxErr(Errors.SYNTAX);
                    break;
            }
        }
        // Возвращаем значение переменной.
        double FindVar(string vname)
        {
            if (!Char.IsLetter(vname[0]))
            {
                SyntaxErr(Errors.SYNTAX);
                return 0.0;
            }
            return vars[Char.ToUpper(vname[0])-'A'];
        }
        // Возвращаем лексему во входной поток.
        void PutBack()
        {
            for (int i = 0; i < token.Length; i++) expIdx--;
        }
        // Обрабатываем синтаксическую ошибку
        void SyntaxErr(Errors error)
        {
            string[] err ={
                         "Синтаксическая оошибка",
                         "Дисбаланс скобок",
                         "Выражение отсутствет",
                         "Деление на нуль"};
            throw new ParserException(err[(int)error]);
        }
        // получем следующую лексему.
        void GetToken()
        {            
            tokType = Types.NONE;
            token = "";
            if (expIdx == exp.Length) return; // Конец выражения.
            // Опускаем пробел.
            while (expldx < exp.Length && Char.IsWhiteSpace(exp[expIdx])) ++expIdx;
            // Хвостовой пробел завершает выражение.
            if (expIdx == exp.Length) return;
            if (IsDelim(exp[expIdx]))
            {
                token += exp[expIdx];
                expIdx++;
                tokType = Types.DELIMITER;
            }
            else if (Char.IsLetter(exp[expIdx]))
            { 
                // Это переменная?
                while (!IsDelim(exp[expIdx]))
                {
                    token += exp[expIdx];
                    expIdx++;
                    if (expIdx >= exp.Length) break;
                }
                tokType = Types.VARIABLE;
            }
            else if (Char.IsDigit(exp[expIdx]))
            { 
                // Это число?
                while (!IsDelim(exp[expIdx]))
                {
                    token += exp[expIdx];
                    expIdx++;
                    if (expIdx >= exp.Length) break;
                }
                tokType = Types.NUMBER;
            }
        }
        // Метод возвращает значение true,
        // если с -- разделитель.
        bool IsDelim(char c)
        {
            if (("+-/*%^=()".IndexOf(c) != -1))
                return true;
            return false;
        }
    }
1
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
17.04.2012, 14:34
Я сам себе сейчас скопировал всё это, и правда почему то внутри метода недоступна эта переменная.Изменил название на expIdx1 и всё норм стало.
0
1 / 1 / 0
Регистрация: 16.04.2012
Сообщений: 29
17.04.2012, 16:09  [ТС]
Цитата Сообщение от NowMatrix Посмотреть сообщение
Я сам себе сейчас скопировал всё это, и правда почему то внутри метода недоступна эта переменная.Изменил название на expIdx1 и всё норм стало.
Можешь мне свой проект передать?
0
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
17.04.2012, 16:23
Я не стал исправлять ничего дальше. В 16 строке твоего листинга,переименуй переменную,ну и следовательно во всём проекте,где она встречается.
0
1 / 1 / 0
Регистрация: 16.04.2012
Сообщений: 29
18.04.2012, 01:01  [ТС]
Разобрался в своей ошибке. Оказывается перепутал переменную с кириллицей. Выкладываю код, может кому то и пригодится
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
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace CalcTrans
{
    class Program
    {
        static void Main(string[] args)
        {
            string expr;
            Parser p = new Parser();
 
            Console.WriteLine("Для выхода из программы введите пустое выражение. ");
 
            for (; ; )
            {
                Console.Write("Введите выражение: ");
                expr = Console.ReadLine();
                if (expr == "") break;
                Console.WriteLine("Результат: " + p.Evaluate(expr));
            } 
        }
        //класс исключающий для ошибок для анализатора
        class ParserException : ApplicationException
        {
            public ParserException(string str) : base(str) { }
            public override string ToString()
            { return Message; }
        }
 
        class Parser
        {
            //перчисляем типы лексем.
            enum Types { NONE, DELIMITER, VARIABLE, NUMBER };
            // Перечисляем типы ошибок.
            enum Errors { SYNTAX, UNBALPARENS, NOEXP, DIVBYZERO };
 
            string exp; // Ссылка на строку выражения,
            int expIdx; // Текущий индекс в выражении,
            string token; // Текущая лексема.
            Types tokType; // Тип лексемы.
 
            // Массив для переменных,
            double[] vars = new double[26];
 
            public Parser()
            {
                // Инициализируем переменные нулевыми значениями.
                for (int i = 0; i < vars.Length; i++)
                    vars[i] = 0.0;
            }
            // Входная точка анализатора.
            public double Evaluate(string expstr)
            {
                double result;
                exp = expstr;
                expIdx = 0;
                try
                {
                    GetToken();
                    if (token == "")
                    {
                        SyntaxErr(Errors.NOEXP); // Выражение отсутствует,
                        return 0.0;
                    }
                    EvalExp1(out result); // В этом варианте анализатора
                    // сначала вызывается
                    // метод EvalExpl().
                    if (token != "") // Последняя лексема должна
                        // быть нулевой.
                        SyntaxErr(Errors.SYNTAX);
                    return result;
                }
                catch (ParserException exc)
                {
                    // При желании добавляем здесь обработку ошибок.
                    Console.WriteLine(exc);
                    return 0.0;
                }
            }
 
            // Обрабатываем присвоение,
            void EvalExp1(out double result)
            {
                int varIdx;
                Types ttokType;
                string temptoken;
                if (tokType == Types.VARIABLE)
                {
                    // Сохраняем старую лексему,
                    temptoken = String.Copy(token);
                    ttokType = tokType;
                    // Вычисляем индекс переменной,
                    varIdx = Char.ToUpper(token[0]) - 'A';
                    GetToken();
                    if (token != "=")
                    {
                        PutBack();// Возвращаем текущую лексему в поток
                        //и восстанавливаем старую,
                        // поскольку отсутствует присвоение.
                        token = String.Copy(temptoken);
                        tokType = ttokType;
                    }
                    else
                    {
                        GetToken();// Получаем следующую часть
                        // выражения ехр.
                        EvalExp2(out result);
                        vars[varIdx] = result;
                        return;
                    }
                }
 
                EvalExp2(out result);
            }
 
            // Складываем или вычитаем два члена выражения.
            void EvalExp2(out double result)
            {
                string op;
                double partialResult;
 
                EvalExp3(out result);
                while ((op = token) == "+" || op == "-")
                {
                    GetToken();
                    EvalExp3(out partialResult);
                    switch (op)
                    {
                        case "-":
                            result = result - partialResult;
                            break;
                        case "+":
                            result = result + partialResult;
                            break;
                    }
                }
            }
 
            // Выполняем умножение или деление двух множителей.
            void EvalExp3(out double result)
            {
                string op;
                double partialResult = 0.0;
                EvalExp4(out result);
                while ((op = token) == "*" || op == "/" || op == "%")
                {
                    GetToken();
                    EvalExp4(out partialResult);
                    switch (op)
                    {
                        case "*":
                            result = result * partialResult;
                            break;
                        case "/":
                            if (partialResult == 0.0)
                                SyntaxErr(Errors.DIVBYZERO);
                            result = result / partialResult;
                            break;
                        case "%":
                            if (partialResult == 0.0)
                                SyntaxErr(Errors.DIVBYZERO);
                            result = (int)result % (int)partialResult;
                            break;
                    }
                }
            }
 
            // выполняем возведение в степень
            void EvalExp4(out double result)
            {
                double partialResult, ex;
                int t;
                EvalExp5(out result);
                if (token == "^")
                {
                    GetToken();
                    EvalExp4(out partialResult);
                    ex = result;
                    if (partialResult == 0.0)
                    {
                        result = 1.0;
                        return;
                    }
                    for (t = (int)partialResult - 1; t > 0; t--)
                        result = result * (double)ex;
                }
            }
            // Выполненяем операцию унарного + или -.
            void EvalExp5(out double result)
            {
                string op;
 
                op = "";
                if ((tokType == Types.DELIMITER) && token == "+" || token == "-")
                {
                    op = token;
                    GetToken();
                }
                EvalExp6(out result);
                if (op == "-") result = -result;
            }
 
            // обрабатываем выражение в круглых скобках
            void EvalExp6(out double result)
            {
                if ((token == "("))
                {
                    GetToken();
                    EvalExp2(out result);
                    if (token != ")")
                        SyntaxErr(Errors.UNBALPARENS);
                    GetToken();
                }
                else Atom(out result);
            }
            // Получаем значение числа или переменной.
            void Atom(out double result)
            {
                switch (tokType)
                {
                    case Types.NUMBER:
                        try
                        {
                            result = Double.Parse(token);
                        }
                        catch (FormatException)
                        {
                            result = 0.0;
                            SyntaxErr(Errors.SYNTAX);
                        }
                        GetToken();
                        return;
                    case Types.VARIABLE:
                        result = FindVar(token);
                        GetToken();
                        return;
                    default:
                        result = 0.0;
                        SyntaxErr(Errors.SYNTAX);
                        break;
                }
            }
            // Возвращаем значение переменной.
            double FindVar(string vname)
            {
                if (!Char.IsLetter(vname[0]))
                {
                    SyntaxErr(Errors.SYNTAX);
                    return 0.0;
                }
                return vars[Char.ToUpper(vname[0]) - 'A'];
            }
            // Возвращаем лексему во входной поток.
            void PutBack()
            {
                for (int i = 0; i < token.Length; i++) expIdx--;
            }
            // Обрабатываем синтаксическую ошибку
            void SyntaxErr(Errors error)
            {
                string[] err ={
                         "Синтаксическая оошибка",
                         "Дисбаланс скобок",
                         "Выражение отсутствет",
                         "Деление на нуль"};
                throw new ParserException(err[(int)error]);
            }
            // получем следующую лексему.
            void GetToken()
            {
                tokType = Types.NONE;
                token = "";
                if (expIdx == exp.Length) return; // Конец выражения.
                // Опускаем пробел.
                while (expIdx < exp.Length && Char.IsWhiteSpace(exp[expIdx])) ++expIdx;
                // Хвостовой пробел завершает выражение.
                if (expIdx == exp.Length) return;
                if (IsDelim(exp[expIdx]))
                {
                    token += exp[expIdx];
                    expIdx++;
                    tokType = Types.DELIMITER;
                }
                else if (Char.IsLetter(exp[expIdx]))
                {
                    // Это переменная?
                    while (!IsDelim(exp[expIdx]))
                    {
                        token += exp[expIdx];
                        expIdx++;
                        if (expIdx >= exp.Length) break;
                    }
                    tokType = Types.VARIABLE;
                }
                else if (Char.IsDigit(exp[expIdx]))
                {
                    // Это число?
                    while (!IsDelim(exp[expIdx]))
                    {
                        token += exp[expIdx];
                        expIdx++;
                        if (expIdx >= exp.Length) break;
                    }
                    tokType = Types.NUMBER;
                }
            }
            // Метод возвращает значение true,
            // если с -- разделитель.
            bool IsDelim(char c)
            {
                if (("+-/*%^=()".IndexOf(c) != -1))
                    return true;
                return false;
            }
        }
    }
}
0
18.04.2012, 01:03

Не по теме:

EVGENYM, главное,чтобы вы сами поняли,что переписали с книги.;)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.04.2012, 01:03
Помогаю со студенческими работами здесь

Синтаксический анализатор для понятия ДНФ
Нужно построить синтаксический анализатор для понятия дизъюнктивная нормальная форма (ДНФ) на С#

TCP/IP Client-Server, упрощенный синтаксический анализатор
Пишу TCP/IP Client-Server, упрощенный синтаксический анализатор для проверки прoцeдуры пacкаля. Подскажите, как переделать программу,...

Синтаксический анализатор (проверка на наличие русских букв)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Теория языков программирования. Лексическо-синтаксический анализатор (доработка существующей программы)
Здравствуйте. Хочу попросить помощь с программой по ТЯП. Тут лежит само задание. У меня есть исходный код ( - с# (MS VS 2010)), но...

Упрощенный синтаксический анализатор(для проверки методов/функций) используя регулярные выражения
Нужно написать метод, регулярное выражение, на С#, который будет проверять правильность ввода процедуры(Pascal). Буду очень благодарен...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru