Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.10 KB | None | 0 0
  1.  
  2. #pragma hdrstop
  3. #pragma argsused
  4.  
  5. #ifdef _WIN32
  6. #include <tchar.h>
  7. #else
  8. typedef char _TCHAR;
  9. #define _tmain main
  10. #endif
  11.  
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <stdlib.h>
  15.  
  16. /* Размеры строк увеличены в связи с тем, что кириллица (во всяком случае у меня)
  17.    занимает два байта */
  18. /* Таким образом, name может хранить 5 русских букв, country - 16 */
  19. struct Data {
  20.     char name[11]; /* Наименование товара */
  21.     char country[33]; /* Страна производитель */
  22.     float dl; /* Длина товара (м) */
  23.     float hr; /* Ширина товара (м) */
  24.     float vs; /* Высота товара (м) */
  25.     float ob; /* Объем товара (м^3) */
  26.     unsigned int vr; /* Частота вращения (об/мин) */
  27.     unsigned char tp; /* Значение пускового тока (А) */
  28.     unsigned short m; /* Масса товара (кг) */
  29.     float gh; /* Стоимость товара (тыс. руб.) */
  30. };
  31.  
  32.  
  33. int load(struct Data* data) {
  34.     FILE* fp = fopen("input.txt", "r");
  35.  
  36.     /* Читаем количество строк */
  37.     int n;
  38.     fscanf(fp, "%d", &n);
  39.  
  40.     /* Считываем все строки по очереди, если они есть */
  41.     if (n != 0) {
  42.         for (int i = 0; i < n; i++) {
  43.             fscanf(fp, "%s %s %f %f %f %u %hhu %hu %f", data[i].name, data[i].country, &data[i].dl, &data[i].hr, &data[i].vs, &data[i].vr, &data[i].tp, &data[i].m, &data[i].gh);
  44.             /* Вычисляем объём */
  45.             data[i].ob = data[i].dl * data[i].hr * data[i].vs;
  46.         }
  47.     }
  48.  
  49.     fclose(fp);
  50.     return n;
  51. }
  52.  
  53. void print_table(struct Data* data, int col) {
  54.     /* Выводим заголовок */
  55.     printf("| Наименование товара | Страна-производитель | Габариты товара (м)      | Объём товара | Частота вращения | Пусковой ток | Масса товара | Стоимость товара |\n");
  56.     printf("|                     |                      | длина  х ширина х высота |          м^3 |           об/мин |        Ампер |    килограмм |      тыс. рублей |\n");
  57.     printf("|---------------------|----------------------|--------------------------|--------------|------------------|--------------|--------------|------------------|\n");
  58.    
  59.     /* В цикле выводим все элементы БД, выравниваем по размерам таблицы */
  60.     for (int i = 0; i < col; i++) {
  61.         printf("| %-*s | %-*s | %6.2f x %6.2f x %6.2f | %12.2f | %16u | %12hhu | %12hu | %16.3f |\n", (int)(19 + (strlen(data[i].name) / 2)), data[i].name, (int)(20 + (strlen(data[i].country) / 2)), data[i].country, data[i].dl, data[i].hr, data[i].vs, data[i].ob, data[i].vr, data[i].tp, data[i].m, data[i].gh);
  62.     }
  63.     printf("|---------------------|----------------------|--------------------------|--------------|------------------|--------------|--------------|------------------|\n");
  64. }
  65.  
  66. /* Так как строки в массиве нумеруются с нуля, то n обозначает номер следующей
  67.    структуры. Если всё успешно, функция возвращает 1, которая прибавляется к n */
  68. int add_str(struct Data* data, int n) {
  69.     printf("Введине наименование товара: ");
  70.     scanf("%s", data[n].name);
  71.     printf("Введите страну производства: ");
  72.     scanf("%s", data[n].country);
  73.     printf("Введите длину: ");
  74.     scanf("%f", &data[n].dl);
  75.     printf("Введите ширину: ");
  76.     scanf("%f", &data[n].hr);
  77.     printf("Введите высоту: ");
  78.     scanf("%f", &data[n].vs);
  79.     data[n].ob = data[n].dl * data[n].hr * data[n].vs;
  80.     printf("Введите частоту вращения: ");
  81.     scanf("%u", &data[n].vr);
  82.     printf("Введите пусковой ток: ");
  83.     scanf("%hhu", &data[n].tp);
  84.     printf("Введите массу: ");
  85.     scanf("%hu", &data[n].m);
  86.     printf("Введите стоимость: ");
  87.     scanf("%f", &data[n].gh);
  88.     return 1;
  89. }
  90.  
  91.  
  92. int del_str(struct Data* data, int n) {
  93.     int num; /* Номер удаляемой строки */
  94.     printf("Введите номер строки для удаления: ");
  95.     scanf("%d", &num);
  96.     if (num < 1 || num > n) {
  97.         printf("Такой строки нет. Попробуйте снова\n");
  98.         return 0;
  99.     }
  100.     num--; /* Приводим к удобному для программы виду */
  101.  
  102.     /* Если мы удаляем не последнюю строку, то нужно сместить все идущие за ней */
  103.     if (num != n - 1) {
  104.         for (int i = num; i < n; i++) {
  105.             data[i] = data[i + 1];
  106.         }
  107.     }
  108.  
  109.     /* Если последнюю, то мы просто уменьшаем количество строк на 1 */
  110.     return 1;
  111. }
  112.  
  113. int change_str(struct Data* data, int n) {
  114.     int num; /* Номер изменяемой строки */
  115.     int v;   /* Номер параметра */
  116.     printf("Какую строку изменить? ");
  117.     scanf("%d", &num);
  118.     if (num < 1 || num > n) {
  119.         printf("Такой строки нет. Попробуйте снова\n");
  120.         return 1;
  121.     }
  122.     num--;
  123.     printf("Какой параметр изменить:\n");
  124.     printf("1. Наименование\n");
  125.     printf("2. Страну-производителя\n");
  126.     printf("3. Длину\n");
  127.     printf("4. Ширину\n");
  128.     printf("5. Высоту\n");
  129.     printf("6. Частоту вращения\n");
  130.     printf("7. Пусковой ток\n");
  131.     printf("8. Массу\n");
  132.     printf("9. Стоимость\n");
  133.     scanf("%d", &v);
  134.     printf("Введите новое значение: ");
  135.    
  136.     /* Считываем и меняем значение в зависимости от выбора */
  137.     /* Если бы меняем габариты, то нужно пересчитать объём */
  138.     if (v == 1) {
  139.         scanf("%s", data[num].name);
  140.     } else if (v == 2) {
  141.         scanf("%s", data[num].country);
  142.     } else if (v == 3) {
  143.         scanf("%f", &data[num].dl);
  144.         data[num].ob = data[num].dl * data[num].hr * data[num].vs;
  145.     } else if (v == 4) {
  146.         scanf("%f", &data[num].hr);
  147.         data[num].ob = data[num].dl * data[num].hr * data[num].vs;
  148.     } else if (v == 5) {
  149.         scanf("%f", &data[num].vs);
  150.         data[num].ob = data[num].dl * data[num].hr * data[num].vs;
  151.     } else if (v == 6) {
  152.         scanf("%u", &data[num].vr);
  153.     } else if (v == 7) {
  154.         scanf("%hhu", &data[num].tp);
  155.     } else if (v == 8) {
  156.         scanf("%hu", &data[num].m);
  157.     } else if (v == 9) {
  158.         scanf("%f", &data[num].gh);
  159.     }
  160.  
  161.     return 0;
  162. }
  163.  
  164. void save(struct Data* data, int n) {
  165.     FILE* fp = fopen("output.txt", "w");
  166.  
  167.     /* Записываем количество строк, затем сами строки */
  168.     fprintf(fp, "%d\n", n);
  169.     for (int i = 0; i < n; i++) {
  170.         fprintf(fp, "%s %s %.2f %.2f %.2f %u %hhu %hu %.3f\n", data[i].name, data[i].country, data[i].dl, data[i].hr, data[i].vs, data[i].vr, data[i].tp, data[i].m, data[i].gh);
  171.     }
  172.  
  173.     fclose(fp);
  174. }
  175.  
  176. int _tmain(int argc, _TCHAR* argv[]) {
  177.     system("chcp 1251");
  178.  
  179.     /* Загружаем данные из файла */    
  180.     struct Data* data;
  181.     int n = load(data); /* В n храним количество строк */    
  182.  
  183.     printf("Магазин Tesla, каталог электродвигателей\n");
  184.     printf("Выберите действие:\n");
  185.     printf("1. Показать таблицу\n");
  186.     printf("2. Добавить строку\n");
  187.     printf("3. Удалить строку\n");
  188.     printf("4. Изменить строку\n");
  189.     printf("5. Сохранение и выход\n");
  190.  
  191.     /* Выбираем функцию */
  192.     int v;
  193.     do { /* Спрашиваем, пока не выбран выход */
  194.         printf("Выберите действие:\n");
  195.         scanf("%d", &v);
  196.  
  197.         if (v == 1) {
  198.             print_table(data, n);   /* Выводим данные */
  199.         } else if (v == 2) {
  200.             n += add_str(data, n);  /* Добавляем строку */
  201.         } else if (v == 3) {
  202.             n -= del_str(data, n);  /* Удаляем строку */
  203.         } else if (v == 4) {
  204.             change_str(data, n);    /* Изменяем строку */
  205.         } else if (v == 5) {
  206.             save(data, n); /* Перед выходом сохраняем */
  207.             printf("Всего доброго!\n");
  208.         } else {
  209.             printf("Неверное значение, повторите ввод.\n");
  210.         }
  211.     } while (v != 5);
  212.  
  213.     system("pause");
  214.     return 0;
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement