Описать массив, индексами которого являются буквы - 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, что означает успешный конец работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д