Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.48 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <string.h>
  5. #include <locale.h>
  6.  
  7. #define DATA_LEN (5) /* количество элементов структуры */
  8. #define USA_KNOWN_FIELDS (3) /* Известные поля для стобца США */
  9. /* Элемент таблицы */
  10. struct data
  11. {
  12.     float coal, oil, gas, peat, slates;
  13. };
  14.  
  15. /* получить поле структуры по индексу */
  16. float* getFieldByIndex(struct data* const data, unsigned char idx)
  17. {
  18.     if (!data)
  19.     {
  20.         return NULL;
  21.     }
  22.  
  23.     switch (idx)
  24.     {
  25.         case 0: return &data->coal; break;
  26.         case 1: return &data->oil; break;
  27.         case 2: return &data->gas; break;
  28.         case 3: return &data->peat; break;
  29.         case 4: return &data->slates; break;
  30.         default: return NULL;
  31.     }
  32. }
  33.    
  34. /* костантные строки */
  35. #define OFFSET_LEN1 (24)
  36. #define OFFSET_LEN2 (14)
  37. static const char* const typenames[] =
  38. {
  39.     "Каменные и бурые угли", "Нефть", "Природный газ", "Торф", "Сланцы"
  40. };
  41. static const char* const OFFSET = "                        ";
  42. static const char* const DIVIDER = \
  43.     "----------------------------------------------------------------------";
  44.  
  45. /* Коды клавиш */
  46. #define ESCAPE (27)
  47. #define BACKSPACE (8)
  48. #define ENTER (13)
  49.  
  50. #define BUFFER_LENGTH (256) /* длина буфера ввода */
  51. static char __buffer[BUFFER_LENGTH]; /* буфер ввода */
  52.  
  53. /* Функция для ограничения ввода */
  54. static unsigned input(const char* const use, const char* const printAfter)
  55. {
  56.     int _tmp;
  57.     unsigned i = 0;
  58.    
  59.     if (!use)
  60.         return 0;
  61.  
  62.     while (i < BUFFER_LENGTH)
  63.     {
  64.         _tmp = getch();
  65.         if (_tmp == ENTER)
  66.         {
  67.             __buffer[i] = '\0';
  68.             break;
  69.         }
  70.         else if (_tmp == BACKSPACE && i > 0)
  71.         {
  72.             printf("\b \b");
  73.             --i;
  74.         }
  75.         else if (_tmp == ESCAPE)
  76.         {
  77.             exit(0);
  78.         }
  79.         else if (_tmp == 0) /* Если нажата специальная клавиша */
  80.         {
  81.             continue;
  82.         }
  83.         else if (strchr(use, _tmp))
  84.         {
  85.             __buffer[i++] = _tmp;
  86.             putchar(_tmp);
  87.         }
  88.     }
  89.  
  90.     if (printAfter)
  91.     {
  92.         printf(printAfter);
  93.     }
  94.  
  95.     return i;
  96. }
  97.  
  98. /* запросить ввод вещественного числа */
  99. float inputFloat(const char* const printAfter)
  100. {
  101.     input(",0123456789", printAfter);
  102.     return atof(__buffer);
  103. }
  104.  
  105. int main(void)
  106. {
  107.     setlocale(LC_ALL, "Russian"); /* Локализация консоли */
  108.     struct data ussr1955, ussr1956, usa1954 = { 0 };
  109.  
  110.     /* Ввод данных */
  111.     float inc = -1, _tmp;
  112.     unsigned char type = 0;
  113.  
  114.     puts(DIVIDER);
  115.     puts("Вид топлива\t\t| CCCР 1955 г. | CCCР 1956 г. |  США 1954 г. |");
  116.     for (unsigned char i = 0; i < DATA_LEN; ++i)
  117.     {
  118.         puts(DIVIDER);
  119.         printf("%s%.*s|", typenames[i], (int)(OFFSET_LEN1 - strlen(typenames[i])), OFFSET);
  120.         *getFieldByIndex(&ussr1955, i) = inputFloat(NULL);
  121.         printf("%.*s|", (int)(OFFSET_LEN2 - strlen(__buffer)), OFFSET);
  122.         *getFieldByIndex(&ussr1956, i) = inputFloat(NULL);
  123.         printf("%.*s|", (int)(OFFSET_LEN2 - strlen(__buffer)), OFFSET);
  124.  
  125.         /* а) Поиск максимального отностительного прироста */
  126.         _tmp = *getFieldByIndex(&ussr1956, i) / *getFieldByIndex(&ussr1955, i);
  127.         if (_tmp > inc)
  128.         {
  129.             inc = _tmp;
  130.             type = i;
  131.         }
  132.  
  133.         if (i < USA_KNOWN_FIELDS)
  134.         {
  135.             *getFieldByIndex(&usa1954, i) = inputFloat(NULL);
  136.             printf("%.*s|", (int)(OFFSET_LEN2 - strlen(__buffer)), OFFSET);
  137.         }
  138.         else
  139.         {
  140.             printf("      --      |");
  141.         }
  142.         putchar('\n');
  143.     }
  144.     puts(DIVIDER);
  145.  
  146.     if (inc > 0)
  147.     {
  148.         inc = inc * 100 - 100;
  149.     }
  150.     else
  151.     {
  152.         inc = 0;
  153.     }
  154.  
  155.     /* а) Вывод результата */
  156.     printf("Максимальный относительный прирост в СССР в 1955-1956 был у топлива"
  157.         " \"%s\".\nВ 1955: %f. В 1956: %f.\nПрирост: %f%%.\n",
  158.         typenames[type],
  159.         *getFieldByIndex(&ussr1955, type),
  160.         *getFieldByIndex(&ussr1956, type),
  161.         inc);
  162.  
  163.     /* б) Поиск топлива, добыча которого была не меньше Y */
  164.     printf("Введите Y: ");
  165.     float Y = inputFloat("\n");
  166.  
  167.     printf("Добыча топлива была не меньше %f:\n", Y);
  168.     for (unsigned char i = 0; i < DATA_LEN; ++i)
  169.     {
  170.         _tmp = *getFieldByIndex(&usa1954, i);
  171.         printf("%d)\t", i + 1);
  172.         if (_tmp >= Y)
  173.         {
  174.             printf("Тип топлива: %s\n\tОбъем добычи: %f\n", typenames[i], _tmp);
  175.         }
  176.         else
  177.         {
  178.             puts("\t-");
  179.         }
  180.     }
  181.  
  182.     system("pause");
  183.     return 0;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement