Описать массив, индексами которого являются буквы - C (СИ)
Формулировка задачи:
Как в С можно описать массив, индексами которого являются буквы (и строчные, и заглавные) латинского алфавита, а значениями могут быть только числа 0 и 1 и никакие другие?
Оффтоп: предыдущую тему случайно создал не в том разделе.
Решение задачи: «Описать массив, индексами которого являются буквы»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
typedef unsigned long long int uint_64;
typedef enum
{
a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, x, y, z,
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, X, Y, Z
} TIndex;
typedef struct TCustomArray TCustomArray;
struct TCustomArray
{
uint_64 bits; /* при индексации 0-49 (50 элементов) будем использовать 64 бита памяти (можно
конечно использовать блок в 7 байт, а не 8-ми байтное целое, но тогда логика
индексации будет несколько сложнее). Максимальное значение составит
0x0003FFFFFFFFFFFF */
void (*SetAtIndex)(TCustomArray* const arrayPtr, const TIndex index, const unsigned char value);
int (*GetAtIndex)(TCustomArray* const arrayPtr, const TIndex index);
};
void Set(TCustomArray* const arrayPtr, const TIndex index, const unsigned char value)
{
if ((arrayPtr != NULL) && (index < Z))
{
if (value != 0)
{
arrayPtr->bits = arrayPtr->bits | (1i64 << index);
}
else
{
arrayPtr->bits = arrayPtr->bits & (~(1 << index));
}
}
}
int Get(TCustomArray* const arrayPtr, const TIndex index)
{
int returnValue = 0;
if ((arrayPtr != NULL) && (index < Z))
{
returnValue = (arrayPtr->bits >> index) & 1;
}
return returnValue;
}
void InitArray(TCustomArray* const arrayPtr)
{
if (arrayPtr != NULL)
{
arrayPtr->bits = 0;
arrayPtr->SetAtIndex = Set;
arrayPtr->GetAtIndex = Get;
}
}
int main(void)
{
int i = a;
int val = 0;
TCustomArray array;
InitArray(&array);
for(i = a; i < Z + 1; i++)
{
val = rand() % 2;
array.SetAtIndex(&array, (TIndex)i, val);
}
array.SetAtIndex(&array, a, 0);
array.SetAtIndex(&array, A, 1);
for(i = a; i < Z + 1; i++)
{
printf("[%d] : %d\n", i, array.GetAtIndex(&array, (TIndex)i));
}
return 0;
}
Объяснение кода листинга программы
- Включение необходимых заголовочных файлов: #include
и #include . - Объявление типа данных, используемого для представления индексов массива: typedef enum.
- Объявление структуры, представляющей пользовательский массив: struct TCustomArray.
- Определение методов для работы с массивом внутри структуры: void (SetAtIndex)(TCustomArray const arrayPtr, const TIndex index, const unsigned char value) и int (GetAtIndex)(TCustomArray const arrayPtr, const TIndex index).
- Реализация метода Set, отвечающего за установку значения по индексу.
- Реализация метода Get, отвечающего за получение значения по индексу.
- Реализация функции InitArray, отвечающей за инициализацию массива перед использованием.
- Реализация функции main, в которой создается экземпляр массива, заполняется случайными значениями, изменяется значение по индексам a и A, а затем выводятся все значения по индексам от a до Z.
- В функции main используется тип данных int для переменной i, которая перебирает все буквы от a до z и дополнительно точку a, а также переменная val, которая принимает случайное значение 0 или 1.
- Создается экземпляр массива TCustomArray с помощью оператора new.
- Вызывается функция InitArray для инициализации экземпляра массива.
- В цикле for перебираются все буквы от a до z и дополнительно точка a.
- Для каждой буквы вызывается метод Set, передавая в него указатель на массив, значение переменной val и индекс текущей буквы.
- Значение переменной val устанавливается равным 0 для буквы a и 1 для буквы A.
- В цикле for выводятся все значения массива по индексам от a до z.
- Значение переменной i выводится на экран с помощью функции printf.
- В конце функции main возвращается значение 0, что означает успешный конец работы программы.