Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141

Свой класс string, нужна помощь с перегрузкой операторов

15.01.2024, 17:03. Показов 6749. Ответов 99

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Создал свой класс string. Цель создания своего класса строк - это скорость работы со строками и второе в образовательных целях. Если реализация получится удачной сделаю библиотеку для личного использования. Сейчас реализованы строки типа char потом добавлю wchar_t. new и delete решил не использовать, так как использую простой тип char. Вроде утечек памяти нет, а работать в теории должно быстрее. Прошу просмотреть код и дать рекомендации по оптимизации или указать на ошибки в коде, буду очень признателен. У меня возник вопрос с перегрузкой операторов, не понимаю как их сделать правильно, представленная реализация вроде работает правильно. Подскажите как правильно перегрузить [], +=, =, +. За ранее благодарю за ответы.

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
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <malloc.h>
 
namespace str
{ 
struct string
{
private:
#pragma region ========================== Variable ==============================
    typedef struct 
    { 
        char *p_str; 
        size_t length;
    }stringA;
 
    stringA str{};
    const type_info& ti_c = typeid(const_cast<const char * >(str.p_str));
 
#pragma endregion 
 
#pragma region ========================== Private Function ==============================
_inline void clr()
{
    if(str.p_str)           free(str.p_str);    
    str.p_str = nullptr;    str.length = 0U;  
}
//------------------------------------------------------------------
_inline bool __type_c(const type_info& ti){return ti_c == ti;}
 
#pragma endregion 
 
 
public:
 
#pragma region ==================================== Constructor ======================================
/* Конструктор однобайтовые символы */
string(const char *p_str)
{   
    clr();
 
   // if(p_str){
        if((str.length = strnlen_s(p_str, SIZE_MAX) ) > 0U)
        { 
            if(str.p_str  = static_cast<char *>(malloc(sizeof(char) * (str.length + 1) ) ) ) 
            {
                strncpy_s(str.p_str, str.length + 1, p_str, _TRUNCATE); 
                str.p_str[str.length] = '\0'; 
                
            }
        }else{  str.p_str   = static_cast<char *>       (calloc(1, sizeof(char) ) );}
                
   // }
}
//------------------------------------------------------------------
 
/* Конструктор по умолчанию */
explicit string(){     
    clr();
    str.p_str   = static_cast<char *>       (calloc(1, sizeof(char) ) ); 
}
 
//------------------------------------------------------------------
/* Конструктор копирования */
string(const string& s) 
{
   // if(s.c_str() == ""){  str.p_str   = static_cast<char *>       (calloc(1, sizeof(char) ) );}else{
 
    clr();
 
    if ((str.length = strnlen_s(s.c_str(), SIZE_MAX)) > 0U) {
        if ((str.p_str = static_cast<char *>    (malloc(sizeof(char) * (str.length + 1) ) ) ) != nullptr) {
    
                strncpy_s(str.p_str, str.length + 1, s.c_str(), _TRUNCATE);
                str.p_str[str.length] = '\0';    
         }
     }
    //}     
}
 
//------------------------------------------------------------------
/* Конструктор перемещения */
string(string &&moved)  noexcept  // ссылка rvalue       
{
    str.p_str = moved.str.p_str;   
    str.length = moved.str.length;
    moved.str.p_str = nullptr;
     
  //  if(str.p_str == nullptr){  str.p_str   = static_cast<char *>       (calloc(1, sizeof(char) ) ); str.length=0U;}
}
 
//------------------------------------------------------------------
~string(){  clr();  }
 
#pragma endregion
 
#pragma region ====================================== Class Members =======================================
//------------------------------------------------------------------
_inline size_t length() const { return str.length ; }
 
//------------------------------------------------------------------
_inline size_t string_size() const  {   
       return (str.p_str == nullptr) ? 0U : ((str.length +  1) * sizeof(char));    
}
 
//------------------------------------------------------------------
/* Добавляем строку с реолакацией памяти */
void add(const char *p_str_in)
{   
    size_t l = 0U;
   // if(str.p_str == nullptr) return;    
   
    if ((l = strnlen_s(p_str_in, SIZE_MAX)) != 0U) {
        if ((str.p_str = static_cast<char *> (realloc(str.p_str, (str.length + l + 1) * sizeof(char) ) ) ) != nullptr) {
            
            if(!strcat_s(str.p_str, str.length + l + 1, p_str_in)) str.length += l;
            str.p_str[str.length] = '\0';
        }//else{  str.p_str   = static_cast<char *>       (calloc(1, sizeof(char) ) ); str.length=0U;}
    }
}
 
//------------------------------------------------------------------
_inline const char* c_str() const {
    return ((str.p_str != nullptr) ? str.p_str : const_cast< char * >(""));
}
 
//------------------------------------------------------------------
/* Вывести символ в строке по индексу от нуля до str.length - 1 */
_inline char ch_at(size_t index) const  {
        return (/*(str.p_str != nullptr) && */(index < str.length)) ? str.p_str[index] : '\0';
}
 
//------------------------------------------------------------------
/* Заменить символ встроке по индексу от нуля до str.length - 1 */
_inline void ch_set_at(size_t index, char ch)   {
            if(/*(str.p_str != nullptr) && */(index < str.length))  str.p_str[index] = ch;
}
//------------------------------------------------------------------
_inline void clear(){ str.p_str   = static_cast<char *>       (calloc(1, sizeof(char) ) ); str.length = 0U;}
 
 
#pragma endregion
 
#pragma region ====================================== Operator Reload ============================================
//------------------------------------------------------------------
 string& operator +=(string const &s )  {      
            this->add(const_cast<char *>(s.c_str()));
            return  *this;
}
 
//------------------------------------------------------------------
  string& operator +=(char *s )    {      
        this->add(static_cast<char *>(s));  
        return  *this;
}
 
//------------------------------------------------------------------
const auto& operator = (const string& s)
{      
   // if (s.c_str() == "")return this;
    clr();
    if ((str.length = strnlen_s(s.c_str(), SIZE_MAX)) != 0U) {
        if ((str.p_str = static_cast<char *>(malloc(sizeof(char) * (str.length + 1) ) ) ) != nullptr) {
    
                strncpy_s(str.p_str, str.length + 1, s.c_str(), _TRUNCATE);
                str.p_str[str.length] = '\0'; 
         }
     }                  
return this;
 
}
 
#pragma endregion
 
//------------------------------------------------------------------ 
 friend std::ostream &operator <<(std::ostream &ostr, string const &point) { ostr << point.c_str(); return ostr; }
 
/* Конец string  */
};
 
//------------------------------------------------------------------
const string operator + (const string &L, const string &R){ return string(L) += R;}    
 
/* Конец области str:: */
};
 
//
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.01.2024, 17:03
Ответы с готовыми решениями:

Класс "Массив дробных чисел" с перегрузкой операторов
Создание консольной программы реализующей перегрузку функции Помогите пожалуйста сделать лабу! Создать проект консольной программы. ...

Класс "Длинные числа" с перегрузкой операторов
только-только начал изучение классов, задание написать класс длинных чисел с перегрузкой операторов если честно, еще очень смутно...

Создать класс "деньги" с перегрузкой операторов
Создать класс деньги поля- гривны, копейки 2 конструктора перегрузить операторы: деньги+деньги деньги-деньги деньги*int ...

99
фрилансер
 Аватар для Алексей1153
6501 / 5737 / 1134
Регистрация: 11.10.2019
Сообщений: 15,375
16.01.2024, 19:03
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Signum7 Посмотреть сообщение
explicit string()
кстати, а меня одного смущает наличие explicit тут?
0
27 / 24 / 4
Регистрация: 20.11.2023
Сообщений: 131
16.01.2024, 19:21
[quote="Алексей1153;17183118"]да да, чтобы забыть про встраивание функций.[/quote
Доказательство того, что компилятору все равно

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
inline int some_junk(int a, int b) {
    return a * b;
}
 
int main() {
    std::cout << some_junk(10, 10);
}
clang++ 17.0.2
Ассемблер
Assembler
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
main:                                   # @main                               
.seh_proc main                                                                
# %bb.0:                                                                      
    pushq   %rbp                                                              
    .seh_pushreg %rbp                                                         
    subq    $32, %rsp                                                         
    .seh_stackalloc 32                                                        
    leaq    32(%rsp), %rbp                                                    
    .seh_setframe %rbp, 32                                                    
    .seh_endprologue                                                          
    callq   __main                                                            
    movl    $10, %edx                                                         
    movl    %edx, %ecx                                                        
    callq   _Z9some_junkii   # типа инлайн                                                 
    movl    %eax, %edx                                                        
    movq    .refptr._ZNSt3__14coutE(%rip), %rcx                               
    callq   _ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi               
    xorl    %eax, %eax                                                        
    addq    $32, %rsp                                                         
    popq    %rbp                                                              
    retq                                                                      
    .seh_endproc                                                              
                                        # -- End function                     
    .def    _Z9some_junkii;                                                   
    .scl    2;                                                                
    .type   32;                                                               
    .endef                                                                    
    .section    .text$_Z9some_junkii,"xr",discard,_Z9some_junkii              
    .globl  _Z9some_junkii                  # -- Begin function _Z9some_junkii
    .p2align    4, 0x90                                                       
_Z9some_junkii:                         # @_Z9some_junkii типа инлайн                     
.seh_proc _Z9some_junkii                                                      
# %bb.0:                                                                      
    pushq   %rax                                                              
    .seh_stackalloc 8                                                         
    .seh_endprologue                                                          
    movl    %ecx, 4(%rsp)                                                     
    movl    %edx, (%rsp)                                                      
    movl    4(%rsp), %eax                                                     
    imull   (%rsp), %eax                                                      
    popq    %rcx                                                              
    retq                                                                      
    .seh_endproc                                                              
                                        # -- End function
0
фрилансер
 Аватар для Алексей1153
6501 / 5737 / 1134
Регистрация: 11.10.2019
Сообщений: 15,375
16.01.2024, 19:25
Цитата Сообщение от pechka_ne_sed Посмотреть сообщение
Доказательство того, что компилятору все равно
так а где же тут
Цитата Сообщение от pechka_ne_sed Посмотреть сообщение
перенести реализацию в source-файл (.cc/.cpp/.cxx).
?
1
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
16.01.2024, 19:28
pechka_ne_sed, да ну тут же о другом речь... Если компилятору в месте вызова доступно определение (не важно инлайн или нет - тут в большинстве случаев ему действительно все равно), то у него появляется возможность встроить вызов. Если же определение не доступно, то такой возможности не будет (LTO и подобные технологиии пока не рассматриваем).
1
27 / 24 / 4
Регистрация: 20.11.2023
Сообщений: 131
16.01.2024, 19:42
DrOffset, спасибо, что разъяснили
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
16.01.2024, 19:44
Цитата Сообщение от Signum7 Посмотреть сообщение
типобезопасная конструкция в своих недрах использует
malloc/realloc/free
на сколько я помню, соответственно не может по определению быть быстрее
Это понятно.
Я просто не понимаю зачем вы отказываетесь от new / delete в пользу malloc/realloc/free?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13215 / 6847 / 1826
Регистрация: 18.10.2014
Сообщений: 17,347
16.01.2024, 19:54
Цитата Сообщение от pechka_ne_sed Посмотреть сообщение
Доказательство того, что компилятору все равно
Во-первых, в упор не вижу здесь никакого доказательства. Дебажная компиляция, то есть компиляция без -O3, бессмысленна для целей рассмотрения сгенерированного кода.

https://godbolt.org/z/zr8qbvT5o

Во-вторых, что можно тут вообще доказывать, если inline изначально был всего лишь "намек"? А сегодня это не более чем средство подавления ODR. Любые функции, тело который видно компилятору во время компиляции, являются встраиваемыми. Нет никакого смысла навешивать на них еще inline, если вам не нужно подавить ODR

https://godbolt.org/z/748x6roTK
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
16.01.2024, 20:07  [ТС]
#pragma region Я использую в студии мне так удобно для форума уберу.
по поводу inline внутри класса методы действительно инлайнятся не явно. Но при указании inline/forceinline компилятор обратит внимание на просьбу и в зависимости от настроек компилятора и типа функции сам примет решение вставлять или нет. Ну а если по сути то для класса действительно это лишнее а актуально только для определения методов вне класса. Возможно уберу если не буду выносить определения во вне.
По поводу комментариев мой препод (дай бог ему долгих лет) когда-то Требовал! все комментировать, просто привычка мне так удобно.
explicit string() а хе его знает для конструктора без параметров наверно не нужно
0
фрилансер
 Аватар для Алексей1153
6501 / 5737 / 1134
Регистрация: 11.10.2019
Сообщений: 15,375
16.01.2024, 20:15
Цитата Сообщение от Signum7 Посмотреть сообщение
Требовал! все комментировать
комментировать нужно только не очевидные вещи
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
16.01.2024, 20:17
Цитата Сообщение от Signum7 Посмотреть сообщение
Подскажите как правильно перегрузить [], +=, =, +.
Еще полезно будет == и <
Примеры как перегружать операторы нагугливаются запросто. Беда только в том (для меня), что постоянно меняется мода как именно эту перегрузку делать. Надо найти какую-то свежую, но авторитетную статью. А то опять смеяться начинают
0
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
16.01.2024, 20:27  [ТС]
я и так все не комментирую а то что мне нужно

Добавлено через 3 минуты
Еще полезно будет == и < и [] так ни кто и не подсказал за все время. но зато я почерпнул много разных советов сейчас пока обдумываю как рефакторить свой класс.
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
16.01.2024, 20:30
Цитата Сообщение от Signum7 Посмотреть сообщение
Еще полезно будет == и < и [] так ни кто и не подсказал за все время
Не подсказали, потому что код сперва нужно привести в порядок.
Иначе "подсказка" превратится в переписывание вашего кода для нормальной организации необходимых перегрузок.
Править наживую, прямо по вашему коду и ничего не переделывая, можно, но дело это неблагодарное (не стоит затраченных усилий).
1
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
16.01.2024, 20:32  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Не подсказали, потому что код сперва нужно привести в порядок.
Иначе "подсказка" превратится в переписывание вашего кода для нормальной организации необходимых перегрузок.
Править наживую, прямо по вашему коду и ничего не переделывая, можно, но дело это неблагодарное (не стоит затраченных усилий).
Да я чуть позже исправленный класс выложу. Замечание актуально.
0
фрилансер
 Аватар для Алексей1153
6501 / 5737 / 1134
Регистрация: 11.10.2019
Сообщений: 15,375
16.01.2024, 20:34
Signum7, внутри класса string:

C++
1
2
3
4
5
6
7
8
9
friend bool operator < (const string& l, const string& r)noexcept
{
   реализация
}
 
friend bool operator == (const string& l, const string& r)noexcept
{
   реализация
}
а для operator[] - нужно для начала определиться, что он будет делать
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
16.01.2024, 20:36
Цитата Сообщение от Signum7 Посмотреть сообщение
[] так ни кто и не подсказал за все время
Вот жеж
Цитата Сообщение от KSergey9 Посмотреть сообщение
Примеры как перегружать операторы нагугливаются запросто.
Без обид, но вот правда: запрос "C++ перегрузить оператор []" выдаст вам массу отличных готовых классных примеров.
Можно даже схитрить и добавить string - и тогда вообще все готовенькое на блюдечке будет

Добавлено через 1 минуту
Ну или книжку любую открыть по С++, там точно будет глава "перегрузка операторов", где все подробно написано.
Не понятно какая подсказка нужна, потому и нет их.
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
16.01.2024, 20:46
Листал предыдущие варианты и нашел это:
Цитата Сообщение от Signum7 Посмотреть сообщение
C++
1
2
3
4
/* Конструктор перемещения */
string(string &&moved) noexcept // ссылка rvalue 
{ 
 if (&moved != this) /* избегаем самоприсваивания*/
На всякий случай: в конструкторе нет проблемы самоприсваивания.

Добавлено через 5 минут
Цитата Сообщение от Signum7 Посмотреть сообщение
string& operator +=(char *s ) {
Здесь лучше const char * передавать.

Цитата Сообщение от Signum7 Посмотреть сообщение
auto & operator = (const string & s)
Реализация этого оператора не учитывает уже потенциально доступную память в объекте, а просто выделяет новую.
Но если уж хочется именно такой стратегии, то лучше и проще применить Copy&Swap Idiom, код станет гораздо приятнее с той же семантикой.

Добавлено через 4 минуты
Цитата Сообщение от Signum7 Посмотреть сообщение
[]
У вас есть вот такая функция.
Цитата Сообщение от Signum7 Посмотреть сообщение
C++
1
2
3
4
/* Вывести символ в строке по индексу от нуля до str.length - 1 */
_inline char ch_at(size_t index) const {
 return (/*(str.p_str != nullptr) && */(index < str.length)) ? str.p_str[index] : '\0';
}
operator[] похож на нее, но обычно обладает следующими свойствами:
1) существует в двух вариантах - некостантном и константном
2) для классов подобным string он возвращает ссылку и константную ссылку на char type соответственно
3) в нем нет постоянных проверок выхода за диапазон (подразумевается, что ее сделали уровнем выше), для проверки диапазона в отладке может стоять assert
1
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
16.01.2024, 21:00  [ТС]
Цитата Сообщение от KSergey9 Посмотреть сообщение
Вот жеж

Без обид, но вот правда: запрос "C++ перегрузить оператор []" выдаст вам массу отличных готовых классных примеров.
Можно даже схитрить и добавить string - и тогда вообще все готовенькое на блюдечке будет

Добавлено через 1 минуту
Ну или книжку любую открыть по С++, там точно будет глава "перегрузка операторов", где все подробно написано.
Не понятно какая подсказка нужна, потому и нет их.
да я смотрел но там есть обычный и константный вариант [] я не понял как мне реализовать для моего класса правильно. И нужно ли вообще оба варианта?
а нужно
C++
1
2
3
4
5
6
***
str::string str("Привет ");
***
где-то в цикле... 
if(str[i] == 'и')
***
Добавлено через 7 минут
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Signum7, внутри класса string:

C++
1
2
3
4
5
6
7
8
9
friend bool operator < (const string& l, const string& r)noexcept
{
   реализация
}
 
friend bool operator == (const string& l, const string& r)noexcept
{
   реализация
}
я так понимаю внутри можно просто использовать strcmp я правильно думаю?
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
16.01.2024, 21:02
Для == можно длины сравнить сначала
1
1 / 1 / 0
Регистрация: 30.03.2017
Сообщений: 141
16.01.2024, 21:28  [ТС]
Сейчас буду переделывать класс.
Для начала переделал структуру строки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace str
{
 
class string
{
private:
const size_t size_string = _MAX_PATH * sizeof(char);
 
struct stringA
    { 
    private:    
        explicit    stringA(const stringA&)     = delete;    
        stringA&    operator=(const stringA&)   = delete;        
    public:  
        ~stringA(){;}
         stringA(void) : length(0U), size_str(0U), p_str(nullptr) {} 
 
        size_t length;      /* Количество символов в строке */
        size_t size_str;    /* Размер выделенной памяти для строки */     
        char *p_str;        
 
    };  stringA str;
const size_t size_string = _MAX_PATH * sizeof(char); для wchar соответственно будет умножение на 2

Для ускорения работы планирую выделять сразу память для строки размера size_string и в случае необходимости буду перевыделять память для более длинной строки.
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
16.01.2024, 21:32
А зачем структура внутри класс? почему не сразу в классе нужные поля?
Просто любопытствую
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2024, 21:32

Разработать класс "Сотрудник" (с перегрузкой операторов)
задание следующее Разработать класс для хранения информации о сотруднике, включая ФИО, зарплату, должность (определяемую значениями...

Написать класс "Дата" с перегрузкой операторов
Здравствуйте, задание: написать класс Дата с перегрузкой операторов. Вот мой код. Почему-то компилятор выбивает, что в main Data и d1 не...

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

Перегрузка операторов. Класс String
Зравствуйте! У меня есть вопрос. Реализовать класс String для работы со строками символов. Память под строку выделять автоматически....

Свой класс String
Небольшой набросок на класс String #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; class String { struct...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru