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