Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma hdrstop
- #pragma argsused
- #ifdef _WIN32
- #include <tchar.h>
- #else
- typedef char _TCHAR;
- #define _tmain main
- #endif
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- /* Размеры строк увеличены в связи с тем, что кириллица (во всяком случае у меня)
- занимает два байта */
- /* Таким образом, name может хранить 5 русских букв, country - 16 */
- struct Data {
- char name[11]; /* Наименование товара */
- char country[33]; /* Страна производитель */
- float dl; /* Длина товара (м) */
- float hr; /* Ширина товара (м) */
- float vs; /* Высота товара (м) */
- float ob; /* Объем товара (м^3) */
- unsigned int vr; /* Частота вращения (об/мин) */
- unsigned char tp; /* Значение пускового тока (А) */
- unsigned short m; /* Масса товара (кг) */
- float gh; /* Стоимость товара (тыс. руб.) */
- };
- int load(struct Data* data) {
- FILE* fp = fopen("input.txt", "r");
- /* Читаем количество строк */
- int n;
- fscanf(fp, "%d", &n);
- /* Считываем все строки по очереди, если они есть */
- if (n != 0) {
- for (int i = 0; i < n; i++) {
- 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);
- /* Вычисляем объём */
- data[i].ob = data[i].dl * data[i].hr * data[i].vs;
- }
- }
- fclose(fp);
- return n;
- }
- void print_table(struct Data* data, int col) {
- /* Выводим заголовок */
- printf("| Наименование товара | Страна-производитель | Габариты товара (м) | Объём товара | Частота вращения | Пусковой ток | Масса товара | Стоимость товара |\n");
- printf("| | | длина х ширина х высота | м^3 | об/мин | Ампер | килограмм | тыс. рублей |\n");
- printf("|---------------------|----------------------|--------------------------|--------------|------------------|--------------|--------------|------------------|\n");
- /* В цикле выводим все элементы БД, выравниваем по размерам таблицы */
- for (int i = 0; i < col; i++) {
- 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);
- }
- printf("|---------------------|----------------------|--------------------------|--------------|------------------|--------------|--------------|------------------|\n");
- }
- /* Так как строки в массиве нумеруются с нуля, то n обозначает номер следующей
- структуры. Если всё успешно, функция возвращает 1, которая прибавляется к n */
- int add_str(struct Data* data, int n) {
- printf("Введине наименование товара: ");
- scanf("%s", data[n].name);
- printf("Введите страну производства: ");
- scanf("%s", data[n].country);
- printf("Введите длину: ");
- scanf("%f", &data[n].dl);
- printf("Введите ширину: ");
- scanf("%f", &data[n].hr);
- printf("Введите высоту: ");
- scanf("%f", &data[n].vs);
- data[n].ob = data[n].dl * data[n].hr * data[n].vs;
- printf("Введите частоту вращения: ");
- scanf("%u", &data[n].vr);
- printf("Введите пусковой ток: ");
- scanf("%hhu", &data[n].tp);
- printf("Введите массу: ");
- scanf("%hu", &data[n].m);
- printf("Введите стоимость: ");
- scanf("%f", &data[n].gh);
- return 1;
- }
- int del_str(struct Data* data, int n) {
- int num; /* Номер удаляемой строки */
- printf("Введите номер строки для удаления: ");
- scanf("%d", &num);
- if (num < 1 || num > n) {
- printf("Такой строки нет. Попробуйте снова\n");
- return 0;
- }
- num--; /* Приводим к удобному для программы виду */
- /* Если мы удаляем не последнюю строку, то нужно сместить все идущие за ней */
- if (num != n - 1) {
- for (int i = num; i < n; i++) {
- data[i] = data[i + 1];
- }
- }
- /* Если последнюю, то мы просто уменьшаем количество строк на 1 */
- return 1;
- }
- int change_str(struct Data* data, int n) {
- int num; /* Номер изменяемой строки */
- int v; /* Номер параметра */
- printf("Какую строку изменить? ");
- scanf("%d", &num);
- if (num < 1 || num > n) {
- printf("Такой строки нет. Попробуйте снова\n");
- return 1;
- }
- num--;
- printf("Какой параметр изменить:\n");
- printf("1. Наименование\n");
- printf("2. Страну-производителя\n");
- printf("3. Длину\n");
- printf("4. Ширину\n");
- printf("5. Высоту\n");
- printf("6. Частоту вращения\n");
- printf("7. Пусковой ток\n");
- printf("8. Массу\n");
- printf("9. Стоимость\n");
- scanf("%d", &v);
- printf("Введите новое значение: ");
- /* Считываем и меняем значение в зависимости от выбора */
- /* Если бы меняем габариты, то нужно пересчитать объём */
- if (v == 1) {
- scanf("%s", data[num].name);
- } else if (v == 2) {
- scanf("%s", data[num].country);
- } else if (v == 3) {
- scanf("%f", &data[num].dl);
- data[num].ob = data[num].dl * data[num].hr * data[num].vs;
- } else if (v == 4) {
- scanf("%f", &data[num].hr);
- data[num].ob = data[num].dl * data[num].hr * data[num].vs;
- } else if (v == 5) {
- scanf("%f", &data[num].vs);
- data[num].ob = data[num].dl * data[num].hr * data[num].vs;
- } else if (v == 6) {
- scanf("%u", &data[num].vr);
- } else if (v == 7) {
- scanf("%hhu", &data[num].tp);
- } else if (v == 8) {
- scanf("%hu", &data[num].m);
- } else if (v == 9) {
- scanf("%f", &data[num].gh);
- }
- return 0;
- }
- void save(struct Data* data, int n) {
- FILE* fp = fopen("output.txt", "w");
- /* Записываем количество строк, затем сами строки */
- fprintf(fp, "%d\n", n);
- for (int i = 0; i < n; i++) {
- 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);
- }
- fclose(fp);
- }
- int _tmain(int argc, _TCHAR* argv[]) {
- system("chcp 1251");
- /* Загружаем данные из файла */
- struct Data* data;
- int n = load(data); /* В n храним количество строк */
- printf("Магазин Tesla, каталог электродвигателей\n");
- printf("Выберите действие:\n");
- printf("1. Показать таблицу\n");
- printf("2. Добавить строку\n");
- printf("3. Удалить строку\n");
- printf("4. Изменить строку\n");
- printf("5. Сохранение и выход\n");
- /* Выбираем функцию */
- int v;
- do { /* Спрашиваем, пока не выбран выход */
- printf("Выберите действие:\n");
- scanf("%d", &v);
- if (v == 1) {
- print_table(data, n); /* Выводим данные */
- } else if (v == 2) {
- n += add_str(data, n); /* Добавляем строку */
- } else if (v == 3) {
- n -= del_str(data, n); /* Удаляем строку */
- } else if (v == 4) {
- change_str(data, n); /* Изменяем строку */
- } else if (v == 5) {
- save(data, n); /* Перед выходом сохраняем */
- printf("Всего доброго!\n");
- } else {
- printf("Неверное значение, повторите ввод.\n");
- }
- } while (v != 5);
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement