Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
 Аватар для T2skler
50 / 50 / 6
Регистрация: 16.05.2012
Сообщений: 232

Выделение лексем

04.12.2014, 11:12. Показов 2917. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написать программу, использующую механизм управления при помощи таблиц (управление осуществляется данными!).
Нужно выделить следующие типы лексем:
Целое число со знаком
Вещественное число со знаком
Скобка

Ориентировочная схема работы главного цикла программы:
1. Ввод символа из файла
2. Переход автомата в новое состояние в зависимости от введенного символа и текущего состояния
3. Вывод символа в выходной файл, либо другое действие (в зависимости от задания)

Перевод автомата в новое состояние (п. 2) и выбор действия для выполнения (п. 3) могут быть реализованы несколькими способами. От способа реализации зависит максимальный балл за выполнение работы:
1. Выбор действия и состояния с помощью ветвлений (if, switch) – 60%
2. Выбор состояния с помощью таблицы (массива), а действия с помощью ветвления – 80%
3. Выбор состояния и действия с помощью таблиц (для действий используются указатели на функции) – 100%

Чуть позже узнал, что есть очень важные ограничения на реализацию:
программа может запоминать только текущее состояние и последний введенный символ. Не должны использоваться никакие дополнительные массивы или переменные для хранения введенных данных.


После ограничений пришлось удалить весь код и набросать этот:
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
#include <iostream>
#include <conio.h>
#include <fstream>
 
const enum CLASS {
    C_NUMBER, C_SIGN, C_BRACE, C_DOT, C_OTHER
};
 
const enum STATE {
    S_BEGIN, S_INTEGER, S_REAL, S_ERROR_1, S_ERROR_2, S_BRACE
};
 
using namespace std;
 
CLASS ReturnClass(char X) { // функция для определения класса
    if ((X >= '0') && (X <= '9'))
        return C_NUMBER;
    if (X == '-' || X == '+')
        return C_SIGN;
    if (X == '.')
        return C_DOT;
    if ((X == '(') || (X == ')') || (X == '[') || (X == ']') || (X == '{') ||
        (X == '}'))
        return C_BRACE;
    return C_OTHER;
}
 
char* ReturnAnalyze(STATE X) { // функция для возвращения анализа статуса
    switch (X) {
    case S_BEGIN:
        return "Error";
    case S_INTEGER:
        return "Integer with sign";
    case S_REAL:
        return "Real with sign";
    case S_ERROR_1:
        return "Error";
    case S_ERROR_2:
        return "Error";
    case S_BRACE:
        return "Brace";
    }
    return "";
}
 
int Table[6][5] = { // таблица переходов
    {1, 4, 5, 3, 0}, {1, 0, 0, 2, 0}, {2, 0, 0, 0, 0}, {2, 0, 0, 0, 0},
    {1, 0, 0, 2, 0}, {1, 0, 5, 2, 0}};
 
int main() {
    FILE *fInput;
    ofstream fOut;
    int State = 0;
    char X = ' ';
    fInput = fopen("C:\\input.txt", "rt"); // открываем файл в режиме чтения
    fOut.open("C:\\output.txt", ios_base::out); // файл для записи
    if (fInput && fOut) { // если файл открыт успешно
        // пока не конец файла посимвольно читаем
        while ((X = fgetc(fInput)) != EOF) {
            if (X != '\n') {
                // определяем состояние
                State = Table[State][ReturnClass(X)];
                cout << "Char: " << X << " Code: " << (int)
                    X << " State: " << State << " Analyze: " << ReturnAnalyze((STATE)State) << endl;
            }
        }
    }
    else
        fOut << "Error: File could not be read";
    fOut.close(); // закрываем файл
    fclose(fInput); // закрываем файл
    cout << "Press any key to close...";
    getch();
    return 0;
}
Помогите разобраться, как мне полностью выделить лексему, например, несколько 123 - как целое со знаком, а не по отдельности, как 1 - целое со знаком, 2 - целое со знаком, 3 - целое со знаком.

Добавлено через 2 часа 47 минут
input
A,D RT ____ e123 &^-.9 _^&*( ()
;
-56
5.6E2; ; +55 6.1E-10

E _123 jkL cv+b; -5.0 5.E+3 .35E-10
output
A - Ошибка
, - Ошибка
D - Ошибка
- Ошибка
R - Ошибка
T - Ошибка
- Ошибка
_ - Ошибка
_ - Ошибка
_ - Ошибка
_ - Ошибка
- Ошибка
e - Ошибка
123 - Целое десятичное со знаком
- Ошибка
& - Ошибка
^ - Ошибка
-.9 - Вещественное десятичное со знаком
- Ошибка
_ - Ошибка
^ - Ошибка
& - Ошибка
* - Ошибка
( - Скобка
- Ошибка
( - Скобка
) - Скобка
Перевод строки - ошибка
- Ошибка
- Ошибка
- Ошибка
; - Ошибка
Перевод строки - ошибка
-56 - Целое десятичное со знаком
- Ошибка
Перевод строки - ошибка
5.6 - Вещественное десятичное со знаком
E - Ошибка
2 - Целое десятичное со знаком
; - Ошибка
- Ошибка
; - Ошибка
- Ошибка
+55 - Целое десятичное со знаком
- Ошибка
6.1 - Вещественное десятичное со знаком
E - Ошибка
-10 - Целое десятичное со знаком
- Ошибка
- Ошибка
- Ошибка
- Ошибка
- Ошибка
- Ошибка
- Ошибка
- Ошибка
Перевод строки - ошибка
Перевод строки - ошибка
E - Ошибка
- Ошибка
_ - Ошибка
123 - Целое десятичное со знаком
- Ошибка
j - Ошибка
k - Ошибка
L - Ошибка
- Ошибка
c - Ошибка
v - Ошибка
+ - Ошибка
b - Ошибка
; - Ошибка
- Ошибка
- Ошибка
-5.0 - Вещественное десятичное со знаком
- Ошибка
5. - Вещественное десятичное со знаком
E - Ошибка
+3 - Целое десятичное со знаком
- Ошибка
.35 - Вещественное десятичное со знаком
E - Ошибка
-10 - Целое десятичное со знаком
Добавлено через 12 часов 14 минут
Up!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.12.2014, 11:12
Ответы с готовыми решениями:

Выделение лексем
Приветствую всех! Помогите разобраться с выделением лексем. Необходимо выделить служебное слово (это я сделал сам), а так же восьмеричное...

Анализатор лексем
Здравствуйте. Помогите пожалуйста, написать анализатор лексем. Я не понимаю, как он работает в паскале, да и не хочу писать на нём....

Подсчет лексем
Добрый день! Подскажите пожалуйста, как правильно подсчитать лексемы? Задание: int n = 1; // 5 лексем printf(&quot;Введите...

2
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
05.12.2014, 10:26
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
/////////////////////////////////////////////////////////////////////////////////////////
//Написать программу, использующую механизм управления при помощи таблиц (управление осуществляется данными!).
//Нужно выделить следующие типы лексем:
//Целое число со знаком
//Вещественное число со знаком
//Скобка
//
//Ориентировочная схема работы главного цикла программы:
//1. Ввод символа из файла
//2. Переход автомата в новое состояние в зависимости от введенного символа и текущего состояния
//3. Вывод символа в выходной файл, либо другое действие (в зависимости от задания)
//
//Перевод автомата в новое состояние (п. 2) и выбор действия для выполнения (п. 3) могут быть реализованы 
//несколькими способами. От способа реализации зависит максимальный балл за выполнение работы:
//1. Выбор действия и состояния с помощью ветвлений (if, switch) – 60%
//2. Выбор состояния с помощью таблицы (массива), а действия с помощью ветвления – 80%
//3. Выбор состояния и действия с помощью таблиц (для действий используются указатели на функции) – 100%
//
//очень важные ограничения на реализацию:
//программа может запоминать только текущее состояние и последний введенный символ. Не должны использоваться 
//никакие дополнительные массивы или переменные для хранения введенных данных.
/////////////////////////////////////////////////////////////////////////////////////////
#include <cctype>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <iostream>
#include <limits>
#include <map>
#include <string>
#include <utility>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
class   T_fsm
{
    //-----------------------------------------------------------------------------------
    enum    T_fsm_state
    {
        START_STATE,
        BRACKET_STATE,
        SIGN_STATE,
        POINT_STATE,
        INT_STATE,
        REAL_STATE,
        BAD_STATE
    };
    //-----------------------------------------------------------------------------------
    enum    T_symb_type
    {
        BRACKET_SYMB_TYPE,
        SIGN_SYMB_TYPE,
        POINT_SYMB_TYPE,
        DIGIT_SYMB_TYPE,
        OTHER_SYMB_TYPE
    };
    //-----------------------------------------------------------------------------------
    typedef     std::pair   < T_fsm_state,              T_symb_type     >   T_state_and_symb_type;
    typedef     std::map    < T_state_and_symb_type,    T_fsm_state     >   T_fsm_table;
    //-----------------------------------------------------------------------------------
    T_str   const   FILE_NAME_;
    size_t  const   FILE_SIZE_;
    T_fsm_state     cur_state_;
    char            cur_symb_;
    T_fsm_table     fsm_table_;
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    T_fsm
        (
            T_str   const   &   file_name,
            size_t              file_size
        )
        :
        FILE_NAME_  ( file_name     ),
        FILE_SIZE_  ( file_size     ),
        cur_state_  ( START_STATE   )
    {
        fill_fsm_table();
    }
    //-----------------------------------------------------------------------------------
    void    input_file_symbols_and_print_tokens_symbols()
    {
        std::ifstream   ifile( FILE_NAME_ );
 
        if( !ifile )
        {
            std::cout   <<  "Невозможно открыть файл "
                        <<  FILE_NAME_
                        <<  "."
                        <<  std::endl;
        }
        else
        {
            while( ifile    >>  cur_symb_ )
            {
                auto    state_and_symb_type  =   T_state_and_symb_type
                                                    (
                                                        cur_state_,
                                                        get_symb_type( cur_symb_ )
                                                    );
 
                auto    new_state   =   fsm_table_[ state_and_symb_type ];
 
                if  (
                        is_new_token( new_state )
                    )
                {
                    print_token_name();
                }
 
                cur_state_  =   new_state;
                std::cout   <<  cur_symb_;
                if( cur_state_   ==  BAD_STATE )
                {
                    print_token_name();
                    return;
                }
            }//while
 
            print_token_name();
        }//else
    }
    //-----------------------------------------------------------------------------------
    void    generate_rand_file()
    {
        std::ofstream   ofile( FILE_NAME_ );
        char            rand_symb   =   0;
 
        for( size_t  i = 0; i < FILE_SIZE_; ++i )
        {
            do
            {
                rand_symb   =   get_rand_isgraph_symb();
            }
            while   (
                            get_symb_type( rand_symb )  ==  OTHER_SYMB_TYPE
                        &&  !get_chance_one_of(200)
                    );
 
            ofile   <<  rand_symb;
        }//for
    }
    //-----------------------------------------------------------------------------------
    void    print_rand_file()
    {
        std::ifstream   ifile( FILE_NAME_ );
 
        if( !ifile )
        {
            std::cout   <<  "Невозможно открыть файл "
                        <<  FILE_NAME_
                        <<  "."
                        <<  std::endl;
        }
        else
        {
            std::cout   <<  std::endl
                        <<  std::endl
                        <<  std::endl
                        <<  std::endl
                        <<  std::endl
                        <<  std::endl
                        <<  std::endl
                        <<  "Содержимое файла:"
                        <<  std::endl
                        <<  ifile.rdbuf()
                        <<  std::endl
                        <<  std::endl;
        }//else
    }
    //-----------------------------------------------------------------------------------
private:
    //-----------------------------------------------------------------------------------
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
05.12.2014, 10:28
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
    bool    is_new_token( T_fsm_state   new_state )
    {
        return      new_state   ==  BRACKET_STATE
                ||  new_state   ==  SIGN_STATE
                ||  new_state   ==  BAD_STATE
                ||  cur_state_  ==  BRACKET_STATE
                ||      cur_state_  ==  REAL_STATE
                    &&  new_state   ==  POINT_STATE;
    }
    //-----------------------------------------------------------------------------------
    void    fill_fsm_table()
    {
        fsm_table_[ T_state_and_symb_type( START_STATE,     BRACKET_SYMB_TYPE    )   ]   =   BRACKET_STATE;
        fsm_table_[ T_state_and_symb_type( START_STATE,     SIGN_SYMB_TYPE       )   ]   =   SIGN_STATE;
        fsm_table_[ T_state_and_symb_type( START_STATE,     POINT_SYMB_TYPE      )   ]   =   POINT_STATE;
        fsm_table_[ T_state_and_symb_type( START_STATE,     DIGIT_SYMB_TYPE      )   ]   =   INT_STATE;
        fsm_table_[ T_state_and_symb_type( START_STATE,     OTHER_SYMB_TYPE      )   ]   =   BAD_STATE;
 
        fsm_table_[ T_state_and_symb_type( SIGN_STATE,      BRACKET_SYMB_TYPE    )   ]   =   BAD_STATE;
        fsm_table_[ T_state_and_symb_type( SIGN_STATE,      SIGN_SYMB_TYPE       )   ]   =   BAD_STATE;
        fsm_table_[ T_state_and_symb_type( SIGN_STATE,      POINT_SYMB_TYPE      )   ]   =   POINT_STATE;
        fsm_table_[ T_state_and_symb_type( SIGN_STATE,      DIGIT_SYMB_TYPE      )   ]   =   INT_STATE;
        fsm_table_[ T_state_and_symb_type( SIGN_STATE,      OTHER_SYMB_TYPE      )   ]   =   BAD_STATE;
 
        fsm_table_[ T_state_and_symb_type( POINT_STATE,     BRACKET_SYMB_TYPE    )   ]   =   BAD_STATE;
        fsm_table_[ T_state_and_symb_type( POINT_STATE,     SIGN_SYMB_TYPE       )   ]   =   BAD_STATE;
        fsm_table_[ T_state_and_symb_type( POINT_STATE,     POINT_SYMB_TYPE      )   ]   =   BAD_STATE;
        fsm_table_[ T_state_and_symb_type( POINT_STATE,     DIGIT_SYMB_TYPE      )   ]   =   REAL_STATE;
        fsm_table_[ T_state_and_symb_type( POINT_STATE,     OTHER_SYMB_TYPE      )   ]   =   BAD_STATE;
 
        fsm_table_[ T_state_and_symb_type( INT_STATE,       BRACKET_SYMB_TYPE    )   ]   =   BRACKET_STATE;
        fsm_table_[ T_state_and_symb_type( INT_STATE,       SIGN_SYMB_TYPE       )   ]   =   SIGN_STATE;
        fsm_table_[ T_state_and_symb_type( INT_STATE,       POINT_SYMB_TYPE      )   ]   =   REAL_STATE;
        fsm_table_[ T_state_and_symb_type( INT_STATE,       DIGIT_SYMB_TYPE      )   ]   =   INT_STATE;
        fsm_table_[ T_state_and_symb_type( INT_STATE,       OTHER_SYMB_TYPE      )   ]   =   BAD_STATE;
 
        fsm_table_[ T_state_and_symb_type( REAL_STATE,      BRACKET_SYMB_TYPE    )   ]   =   BRACKET_STATE;
        fsm_table_[ T_state_and_symb_type( REAL_STATE,      SIGN_SYMB_TYPE       )   ]   =   SIGN_STATE;
        fsm_table_[ T_state_and_symb_type( REAL_STATE,      POINT_SYMB_TYPE      )   ]   =   POINT_STATE;
        fsm_table_[ T_state_and_symb_type( REAL_STATE,      DIGIT_SYMB_TYPE      )   ]   =   REAL_STATE;
        fsm_table_[ T_state_and_symb_type( REAL_STATE,      OTHER_SYMB_TYPE      )   ]   =   BAD_STATE;
 
        fsm_table_[ T_state_and_symb_type( BRACKET_STATE,   BRACKET_SYMB_TYPE    )   ]   =   BRACKET_STATE;
        fsm_table_[ T_state_and_symb_type( BRACKET_STATE,   SIGN_SYMB_TYPE       )   ]   =   SIGN_STATE;
        fsm_table_[ T_state_and_symb_type( BRACKET_STATE,   POINT_SYMB_TYPE      )   ]   =   POINT_STATE;
        fsm_table_[ T_state_and_symb_type( BRACKET_STATE,   DIGIT_SYMB_TYPE      )   ]   =   INT_STATE;
        fsm_table_[ T_state_and_symb_type( BRACKET_STATE,   OTHER_SYMB_TYPE      )   ]   =   BAD_STATE;
    }
    //-----------------------------------------------------------------------------------
    void    print_token_name()
    {
        T_str   token_name;
 
        switch( cur_state_ )
        {
        case    BRACKET_STATE   :
            token_name  =   "скобка";
            break;
 
        case    INT_STATE       :
            token_name  =   "целое число";
            break;
 
        case    REAL_STATE      :
            token_name  =   "вещественное число";
            break;
 
        case    BAD_STATE       :
            token_name  =   "недопустимый символ";
            break;
 
        default:
            ;
        }//switch
 
        std::cout   <<  '\t'
                    <<  token_name
                    <<  std::endl;
    }
    //-----------------------------------------------------------------------------------
    static  T_symb_type     get_symb_type( char     symb )
    {
        if  (
                isdigit( symb )
            )
        {
            return  DIGIT_SYMB_TYPE;
        }
 
        switch( symb )
        {
        case    '(':
        case    ')':
        case    '[':
        case    ']':
        case    '{':
        case    '}':
            return  BRACKET_SYMB_TYPE;
 
        case    '+':
        case    '-':
            return  SIGN_SYMB_TYPE;
 
        case    '.':
            return  POINT_SYMB_TYPE;
 
        default:
            return  OTHER_SYMB_TYPE;
        }//switch
    }
    //-----------------------------------------------------------------------------------
    char    get_rand_isgraph_symb()
    {
        int     char_min    =   std::numeric_limits<char>::min();
        int     char_max    =   std::numeric_limits<char>::max();
        char    res_symb    =   0;
 
        do
        {
            res_symb    =   rand() % ( char_max - char_min + 1 )    +   char_min;
        }
        while   (
                    !isgraph( res_symb )
                );
 
        return  res_symb;
    }
    //-----------------------------------------------------------------------------------
    static  bool    get_chance_one_of( int  variants_total )
    {
        int     rand_val    =   rand() % ( variants_total ) + 1;
        return  rand_val    ==  1;
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
    srand(unsigned(time(0)));
    T_str   const   FILE_NAME   =   "t.txt";
    size_t  const   FILE_SIZE   =   10;
 
    for(;;)
    {
        T_fsm   fsm
            (
                FILE_NAME,
                FILE_SIZE
            );
 
        fsm.generate_rand_file                              ();
        fsm.print_rand_file                                 ();
        fsm.input_file_symbols_and_print_tokens_symbols     ();
        system("pause");
    }//for
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.12.2014, 10:28
Помогаю со студенческими работами здесь

Класс лексем, разбить числа
class Token { public: // Вид лексемы double value; // Для...

объединение лексем в единое целое
Программа должна считывать тел. номер в виде xxx-xxxx, затем с помощью функции strtok разбить его на 2 лексемы, а потом склеить их и...

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

Написать анализатор кода, определяющий тип лексем
Допустим есть строка и мне нужно её поделить на точки, запятые, else и так далее, как это сделать на c++ Добавлено через 1 минуту if...

Сохранение всех входящих лексем(строк) в порядке поступления
:help: Уже ни первый день бьюсь над ошибкой в подпрограмме транслятора? :wall: Цель подпрограммы: сохранение всех входящих лексем(строк)...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru