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

Архитектура консольного калькулятора

26.08.2021, 06:02. Показов 2621. Ответов 9

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Подскажите, как будет правильно?
Поясню, с точки зрения архитектуры, в модели, мы располагаем данные и основную логику программы. Следовательно, блок с набором команд нужно разместить в модели. Или, все-таки Command оставить отдельно? Может быть этот блок вообще вынести в отельную библиотеку?

p.s. не обращайте внимания на то что это WPF, код будет перенесен в консоль
Миниатюры
Архитектура консольного калькулятора  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.08.2021, 06:02
Ответы с готовыми решениями:

Прошу покритиковать код моего консольного калькулятора
Прошу покритиковать код моего консольного калькулятор. Также я не уверен, что правильно организовал исключительные ситуации. Калькулятор...

Создание консольного калькулятора
Товарищи!:) Помоги пожалуйста несчастной студентке)) Мне нужно создать простой консольный калькулятор. Программа на в параметрах...

Создание консольного калькулятора
Мне задали курсовой проэкт спрограмирования...Нужно на С++ НЕ ИСПОЛЬЗУЯ WINDOWS FORM создать калькулятор, помогите пожалуйста.

9
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
26.08.2021, 09:22
m054, ICommand - это интерфейс для биндинга действия кнопки на какую то команду в mvvm. Вам в консоли они вообще не нужны, ибо нечего биндить. Вам больше подойдет классический mvc без всяких биндингов.
Цитата Сообщение от m054 Посмотреть сообщение
блок с набором команд нужно разместить в модели
только не команды, а просто методы с арифметическими операциями

Добавлено через 5 минут
Вообще, если у вас не задание на архитектурные шаблоны, то будет достаточно сделать класс Calculator со всеми операциями и вызывать его прямо из консоли.
0
50 / 24 / 8
Регистрация: 11.08.2020
Сообщений: 98
26.08.2021, 10:00
Не думаю, что тут модель вообще нужна. Мне сложно представить какие модели данных могут понадобиться для калькулятора (конечно могу быть и не прав).
Модель должна описывать какую-либо сущность. К примеру у прямоугольника есть длина и ширина, получится класс Rectangle с полями length и width. Так же модель может содержать обработку своих данных, вроде получения площади. А деление площади на пополам уже к модели относиться не может.
Так и тут обработчики команд запихивать в папку Models будет неправильно.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3414 / 2735 / 575
Регистрация: 04.09.2018
Сообщений: 8,585
Записей в блоге: 3
26.08.2021, 13:58
Rosgard, ваша модель и есть некий класс "Calculator", в котором заключается вся логика обсчета (т.н. бизнес-логика). Этот класс не должен зависеть от типа программы: консоль или винформ, т.е. должен работать везде.
В качестве интерфейса в данном случае выступает консоль. Это будет типа "View". Она должна уметь работать с моделью, т.е. с вашим классом "Calculator": вводить данные и выводить результат операций.
1
50 / 24 / 8
Регистрация: 11.08.2020
Сообщений: 98
26.08.2021, 14:08
wizard41, это не модель, а бэкэнд. Я говорю про MVVM, MVC и т.д.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3414 / 2735 / 575
Регистрация: 04.09.2018
Сообщений: 8,585
Записей в блоге: 3
26.08.2021, 14:15
Цитата Сообщение от Rosgard Посмотреть сообщение
Я говорю про MVVM
расскажите ваше видение MVVM в консоли... ?
0
50 / 24 / 8
Регистрация: 11.08.2020
Сообщений: 98
26.08.2021, 14:44
wizard41, вот к словам придираться не обязательно. И так понятно, что имелась в виду архитектура в целом, независимо от названия и технологий, в которых она применима.
В своем сообщении вы попытались объединить модель данных и логику работы с ней, назвав это все моделью. Это тоже самое, что объединить model и viewModel в mvvm, или model и controller в mvc.

Калькулятор слишком прост, чтобы писать его используя архитектурные шаблоны. Но даже так логика работы приложения не может называться моделью, если она не производит работу с данными этой модели, которые содержатся в полях и/или свойствах.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3414 / 2735 / 575
Регистрация: 04.09.2018
Сообщений: 8,585
Записей в блоге: 3
26.08.2021, 15:29
Цитата Сообщение от Rosgard Посмотреть сообщение
В своем сообщении вы попытались объединить модель данных и логику работы с ней, назвав это все моделью
Где вы это узрели? Покажите конкретное место.
Цитата Сообщение от Rosgard Посмотреть сообщение
если она не производит работу с данными этой модели, которые содержатся в полях и/или свойствах.
Так я о чем?

Добавлено через 6 минут
Ваш класс - это модель. Сделайте еще прослойку типа контроллера - в нем проверяйте корректность ввода чисел. Сделайте "view" с двумя методами, собсно Console.ReadLine и Console.Write.
Не важно каким образом будут вводиться и выводится данные; ваш класс (модель) должен уметь обрабатывать их везде.
1
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,075
27.08.2021, 14:01
MVC:
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
using System;
using System.Collections.Generic;
public class View {
  public static void Main() {
    CommandOrModel model = new CommandOrModel();
    Controller controller = new Controller(model);  
  }
}
class Controller{
    private char symbol;
    public char Symbol{get{return symbol;}set{symbol = value;}}
    private string num;
    private double result;
    CommandOrModel mod;
    List<char> commands = new List<char>();
    List<double> nums = new List<double>();
    public Controller(CommandOrModel model){
        model.operation += Summa;
        mod = model;
        while(true){
            char symbol = char.Parse(Console.ReadLine());
            switch(char.IsDigit(symbol)){
                case true :
                num += symbol; 
                break;
                case false :    
                if(result == 0) result = double.Parse(num);
                else nums.Add(double.Parse(num));
                num = string.Empty;
                if(symbol != '='){
                    commands.Add(symbol);
                }
                break;
            }
            if(symbol == '='){
                for(int i = 0; i < commands.Count; i++){
                    Symbol = commands[i];
                    model.operation.Invoke(nums[i]);
                }
                nums.Clear();
                commands.Clear();
                Console.WriteLine(result);
                result = 0;
            }
        }
    }
    public void Summa(double n){
        switch(symbol){
            case '/' :
            result /= n;
            break;
            case '*' :
            result *= n;
            break;
            case '-' :
            result -= n;
            break;
            case '+' :
            result += n;
            break;
        }
    }
}
class CommandOrModel{
    public delegate void Operation(double n);
    public Operation operation;
}
0
 Аватар для roach1967
983 / 463 / 233
Регистрация: 27.06.2014
Сообщений: 1,033
29.08.2021, 20:09
Для развития навыков как-то решил написать калькулятор а-ля БЛОКНОТ. В результате появилось такое решение:
Calculate.cs
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
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
using System;
using System.Collections.Generic;
 
// 0 - целое число
// 1 - вещественное число, на самом деле все числа double
// 3 - +
// 4 - -
// 5 - *
// 6 - /
// 7 - % целочисленное деление
// 8 - \ остаток от деления
// 9 - ^ возведение в степень
// математическая функция:
// 10 - sin
// 11 - cos
// 12 - tan
// 13 - ctn
// 14 - ln
// 15 - lg
// 16 - sqrt
// 17 - Pi()
// 128 - : присвоить однобуквенной переменной значение (для будущего релиза...)
// 129 - пользовательская переменная (a-z) (для будущего релиза...)
// 252 - ? вывести значения задействованных пользовательских переменных (для будущего релиза...)
// 253 - (
// 254 - )
// 255 - null
 
namespace NoteCalcCon
{
    public class Calculate
    {
        public struct TypeSPN
        {
            public double numeric;
            public byte typerec;
            public int level;
        }
        //public static double[] MyValue = new double[32]; // Для своих переменных (a-z)(ещё не реализовано)
        private const int maxOpers = 32; // максимальное количество элементов
        private const string operstr = "+-*/()%\\^="; // математические односимвольные операторы
                                                      // Эти символы/строки для вывода исходной строки после парсинга для WinForm приложения
        public readonly static string[] opers = { "_", "_", "_", "+", "-", "*", "/", "%", "\\", "^", "sin", "cos", "tan", "ctn", "ln", "lg", "sqrt", "Pi" };
        private static int levelHead; // начало вложенного уровня (левая скобка)
        private static int levelTail; // конец вложенного уровня (правая скобка)
                                      // разобранная по функциональности строка
        private static List<TypeSPN> ALSPSN, BFSPSN;
        private static bool flagNoError;
 
        public static List<TypeSPN> Parsing(string inpstr)
        {
            List<TypeSPN> alspsn = new List<TypeSPN>();
            string[] spns = PrePars(inpstr);
            int lvl = 0;
            int i = 0;
            while (i < maxOpers && spns[i] != "")
            {
                TypeSPN SPNS = new TypeSPN
                {
                    numeric = 0,
                    level = lvl,
                    typerec = 255
                };
                if (IsDigsInt(spns[i]))
                {
                    SPNS.numeric = double.Parse(spns[i]);
                    SPNS.typerec = 0;
                }
                else if (IsDigsDouble(spns[i]))
                {
                    SPNS.numeric = double.Parse(spns[i]);
                    SPNS.typerec = 1;
                }
                else if (spns[i].Length == 1)
                {
                    switch (spns[i])
                    {
                        case "+":
                            SPNS.typerec = 3;
                            break;
                        case "-":
                            SPNS.typerec = 4;
                            break;
                        case "*":
                            SPNS.typerec = 5;
                            break;
                        case "/":
                            SPNS.typerec = 6;
                            break;
                        case "%":
                            SPNS.typerec = 7;
                            break;
                        case "\\":
                            SPNS.typerec = 8;
                            break;
                        case "^":
                            SPNS.typerec = 9;
                            break;
                        case "(":
                            SPNS.typerec = 253;
                            lvl++;
                            SPNS.level = lvl;
                            break;
                        case ")":
                            SPNS.typerec = 254;
                            lvl--;
                            break;
                        default:
                            SPNS.typerec = 255;
                            flagNoError = false;
                            break;
                    }
                }
                else
                {
                    switch (spns[i])
                    {
                        case "sin":
                            SPNS.typerec = 10;
                            break;
                        case "cos":
                            SPNS.typerec = 11;
                            break;
                        case "tan":
                            SPNS.typerec = 12;
                            break;
                        case "ctn":
                            SPNS.typerec = 13;
                            break;
                        case "ln":
                            SPNS.typerec = 14;
                            break;
                        case "lg":
                            SPNS.typerec = 15;
                            break;
                        case "sqrt":
                            SPNS.typerec = 16;
                            break;
                        case "pi":
                            SPNS.typerec = 17;
                            break;
                        default:
                            SPNS.typerec = 255;
                            flagNoError = false;
                            break;
                    }
                }
                if (SPNS.typerec != 255)
                {
                    alspsn.Add(SPNS);
                }
                i++;
            }
            return alspsn;
        }
        public static bool Solve(string inpstr, out double otvet)
        {
            ALSPSN = Parsing(inpstr);
            BFSPSN = new List<TypeSPN>();
            // Скопируем весь массив элементов для вывода исходного выражения.
            for (int i = 0; i < ALSPSN.Count; i++)
            {
                BFSPSN.Add(ALSPSN[i]);
            }
            if (flagNoError)
            {
                int level = 999; // Уровень вложенности скобок.
                while (level > 0)
                {
                    levelHead = 0;
                    levelTail = ALSPSN.Count - 1;
                    bool flgTail = false;
                    level = 0;
                    // Находим самый верхний уровень вложенности и запоминаем позиции открывающей и закрывающей скобок.
                    for (int i = 0; i < ALSPSN.Count; i++)
                    {
                        if (ALSPSN[i].level > level)
                        {
                            level = ALSPSN[i].level;
                            levelHead = i;
                            flgTail = true;
                        }
                        if ((ALSPSN[i].level < level) && flgTail)
                        {
                            levelTail = i - 1;
                            flgTail = false;
                        }
                    }
                    if (level > 0)
                    {
                        TypeSPN tms = CalcLevel(levelHead, levelTail, ALSPSN); // Расчитаем выражение внутри скобок
                        tms.level = level - 1; // Понизим уровень вложенности
                        tms.typerec = 1;
                        ALSPSN[levelTail] = tms; // Ответ записали на место хвоста
                        for (int i = levelHead; i < levelTail; i++)
                        {
                            ALSPSN.RemoveAt(levelHead); // Всё остальное от головы до хвоста удаляем.
                        }
                    }
                    else
                    {
                        // А вот здесь всё выражение не имеет скобок и голова должна указывать на первый элемент, а хвост на последний
                        // Надо как-то проверить :(
                        TypeSPN tms = CalcLevel(levelHead, levelTail, ALSPSN);
                        ALSPSN[levelTail] = tms;
                        for (int i = levelHead; i < levelTail; i++)
                        {
                            ALSPSN.RemoveAt(levelHead);
                        }
                    }
                }
                otvet = ALSPSN[0].numeric;
                return true;
            }
            else
            {
                otvet = 0;
                return false;
            }
        }
        private static string[] PrePars(string inpstr)
        {
            // Разбираем полученную строку на числа и операторы/функции. Пока только в строковых словах
            string[] tmst = new string[maxOpers];
            flagNoError = true;
            for (int i = 0; i < maxOpers; i++)
            {
                tmst[i] = "";
            }
            char predchar = ' ';
            int curpos = 0;
            int curoper = 0;
            while (curpos < inpstr.Length)
            {
                char curchar = inpstr[curpos];
                if (curchar != ' ' && operstr.IndexOf(curchar) < 0)
                {
                    // Если не пробел и не математический оператор, то либо число, либо имя функции
                    tmst[curoper] += char.ToLower(curchar);
                    predchar = curchar;
                }
                else if (operstr.IndexOf(curchar) >= 0)
                {
                    // Если математический оператор, смотрим, не пустое-ли текущее слово. Иначе будет следующее слово
                    if (tmst[curoper] != "")
                    {
                        curoper++;
                    }
                    if (curpos == 0 && curchar == '-')
                    {
                        tmst[0] = "-";
                    }
                    else if (curpos > 1 && curchar == '-' && operstr.IndexOf(predchar) >= 0)
                    {
                        tmst[curoper] = "-";
                        predchar = '-';
                    }
                    else if (curpos > 1 && curchar == '-' && operstr.IndexOf(predchar) < 0)
                    {
                        tmst[curoper] = "-";
                        curoper++;
                    }
                    else
                    {
                        tmst[curoper] = curchar.ToString();
                        predchar = curchar;
                        curoper++;
                    }
                }
                else
                {
                    // Сюда попадаем в случае пробела. Просто переходим на новое слово
                    if (tmst[curoper] != "")
                    {
                        curoper++;
                    }
                }
                curpos++;
            }
            return tmst;
        }
        private static bool IsDigsDouble(string instr)
        {
            bool flag = double.TryParse(instr, out _);
            return flag;
        }
        private static bool IsDigsInt(string instr)
        {
            bool flag = int.TryParse(instr, out _);
            return flag;
        }
        private static TypeSPN CalcLevel(int Head, int Tail, List<TypeSPN> spsn)
        {
            // Расчёт полученного уровня вложенности.
            // Голова указывает на открывающую скобку, хвост - на закрывающую.
            double nn1 = 0, nn2 = 0;
            List<TypeSPN> mySPNs = new List<TypeSPN>();
            for (int i = Head; i <= Tail; i++)
            {
                if (spsn[i].typerec < 250)
                {
                    mySPNs.Add(spsn[i]);
                }
            }
            try
            {
                while (mySPNs.Count > 1)
                {
                    byte maxOper = 0;
                    int posOper = 0;
 
                    for (int i = 0; i < mySPNs.Count; i++)
                    {
                        if (maxOper < mySPNs[i].typerec)
                        {
                            maxOper = mySPNs[i].typerec;
                            posOper = i;
                        }
                    }
                    if (maxOper < 10 && maxOper > 1)
                    {
                        if (mySPNs[posOper - 1].typerec < 3)
                        {
                            nn1 = mySPNs[posOper - 1].numeric;
                        }
                        if (mySPNs[posOper + 1].typerec < 3)
                        {
                            nn2 = mySPNs[posOper + 1].numeric;
                        }
                        TypeSPN tms = new TypeSPN()
                        {
                            numeric = Calcul(nn1, maxOper, nn2),
                            typerec = 1,
                            level = mySPNs[posOper].level
                        };
                        mySPNs[posOper] = tms;
                        mySPNs.RemoveAt(posOper + 1);
                        mySPNs.RemoveAt(posOper - 1);
                    }
                    else if (maxOper >= 10 && maxOper < 17)
                    {
                        if (mySPNs[posOper + 1].typerec < 3)
                        {
                            nn1 = mySPNs[posOper + 1].numeric;
                        }
                        TypeSPN tms = new TypeSPN()
                        {
                            numeric = Calcul(nn1, maxOper, nn2),
                            typerec = 1,
                            level = mySPNs[posOper].level
                        };
                        mySPNs[posOper] = tms;
                        mySPNs.RemoveAt(posOper + 1);
                    }
                    else
                    {
                        TypeSPN tms = new TypeSPN()
                        {
                            numeric = Calcul(nn1, maxOper, nn2),
                            typerec = 1,
                            level = mySPNs[posOper].level
                        };
                        mySPNs[posOper] = tms;
                    }
                }
            }
            catch (Exception err)
            {
                //_ = MessageBox.Show($"Какая-то ошибка - {err}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Console.WriteLine($"Какая-то ошибка - {err}");
            }
            TypeSPN res = new TypeSPN
            {
                numeric = 0,
                typerec = 0,
                level = 0
            };
            if (mySPNs.Count != 0)
            {
                res = mySPNs[0];
            }
            else
            {
                flagNoError = false;
            }
 
            return res;
        }
        private static double Calcul(double num1, byte oper, double num2)
        {
            double result = 0d;
            switch (oper)
            {
                case 3:
                    result = num1 + num2;
                    break;
                case 4:
                    result = num1 - num2;
                    break;
                case 5:
                    result = num1 * num2;
                    break;
                case 6:
                    try
                    {
                        if (num2 != 0)
                        {
                            result = num1 / num2;
                        }
                        else
                        {
                            flagNoError = false;
                        }
                    }
                    catch (Exception err)
                    {
                        //_ = MessageBox.Show($"Деление на ноль!\n{err}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        Console.WriteLine($"Деление на ноль! - {err}");
                        flagNoError = false;
                    }
                    break;
                case 7:
                    if (num2 != 0)
                    {
                        while (num1 > num2)
                        {
                            num1 -= num2;
                            result += 1d;
                        }
                    }
                    else
                    {
                        flagNoError = false;
                    }
                    break;
                case 8:
                    if (num2 != 0)
                    {
                        while (num1 >= num2)
                        {
                            num1 -= num2;
                        }
                        result = num1;
                    }
                    else
                    {
                        flagNoError = false;
                    }
                    break;
                case 9:
                    result = Math.Pow(num1, num2);
                    break;
                case 10:
                    result = Math.Sin(num1);
                    break;
                case 11:
                    result = Math.Cos(num1);
                    break;
                case 12:
                    result = Math.Tan(num1);
                    break;
                case 13:
                    if (num1 != 0)
                    {
                        result = 1 / Math.Tan(num1);
                    }
                    else
                    {
                        flagNoError = false;
                    }
                    break;
                case 14:
                    if (num1 >= 0)
                    {
                        result = Math.Log(num1);
                    }
                    else
                    {
                        flagNoError = false;
                    }
                    break;
                case 15:
                    if (num1 >= 0)
                    {
                        result = Math.Log10(num1);
                    }
                    else
                    {
                        flagNoError = false;
                    }
                    break;
                case 16:
                    if (num1 >= 0)
                    {
                        result = Math.Sqrt(num1);
                    }
                    else
                    {
                        flagNoError = false;
                    }
                    break;
                case 17:
                    result = Math.PI;
                    break;
                default:
                    result = 0d;
                    break;
            }
            return result;
        }
    }
 
}
Писал для Windows Form, но вот такое применение для консоли:
Program.cs
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
using System;
 
namespace NoteCalcCon
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Введите выражение (для выхода - 0)");
            string stro = "";
            while (stro != "0")
            {
                stro = Console.ReadLine();
                if (Calculate.Solve(stro, out double otvet))
                {
                    Console.WriteLine($"{stro} = {otvet}");
                }
                else
                {
                    Console.WriteLine($"{stro} - где-то ошибка!");
                }
            }
        }
    }
 
}

Не по теме:


Кстати, не подскажите, почему размер консольного приложения чуть-ли не в 10 раз больше WinForm?



Добавлено через 19 минут
Применять так:
Code
1
2
3
4
5
6
Введите выражение (для выхода - 0)
(321.654987-123.46579)*cos(pi/6)
(321.654987-123.46579)*cos(pi/6) = 171.63687935763866
ln(2.7182818284^2.5)
ln(2.7182818284^2.5) = 2.499999999945696
0
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.08.2021, 20:09
Помогаю со студенческими работами здесь

Написание консольного строкового калькулятора
Сконструировать простой консольный калькулятор, который осуществляет сложение, вычитание, умножение и деление. Выражения для вычисления...

Создание консольного валютного калькулятора
С чего и как начать? 1-Создайте файл программы valjuta.xml, которая является переменной состояния, покупка и продажа цена (данные брать...

Реализация консольного калькулятора с обработкой строк
Реализация консольного калькулятора с обработкой строк. Помогите чем кто может, заранее спасибо:)

Оцените, пожалуйста, качество кода разговаривающего консольного калькулятора
Доброго времени суток! Оцените, пожалуйста, мой код разговаривающего консольного калькулятора. Немного о коде. Пытался в ООП;...

В указанном dsn архитектура драйвера и архитектура приложения не соответствуют друг другу
Добрый день. При запуске программы выскакивает вот такая вот ошибка. В чем может быть проблема и как ее исправить?


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru