Last active
December 22, 2020 10:04
-
-
Save EugW/b6aa7bacb17471fa59bf240ea101467c to your computer and use it in GitHub Desktop.
Лаб7
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> // Стандартный ввод/вывод | |
#include <stdlib.h> // Стандартная библиотека | |
#ifdef _WIN32 | |
#define CLEAR_COMM "cls" | |
#else | |
#define CLEAR_COMM "clear" | |
#endif | |
typedef enum { // Перечисление типов ламп | |
HALOGEN = '1', // Галогенная | |
INCANDESCENT = '2', // Лампа накаливания | |
GAS = '3' // Газовая лампа | |
} LType; | |
typedef struct { // Структура, содержащая параметры лампы | |
LType type; // Тип лампы | |
int voltage; // Номинальное напряжение (V) | |
int power; // Номинальная мощность (W) | |
int ct; // Цветовая температура (color temperature) (K) | |
int brightness; // Яркость (LM) | |
} Bulb; | |
char mgetc() { // Функция чтения 1 символа | |
char c; // Переменная типа char | |
while ((c = getchar()) == '\n' || c == '\r'); // Цикл нужен чтобы игнорировать переход на новую строку | |
return c; // Возврат значения | |
} | |
int main() { // Главная функция | |
printf("LAB7, V2\n"); // Вывод номера и варианта лаб. работы | |
Bulb* arr = malloc(0); // Инициализация указателя | |
Bulb* pStart = arr; // Вспомогательный указатель, указывает на начало | |
int bulbscount = 0; // Количество ламп | |
while (1) { // Бесконечный цикл | |
printf("a - Add struct.\n" // Вывод возможных действий | |
"d - Delete struct.\n" | |
"v - View struct.\n" | |
"e - Exit.\n" | |
"Choose an action: "); | |
switch (mgetc()) { // Switch конструкция для выполнения выбранного действия | |
case 'a': { // а - Добавление структуры | |
system(CLEAR_COMM); // Очистка консоли | |
bulbscount++; // Увеличивание количества ламп | |
pStart = realloc(pStart, bulbscount * sizeof(Bulb)); // Переопределние памяти с учетом нового количества ламп | |
arr = pStart + (bulbscount - 1) * sizeof(Bulb); // Указатель на новую структуру | |
printf("1 - Halogen\n" // Вывод возможных вариантов | |
"2 - Incandescent\n" | |
"3 - Gas\n" | |
"Enter type: "); | |
arr->type = mgetc(); // Ввод типа лампы | |
printf("Enter rated voltage: "); | |
scanf("%d", &(arr->voltage)); // Ввод номинального напряжения | |
printf("Enter rated power: "); | |
scanf("%d", &(arr->power)); // Ввод номинальной мощности | |
printf("Enter color temperature: "); | |
scanf("%d", &(arr->ct)); // Ввод цветовой температуры | |
printf("Enter brightness: "); | |
scanf("%d", &(arr->brightness)); // Ввод яркости | |
break; | |
} | |
case 'd': { // d - Удаление структуры | |
system(CLEAR_COMM); // Очистка консоли | |
if (bulbscount == 0) break; // Нельзя удалить структуру, если ее нет | |
int num; // Номер структуры, над которой будет производиться действие | |
printf("Enter number of struct (0..%d): ", bulbscount - 1); | |
scanf("%d", &num); // Ввод номера | |
if (0 > num || num > bulbscount - 1) { // Защита от выхода за количество ламп | |
printf("Out of range\n" | |
"Press any key to continue . . . "); | |
getchar(); // Пауза | |
getchar(); | |
break; | |
} | |
Bulb* tmp = malloc((bulbscount - 1) * sizeof(Bulb)); // Определние нового указателя с учетом удаленной структуры | |
Bulb* tmpStart = tmp; // Указатель на начало | |
arr = pStart; // Указатель для работы над исходным массивом | |
for (int i = 0; i < bulbscount; i++) { | |
if (i != num) { | |
tmp->type = arr->type; | |
tmp->voltage = arr->voltage; | |
tmp->power = arr->power; | |
tmp->ct = arr->ct; | |
tmp->brightness = arr->brightness; | |
tmp += sizeof(Bulb); // Сдвиг указателя на одну структуру | |
} | |
arr += sizeof(Bulb); // Сдвиг указателя на одну структуру | |
} | |
bulbscount--; // Уменьшение количества ламп | |
pStart = tmpStart; // Новый указатель начала массива | |
break; | |
} | |
case 'v': { // v - Вывод структуры | |
system(CLEAR_COMM); // Очистка консоли | |
if (bulbscount == 0) break; // Нельзя вывести структуру, если ее нет | |
int num; // Номер структуры, над которой будет производиться действие | |
printf("Enter number of struct (0..%d): ", bulbscount - 1); | |
scanf("%d", &num); // Ввод номера | |
if (0 > num || num > bulbscount - 1) { // Защита от выхода за количество ламп | |
printf("Out of range\n" | |
"Press any key to continue . . . "); | |
getchar(); // Пауза | |
getchar(); | |
break; | |
} | |
arr = pStart + num * sizeof(Bulb); // Указатель на структуру под номером | |
printf("Type: "); | |
switch (arr->type) { | |
case '1': { | |
printf("Halogen"); | |
break; | |
} | |
case '2': { | |
printf("Incandescent"); | |
break; | |
} | |
case '3': { | |
printf("Gas"); | |
break; | |
} | |
} | |
printf("\nVoltage: %d V\nPower: %d W\nColor temperature: %d K\nBrightness: %d LM\n", arr->voltage, arr->power, arr->ct, arr->brightness); | |
printf("Press any key to continue . . . "); | |
getchar(); // Пауза | |
getchar(); | |
break; | |
} | |
case 'e': { | |
return 0; // Выход из программы | |
} | |
} | |
system(CLEAR_COMM); // Вызов паузы независимо от системы | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment