Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

Оценка кода

28.01.2020, 22:43. Показов 6989. Ответов 123
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, прошу вас всех оценить мой код , по возможности дать советы что так , а что не так и как это исправить либо в каком направлении смотреть , это моя первая попытка создать что-то не ради забавы , а чтобы использовать это в реальной жизни. Сразу скажу что еще не все доделал что хотел бы. Это декодер asn1.der , данные передаются в decode() в виде BLOB конвертированного в массив знаков.
header
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include "string.h"
 
#define ENDOFARRAY -1
 
#define INTEGER 0x02
#define OCTET_STRING 0x04
#define OBJECT_IDENTIFIER 0x06
#define SEQUENCE 0x30
 
#define SETBIT(number,bit) ((number) |= (pow(2,bit)))
#define CHECKBIT(number,bit) ((number) & (1 << (bit)))
 
class decoder{
    public:
        decoder();
 
        ~decoder();
 
        char * decode(const unsigned char * ,int,char * cipherT = nullptr, char * Other = nullptr);
 
        void decode64(const char * ,char * cipherT = nullptr, char * Other = nullptr);
 
    private:
        //Calculates number in power
        int pow(int,int);
 
        char* IntToHexChar(int);
 
        void AppendOctetString(int);
 
        int CalculateLongSID(int&);
 
        //Calculates all decimal values of indentifier
        void CalculateIdentifier(int);
 
        //Calculates first byte of indentifier which is decoded to two values
        void CalculateIdentifierFirstByte();
 
        //Convert byte array to decimal value
        int CalculateBytes(int);
 
        //Decoding encoded ans1.der string
        void ParseData();
 
        //Appends passed array with new array
        char * Append(char *,char *);
 
        //Decodes length of front bytes
        int ParseLength(int);
 
        //Handles Octet String
        void OctetStringHandler();
 
        //Handles Object Indentifier
        void ObjectIdentifierHandler();
 
        //Handles Integer
        void IntegerHandler();
 
        //Handles Sequance
        void SequenceHandler();
 
        //Converts char array to int array
        void ToIntArray();
 
        //Copies value of passed array and returns new created one with same values
        const unsigned char *  NewArr(const unsigned char* );
 
        //Byte array as integers
        int * IntByteArray = nullptr;
 
        //Pointer to IntByteArray which is used to move through array
        int * pArr = nullptr;
 
        //Byte array as char
        const unsigned char * CharByteArray = nullptr;
 
        //The result decoded string
        char * Result = new char[1]{};
 
        //Size of IntByteArray
        int size = 0;
};

cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
#include "asn1der.h"
 
decoder::decoder(){
}
 
 
decoder::~decoder(){
    if(CharByteArray)
        delete[] CharByteArray;
    if(IntByteArray)
        delete[] IntByteArray;
}
 
 
char * decoder::Append(char * dst,char * src){  
     int dstlen = strlen(dst),srclen =  strlen(src);
     char* temp = new char[dstlen+srclen+1]{};
     memcpy(temp, dst, dstlen);
     strcat(temp,src);
     delete[] dst;
     return temp;
}
 
 
const unsigned char *  decoder::NewArr(const unsigned char* arr) {
    unsigned char * temp = new unsigned char[size+1]{};
    for(int i = 0;i < size;++i){
        temp[i] = arr[i];
    }
    return temp;
}
 
 
void decoder::ToIntArray(){
    IntByteArray = new int[size+1]{};
    for(int i = 0;i<size;++i){
        IntByteArray[i] = (unsigned int)CharByteArray[i];
    }
    IntByteArray[size] = -1;
    pArr = IntByteArray;
}
 
 
void decoder::ParseData(){
    switch (*pArr)
    {
        case ENDOFARRAY:
            break;
        case INTEGER:
            IntegerHandler();
            ParseData();
            break;
        case OCTET_STRING:
            OctetStringHandler();
            ParseData();
            break;
        case OBJECT_IDENTIFIER:
            ObjectIdentifierHandler();
            ParseData();
            Result = Append(Result,const_cast<char *>("}"));
            break;
        case SEQUENCE:
            SequenceHandler();
            ParseData();
            Result = Append(Result,const_cast<char *>("\n}"));
            break;
        default:
            break;
    }
}
 
 
char * decoder::decode(const unsigned char * Text,int length,char * cipherT, char * Other){
    size = length;
      CharByteArray = NewArr(Text);
      ToIntArray();
      try{
          ParseData();
      }
      catch(const char* exception){
         std::cout << exception;
          return nullptr;
      }
      return Result;
}
 
 
int decoder::ParseLength(int num){
    num &= 63;
    return num;
}
 
 
int decoder::pow(int num, int times){
    if(times == 0)
        return 1;
    if(times == 1)
        return 2;
    if(times > 1)
        return num*pow(num,--times);
}
 
 
int decoder::CalculateBytes(int len){
    int calculated = 0,power = len*8-1;
    for(int i = 0;i < len && ++pArr;i++){
 
        if(*pArr == -1 )
            throw "CalculateBytes error";
 
        for(int q = 7;q >= 0;--q){
            if(CHECKBIT(*pArr,q)){
                calculated += pow(2,power);
            }
            --power;
        }
    }
    return calculated;
}
 
 
void decoder::CalculateIdentifierFirstByte(){ //there are only three types of first node 1,2,3 , first byte is calculated with (firstnode*40 + secondnode)
    if(*++pArr < 80){ //if first byte is less than 80 it means that first node is 1
 
        if(*pArr == -1 )
            throw "CalculateIndentifierFirstByte error";
 
        Result = Append(Result,const_cast<char *>((std::to_string(1) + ".").c_str()));
        Result = Append(Result,const_cast<char *>((std::to_string(*pArr-40)+ ".").c_str())); //if first node is 1 the second node is : number - (firstnode * 40)
        return;
    }else if (*pArr < 120) //means that first node is 2
    {
        Result = Append(Result,const_cast<char *>((std::to_string(2) + ".").c_str()));
        Result = Append(Result,const_cast<char *>((std::to_string(*pArr-80)+ ".").c_str())); //if first node is 1 the second node is : number - (firstnode * 40)
        return;
    }else // first node is 3
    {
        Result = Append(Result,const_cast<char *>((std::to_string(3) + ".").c_str()));
        Result = Append(Result,const_cast<char *>((std::to_string(*pArr-120)+ ".").c_str()));
        return;
    }
}
 
 
int decoder::CalculateLongSID(int& size) {
  int length = 1, value = 0, SID = 0;
  for (;; ++pArr) {
    if (!CHECKBIT(*pArr, 7)) {
      ++length;
      *pArr &= 127;
      value |= *pArr;
      break;
    }
    else
    {
      ++length;
      *pArr &= 127;
      value |= *pArr;
      value = value << 8;
    }
  }
  for (int i = 0; i < length*8-1; ++i) {
    if(CHECKBIT(value,i)){
        SETBIT(SID,i-i/8);
    }
  }
  size += length-2;
  return SID;
 
}
 
 
void decoder::CalculateIdentifier(int len){
    CalculateIdentifierFirstByte();
    for(int i = 0; i<len && ++pArr ; ++i){
        if(*pArr == -1 || *(pArr+1) == -1)
            throw "CalculateIndentifier error";
        if(!CHECKBIT(*pArr,7)){ //if decimal number consists of only one byte
            Result = Append(Result,const_cast<char *>((std::to_string(*pArr) + ".").c_str()));
        }else //if bit 7 is set it means that length of decimal number in bytes is bigger than one byte
        {
            Result = Append(Result,const_cast<char *>((std::to_string(CalculateLongSID(i)) + ".").c_str()));
        }
    }
}
 
 
char * decoder::IntToHexChar(int number){
    char * hex = new char[3]{};
    int num = number/16;
    for(int i = 0;i < 2;++i)
    switch (num)
    {
    case 15:
        hex[i] = 'F';
        num = number%16;
        break;
    case 14:
        hex[i] = 'E';
        num = number%16;
        break;
    case 13:
        hex[i] = 'D';
        num = number%16;
        break;
    case 12:
        hex[i] = 'C';
        num = number%16;
        break;
    case 11:
        hex[i] = 'B';
        num = number%16;
        break;
    case 10:
        hex[i] = 'A';
        num = number%16;
        break;
    case 9:
        hex[i] = '9';
        num = number%16;
        break;
    case 8:
        hex[i] = '8';
        num = number%16;
        break;
    case 7:
        hex[i] = '7';
        num = number%16;
        break;
    case 6:
        hex[i] = '6';
        num = number%16;
        break;
    case 5:
        hex[i] = '5';
        num = number%16;
        break;
    case 4:
        hex[i] = '4';
        num = number%16;
        break;
    case 3:
        hex[i] = '3';
        num = number%16;
        break;
    case 2:
        hex[i] = '2';
        num = number%16;
        break;
    case 1:
        hex[i] = '1';
        num = number%16;
        break;
    case 0:
        hex[i] = '0';
        num = number%16;
        break;
    default:
        break;
    }
    return hex;
}
 
 
void decoder::AppendOctetString(int length){
     for(int i = 0; i < length && ++pArr;++i){
         char * p = IntToHexChar(*pArr);
         Result = Append(Result,p);
         delete[] p;
     }
}
 
 
void decoder::OctetStringHandler(){
    if(!CHECKBIT(*++pArr,7)){
        if(*pArr == -1 )
            throw "IntegerHandler error";
 
        Result = Append(Result,const_cast<char *>(" Octet String : { "));
        AppendOctetString(ParseLength(*pArr));
        Result = Append(Result,const_cast<char *>("}"));
    }
    ++pArr;
}
 
 
void decoder::ObjectIdentifierHandler(){
    Result = Append(Result,const_cast<char *>(" OBJECT INDENTIFIED WITH VALUE: { "));
    if(!CHECKBIT(*++pArr,7)){ //if length in one byte
 
        if(*pArr == -1 )
            throw "IntegerHandler error";
 
        CalculateIdentifier(*pArr-1);
    }
    else //behaviour not described
    {
        CalculateIdentifierFirstByte();
        CalculateIdentifier(ParseLength(*pArr));
    }
    ++pArr;
}
 
 
void decoder::IntegerHandler(){
    if(!CHECKBIT(*++pArr,7)){
 
        if(*pArr == -1 )
            throw "IntegerHandler error";
 
        Result = Append(Result,const_cast<char *>(" INTEGER WITH VALUE: { "));
        Result = Append(Result, const_cast<char *>((std::to_string(CalculateBytes(ParseLength(*pArr)))+ " }").c_str()));
    }
    else
    {
        Result = Append(Result,const_cast<char *>(" INTEGER WITH VALUE: { "));
        Result = Append(Result, const_cast<char *>((std::to_string(CalculateBytes(CalculateBytes(ParseLength(*pArr))))+ " }").c_str()));
    }
    ++pArr;
}
 
 
void decoder::SequenceHandler(){
    if(!CHECKBIT(*++pArr,7)){
 
            if(*pArr == -1 )
                throw "SequenceHandler error";
 
            Result = Append(Result,const_cast<char *>(" SEQUENCE WITH LENGTH: "));
            Result = Append(Result, const_cast<char *>((std::to_string(*pArr) + "{ \n\t").c_str()));
      }
    else
    {
        Result = Append(Result,const_cast<char *>(" SEQUENCE WITH LENGTH: "));
        Result = Append(Result, const_cast<char *>((std::to_string(CalculateBytes(ParseLength(*pArr)))+ "\n\t").c_str()));
    }
    ++pArr;
}
 
 
void decoder::decode64(const char * Text,char * cipherT, char * Other){
    
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.01.2020, 22:43
Ответы с готовыми решениями:

Советы по ускорению работы кода + оценка самого кода
Вчера вечером сел написать 3 консольные программки для работы с шаблонами размножения текста: 1.Выборка групп синонимов(создание словаря)...

Оценка кода
Добрый день! Есть задание в ВУЗе: Я сделал следующий код: #include &lt;iostream&gt; #include &lt;conio.h&gt; int...

Оценка кода
Суть задачи описал вначале кода, хотелось бы услышать, что можно было сделать лучше, где можно было бы написать/описать...

123
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
09.02.2020, 02:18  [ТС]
Студворк — интернет-сервис помощи студентам
DrOffset, разве не должен отработать деструктор?
0
Just Do It!
 Аватар для XLAT
4217 / 2677 / 656
Регистрация: 23.09.2014
Сообщений: 9,165
Записей в блоге: 3
09.02.2020, 02:20
Цитата Сообщение от DrOffset Посмотреть сообщение
Как бы вы это пофиксили?
у меня такой проблемы скорее всего не будет, потому что флажки нужные у компилятора стоят

а в общем случае:
на конструкторе поставить noexcept

???
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.02.2020, 02:26
Цитата Сообщение от DrOffset Посмотреть сообщение
Как бы вы это пофиксили?
зачем вообще пытаться фиксить std::bad_alloc?

Кликните здесь для просмотра всего текста
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
09.02.2020, 02:28
Цитата Сообщение от ReYalp Посмотреть сообщение
разве не должен отработать деструктор?
Нет, объект же не был до конца сконструирован.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
09.02.2020, 02:30  [ТС]
DrOffset, аааа, даже так, я не знал об этом, я думал объект конструируется в момент его определения, а конструктор играет только роль инициализации
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
09.02.2020, 02:31
Цитата Сообщение от hoggy Посмотреть сообщение
зачем вообще пытаться фиксить std::bad_alloc?
Там может быть new SomeType, и из конструктора SomeType вылетает исключение.
В данном случае вопрос не в том какое именно исключение вылетает и почему, а в том, как бы ТС обезопасил себя от подобной ситуации.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
09.02.2020, 02:32  [ТС]
DrOffset, выходом из ситуации может быть использование контейнеров вместо массивов?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
09.02.2020, 02:34
Цитата Сообщение от hoggy Посмотреть сообщение
зачем вообще пытаться фиксить std::bad_alloc?
Это не важно, std::bad_alloc там или другое исключение.
Я же написал, пример синтетический.
Однако ситуация, когда в одном конструкторе динамически выделяются два ресурса вполне реальна.
И в этом случае исключение не обязательно может быть об ошибке выделения памяти.
Оно может прилететь из конструктора динамически создаваемого объекта.

Вообще об обработке или игнорировании bad_alloc можно спорить вечно.
Я бы может быть и поспорил, если бы это было хоть немного важно в контексте обсуждаемого вопроса.
Стратегия "если не выделилось, значит уже все и так пропало" мне хорошо знакома, и я сам ей пользовался неоднократно.
Однако, я повторюсь, здесь это не важно. Вообще.

Добавлено через 19 секунд
Цитата Сообщение от ReYalp Посмотреть сообщение
выходом из ситуации может быть использование контейнеров вместо массивов?
Может.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
09.02.2020, 02:36  [ТС]
DrOffset, но я так понимаю есть другой вариант лучше?

Добавлено через 1 минуту
DrOffset, ну или вынести выделение памяти в отдельную функцию
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
09.02.2020, 02:37
Цитата Сообщение от ReYalp Посмотреть сообщение
выходом из ситуации может быть использование контейнеров вместо массивов?
Только давайте абстрагируемся о того, что там выделяются массивы целых.
Думайте о них, как о двух ресурсах.
Довольно трудно написать, как вы успели заметить, такой пример, который одновременно устроил бы всех. Слишком велик соблазн сразу начать обращать внимание на частности.
Поэтому давайте поговорим о концепции. Допустим у нас есть класс, в котором динамически выделяются два ресурса.
Допустим эти ресурсы библиотечные и в этих библиотеках используются исключения. Код концептуально имеет представленную выше структуру. Ваши действия?
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
09.02.2020, 02:41  [ТС]
DrOffset, мои действия по поводу того как предотвратить ошибку утечки памяти?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.02.2020, 02:41
Цитата Сообщение от DrOffset Посмотреть сообщение
Это не важно, std::bad_alloc там или другое исключение.
Я же написал, пример синтетический.
в твоём синтетическом примере не может быть ничего, кроме std::bad_alloc.

Цитата Сообщение от DrOffset Посмотреть сообщение
Вообще об обработке или игнорировании bad_alloc можно спорить вечно.
Я бы может быть и поспорил, если бы это было хоть немного важно в контексте обсуждаемого вопроса.
Стратегия "если не выделилось, значит уже все и так пропало" мне хорошо знакома, и я сам ей пользовался неоднократно.
Однако, я повторюсь, здесь это не важно. Вообще.
специально на случай,
если под int ты подразумевал SomeType,
я оставил спойлер.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
09.02.2020, 02:43
Цитата Сообщение от ReYalp Посмотреть сообщение
мои действия по поводу того как предотвратить ошибку утечки памяти?
Да. Утечку памяти и отсутствие вызова деструктора первого, успевшего выделиться, ресурса.

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
в твоём синтетическом примере не может быть ничего, кроме std::bad_alloc.
Конечно. Почему бы не поговорить на примере bad_alloc о всех остальных исключениях? То, что есть ситуации, когда bad_alloc можно не обрабатывать как-то меняет дело? По-моему нет.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
09.02.2020, 02:45  [ТС]
DrOffset, ну я бы убрал инициализации массива их конструктора в специально созданную для этого функцию, но это не подходит так что кроме как использования контейнеров я не знаю ничего, смарт поинтеры?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
09.02.2020, 02:47
Цитата Сообщение от hoggy Посмотреть сообщение
если под int ты подразумевал SomeType,
я оставил спойлер.
это?
Цитата Сообщение от hoggy Посмотреть сообщение
new(std::nothrow)
nothrow-версия operator new гарантирует только, что сам operator new не выбросит исключение. На конструкторы создаваемых объектов это не распространяется, поэтому, если SomeType выбросит исключение, то оно так же вылетит из new-expression.
2
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
09.02.2020, 03:19  [ТС]
DrOffset, и кстати как работает исключение bad_alloc? Как вообще работает оператор new? Он вызывает malloc и если вернулся nullptr то вылетает bad_alloc?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
09.02.2020, 03:23
ReYalp, Массивы: Если размер массива неизвестен
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
09.02.2020, 03:27
Цитата Сообщение от ReYalp Посмотреть сообщение
смарт поинтеры?
Попробуйте

Добавлено через 2 минуты
Цитата Сообщение от ReYalp Посмотреть сообщение
убрал инициализации массива их конструктора в специально созданную для этого функцию
Допустим вы сделаете это. Покажите как.
Я специально оставил пример, который можно менять.
0
Just Do It!
 Аватар для XLAT
4217 / 2677 / 656
Регистрация: 23.09.2014
Сообщений: 9,165
Записей в блоге: 3
09.02.2020, 03:45
Цитата Сообщение от DrOffset Посмотреть сообщение
Да. Утечку памяти и отсутствие вызова деструктора первого, успевшего выделиться, ресурса.
если можно ИСПРАВИТЬ это после провальной попытки выделения,
то это значит что можно и не допустить ситуацию выброса такого исключения.


но вангую, что решение простое и универсальное должно быть,
иначе оно бессмысленно по выше приведенному соображению.
ну или исправить скорее не полностью, если без этого объекта можно обойтись.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
09.02.2020, 03:49
Цитата Сообщение от XLAT Посмотреть сообщение
то это значит что можно и не допустить ситуацию выброса такого исключения.
Вполне может быть, что можно. Вопрос в цене.
В принципе если весь код сквозняком поддерживает работу без исключений, так, как это сделано в Google, то нет никакой проблемы. В реальной же ситуации могут быть нюансы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2020, 03:49
Помогаю со студенческими работами здесь

оценка кода
Дайте оценку моему коду (https://onlinegdb.com/r1i-i8Cqm), укажите на ошибки

Оценка стиля кода
Народ, есть предложение. Оцените мой код. Не в смысле функционала - в смысле стиля написания. Значится, вот тут есть некий код: bool...

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

Список учеников имеет следующую структуру: фамилия – класс - оценка по алгебре - оценка по физике - средний балл
Задание такое Список учеников имеет следующую структуру: фамилия – класс - оценка по алгебре - оценка по физике - средний балл. При...

Оценка стиля написания кода
Здравствуйте! Я к вам пожаловал не с очередной проблемой. Код у меня рабочий. Меня интересует то, насколько стандартен мой стиль...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru