Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <string.h>
- #include <locale.h>
- #define DATA_LEN (5) /* количество элементов структуры */
- #define USA_KNOWN_FIELDS (3) /* Известные поля для стобца США */
- /* Элемент таблицы */
- struct data
- {
- float coal, oil, gas, peat, slates;
- };
- /* получить поле структуры по индексу */
- float* getFieldByIndex(struct data* const data, unsigned char idx)
- {
- if (!data)
- {
- return NULL;
- }
- switch (idx)
- {
- case 0: return &data->coal; break;
- case 1: return &data->oil; break;
- case 2: return &data->gas; break;
- case 3: return &data->peat; break;
- case 4: return &data->slates; break;
- default: return NULL;
- }
- }
- /* костантные строки */
- #define OFFSET_LEN1 (24)
- #define OFFSET_LEN2 (14)
- static const char* const typenames[] =
- {
- "Каменные и бурые угли", "Нефть", "Природный газ", "Торф", "Сланцы"
- };
- static const char* const OFFSET = " ";
- static const char* const DIVIDER = \
- "----------------------------------------------------------------------";
- /* Коды клавиш */
- #define ESCAPE (27)
- #define BACKSPACE (8)
- #define ENTER (13)
- #define BUFFER_LENGTH (256) /* длина буфера ввода */
- static char __buffer[BUFFER_LENGTH]; /* буфер ввода */
- /* Функция для ограничения ввода */
- static unsigned input(const char* const use, const char* const printAfter)
- {
- int _tmp;
- unsigned i = 0;
- if (!use)
- return 0;
- while (i < BUFFER_LENGTH)
- {
- _tmp = getch();
- if (_tmp == ENTER)
- {
- __buffer[i] = '\0';
- break;
- }
- else if (_tmp == BACKSPACE && i > 0)
- {
- printf("\b \b");
- --i;
- }
- else if (_tmp == ESCAPE)
- {
- exit(0);
- }
- else if (_tmp == 0) /* Если нажата специальная клавиша */
- {
- continue;
- }
- else if (strchr(use, _tmp))
- {
- __buffer[i++] = _tmp;
- putchar(_tmp);
- }
- }
- if (printAfter)
- {
- printf(printAfter);
- }
- return i;
- }
- /* запросить ввод вещественного числа */
- float inputFloat(const char* const printAfter)
- {
- input(",0123456789", printAfter);
- return atof(__buffer);
- }
- int main(void)
- {
- setlocale(LC_ALL, "Russian"); /* Локализация консоли */
- struct data ussr1955, ussr1956, usa1954 = { 0 };
- /* Ввод данных */
- float inc = -1, _tmp;
- unsigned char type = 0;
- puts(DIVIDER);
- puts("Вид топлива\t\t| CCCР 1955 г. | CCCР 1956 г. | США 1954 г. |");
- for (unsigned char i = 0; i < DATA_LEN; ++i)
- {
- puts(DIVIDER);
- printf("%s%.*s|", typenames[i], (int)(OFFSET_LEN1 - strlen(typenames[i])), OFFSET);
- *getFieldByIndex(&ussr1955, i) = inputFloat(NULL);
- printf("%.*s|", (int)(OFFSET_LEN2 - strlen(__buffer)), OFFSET);
- *getFieldByIndex(&ussr1956, i) = inputFloat(NULL);
- printf("%.*s|", (int)(OFFSET_LEN2 - strlen(__buffer)), OFFSET);
- /* а) Поиск максимального отностительного прироста */
- _tmp = *getFieldByIndex(&ussr1956, i) / *getFieldByIndex(&ussr1955, i);
- if (_tmp > inc)
- {
- inc = _tmp;
- type = i;
- }
- if (i < USA_KNOWN_FIELDS)
- {
- *getFieldByIndex(&usa1954, i) = inputFloat(NULL);
- printf("%.*s|", (int)(OFFSET_LEN2 - strlen(__buffer)), OFFSET);
- }
- else
- {
- printf(" -- |");
- }
- putchar('\n');
- }
- puts(DIVIDER);
- if (inc > 0)
- {
- inc = inc * 100 - 100;
- }
- else
- {
- inc = 0;
- }
- /* а) Вывод результата */
- printf("Максимальный относительный прирост в СССР в 1955-1956 был у топлива"
- " \"%s\".\nВ 1955: %f. В 1956: %f.\nПрирост: %f%%.\n",
- typenames[type],
- *getFieldByIndex(&ussr1955, type),
- *getFieldByIndex(&ussr1956, type),
- inc);
- /* б) Поиск топлива, добыча которого была не меньше Y */
- printf("Введите Y: ");
- float Y = inputFloat("\n");
- printf("Добыча топлива была не меньше %f:\n", Y);
- for (unsigned char i = 0; i < DATA_LEN; ++i)
- {
- _tmp = *getFieldByIndex(&usa1954, i);
- printf("%d)\t", i + 1);
- if (_tmp >= Y)
- {
- printf("Тип топлива: %s\n\tОбъем добычи: %f\n", typenames[i], _tmp);
- }
- else
- {
- puts("\t-");
- }
- }
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement