Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
29 / 24 / 5
Регистрация: 15.10.2019
Сообщений: 268

Шаблонный класс динамического массива. Тип элементов char*

08.11.2022, 21:34. Показов 2053. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я тут в ступоре...
Вот мое полное задание:

В данной лабораторной работе необходимо разработать шаблонный класс в соответствии с
вариантом задания. Любой класс должен иметь конструктор копии и перегруженный оператор =.
Также класс должен содержать перегрузку оператора << для класса iostream, чтобы его можно было
выводить в консоль через стандартный поток вывода cout с указанием количества элементов и их
значений. В главной функции main обеспечить консольный интерфейс для тестирование всех
функций шаблонного класса с типами int, float, char*, struct Vec2 {float x; float y;} (аналогично лаб 1)
Non-type параметр при тестировании класса можно задавать через константу.

Динамический массив, использующий избыточное резервирование памяти под элементы.
Увеличивает ёмкость на количество элементов, заданных в non-type параметре.
Необходимые методы:
reserve(n) – зарезервировать ещё n элементов
getCapacity() – получить текущую ёмкость
getLength() – получить текущую длину
insert(elem,n) – добавить элемент на позицию n
remove(elem,n) – удалить элемент на позиции n
Перегрузить следующие операции:
+ – добавить элемент в конец массива
- – удалить первое вхождение элемента в массиве (для типа char* должна быть своя специализация шаблона)
[] – доступ к элементу по индексу
== и != – проверка на идентичность и не идентичность массивов (для типа char* должна быть
своя специализация шаблона)

Местами есть приписка, что нужна обязательна специализация шаблона для char*, но у меня без этого все работает. Поэтому вопрос, специализация действительно нужна? Или это могли дать так, чисто ради задания?

C++ (Qt)
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
#include <iostream>
#include <cstring>
 
using namespace std;
 
struct Vec2;
 
 
template <typename T, int Nup>
class DynArray
{
  T* array;
  int Capacity;
  int length = 0;
 
  void alloc(int newCapacity)
  {
    if (newCapacity <= Capacity) return;
    T* newArray = new T[newCapacity];
    for(int i = 0; i < newCapacity; ++i)
    {
      if (i < Capacity)
      {
        newArray[i] = array[i];
      }
      else
      {
        newArray[i] = 0;
      }
    }
    delete[] array;
    array = newArray;
    Capacity = newCapacity;
  }
 
  void malloc()
  {
    array = new T[Capacity];
    for(int i = 0; i < Capacity; ++i)
      array[i] = 0;
  }
 
public:
 
  DynArray(int Capacity=0) : Capacity(Capacity)
  {
    malloc();
  }
 
  DynArray(DynArray& otherObj)
  {
          cout<<endl<<"copy ctor!"<<endl;
          Capacity = otherObj.getCapacity();
          malloc();
          length = otherObj.getLength();
          for (int i = 0; i < length; ++i)
          {
            array[i] = otherObj[i];
          }
  }
  
    DynArray& operator= (DynArray& otherObj)
    {
        if ( &otherObj != this)
        {
            cout<<endl<<"oper prisvo!"<<endl;
            delete[] array;
            Capacity = otherObj.getCapacity();
              malloc();
              length = otherObj.getLength();
              for (int i = 0; i < length; ++i)
              {
                array[i] = otherObj[i];
              }
        }
        else
        {
            cout << "Была остановленна попытка самоприсваиванья. " << endl;
        }
        
        return *this;
    }
 
  ~DynArray() { delete[] array; }
 
  T& operator[](int index) const
  {
    return array[index];
  }
 
  void reserve(int n) { alloc(Capacity + Nup); }
 
  DynArray& insert(T elem, int pos = -1)
  {
    pos = pos < 0 ? length : pos;
    //alloc(length + 1);
    if (Capacity < length + 1) { alloc(length + Nup); }
    for(int i = length - 2; i >= pos; ++i)
      array[i+1] = array[i];
    array[pos] = elem;
    length += 1;
    return *this; 
  }
  
  DynArray& operator+ (T elem)
  {
    insert(elem);
    return *this;
  }
  
  DynArray& remove(const T& elem, int pos = -1)
  {
    if(pos == -1)
    {
        for(int i = 0; i < length; ++i)
        {
            if(elem == array[i])
            {
                pos = i;
                break;
            }
        }
    }
    if(pos != -1 && pos < length)
    {
        for(int i = pos + 1; i < length; ++i)
        {
            array[i - 1] = array[i];
        }
        length -= 1;
    }
    return *this;
  }
    
  DynArray& operator- (T elem)
  {
    remove(elem);
    return *this;
  } 
  
 
  void print();
  int getLength() const { return length; }
  int getCapacity() const { return Capacity; }
  bool isEmpty() const { return length == 0; }  
  
  bool operator== (DynArray<T, Nup>& b)
    {
        if (this->getLength() == b.getLength())
        {
            for(int i=0; i < b.getLength(); ++i)
            {
                if (array[i] != b[i])
                {
                    return false; break;
                }
            }
            return true;
        }
        else
        {
            return false;
        }
    }
    
    bool operator!= (DynArray<T, Nup>& b)
    {
        if (this->getLength() == b.getLength())
        {
            for(int i=0; i < b.getLength(); ++i)
            {
                if (array[i] != b[i])
                {
                    return true; break;
                }
            }
            return false;
        }
        else
        {
            return true;
        }
    }   
 
  
  
};
 
 
 
 
template <typename T, int Nup>
void DynArray<T, Nup>::print()
{
  for(int i = 0; i < length; ++i)
    cout << array[i] << " ";
  cout << endl;
}
 
template <typename T, int Nup>
ostream& operator<<(ostream & os, const DynArray<T, Nup> & arr)
{
  for(int i = 0; i < arr.getLength(); ++i)
    cout << arr[i] << " ";
  cout << endl;
}
 
 
/*template <int Nup>
void DynArray<char*, Nup>::print()
{
  for(int i = 0; i < length; ++i)
    cout << array[i] << " ";
  cout << endl;
}*/
 
struct Vec2
{
  float x = 0, y = 0;
  
  Vec2(float a = 0) : x(a), y(a) {} 
  
  Vec2& operator=(float value)
  {
    x = y = value;
    return *this;
  }
  
  bool operator== (Vec2& b) const
    {
        if (x == b.x) {return true; }
        else { return false; }
    }
};
 
 
ostream& operator<<(ostream& os, const Vec2& vec)
{
  return os << " vec: " << vec.x << " " << vec.y;
}
 
int main(int argc, char** argv)
{
  system("chcp 1251");
    const int M = 3;
  cout << "Шаблон DynArray<int>:" << endl;
  DynArray<int, M> intArray(10);
  intArray+1+2+3;
  intArray.print();
  DynArray<int, M> iAr2(10);
  iAr2+2+3+4+1;
  cout << iAr2;
  intArray = iAr2;
  cout << intArray;
 
 
  
  cout << "check char*" << endl;
  DynArray<char*, M> ca(1);
  ca+"hi";
  ca+"world!";  
  cout << ca;
  ca-"world!";
  cout << ca;
  DynArray<char*, M> ca2 = ca;
  cout << ca2;
  if (ca2 == ca)
  {
    cout << "odinakivie" << endl;
  }
 
  return 0;
}
но также у меня есть варнинги
Code
1
[Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
в подобных местах
C++
1
  ca+"world!";
но вряд ли для этого нужна специализация
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.11.2022, 21:34
Ответы с готовыми решениями:

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

Разработать шаблонный класс Stek на основе динамического массива размером 100
Разработать шаблонный класс Stek на основе динамического массива размером 100. Класс должен включать переменную-член top (вершина стека)....

Шаблонный класс со статическим методом вывода всех элементов переданного массива
Вот код, но что то не работает, выдает ошибку, помогите исправить #include &lt;iostream&gt; using namespace std; template...

28
118 / 86 / 35
Регистрация: 07.11.2022
Сообщений: 355
08.11.2022, 21:48
нужна обязательна специализация шаблона для char*, но у меня без этого все работает.

не, не работает. вот так проверьте.:
C++
1
2
3
4
5
  cout << "check char*" << endl;
  DynArray<char*, M> ca(1);
  ca+"hi";
  ca+"world!";
  cout  << ca.getLength()<< endl;
длина равна 2, что неверно
0
29 / 24 / 5
Регистрация: 15.10.2019
Сообщений: 268
08.11.2022, 21:49  [ТС]
NEED-A-JOB, верно, было добавлено две строки, соответственно длина равна двум. а то что там
Code
1
ca(1)
это первоначальная емкость, которая потом при необходимости увеличивается
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
08.11.2022, 22:08
Цитата Сообщение от billy121 Посмотреть сообщение
Местами есть приписка, что нужна обязательна специализация шаблона для char*, но у меня без этого все работает. Поэтому вопрос, специализация действительно нужна? Или это могли дать так, чисто ради задания?
Нужна (правда можно и обойтись немного иначе). Сравнение указателей - это не сравнение строк. У вас же просят сравнение строк.
0
29 / 24 / 5
Регистрация: 15.10.2019
Сообщений: 268
08.11.2022, 22:31  [ТС]
DrOffset, получается мне нужно теперь целый класс прописывать, который будет ориентирован чисто на char*?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
08.11.2022, 22:37
Лучший ответ Сообщение было отмечено billy121 как решение

Решение

billy121, ну можно и так, только это не рационально. Также можно специализировать отдельные функции члены, где используется сравнение.
Но лучше сделать специальный параметр - компаратор, и его уже специализировать.

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
template <typename T>
struct Equal
{
    bool operator()(T const& a, T const& b) const
    {
        return a == b;
    }
};
template <>
struct Equal<char*>
{
    bool operator()(char const* a, char const* b) const
    {
        return std::strcmp(a, b) == 0;
    }
};
template <>
struct Equal<const char*> : Equal<char*>
{ };
 
template <typename T, int Nup, typename Cmp = Equal<T> >
class DynArray 
{
//................
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    DynArray& remove(const T& elem, int pos = -1)
    {
        if(pos == -1)
        {
            for(int i = 0; i < length; ++i)
            {
                if(Cmp()(elem, array[i])) // !!!
                {
                    pos = i;
                    break;
                }
            }
        }
        if(pos != -1 && pos < length)
        {
            for(int i = pos + 1; i < length; ++i)
            {
                array[i - 1] = array[i];
            }
            length -= 1;
        }
        return *this;
    }
1
29 / 24 / 5
Регистрация: 15.10.2019
Сообщений: 268
08.11.2022, 22:44  [ТС]
DrOffset, выглядит сложно, нужно разбираться
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
08.11.2022, 23:26
Лучший ответ Сообщение было отмечено billy121 как решение

Решение

billy121, для этого вы и учитесь
Кстати вы так и не исправили проблему с оператором <<.


Добавлено через 10 минут
Шпаргалки:
Перегрузка
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
template <typename T>
bool ElementCompare(T const& a, T const& b) {
    return a == b;
}
inline
bool ElementCompare(char const* a, char const* b) {
    return std::strcmp(a, b) == 0;
}
 
template <typename T>
class Arr {
public:
    bool operator==(Arr const& other) const
    {
        if(m_length == other.m_length)
        {
            for(int i = 0; i < m_length; ++i)
            {
                if(!ElementCompare(m_data[i], other.m_data[i]))
                    return false;
            }
            return true;
        }
        return false;
    }
private:
    int m_length;
    T*  m_data;
};

Компаратор + специализация
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
template <typename T>
struct ElementCompare
{
    bool operator()(T const& a, T const& b) const {
        return a == b;
    }
};
template <typename T>
struct ElementCompare<char const*>
{
    bool operator(char const* a, char const* b) const {
        return std::strcmp(a, b) == 0;
    }
}
 
template <typename T, typename Cmp = ElementCompare<T> >
class Arr {
public:
    bool operator==(Arr const& other) const
    {
        if(m_length == other.m_length)
        {
            for(int i = 0; i < m_length; ++i)
            {
                if(!Cmp{}(m_data[i], other.m_data[i]))
                    return false;
            }
            return true;
        }
        return false;
    }
private:
    int m_length;
    T*  m_data;
};

Трейт с функцией сравнения и ее специализацией
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
// (может быть применен и для других задач, например выбор аллокатора памяти)
 
template <typename T>
struct ArrTrait
{
    static bool compare(T const& a, T const& b) {
        return a == b;
    }
};
 
template <>
inline
bool ArrTrait<char const*>::compare(char const* const& a, char const* const& b) {
    return std::strcmp(a, b) == 0;
}
 
template <typename T, typename Trait = ArrTrait<T> >
class Arr {
public:
    bool operator==(Arr const& other) const
    {
        if(m_length == other.m_length)
        {
            for(int i = 0; i < m_length; ++i)
            {
                if(!Trait::compare(m_data[i], other.m_data[i]))
                    return false;
            }
            return true;
        }
        return false;
    }
private:
    int m_length;
    T*  m_data;
};

Непосредственно специализация метода класса
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
template <typename T>
class Arr {
public:
    bool operator==(Arr const& other) const
    {
        if(m_length == other.m_length)
        {
            for(int i = 0; i < m_length; ++i)
            {
                if(m_data[i] != other.m_data[i])
                    return false;
            }
            return true;
        }
        return false;
    }
private:
    int m_length;
    T*  m_data;
};
 
template <>
inline
bool Arr<char const*>::operator==(Arr<char const*> const& other) const
{
    if(m_length == other.m_length)
    {
        for(int i = 0; i < m_length; ++i)
        {
            if(std::strcmp(m_data[i], other.m_data[i]) != 0)
                return false;
        }
        return true;
    }
    return false;
}
1
29 / 24 / 5
Регистрация: 15.10.2019
Сообщений: 268
08.11.2022, 23:37  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Кстати вы так и не исправили проблему с оператором <<.
вроде не было на него замечаний, только на []

а в << даж не знаю, что не так может быть

а шпаргалки крутые

особенно первый способ, получается более менее рационально, плюс легко усваивается
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
08.11.2022, 23:42
Цитата Сообщение от billy121 Посмотреть сообщение
вроде не было на него замечаний
Были: https://www.cyberforum.ru/post16549807.html
1
29 / 24 / 5
Регистрация: 15.10.2019
Сообщений: 268
08.11.2022, 23:46  [ТС]
DrOffset, хм, и правда был. Подобную реализацию взял из лекций

И вот тут еще встречал
https://radioprog.ru/post/1240
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
08.11.2022, 23:50
Цитата Сообщение от billy121 Посмотреть сообщение
И вот тут еще встречал
Но "тут" все правильно, а у вас нет.
0
08.11.2022, 23:53

Не по теме:

billy121,
DrOffset, помнит топики прошлогодней давности, с ним "шутки" плохи :)

0
29 / 24 / 5
Регистрация: 15.10.2019
Сообщений: 268
08.11.2022, 23:55  [ТС]
DrOffset, аааааа
Еще раз перечитал Ваш пост, ту статью и увидил свою ошибку


Добавлено через 2 минуты
SmallEvil,

Не по теме:

это же наоборот здорово) мало того, что просто разбираться в теме, так еще и помнить всю жизнь сообщества. Это отдельный респект

0
Заблокирован
09.11.2022, 01:36
Цитата Сообщение от billy121 Посмотреть сообщение
жизнь сообщества. Это отдельный респект
Ну не знаю, я бы не стал такое поощрять, DrOffset, уж сильно добрый человек
Таких нужно кнутом гнать из подобных ресурсов. Пусть про себя подумают.
А не бестолочам халявы подгонять. При этом балуя качеством той самой халявы.
Раздавая за даром свой многолетний опыт.
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
09.11.2022, 08:11
SmallEvil, ну, мне кажется, что человек пытается что-то делать сам, интересуется предметом и прислушивается к замечаниям. Поэтому, полагаю, он разберётся в «халяве» и это пойдёт на пользу. Поэтому я помогаю. Настоящих халявщиков видно сразу, они по-другому относятся. Может конечно я и не прав, такое уже бывало, но пока признаков нет.
0
Заблокирован
09.11.2022, 14:43
Цитата Сообщение от DrOffset Посмотреть сообщение
ну, мне кажется, что человек пытается что-то делать сам
извините , но мне так не кажется

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Настоящих халявщиков видно сразу, они по-другому относятся
Яркий пример "оптимустам где то 11"
ну нифига он за год не освоиил

Добавлено через 55 секунд
Хотя я с вашего одногой ссылки про дперекейтедЮ понял что есть другие инструменты
0
09.11.2022, 15:26

Не по теме:

Цитата Сообщение от SmallEvil Посмотреть сообщение
извините , но мне так не кажется
Чего извиняться? Каждый человек имеет право на личное мнение.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Яркий пример
У всех разные способности.

0
09.11.2022, 20:32

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
У всех разные способности.
Крокодилы например не летают ага :)
Но мы же не об этом ?

0
09.11.2022, 20:36

Не по теме:

SmallEvil, не знаю о чем вы, но я о том, что если человек что-то не освоил в течение времени, которое вам кажется длинным, совсем не обязательно, что он при этом "ленился и ждал халявы". Вполне вероятно, что ему просто что-то тяжелее дается, чем вам (если вы сравниваете с собой).

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

Пользовательський тип и шаблонный класс
У меня есть шаблонный клас(дек), он может обрабатывать стандартные типы данных, мне нужно чтобы он мог обработать пользователький тип: ...

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

Создать шаблонный класс для преобразования массивов из типа int в char.
Хелп как это сделать сиджу уже 2 дня и голову ломаю Создать шаблонный класс для преобразования массивов из типа int в char. нужно на с++

Вычисления суммы элементов массива с явной специализацией (тип char*)
Здравствуйте! Помогите найти сумму элементов массива с явной специализацией (тип char*)! Это должна быть шаблонная функция! ...

как переделать шаблонный класс-стек в шаблонный класс-очередь !
Есть класс-контейнер стек с сортировкой , а нужно класс-контейнер очередь ! как переделать ?? подскажите #include &quot;queue.h&quot; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru