Skip to content

Instantly share code, notes, and snippets.

@EugW
Last active December 22, 2020 10:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save EugW/b6aa7bacb17471fa59bf240ea101467c to your computer and use it in GitHub Desktop.
Save EugW/b6aa7bacb17471fa59bf240ea101467c to your computer and use it in GitHub Desktop.
Лаб7
#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