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

Свойства, интерфейсы, сигнатуры, делегаты. Просто о сложном

19.11.2013, 14:42. Показов 3173. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Начал изучать C#. Лет мне много с ООП - туго. Решил изучать азбуку по детсадовскому методу.

Итак. Есть план дачного кооператива ( класс).

По этому плану строителем (конструктором) построено три объекта собственности - три дачных участка.

В первом есть поля с луком и огурцами, метод вспашки -лопата
Во втором есть поля с картошкой и капустой , метод вспашки - лошадка
На третьем есть поля с маком и коноплей, метод вспашки - трактор -"Беларусь"

Вчера произошло событие - над участками пролетел самолет и обработал от вредителей.

Сейчас мне надо найти аналогии:

свойство
интерфейс
сигнатура
делегат

Помогите пожалуйста!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.11.2013, 14:42
Ответы с готовыми решениями:

Объяснить такие понятия как делегаты, сигнатуры, интерфейсы, ковариантность, контравариантность
Всем доброго времени суток!!!! Не могли бы вы ясно объяснить такие понятия как делегаты, сигнатуры, интерфейсы, ковариантность,...

Делегаты, интерфейсы и еще
Вот читал я книгу Г.Шилдта и вот что заметил что он все понятно объясняет как работает, но не объясняет зачем это нужно И вот у меня...

Делегаты, интерфейсы и коллекции
Уважаемые пользователи,очень прошу помочь в реализации экзамена... Проект сохранить под именем MyClientsGListTestConsol и использовать...

16
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
19.11.2013, 15:37
0) метод - некоторое действие, которое может выполнять объект.
1) свойство(Property) - упрощенная форма записи метода, который определяет получение какого-нибудь значения, или запись + внешне он выглядит как обычное поле.
например, у каждого участка указана урожайность на квадратный метр, размер участка.
свойство "урожай" может внутри себя вычислить сколько именно было собрано и вернуть результат.
или наоборот, нам известен урожай на участке, надо узнать его урожайность. создаем свойство УрожайностьПоУрожаю и простым присваиванием получаем значение поля урожайности для данного участка(при этом вычисления скрыты внутри свойства).
2) Интерфейс - описание методов и свойств. то есть такой вот шаблон для шаблона класса.
пример: есть интерфейс ОбслуживаниеОбъекта - в него входят ОбходПатруляОхраны, ОбрезкаДеревьев.
потом создаем класс для дачного участка и совсем "левый" класс для коттеджа нового русского. если в них осуществить реализацию интерфейса ОбслуживаниеОбъекта, то мы будем сразу знать что в них есть методы ОбходПатруляОхраны и ОбрезкаДеревьев даже ничего не зная о самих классах участка и коттеджа.
3) Сигнатура - краткое описание функции(возвращаемый тип, имя функции, порядок, тип параметров (параметры char, int не то же самое что int, char).
4) Делегат - указатель на функцию.
1
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 14
19.11.2013, 15:54  [ТС]
Спасибо!

Можно продолжить: перегрузка - план участков дополненный планом дороги, электричества, водопровода
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
19.11.2013, 16:17
мы создали общий класс и указали в нем виртуальный метод ОбработкаУчастка.
после этого создаем класс-наследник, ДачныйУчасток и в нем создаем перегруженный метод ОбработкаУчастка - выполняется обработка лопатой.
и создаем класс-наследник Кооператив, и в нем создаем перегруженный метод ОбработкаУчастка - выпоняется работа трактором
а отдельные планы дорог, электро и водопроводных сетей лучше вынести в интерфейсы.
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
class Area
{
   double Height, Width; //поля
   //базовый класс пользователь не может создавать его экземпляры
   protected Area(double height, double width)
   {
       this.Height = height; this.Width=width;
   }
   //свойство,  которое возвращает площадь
   public double Squre
   {
        get{ return Height*Width;}
        private set{}
   }
   public virtual double Work();
}
//маленький участок
class Cottege: Area
{
    public Cottege(double h, double w) : base(h,w)
    {
    }
    public override double Work()
    {
         Console.WriteLine(string.Format("Пришло {0} мужиков и перекопали огород за {1} часа", ((int)this.Squre)/10,  this.Squre/20);
    } 
}
class Homestead: Area
//фермерское хозяйство
{
    public Homestead(double h, double w) : base(h,w)
    {
    }
    public override double Work()
    {
         Console.WriteLine(string.Format("Трактор перепахал участок за {0} часа", ((int)this.Squre)/100);
    } 
}
 
main
{
//создаем список участков
     List<Area> areas=new List<Area>();
//заполняем список
     areas.Add(new Cottege(10,10));
     areas.Add(new Homestead(200,200));
     areas.Add(new Homestead(100,500));
     areas.Add(new Cottege(5,5));
//для каждого элемента списка выполнить работу
     areas.ForEach(f=>f.Work());
}
1
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 14
19.11.2013, 20:30  [ТС]
ОК. спасибо. Поле от свойства уже отличаю.

Немного более сложный для меня пример, пытаюсь его откомментировать, но не получается, чем больше читаю msdn, тем больше тону. Хотя в нете надергал фрагментов кода и написал работающее приложение. Все-таки хочу понять. Слишком глубоко во мне сидит процедурное программирование.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 static void StartMove(object sender, MouseEventArgs e) 
 
      // метод (делегат?)  обработчик событий мыши, кто такой  sender? кто такой е?
       
    {
         Control ctrl = sender as Control;                // что мы присвоили объекту ctrl???  
         ControlMover.ctrl = ctrl;                           //   ???
         oldMousePos = Cursor.Position;                 // старая позиция курсора
         oldCtrlLocation = ctrl.Location;                 // "устарить" позицию контрола
 
         ctrl.MouseMove += new MouseEventHandler(ctrl_MouseMove); // новые позиции? почему такая запись?
         ctrl.MouseUp += new MouseEventHandler(ctrl_MouseUp);
    }
0
foo();
 Аватар для rattrapper
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
19.11.2013, 23:41
Цитата Сообщение от Muraw Посмотреть сообщение
sender? кто такой е?
Итак, мы работаем со средой winforms, основа которой - контролы(таблицы, кнопки, надписи...).
Каждый контрол на форме - это объект класса, исходный код которого нам не виден. Зато видны открытые свойства, методы и события этих объектов.
Цитата Сообщение от Muraw Посмотреть сообщение
метод (делегат?)
StartMove - тут метод, вызываемый при начале движения мышки по объекту - контролу(не обязательно). Этот метод должен быть назначен, на обработку события, где-то в коде.
sender - объект
Цитата Сообщение от Muraw Посмотреть сообщение
MouseEventArgs e
объект класса аргументов. e содержит информацию о положении, нажатых кнопках мышки (в момент вызова события).
Цитата Сообщение от Muraw Посмотреть сообщение
Control ctrl = sender as Control;
sender передается методу в виде object, и компилятор не знает, что sender - это контрол.
Цитата Сообщение от Muraw Посмотреть сообщение
Control ctrl = sender as Control;
а мы то знаем, что такое sender на самом деле, и этой строчкой "конвертируем" object sender в Control, получаем ctrl на выходе.
Цитата Сообщение от Muraw Посмотреть сообщение
ControlMover.ctrl = ctrl; // ???
сам не знаю)))
если я помог и Вам понятно - пишите, будем дальше разбираться
1
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 14
20.11.2013, 08:50  [ТС]
rattrapper, спасибо.

Кажется понял, что такое
C#
1
ControlMover.ctrl = ctrl;
ControlMover - класс который помогает тягать контрол мышкой по форме ( к сожалению сейчас нет под рукой полной распечатки). Как я понял полученный ctrl - передаем в класс.

Теперь мне надо прочитать своими словами строчку

C#
1
ctrl.MouseMove += new MouseEventHandler(ctrl_MouseMove)
Если не сложно - помогите.
0
 Аватар для akafeanor
60 / 59 / 15
Регистрация: 04.05.2010
Сообщений: 161
20.11.2013, 09:42
я конечно могу ошибаться, но идея такая:
у Control'а есть событие MouseMove, и мы с помощью оператора += подписываемся на это событие. Для этого создаем новый делегат типа MouseEventHandler.
ctrl_MouseMove - это метод, у которого параметры такого же типа как и у события MouseMove.
То есть при вызове события ctrl.MouseMove, программа выполнит наш код в методе ctrl_MouseMove.
1
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 14
21.11.2013, 09:10  [ТС]
Вылезла ещё одна непонятка - какая разница между делегатом и интерфейсом.

Как я понял: делегат это телеграмма: "Бабушка приехала".

А интерфейс - та же телеграмма с приказом: копай огород. чем копать твое дело - хоть конем, хоть лопатой, хоть трактором.

Если я не прав, поправьте, пожалуйста.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
21.11.2013, 12:40
Muraw, интерфейс говорит: у этого класса есть такие-то и такие-то определенные методы.
а делегат - хранит метод. а чей это метод - ему без разницы.
например, есть идентичные методы(по параметрам и возвращаемому значению) перекопать огород у объекта-трактора и рабочего. мы можем сохранить метод как рабочего так и трактора. и выполнив делегат мы "заставим" выполнить это действие объект, при этом даже не зная толком кто его сделал и как.(то есть как бы говорим по рации: "перекопай огород!" - а кто услышит эту команду - работник или тракторист мы не знаем. рация - это делегат. и кто на другой стороне рации зависит от того какой метод хранит делегат)

Добавлено через 5 минут
подробнее с интерфейсом - это как бы описание.
ты работаешь в отделе кадров и у тебя большая папка сотрудников. есть у нас интерфейсы: программист, уборщица, водитель. - ты ничего не знаешь о том, кто эти содтрудники, но ты знаешь, что программист умеет писать код, уборщица может сделать уборку, а водитель может выполнить грузоперевозку.
1
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 14
21.11.2013, 13:58  [ТС]
Learx, спасибо. Прояснил. А теперь мне не очень понятен букварь.

Читаю у Шилдта

Событие Click определяется в классе Button. (Событие Click унаследовано от
класса Control.) Его общий формат таков:
public Event EventHandler Click;


Так и не понял, что такое public Event EventHandler Click; В приведенном ниже примере такой строчки не увидел.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
21.11.2013, 14:12
Event - событие, контейнер делегатов.
EventHandler - делегат, описанный в библиотеке
Click - имя события.
эта строчка находится внутри библиотеки фреймворка в классе Control.

Добавлено через 8 минут
как используется(код автоматически генерируется студией при двойном щелчке по кнопке на контрукторе формы)
C#
1
this.button1.Click += new System.EventHandler(this.button1_Click);
this.button1_Click - автоматически созданный метод для обработки события
так выглядит описание делегата(обратите внимание что возвращаемый тип и тип переменных метода соответствует делегату):
C#
1
public delegate void EventHandler(object sender, EventArgs e);
new System.EventHandler - создаем новый делегат и привязываем его к нашему методу(передав его в конструктор)
C#
1
this.button1.Click +=
это упрощенный синтаксис для добавления делегата в событие. при возникновении события вызывается выполнение всех его делегатов
1
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 14
21.11.2013, 14:31  [ТС]
Learx, если можно ещё вопрос:

Читаю
Рассмотрим внимательно код обработчика события щелчка на кнопке:
C#
1
2
// Обработчик для кнопки MyButton.
protected void MyButtonClick(object who, EventArgs e)
Я понимаю, что среда эту строчку вставит автоматически. Но откуда взялись who и e? Что произойдет если я напишу protected void MyButtonClick(object ddd, EventArgs sss)?
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
21.11.2013, 15:05
имена параметров и методов роли не играют. вы можете использовать любое имя. важна лишь сигнатура метода(возвращаемый тип данных, типы параметров, важно количество и порядок параметров)
1
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 14
22.11.2013, 08:46  [ТС]
Learx, спасибо. А то я всё пытаюсь понять где и как эти имена рождаются.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
22.11.2013, 09:14
Я когда-то тоже не понимал, что за "е", что за делегаты, что вообще за события, как они вызываются вообще. Вот приложение написал, в котором наглядно это показано, думаю сразу поймёшь, что за
C#
1
static void StartMove(object sender, MouseEventArgs e)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
 
namespace ConsApp_Events
{
    public class HumanDamagedArgs : EventArgs
    {
        protected uint _damage;
 
        public HumanDamagedArgs(uint damage)
        {
            _damage = damage;
        }
 
        /// <summary>Показывает кол-во урона, который получил юнит</summary>
        public uint Damage { get { return _damage; } }
    }
}
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
using System;
 
namespace ConsApp_Events
{
    //просто для примера, а так можно использовать готовый EventHandler и EventHandler<T>
    public delegate void HumanDamageEventHandler(object sender, HumanDamagedArgs e);
    public delegate void HumanEventHandler(object sender, EventArgs e); 
 
    public class Human
    {
        #region Поля
 
        protected uint _hp;
        protected uint _maxHp;
        protected string _name;
        protected bool _isAlive;
        #endregion
 
        #region Конструкторы
 
        /// <summary>
        /// Создать юнит
        /// </summary>
        /// <param name="name">Имя</param>
        /// <param name="hp">Кол-во жизней максимальное и текущее</param>
        public Human(string name, uint hp)
            : this(name, hp, hp)
        {
        }
 
        /// <summary>
        /// Создать юнит
        /// </summary>
        /// <param name="name">Имя</param>
        /// <param name="hp">Кол-во жизней</param>
        /// <param name="maximumHP">Максимальное кол-во жизней</param>
        public Human(string name, uint hp, uint maximumHP)
        {
            if (hp > maximumHP)
                throw new ArgumentOutOfRangeException("hp");
 
            _maxHp = maximumHP;
            _hp = hp;
            _name = name;
            if (_hp > 0)
                _isAlive = true;
        }
 
        #endregion
 
        #region События
 
        /// <summary>Получил  урон</summary>
        public event HumanDamageEventHandler WasDamaged;
        /// <summary>Был убит</summary>
        public event HumanEventHandler WasKilled;
        #endregion
 
        #region Свойства
        /// <summary>Максимальноекол-во жизней</summary>
        public uint MaximumHP { get { return _maxHp; } }
        /// <summary>Текущее кол-во жизней</summary>
        public uint HP { get { return _hp; } }
        /// <summary>Имя</summary>
        public string Name { get { return _name; } }
        /// <summary>Жив ли юнит</summary>
        public bool IsAlive { get { return _isAlive; } }
        #endregion
 
        #region Методы
        /// <summary>
        /// Нанести урон
        /// </summary>
        /// <param name="damage">Кол-во урона</param>
        public virtual void InflictDamage(uint damage)
        {
            int tempHp = (int)_hp; //Чтобы свойсво не могло никак отобразить промежуточный результат, который может быть меньше нуля
            tempHp -= (int)damage;
 
            if (tempHp < 0)
            {
                uint realDamage = (uint)((int)damage + tempHp);
                _hp = 0;
                _isAlive = false;
                OnDamage(realDamage);
                OnKill(); 
            }
            else
            {
                _hp = (uint)checked(tempHp);
                OnDamage(damage);
            }
        }
 
        protected void OnDamage(uint damage)
        {
            HumanDamageEventHandler handler = WasDamaged;
            if (handler != null)
                handler(this, new HumanDamagedArgs(damage));
        }
 
        protected void OnKill()
        {
            HumanEventHandler handler = WasKilled;
            if (handler != null)
                handler(this, EventArgs.Empty);
        }
 
        #endregion
    }
}
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
using System;
using System.Threading;
using System.Diagnostics;
 
namespace ConsApp_Events
{
    class Program
    {
        static readonly Random _random = new Random();
 
        static void Main(string[] args)
        {
            Human humanOne = new Human("Боб", 200);
 
            humanOne.WasDamaged += new HumanDamageEventHandler(HumanOne_WasDamaged);
            humanOne.WasKilled += new HumanEventHandler(HumanOne_WasKilled);
            //Stopwatch sw = new Stopwatch();
            while (humanOne.IsAlive)
            {
                //sw.Restart();
                humanOne.InflictDamage((uint)_random.Next(40));
                //sw.Stop();
 
                Thread.Sleep(250);
            }
 
            Console.ReadKey();
        }
 
        static void HumanOne_WasDamaged(object sender, HumanDamagedArgs e)
        {
            Human human = (Human)sender;
            Console.WriteLine("Юнит {0} получил {1,2} урона.\tHP = {2,3}/{3}", human.Name, e.Damage, human.HP, human.MaximumHP);
        }
 
        static void HumanOne_WasKilled(object sender, EventArgs e)
        {
            Human human = (Human)sender;
            Console.WriteLine("Юнит {0} был убит", human.Name);
        }
    }
}
Добавлено через 1 минуту
Создай консольное приложение, скопируй туда это всё, запусти и пройдись по коду пошагово в отладке, и всё станет ясно.

Добавлено через 48 секунд
Когда создавать проект будешь, сразу назови его: ConsApp_Events, чтобы не было лишнего гемора с нэймспэйсом

Добавлено через 5 минут
Цитата Сообщение от Muraw Посмотреть сообщение
ControlMover.ctrl = ctrl; * * * * * * * * * * * * * // * ???
Скорее всего что-то типа (грубо):
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
using System.Drawing;
using System.Windows.Forms;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Button button = new Button();
            ControlMover.ctrl = button;
        }
    }
 
    public static class ControlMover //основное внимание на класс
    {
        public static  Control ctrl { get; set; } //и на его статическое свойство
 
        public static void Move(int dx, int dy)
        {
            ctrl.Location = new Point(ctrl.Location.X + dx, ctrl.Location.Y + dy);
        }
    }
}
Добавлено через 15 минут
Цитата Сообщение от Muraw Посмотреть сообщение
А интерфейс - та же телеграмма с приказом: копай огород. чем копать твое дело - хоть конем, хоть лопатой, хоть трактором.
Ага:
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
using System;
 
namespace ConsoleApplication1
{
    class Program
    {
        private static Random _random = new Random();
 
        static void Main(string[] args)
        {
            ISearcher searcher;
            for (int i = 0; i < 10; i++)
            {
                searcher = Create(_random.Next(0, 3));
                Console.WriteLine(searcher.Search("Бла-бла-бла, хрю му, му хрю"));
                Console.WriteLine();
            }
 
            Console.ReadKey();
        }
 
        public static ISearcher Create(int number)
        {
            switch (number)
            {
                case 0:
                    return new SuperSearcher();
                case 1:
                    return new MegaSearcher();
                case 2:
                    return new WowWowSearcher();
                default:
                    throw new ArgumentOutOfRangeException("number");
            }
        }
    }
 
    public interface ISearcher
    {
        string Search(string text);
    }
 
    public class SuperSearcher : ISearcher
    {
        public string Search(string text)
        {
            return "Я такой крутой поисковик SuperSearcher";
        }
    }
 
    public class MegaSearcher : ISearcher
    {
        public string Search(string text)
        {
            return "Мега-убойно крутой поисквик MegaSearcher двигал телом";
        }
    }
 
    public class WowWowSearcher : ISearcher
    {
        public string Search(string text)
        {
            return "Полехчееее, я ещё тот поисковик, ищу на совесть, WowWowSearcher к вашим услугам";
        }
    }
}
1
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 14
22.11.2013, 13:23  [ТС]
Как все-таки много зависит от стиля изложения! Читаю Шилдта , вроде всё элементарно, но ничего не понятно. Взял Троелсена - идет на ура!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.11.2013, 13:23
Помогаю со студенческими работами здесь

Интерфейсы и делегаты. Каков функционал IEnumerable в приведенном коде
пробую так, но не очень то получается и прошу объяснить при чем тут IEnumerable namespace ConsoleApplication { class Program ...

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

Интерфейсы, просто подскажите с чего начать
Не могу понять с чего мне начать все это делать. может подскажите. Не могу себе представить как это все будет выглядеть. Спасибо. using...

Интерфейсы. Выделить у классов общий интерфейс(или интерфейсы)
Задание: У классов выделить общий интерфейс ( или интерфейсы ). первый класс : using System; using...

Сортировка в сложном List
Доброй ночи. Есть структура public struct TabIe { public string url; public string time; ...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru