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

Перечисление (enum) и объединение (union)

03.07.2018, 15:09. Показов 2779. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Написал вот программку из задания, но совершенно забыл про enum. Можно ли как-то его втулить не сильно перелопачивая код?

Задание
Согласно варианту создать структуры, используя объединения и перечисления. Написать функции для ввода данных в структуру с клавиатуры и вывода информации на экран.
Структура для описания товара с полями: название, тип характеристики (цвет - для чайника, тактовая частота - для компьютера, количество программ - для микроволновой печи), значение характеристики.

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
#include <stdio.h>      
#include <windows.h>    
#include <string.h>     
 
#define SIZE 2          
typedef struct {        
    char * name;        
    char * specification; 
    union {                 
        char * color;                       
        unsigned int clockRate;             
        unsigned int numberOfPrograms;      
    };
    unsigned short int check;               
} Product;
 
void inputData(Product *);      
void outputData(Product *);     
 
int main(void)
{
    SetConsoleCP(1251);         
    SetConsoleOutputCP(1251);
    Product prod[SIZE];         
    inputData(prod);            
    outputData(prod);           
    return 0;
}
 
void inputData(Product * prod)
{
    for (int i = 0; i < SIZE; i++)
    {
        (prod + i)->name = (char *)malloc(sizeof(char) * 10);
        (prod + i)->specification = (char *)malloc(sizeof(char) * 10);
        {
            if((prod + i)->specification == NULL || (prod + i)->name == NULL)
            {
                perror("Error");
                exit(EXIT_FAILURE);
            }
        }
    }
 
    for (int i = 0; i < SIZE; i++)
    {
        printf("Введите название товара: ");
        scanf("%s", (prod + i)->name);
        printf("Введите тип характеристики (цвет, тактовая/частота, программы):\n");
        while (scanf("%s", (prod + i)->specification))  
        {
            if (strcmp((prod + i)->specification, "колір") == 0) 
            {
                printf("Введите цвет: ");
                (prod + i)->color = (char *)malloc(sizeof(char) * 10); 
                {
                    if((prod + i)->color == NULL)
                    {
                        perror("Error");
                            exit(EXIT_FAILURE);
                    }
                    else
                    {
                        scanf("%s", (prod + i)->color);
                        (prod + i)->check = 1;  
                        break;
                    }
                }
            }
            else if (strcmp((prod + i)->specification, "тактовая") == 0 || strcmp((prod + i)->specification, "частота") == 0) 
            {
                printf("Введите тактовую частоту: ");
                scanf("%u", &(prod + i)->clockRate);
                break;
            }
            else if (strcmp((prod + i)->specification, "программы") == 0) 
            {
                printf("Введите кол-во программ: ");
                scanf("%u", &(prod + i)->numberOfPrograms);
                break;
            }
            else
                printf("Проверьте правильность ввода: ");
        }
    }
}
 
void outputData(Product * prod)
{
    for (int i = 0; i < SIZE; i++)
    {
        printf("\n\nНазвание %d-го товара: %s\n", i + 1, (prod + i)->name);
        if (strcmp((prod + i)->specification, "цвет") == 0)
            printf("Цвет: %s", (prod + i)->color);
        else if (strcmp((prod + i)->specification, "тактовая") == 0 || strcmp((prod + i)->specification, "частота") == 0)
            printf("Тактовая частота: %u", (prod + i)->clockRate);
        else
            printf("Кол-во программ: %u", (prod + i)->numberOfPrograms);
    }
 
    for (int i = 0; i < SIZE; i++)      
    {
        free((prod + i)->name);
        free((prod + i)->specification);
        if ((prod + i)->check == 1)
            free((prod + i)->color);
    }
}
Добавлено через 22 часа 16 минут
сделяль! может кому-то понадобиться:

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
#include <stdio.h>
#include <windows.h>
#include <string.h>
 
#define SIZE 2
typedef struct {
    char * name;
    char * specification;
    union {
        char * color;
        unsigned int clockRate;
        unsigned int numberOfPrograms;
    };
    unsigned short int check;
} Product;
enum type {_color, _clockRate, _numProgramms};
 
void inputData(Product *);
void outputData(Product *);
 
int main(void)
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    Product prod[SIZE];
    inputData(prod);
    outputData(prod);
    return 0;
}
 
void inputData(Product * prod)
{
    for (int i = 0; i < SIZE; i++)
    {
        (prod + i)->name = (char *)malloc(sizeof(char) * 10);
        (prod + i)->specification = (char *)malloc(sizeof(char) * 10);
    }
 
    for (int i = 0; i < SIZE; i++)
    {
        printf("Введіть назву товару: ");
        scanf("%s", (prod + i)->name);
        printf("Введіть тип характеристики (колір, тактова/частота, програми):\n");
        while (scanf("%s", (prod + i)->specification))
        {
            if (strcmp((prod + i)->specification, "колір") == 0)
            {
                printf("Введіть колір: ");
                (prod + i)->color = (char *)malloc(sizeof(char) * 10);
                scanf("%s", (prod + i)->color);
                (prod + i)->check = _color;
                break;
            }
            else if (strcmp((prod + i)->specification, "тактова") == 0 || strcmp((prod + i)->specification, "частота") == 0)
            {
                printf("Введіть тактову частоту: ");
                scanf("%u", &(prod + i)->clockRate);
                (prod + i)->check = _clockRate;
                break;
            }
            else if (strcmp((prod + i)->specification, "програми") == 0)
            {
                printf("Введіть кількість програм: ");
                scanf("%u", &(prod + i)->numberOfPrograms);
                (prod + i)->check = _numProgramms;
                break;
            }
            else
                printf("Перевірте правильність вводу: ");
        }
    }
}
 
void outputData(Product * prod)
{
    for (int i = 0; i < SIZE; i++)
    {
        printf("\n\nНазва %d-го товару: %s\n", i + 1, (prod + i)->name);
        if ((prod + i)->check == _color)
            printf("Колір: %s", (prod + i)->color);
        else if ((prod + i)->check == _clockRate)
            printf("Тактова частота: %u", (prod + i)->clockRate);
        else
            printf("Кількість програм: %u", (prod + i)->numberOfPrograms);
    }
 
    for (int i = 0; i < SIZE; i++)
    {
        free((prod + i)->name);
        free((prod + i)->specification);
        if ((prod + i)->check == _color)
            free((prod + i)->color);
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2018, 15:09
Ответы с готовыми решениями:

Сколько памяти занимает объединение union
Помогите пожалуйста разобраться. Сколько памяти занимает объединение union Z { int a; float b; char c; }; ? И как вообще это делать?...

Объединение union для разных массивов
Пожалуйста объясните, можно ли как то применить union в моем случае. Сложилась проблема с нехваткой памяти данных МК PIC18F2525. ...

Создать статические структуры, используя объединение и перечисление
Помогите пожалуйста написать программу: нужно создать структуру, используя объединение и перечисление. Структура для описания товара с...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.07.2018, 15:09
Помогаю со студенческими работами здесь

Enum Перечисление
Есть номиналы монет, которые занесены в 2 перечисления (enum): рубли и монеты. Набрать определенную сумму минимальным количеством монет. ...

Перечисление enum
Здравствуйте. Хотелось бы узнать, возможно ли &quot;пройтись&quot; по всем значениям перечисления, увеличивая переменную этого перечисления? Вот...

Ссылка в XAML на перечисление (enum)
Простой пример. Есть несколько RadioButton XAML &lt;StackPanel&gt; &lt;RadioButton x:Name=&quot;RadioButton1&quot;...

Сортировка элементов типа enum (перечисление)
Пишу прогу, столкнулась с такой проблемой что не могу отсортировать данные типа enum class typeOfShuttle Есть база ItemBase public...

Enum перечисление переменных и присвоение им значений
добрый день, работаю в среде qt, застала проблема в оптимизации кода, хочу перечислить переменные и присвоить им значение из списка ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru