С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 22.05.2018
Сообщений: 4
1

Полиморфизм реализации абстрактного типа данных на основе динамического массива

22.05.2018, 01:33. Показов 2537. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
ТЗ
1. Необходимо реализовать абстрактный тип данных на основе динамического массива.
2. Программа должна быть написана на языке С. Нельзя использовать возможности языка С++. Это значит, что нельзя использовать cout и cin, вместо них нужно использовать printf() и scanf(). Нельзя использовать using namespace std. Нельзя использовать class, вместо них нужно использовать struct.
3. Абстрактный тип данных должен быть полиморфным. Необходимо задать структуру данных и интерфейс так, чтобы можно было не меняя их работать с данными любого типа внутри структуры. В языке С это делается путём сохранения размера типа данных внутри структуры в отдельной переменной.
4. Функции интерфейса должны быть полиморфны, т.е. принимать аргументы также произвольного типа. Это делается при помощи указателей void*.
5. Собственно, основа вашего задания – это именно реализовать абстрактный тип данных и уметь организовать работу с ним. Ваш «Динамический массив» должен быть полиморфным, и, в общем случае, уметь сохранить и извлечь произвольный тип, а не только те, что заданы вариантом.
6. Интерфейс вашего абстрактного типа данных «Динамический массив» реализован верно, если обращения к полям через « . » или « –> » используются только в функциях интерфейса и нигде вне их.
7. Не разыменовывать указатель void* и не использовать с ним адресную арифметику, например void* ptr = malloc(10); int a = ptr[4]; или char c = *(ptr + 4); Если вы хотите работать с void* как с указателем на байт, то приводите его к типу char*. У типа void же размера нет, поэтому разыменование такого типа, который даже не является типом, бессмысленно. Если ваша среда программирования поддерживает такой подход, то это не значит, что будет поддерживать другая. И использование такого подхода будет считаться примером плохого стиля.

Задача моего варианта
Тип коллекции - Строка
Типы хранимых элементов - Символы
Операции - Конкатенация, получение подстроки (с i-го символа по j-й), поиск подстроки (реализовать два варианта: чувствительное к регистру сравнение, и нечувствительное)

По ТЗ сделала все пункты
Решила проверить полиморфизм для типов хранимых элементов int, float, double
Для типа элементов char и int всё работает, а для float и double нет и не могу понять что и где не так, перепробовала кучу вариантов и не получается

Вот что в итоге есть
Include\Atd.h:
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
#include <stdbool.h>
 
#pragma once
#ifndef Atd_H
#define Atd_H
 
typedef struct Atd_t
 {
    void * ptrArray; /* Указатель на массив */
    unsigned ArraySize; /* Размерность массива*/
    unsigned ElementSize; /* Размерность элемента массива*/
    unsigned AtdType; /* Тип данных: 1 - string, 2 - int, 3 - float, 4 - double, ...*/
 } Atd_t;
 
unsigned LenStr (char * Str);
 
Atd_t * AtdAllocate(unsigned N, unsigned ElementSize, unsigned AtdType);
 
void AtdFree(Atd_t * Atd);
 
void AtdInit(Atd_t * Atd, void * ud_t);
 
void AtdPrint(Atd_t * Atd, char * cDelimiter);
 
unsigned GetAtdSizeArray(Atd_t * Atd);
 
unsigned GetAtdElementSize(Atd_t * Atd);
 
unsigned GetAtdType(Atd_t * Atd);
 
int GetAtdElements(Atd_t * AtdSrc, Atd_t * AtdElements, unsigned BegIndex, unsigned EndIndex);
 
int AtdConcatenation(Atd_t * AtdSrc1, Atd_t * AtdSrc2, Atd_t * AtdTrgt);
 
#endif /*Atd_H*/
Include\Atd.c:
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
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdbool.h>
#include "Atd.h"
 
/*Выделение памяти для Atd на N элементов размером Size*/
Atd_t * AtdAllocate(unsigned N, unsigned Size, unsigned AtdType)
{
    Atd_t * Atd;
 
    /* Выделение памяти под структуру Atd_t*/
    Atd = (Atd_t *) malloc(sizeof(Atd_t));
 
    if (N <= 0)
    {
        printf("\nThe incorrect input ArraySize, is created one element Array\n");
        N = 1;
    }
    if (Size <= 0)
    {
        printf("\nThe incorrect input ElementSize, is created element Size = 1\n");
        Size = 1;
    }
 
    Atd->ArraySize = N;
    Atd->ElementSize = Size;
    Atd->AtdType = AtdType;
 
    /* Выделение памяти под элементы массива ptrArray*/
    Atd->ptrArray = malloc(N * Size);
 
    return Atd;
}
 
 
/*Освобождение памяти*/
void AtdFree(Atd_t * Atd)
{
    free(Atd->ptrArray);    /* Освобождение памяти для void * */
    free(Atd);              /* Освобождение памяти для структуры Atd * */
}
 
 
/*Инициализация Atd_t */
void AtdInit(Atd_t * Atd, void * ud_t)
{
    char * cptrArray = (char *) Atd->ptrArray;
    char * cptrSrc = (char *) ud_t;
    char * cptrTrgt;
    unsigned ArraySize = Atd->ArraySize;
    unsigned ElementSize = Atd->ElementSize;
    unsigned i, j;
 
    /*
    for (i = 0; i < ArraySize * ElementSize; i++)
    {
        cptrArray[i] = cptrSrc[i];
    }
    */
 
    for (i = 0; i < ArraySize; i++)
    {
        cptrTrgt = &cptrArray[i * ElementSize];
        for (j = 0; j < ElementSize; j++)
            cptrTrgt[j] = cptrSrc[i * ElementSize + j];
    }
}
 
 
/*Получение размера Atd_t массива */
unsigned GetAtdSizeArray(Atd_t * Atd)
{
    return (Atd->ArraySize);
}
 
 
/*Получение размера элемента Atd_t массива */
unsigned GetAtdElementSize(Atd_t * Atd)
{
    return (Atd->ElementSize);
}
 
/*Получение типа элемента Atd_t массива */
unsigned GetAtdType(Atd_t * Atd)
{
    return (Atd->AtdType);
}
 
 
/* Вывод на экран элементов АТД*/
void AtdPrint(Atd_t * Atd, char * cDelimiter)
{
    char * cptrArray = (char *) Atd->ptrArray;
    unsigned ArraySize = Atd->ArraySize;
    unsigned ElementSize = Atd->ElementSize;
    unsigned AtdType = Atd->AtdType;
    unsigned i;
    int IntElement;
    float FloatElement;
    double DoubleElement;
 
    if (AtdType > 4)
        printf("Output for this data type Atd will be implemented in the future");
    else
        for (i = 0; i < ArraySize; i++)
        {
            if (AtdType == 1) /*  1 - string */
                printf("%c", cptrArray[i]);
            else if (AtdType == 2) /*  2 - int */
            {
                IntElement = cptrArray[i *  ElementSize];
                printf("%d", IntElement);
            }
            else if (AtdType == 3) /*  3 - float */
            {
                FloatElement = cptrArray[i *  ElementSize];
                printf("%.2f", FloatElement);
            }
            else if (AtdType == 4) /*  4 - double */
            {
                DoubleElement = cptrArray[i *  ElementSize];
                printf("%5.2f", DoubleElement);
            }
 
           printf("%s", cDelimiter);
        }
}
 
 
/* Получение элементов массива с i-го по j-й (для строки - это получение подстроки) */
int GetAtdElements(Atd_t * AtdSrc, Atd_t * AtdElements, unsigned BegIndex, unsigned EndIndex)
{
    char * cptrSrc = (char *) AtdSrc->ptrArray;
    char * cptrTrgt = (char *) AtdElements->ptrArray;
    unsigned ArraySize = AtdSrc->ArraySize;
    unsigned ElementSize = AtdSrc->ElementSize;
    unsigned i;
    unsigned n = 0;
 
    if (AtdSrc->AtdType != AtdElements->AtdType)
    {
        printf("\nOperation is possible only for the same AtdType");
        return (-1); /* Fatal Error */
    }
 
    if (BegIndex <= 0 || BegIndex > EndIndex || EndIndex > ArraySize)
    {
        printf("\nInput Not correct Index value i or j - Index i must be > 0 and <= j and j must be <= SizeArray, i.e. value must be from 1 to %d", ArraySize);
        return (1); /* Error */
    }
 
    for (i = (BegIndex - 1) * ElementSize; i < EndIndex * ElementSize; i++)
        cptrTrgt[n++] = cptrSrc[i];
 
    return (0); /* Success */
}
 
/* Конкатенация */
int AtdConcatenation(Atd_t * AtdSrc1, Atd_t * AtdSrc2, Atd_t * AtdTrgt)
{
    char * cptrSrc1 = (char *) AtdSrc1->ptrArray;
    char * cptrSrc2 = (char *) AtdSrc2->ptrArray;
    char * cptrTrgt = (char *) AtdTrgt->ptrArray;
    unsigned ElementSize = AtdSrc1->ElementSize;
    unsigned cElementsAtdSrc1 = AtdSrc1->ArraySize * ElementSize;
    unsigned cElementsAtdSrc2 = AtdSrc2->ArraySize * ElementSize;
    unsigned NewArraySize = AtdTrgt->ArraySize;
    unsigned ArrayConcat = AtdSrc1->ArraySize + AtdSrc2->ArraySize;
    unsigned i;
 
    if (AtdSrc1->AtdType != AtdSrc2->AtdType)
    {
        printf("\nOperation is possible only for the same AtdType");
        return (-1); /* Fatal Error */
    }
 
    if (NewArraySize != ArrayConcat)
    {
        printf("\nIncorrect Size Atd Concatenation - must be = %d, and the total size is specified = %d", ArrayConcat, NewArraySize);
        return (-2); /* Fatal Error */
    }
 
    for (i = 0; i < cElementsAtdSrc1; i++)
        cptrTrgt[i] = cptrSrc1[i];
 
    for (i = 0; i < cElementsAtdSrc2; i++)
        cptrTrgt[cElementsAtdSrc1 + i] = cptrSrc2[i];
 
    return (0); /* Success */
}
main.c:
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
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <ctype.h>
#include "Include/Atd.h"
 
int main()
{
    Atd_t * String1, * String2;
    Atd_t * AtdElements, * ConcatAtd;
    Atd_t * Int1, * Int2;
    Atd_t * Float1, * Float2;
 
    int MaxLenStr = 128;
    char * Str = (char *) malloc(sizeof(char) * MaxLenStr);
    unsigned i, j;
    unsigned AtdSizeArray;
    char ChoiceNext;
 
    unsigned SizeIntArray1 = 10;
    unsigned SizeIntArray2 = 10;
    int IntArray1[] = {10,11,21,31,41,51,61,71,81,91};
    int IntArray2[] = {91,81,71,61,51,41,31,21,11,10};
 
    unsigned SizeFloatArray1 = 10;
    unsigned SizeFloatArray2 = 10;
    float FloatArray1[] = {10.0,11.1,21.2,31.3,41.4,51.5,61.6,71.7,81.8,91.9};
    float FloatArray2[] = {91.1,81.2,71.3,61.4,51.5,41.6,31.7,21.8,11.9,10.0};
 
 
    /* Проверка полиморфизма для элементов типа int и float */
 
    /* Работа с int */
    printf("\n\n\nCheck polymorphism for elements of type int\n");
    printf("\nInit array type int for Int1:\n");
    for (i = 0; i < SizeIntArray1; i++)
        printf("%d, ", IntArray1[i]);
 
    /* Выделение памяти для Atd_t */
    Int1 = AtdAllocate(SizeIntArray1, sizeof(int), 2);   /* AtdType = 2 - int */
 
    /* Инициализация Atd_t */
    AtdInit(Int1, IntArray1);
 
    /* Вывод на экран после инициализации Int1 */
    printf("\nOutput Elements Atd with Delimiter:\n");
    AtdPrint(Int1, "|");
 
    /* --- Получение элементов Atd Int1 с i-го по j-й элемент*/
    i = 2;
    j = 5;
 
    /* Выделение памяти для Atd_t Array Size = j - i + 1*/
    AtdElements = AtdAllocate(j - i + 1, GetAtdElementSize(Int1), GetAtdType(Int1));
 
    if (GetAtdElements(Int1, AtdElements, i, j) == 0) /* Если получение элементов с i-го по j-й успешно, выводим элементы на экран */
    {
        printf("\n\nOutput Elements from %d to %d with Delimiter:\n", i, j);
        AtdPrint(AtdElements, "|");
    }
 
    AtdFree(AtdElements);
 
    printf("\n\nInit array type int for Int2:\n");
    for (i = 0; i < SizeIntArray2; i++)
        printf("%d, ", IntArray2[i]);
 
    /* Выделение памяти для Atd_t */
    Int2 = AtdAllocate(SizeIntArray2, sizeof(int), 2);   /* AtdType = 2 - int */
 
    /* Инициализация Atd_t */
    AtdInit(Int2, IntArray2);
 
    /* Вывод на экран после инициализации Int2 */
    printf("\nOutput Elements Atd with Delimiter:\n");
    AtdPrint(Int2, "|");
 
    /* Выделение памяти для Сoncatenation Atd_t */
    ConcatAtd = AtdAllocate(GetAtdSizeArray(Int1) + GetAtdSizeArray(Int2), GetAtdElementSize(Int1), GetAtdType(Int1));
 
    if (AtdConcatenation(Int1, Int2, ConcatAtd) == 0) /* Если Конкатенация успешно, выводим итого на экран */
    {
        printf("\n\nOutput Elements after Concatenation with Delimiter:\n");
        AtdPrint(ConcatAtd, "|");
    }
 
    AtdFree(Int2);
    AtdFree(ConcatAtd);
    AtdFree(Int1);
 
 
   /* Работа с float */
    printf("\n\n\nCheck polymorphism for elements of type float");
 
    printf("\n\nInit array type float for Float1:\n");
    for (i = 0; i < SizeFloatArray1; i++)
        printf("%5.2f, ", FloatArray1[i]);
 
    /* Выделение памяти для Atd_t */
    Float1 = AtdAllocate(SizeFloatArray1, sizeof(float), 3);   /* AtdType = 3 - float */
 
    /* Инициализация Atd_t */
    AtdInit(Float1, FloatArray1);
 
    /* Вывод на экран после инициализации Float1 */
    printf("\n\nOutput Elements Atd with Delimiter:\n");
    AtdPrint(Float1, "|");
 
    /* --- Получение элементов Atd Float1 с i-го по j-й элемент*/
    i = 2;
    j = 5;
 
    /* Выделение памяти для Atd_t Array Size = j - i + 1*/
    AtdElements = AtdAllocate(j - i + 1, GetAtdElementSize(Float1), GetAtdType(Float1));
 
    if (GetAtdElements(Float1, AtdElements, i, j) == 0) /* Если получение элементов с i-го по j-й успешно, выводим элементы на экран */
    {
        printf("\n\nOutput Elements from %d to %d with Delimiter:\n", i, j);
        AtdPrint(AtdElements, "|");
    }
 
    AtdFree(AtdElements);
 
    printf("\n\nInit array type float for Float2:\n");
    for (i = 0; i < SizeFloatArray2; i++)
        printf("%5.2f, ", FloatArray2[i]);
 
 
    /* Выделение памяти для Atd_t */
    Float2 = AtdAllocate(SizeFloatArray2, sizeof(float), 3);   /* AtdType = 3 - float */
 
    /* Инициализация Atd_t */
    AtdInit(Float2, FloatArray2);
 
    /* Вывод на экран после инициализации Int2 */
    printf("\n\nOutput Elements Atd with Delimiter:\n");
    AtdPrint(Float2, "|");
 
    /* Выделение памяти для Сoncatenation Atd_t */
    ConcatAtd = AtdAllocate(GetAtdSizeArray(Float1) + GetAtdSizeArray(Float2), GetAtdElementSize(Float1), GetAtdType(Float1));
 
    if (AtdConcatenation(Float1, Float2, ConcatAtd) == 0) /* Если Конкатенация успешно, выводим итого на экран */
    {
        printf("\n\nOutput Elements after Concatenation with Delimiter:\n");
        AtdPrint(ConcatAtd, "|");
    }
 
    AtdFree(Float2);
    AtdFree(ConcatAtd);
 
    AtdFree(Float1);
 
 
return(0);
 
}
Помогите мне кто-нибудь, плиз
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.05.2018, 01:33
Ответы с готовыми решениями:

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

Создание абстрактного типа данных
Сейчас читаю книгу Брюса Эккеля - Философия C++. Вот там одно их задиний: &quot;Создайте абстрактный...

Написание абстрактного типа данных (полиморфная коллекция)
Помогите, пожалуйста, с программой. Необходимо написать абстрактный тип данных (полиморфную...

Проверить корректность реализации динамического массива
Проверьте пожалуйста или я правильно сделал динамический массив!! #include&lt;iostream.h&gt;...

3
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
23.05.2018, 15:42 2
Могу только посоветовать искать ошибку отладчиком.
0
0 / 0 / 0
Регистрация: 22.05.2018
Сообщений: 4
23.05.2018, 16:09  [ТС] 3
Препод указал на ошибку:
функция AtdPrint неправильно реализована.
Выражение
cptrArray[i * ElementSize]
в любом случае имеет тип char, т.к. вы разыменовываете здесь указатель char*

Если хранится int, то cptrArray[i * ElementSize] всё равно имеет тип char, причём только первый char, лежащий по указателю, хотя тип int имеет размер 4, т.е. 3 байта от int-а просто игнорируются у вас в программе; затем выражение IntElement = cptrArray[i * ElementSize]; всего лишь инициирует неявное приведение типа этого char-а к типу int. Почему вы видите правильные значения int? Потому что вы выбрали для своих экспериментов значения, которые меньше 127, а значения char приводятся к int аккурат в пределы от -128 до 127. Это просто совпадение, вам повезло.

Как правильно? Вкратце *((double*)&cptrArray[i * ElementSize]) - сперва приведение указателя на char к указателю на double, затем разыменование первого double, лежащего по указателю. Тогда к double будут приведены 8 байт, лежащих по адресу &cptrArray[i * ElementSize]
В итоге AtdPrint получилась вот так:
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
/* Вывод на экран элементов АТД*/
void AtdPrint(Atd_t * Atd, char * cDelimiter)
{
    char * cptrArray = (char *) Atd->ptrArray;
    unsigned ArraySize = Atd->ArraySize;
    unsigned ElementSize = Atd->ElementSize;
    unsigned AtdType = Atd->AtdType;
    unsigned i;
    int IntElement;
    float FloatElement;
    double DoubleElement;
 
    if (AtdType > 4)
        printf("Output for this data type Atd will be implemented in the future");
    else
        for (i = 0; i < ArraySize; i++)
        {
            if (AtdType == 1) /* 1 - string */
                printf("%c", cptrArray[i]);
            else if (AtdType == 2) /* 2 - int */
            {
                IntElement = *((int*)&cptrArray[i *  ElementSize]);
                printf("%d", IntElement);
            }
            else if (AtdType == 3) /* 3 - float */
            {
                FloatElement = *((float*)&cptrArray[i *  ElementSize]);
                printf("%.2f", FloatElement);
            }
            else if (AtdType == 4) /* 4 - double */
            {
                DoubleElement = *((double*)&cptrArray[i *  ElementSize]);
                printf("%.2f", DoubleElement);
            }
 
           printf("%s", cDelimiter);
        }
}
Всем спасибо, тема закрыта
0
603 / 403 / 212
Регистрация: 30.04.2017
Сообщений: 743
23.05.2018, 16:30 4
del
0
23.05.2018, 16:30
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.05.2018, 16:30
Помогаю со студенческими работами здесь

Динамический полиморфизм (разработка абстрактного класса)
Дано задание:Согласно варианту задания, разработайте структуру абстрактного класса, который...

Создать класс для реализации динамического массива
Доброго времени суток! Помогите создать класс который реализует динамический массив(с динамическим...

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

Список на основе динамического массива
Добрый вечер,уважаемые форумчане!Пожалуйста не кидайтесь тапками.Я не прошу решения моей...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru