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

Реорганизовать код: вызовы методов в зависимости от условий

16.07.2015, 15:45. Показов 3447. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте
Опыт в программировании небольшой, код получается достаточно раздутый, написал конструкцию достаточно простую, но кажется что её можно оформить более лаконично подскажите пожалуйста как это сделать:
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
 private double[] td = new double[14];
        public int TDOUT (ref double[] IN,string pair)
        {
            td = IN; //записывааем исходные значения
            if (pair=="pw")
            {
                int temp = PW();
                if (temp == 0)
                {
                    IN = td;
                    return temp;
                }
                else return temp;
            }
            if (pair == "pst")
            {
                int temp = PST();
                if (temp == 0)
                {
                    IN = td;
                    return temp;
                }
                else return temp;
            }
            if (pair == "tw")
            {
                int temp = TW();
                if (temp == 0)
                {
                    IN = td;
                    return temp;
                }
                else return temp;
            }
            if (pair == "tst")
            {
                int temp = TST();
                if (temp == 0)
                {
                    IN = td;
                    return temp;
                }
                else return temp;
            }
            if (pair == "pt")
            {
                int temp = PT();
                if (temp == 0)
                {
                    IN = td;
                    return temp;
                }
                else return temp;
            }
            if (pair == "ph")
            {
                int temp = PH();
                if (temp == 0)
                {
                    IN = td;
                    return temp;
                }
                else return temp;
            }
            return 2;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.07.2015, 15:45
Ответы с готовыми решениями:

Вызовы методов из разных потоков
Вдруг внезапно встал вопрос по вызову методов из разных потоков. Мне казалось что такой проблемы быть не должно но она почему-то есть. Есть...

Управляемый цикл через вызовы методов класса
Предположим есть такой класс: class A: def __init__(self, elem): self.elem = elem def push(self): ...

Программа работает, но не получается реорганизовать код
Собственно говоря, само задание(см. скрин) Я хочу убрать метод и поле NOK с класса Number, так как нецелесообразно получается, хочу...

25
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
16.07.2015, 15:55
Лучший ответ Сообщение было отмечено alspav как решение

Решение

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
        public int TDOUT(ref double[] IN, string pair)
        {
            td = IN; //записывааем исходные значения
            int temp;
            switch (pair)
            {
                case "pw":
                    temp = PW();
                    break;
                case "pst":
                    temp = PST();
                    break;
                case "tw":
                    temp = TW();
                    break;
                case "tst":
                    temp = TST();
                    break;
                case "pt":
                    temp = PT();
                    break;
                case "ph":
                    temp = PH();
                    break;
                default:
                    return 2;
            }
 
            if (temp == 0)
                IN = td;
 
            return temp;
        }
1
 Аватар для alspav
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 41
16.07.2015, 15:57  [ТС]
спасибо, совсем забыл про этот оператор.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.07.2015, 15:58
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
    public int TDOUT(ref double[] IN, string pair)
    {
        td = IN; //записывааем исходные значения
        Func<int> func = GetFunc(pair);
        if (func == null)
            return 2;
        int temp = func();
        if (temp == 0)
        {
            IN = td;
        }
        return temp;
    }
 
    private Func<int> GetFunc(string pair)
    {
        switch (pair)
        {
            case "pw":
                return PW;
            case "pst":
                return PST;
            case "tw":
                return TW;
            //..и так далее для всех функций
 
            default:
                return null;
        }
    }
0
20 / 20 / 6
Регистрация: 04.07.2012
Сообщений: 73
16.07.2015, 15:59
Ну во-первых надо глянуть в сторону оператора switch, а во-вторых покажите методы PW(), PST(), TW() и т.д.

Добавлено через 53 секунды
Опоздал)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.07.2015, 16:00
m0nax, не успел, пока удалял всё это дело...

alspav, вам над кодом поработать бы еще, куча глобальных переменных, ref-параметры, всё в перемешку... Короче, если не лаба "сдать-забыть", то головная боль обеспечена в будущем.
0
 Аватар для alspav
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 41
16.07.2015, 16:41  [ТС]
нет не лаба, но програмирую для себя, точнее для перевода рутинных расчетов по работе (тепломеханика, гидравлика) в небольшую программу, скажем так собираю расчеты из справочников и расчеты по термодинамике пара и воды что бы в таблицы не лазить, ну и соответственно на основании термодинамики можно и гидравлику прикинуть и тепломассообмен. (я теплотехник и электрик по образованию и это можно сказать первый опыт написать что то полезное). массив использую для передачи значений из класса который в зависимости от входных параметров делает расчет 12 физических виличин. Там просто много условий по входным параметрам и вызываемые методы как раз проверяют на достоверность(зону определения) и если все хорошо делают расчет записывая в массив, потом этот массив переписывается в вызывающую функцию если нет ошибки. Если передачу выходных параметров можно организовать как то по другому (при разных комбинациях вызова разные входные параметры, но выходной массив всегда однотипен с четко определенными местами для физ. значений) было бы интересно узнать.

Добавлено через 21 минуту
входные значения в метод так же передаются в этом массиве, а какие именно обрабатывать зависит от значения строкойой переменной. лучшего я не придумал. потом все эти расчеты при необходимости записываются в CSV файл прямо из этого массива. Поэтому если есть более простые/правильные/безопасные способы передачи подобных данных подскажите пожалуйста.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.07.2015, 17:02
alspav, тут нужен взгляд в целом, на ситуацию. Просто есть некоторые симптомы, по которым можно сказать, что код не очень хорош. Например, если человек пришел на работу зеленый, а из носа у него постоянно идет кровь, вы наверняка догадаетесь, что с ним что-то не в порядке Но для того, чтобы вылечить это, нужно иметь ситуацию в целом - сдать анализы, обработать их, сделать выводы и исправить... На глазок этого не сделать, хотя определить сам факт "что-то не так" можно.

В вашем случае симптом - это сигнатура метода и первые его несколько строк:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private double[] td = new double[14];
        public int TDOUT (ref double[] IN,string pair)
        {
            td = IN; //записывааем исходные значения
            if (pair=="pw")
            {
                int temp = PW();
                if (temp == 0)
                {
                    IN = td;
                    return temp;
                }
                else return temp;
            }
этого уже достаточно, чтобы сделать такие выводы.
0
 Аватар для alspav
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 41
16.07.2015, 18:07  [ТС]
Ну проект достаточно большой в коде, если есть желание могу скинуть на почту вам глянуть скажите куда прислать

Добавлено через 1 час 2 минуты
Хорошо, а если в место ref использовать только out, а значения получать в именованных ( и если так можно именованных и необязательных, так как входные параметры варьируются от 1 до 3) и уже дальше обрабатывать. Так будет правильнее?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.07.2015, 19:26
Лучший ответ Сообщение было отмечено alspav как решение

Решение

alspav, есть хороший принцип - единой ответственности. То есть метод должен делать что-то одно. У вас тут
1) перезапись глобальных переменных
2) перезапись входных параметров глобальными (это вообще ужас)
3) собственно вычисление результатов.

Последние 2 можно решить, если на выход возвращать класс с несколькими параметрами:

C#
1
2
3
4
5
public KeyValuePair<int, double[]> TDOUT (double[] in, string pair)
{
   //...
   return new KeyValuePair<int, double[]>(temp, temp == 0 ? in : td);
}
Первая сложнее, т.к. раз переменная глобальная, то и развязывать много нужно. В общем метод, который и читает глобальную переменную, и пишет в неё, и еще значения всякие возвращает да еще какие-то функции вычисляет явно пытается усидеть даже не на трех стульях, а больше.

Ну и почитайте code style для шарпа, очень помогает потом разбираться в коде. Вот например я писал в своё время код для сериализации структур, несмотря на то, что там используется очень много кодогенерации непосредственно IL-кода, всё достаточно легко читается. Всё дело именно в code style. Вы через месяц забудете, что писали, поверьте Я сам змейки писал и т.п., не так давно, в качестве учебы, сейчас перечитываю, нихрена не понятно, да еще и говнокод тот еще.

Можете сами оценить:
Кликните здесь для просмотра всего текста
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
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
 
namespace StructInterop
{
    public static class StructInterOp
    {
        static readonly ConstructorInfo IntPtrCtor = typeof(IntPtr).GetConstructor(new[] { typeof(void*) });
        static readonly MethodInfo MarshalCopy = typeof(Marshal).GetMethod("Copy", new[] { typeof(IntPtr), typeof(byte[]), typeof(int), typeof(int) });
        private static class DelegateHolder<T> where T : struct
        {
            // ReSharper disable MemberHidesStaticFromOuterClass
            // ReSharper disable StaticMemberInGenericType
            public static readonly Type TypeOfT = typeof(T);
            public static readonly int SizeInBytes = Marshal.SizeOf(TypeOfT);
 
            public static readonly Func<T, byte[]> Serialize = CreateSerializationDelegate();
            public static readonly Func<byte[], T> Deserialize = CreateDeserializationDelegate();
 
 
            //public static T[] Serialize(T value)
            //{
            //    IntPtr p = new IntPtr(&value);
            //    byte[] result = new byte[sizeof(T)];
            //    Marshal.Copy(p, result, 0, result.Length);
            //    return result;
            //}
            private static Func<T, byte[]> CreateSerializationDelegate()
            {
                var dm = new DynamicMethod("Serialize" + TypeOfT.Name,
                    typeof(byte[]),
                    new[] { TypeOfT },
                    Assembly.GetExecutingAssembly().ManifestModule);
                dm.DefineParameter(1, ParameterAttributes.None, "value");
 
                var generator = dm.GetILGenerator();
                generator.DeclareLocal(typeof(byte[]));
 
                //IntPtr p = new IntPtr(&value);
                generator.Emit(OpCodes.Ldarga_S, (byte)0);
                generator.Emit(OpCodes.Conv_U);
                generator.Emit(OpCodes.Newobj, IntPtrCtor);
 
                //byte[] result = new byte[sizeof(T)]; 
                OpCode ldcStructSize = SizeInBytes < sbyte.MaxValue ? OpCodes.Ldc_I4_S : OpCodes.Ldc_I4;
                generator.Emit(ldcStructSize, SizeInBytes);
                generator.Emit(OpCodes.Newarr, typeof(byte));
 
                //Marshal.Copy(p, result, 0, result.Length);
                generator.Emit(OpCodes.Stloc_0);
                generator.Emit(OpCodes.Ldloc_0);
                generator.Emit(OpCodes.Ldc_I4_0);
                generator.Emit(OpCodes.Ldloc_0);
                generator.Emit(OpCodes.Ldlen);
                generator.Emit(OpCodes.Conv_I4);
                generator.EmitCall(OpCodes.Call, MarshalCopy, null);
 
                //return result
                generator.Emit(OpCodes.Ldloc_0);
                generator.Emit(OpCodes.Ret);
 
                return (Func<T, byte[]>)dm.CreateDelegate(typeof(Func<T, byte[]>));
            }
 
            //public static T Deserialize(byte[] data)
            //{
            //    fixed (byte* pData = &data[0])
            //    {
            //        return *(T*)pData;
            //    }
            //}
            private static Func<byte[], T> CreateDeserializationDelegate()
            {
                var dm = new DynamicMethod("Deserialize" + TypeOfT.Name,
                                            TypeOfT,
                                            new[] { typeof(byte[]) },
                                            Assembly.GetExecutingAssembly().ManifestModule);
                dm.DefineParameter(1, ParameterAttributes.None, "data");
                var generator = dm.GetILGenerator();
                generator.DeclareLocal(typeof(byte).MakePointerType(), pinned: true);
                generator.DeclareLocal(TypeOfT);
 
                //fixed (byte* pData = &data[0])
                generator.Emit(OpCodes.Ldarg_0);
                generator.Emit(OpCodes.Ldc_I4_0);
                generator.Emit(OpCodes.Ldelema, typeof(byte));
                generator.Emit(OpCodes.Stloc_0);
 
                // return *(T*)pData;
                generator.Emit(OpCodes.Ldloc_0);
                generator.Emit(OpCodes.Conv_I);
                generator.Emit(OpCodes.Ldobj, TypeOfT);
                generator.Emit(OpCodes.Ret);
                return (Func<byte[], T>)dm.CreateDelegate(typeof(Func<byte[], T>));
            }
        }
 
 
        /// <summary>
        /// Do not check array bounds, possible buffer overflow
        /// </summary>
        public static T Deserialize<T>(byte[] data) where T : struct
        {
            return DelegateHolder<T>.Deserialize(data);
        }
 
        /// <summary>
        /// Check array bounds
        /// </summary>
        public static T DeserializeSafe<T>(byte[] data) where T : struct
        {
            if (DelegateHolder<T>.SizeInBytes != data.Length)
                throw new ArgumentException(string.Format("Struct size is {0} bytes but array is {1} bytes length", DelegateHolder<T>.SizeInBytes, data.Length));
            return DelegateHolder<T>.Deserialize(data);
        }
 
        /// <summary>
        /// Marshal struct in byte array without any type information
        /// </summary>
        public static byte[] Serialize<T>(this T value) where T : struct
        {
            return DelegateHolder<T>.Serialize(value);
        }
    }
}
1
 Аватар для alspav
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 41
16.07.2015, 19:47  [ТС]
По поводу разделения как раз это и сделано, этот метод является унифицированной точкой через которую отправляется запрос из файла формы с параметрами для вычислений. Идея была какая: метод получает параметры в виде массива сформированного с учетом вычисляемых значений, в зависимости от выбранных параметров в форме, формируется строковая переменная, далее получив значения он передает(вызывает методы в которых выполнен расчет точнее даже не методы а интерфейс методов (там для разных зон разные формулы). Вызванные методы проверяют корректность значений и если все ок вызывается решение, которое и записывается в буферный массив данного класса. отработав метод определенной зоны возвращает 0 - все хорошо или 1-ошибка, если 0 то буферный массив переписывается в исходящий по ref.
Спасибо за помощь.

Добавлено через 3 минуты
Да и это все таки не змейка, поэтому и спрашиваю как правильнее. Пишу расчеты на основе http://www.iapws.org/release.html
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.07.2015, 20:34
alspav, еще раз, я привел пример, как можно разделить. То, что у вас одна точка входа - прекрасно, в любой программе она одна. И любую программу можно привести к каноническому виду. Чем раньше начнете - тем лушче будет.

Впрочем, я уже в нравоучения ударился, так что засим откланяюсь, свою тз я озвучил, на ваш вопрос тоже ответили.
1
 Аватар для 1337trix
23 / 24 / 11
Регистрация: 04.12.2014
Сообщений: 422
16.07.2015, 20:38
По хорошему случаю разбить все на классы\ public int и тд, это же ООП)
0
 Аватар для alspav
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 41
16.07.2015, 20:42  [ТС]
все разбито на классы их уже около 10 шт, из этого я хотел сделать класс через который метод из Form будет обращаться к классам выполняющим расчеты термодинамических характеристик и возвращать результат в виде массива единообразного для любого запроса.
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
16.07.2015, 20:50
не слушай их, пиши как пишется
это же маленькое полезное приложение, а не корпоративная система которую потом будут поддерживать 10 лет 10 разных компаний
http://habrahabr.ru/post/153225/

Добавлено через 2 минуты
если нет времени или лень читать много текста просто прокрути и смотри картинки )
слева это то что предлагают в теме, "как правильно", справа то что у тебя сейчас
1
 Аватар для alspav
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 41
16.07.2015, 23:54  [ТС]
Спасибо прочитал с удовольствием. Я конечно не программист профессиональный, но руководством проектирования крупных строительных объектов занимаюсь давно. И то что там написано это про жизнь . Программирование это скажем так увлечение.

Добавлено через 6 минут
лучшее враг хорошего

Добавлено через 2 часа 40 минут
Вот такое решение более правильное?
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
public TT TDOUT (TT IN,string pair)
        {
            
            TT temp;
            switch (pair)
            {
                case "pw":
                    temp = PW();
                    break;
                case "pst":
                    temp = PST();
                    break;
                case "tw":
                    temp = TW();
                    break;
                case "tst":
                    temp = TST();
                    break;
                case "pt":
                    temp = PT();
                    break;
                case "ph":
                    temp = PH();
                    break;
                default:
                    temp.error = 1;
                    return temp;
            }
            return temp;
        }
 
 
// в отдельном файле сделана структура
struct TT
    {
        public int error;
        public double P;//значение давления
        public double T;//значение температуры
        public double h;//значение энтальпии
        public string PasheState;//фазовое состояние
        public double Po; //плотность
        public double S; //энтропия
        public double Cp;//изобарная теплоемкость
        public double Cv;//изохорная теплоемкость
        public double u;//внутренняя энергия
        public double Wz;//скорость звука в среде
        public double mu;//динамическая вязкость
        public double v;//кинематическая вязкость
        public double lamda;//теплопроводность
        public string strTd;//значение термодинамической таблице в строковой форме для записи в файл
        public string ExcessAbsoluteP;//избыточное или абсолютное давление используется в расчетах
        public string KelCelT;//значение заданное в измерении температуры
        public void SaveString()
        {
            strTd = ExcessAbsoluteP + ';' + string.Concat(P) + ';' + string.Concat(T) + ';' + KelCelT + ';' +
                string.Concat(h) + ';' + PasheState + ';' + string.Concat(Po) + ';' + string.Concat(S) + ';' +
                string.Concat(Cp) + ';' + string.Concat(Cv) + ';' + string.Concat(u) + ';' +
                string.Concat(Wz) + ';' + string.Concat(mu) + ';' + string.Concat(v) + ';' + string.Concat(lamda) + "\n";
 
        }
    }
0
Заблокирован
17.07.2015, 01:19
Цитата Сообщение от alspav Посмотреть сообщение
Вот такое решение более правильное?
alspav, Вместо SaveString() лучше переопределить .ToString(). Т.е. можно переписать, примерно, так:

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
    struct TT
    {
        public int error { get; set; }
        public double P { get; set; }//значение давления
        public double T { get; set; }//значение температуры
        public double h { get; set; }//значение энтальпии
        public string PasheState { get; set; }//фазовое состояние
        public double Po { get; set; } //плотность
        public double S { get; set; } //энтропия
        public double Cp { get; set; }//изобарная теплоемкость
        public double Cv { get; set; }//изохорная теплоемкость
        public double u { get; set; }//внутренняя энергия
        public double Wz { get; set; }//скорость звука в среде
        public double mu { get; set; }//динамическая вязкость
        public double v { get; set; }//кинематическая вязкость
        public double lamda { get; set; }//теплопроводность
        public string ExcessAbsoluteP { get; set; }//избыточное или абсолютное давление используется в расчетах
        public string KelCelT { get; set; }//значение заданное в измерении температуры
 
        public override string ToString()
        {
            return string.Format("{0};{1}\n", ExcessAbsoluteP,
                string.Join(";", P, T, KelCelT, h, PasheState, Po, S, Cp, Cv, u, Wz, mu, v, lamda));
        }
    }
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.07.2015, 10:35
m0nax, я всё же предпочитаю эту статью, пусть и извиняюсь за некоторую авторскую экспрессию, он немного бурлит в начале, а потом нормально пишет.

Добавлено через 1 минуту
Приведу лишь итоговую диаграмму классов, как оно должно было получиться. Если автор статьи не умеет в KISS, то что уж тут поделать.
Миниатюры
Реорганизовать код: вызовы методов в зависимости от условий  
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.07.2015, 10:42
Не говоря уже о том, что у автора статья была больше приколистская, чем реально так он считал:
никогда бы не подумал, что мою статью можно воспринять так всерьёз! я даже не знаю, что это за чувство такое, открываешь Хабр — а тут целая огромная статья по мотивам твоей
0
 Аватар для alspav
1 / 1 / 0
Регистрация: 29.06.2015
Сообщений: 41
17.07.2015, 14:07  [ТС]
Ev_Hyper, Подскажи пожалуйста с какой целью к полю структуры добавляется { get; set; }, ведь насколько я понимаю в них и так можно писать если стоит public?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.07.2015, 14:07
Помогаю со студенческими работами здесь

Что происходит, когда объект не успевает обрабатывать вызовы методов?
Здравствуйте! Есть объект А и объекты В1, В2, В3. Когда объекты В обращаются к А, вызывая какие-нибудь методы А и объект А не успевает...

Проверка достаточных условий сходимости методов
Проверьте пожалуйста Задание =Предусмотреть проверку достаточных условий сходимости методов =Вычислить невязку полученного...

Автозаполнение поля в зависимости от условий
Здравствуйте! Есть 3 таблицы: СРМ (ИД, Название, стоимость) Описание (ИД, ценовая категория, ИД_СРМ) Ценовая категория (ИД,...

Вывод разметки в зависимости от условий
Здравствуйте уважаемые форумчане. Не подскажите как грамотно генерировать разметку, в зависимости от прав в базе данных. Я лично со своим...

Появление объектов в зависимости от условий
Расскажите, пожалуйста, как сделать такое: Например, есть комбобокс с двумя строками (умножить и площадь круга). при выборе умножения,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru