Неправильные подсчёты при файловом вводе-выводе - C (СИ)
Формулировка задачи:
Исходная программа выглядит так, тут всё выводит и считает правильно:
Потребовалось добавить файловый ввод и вывод. В итоге правильно выводит лишь исходные данные и общую цену.
Программа с файловым вводом и выводом:
Листинг программы
- #include <stdio.h>
- #include <locale.h>
- #include <math.h>
- #include <string.h>
- #define N 3
- struct tort
- {
- char name[16];
- char post[12];
- float price1;
- float price2;
- float uc1;
- float uc2;
- int kprsr;
- float prsr;
- int sg;
- int k;
- int ub;
- } M[N];
- void vvod()
- {
- int i;
- for (i=0; i<N; i++)
- {
- printf("\n---------------------------"
- "\n Введите данные о товаре %d \n"
- "---------------------------", i+1);
- printf("\n Название товара: ");
- scanf("%s", &M[i].name);
- printf("\n Поставщик товара: ");
- scanf("%s", &M[i].post);
- printf("\n Количество: ");
- scanf("%d", &M[i].k);
- printf("\n Цена за единицу товара: ");
- scanf("%f", &M[i].price1);
- printf("\n Дней на складе ");
- scanf("%d", &M[i].sg);
- M[i].prsr=0;
- M[i].uc1=0;
- M[i].uc2=0;
- M[i].kprsr=0;
- M[i].price2=(M[i].price1)*(M[i].k);
- if (M[i].sg==3) (M[i].uc1=(M[i].price1)*0.5)&&(M[i].uc2=(M[i].price2)*0.5);
- if (M[i].sg>3) (M[i].kprsr=M[i].k);
- M[i].prsr=M[i].kprsr*M[i].price1;
- }
- }
- void vivod()
- {
- int i;
- float ub=0;
- printf(" База данных 'Склад' \n"
- "____________________________________________________________________________________________________________\n"
- " Исходные данные | Результаты |\n"
- "_______________________________________________________|____________________________________________________|\n"
- " Имя | Поставщик |Кол-во| Цена |Дней | Цена | Уценка | Уценка |Кол-во| Цена | \n"
- " товара | товара | |(за шт) |на складе|всего товара|(единицы)|(партии) |прсроч| просроченн.| \n"
- "________________|____________|______|________|_________|____________|_________|_________|______|____________|\n");
- for (i=0; i<N; i++)
- {
- ub=ub+M[i].prsr+(M[i].uc2*0.5);
- printf("%-16.15s|", M[i].name);
- printf("%-12.12s|", M[i].post);
- printf("%6.1d|", M[i].k);
- printf("%8.2f|", M[i].price1);
- printf("%9.1d|", M[i].sg);
- printf("%12.2f|", M[i].price2);
- printf("%9.2f|", M[i].uc1);
- printf("%9.2f|", M[i].uc2);
- printf("%6.1d|", M[i].kprsr);
- printf("%12.2f|", M[i].prsr);
- printf("\n");
- } printf("____________________________________________________________________________________________________________|\n");
- printf("\n Убытки: %f", ub);
- }
- main()
- {
- setlocale(LC_ALL, "Rus");
- int key;
- do
- {
- printf("\n \n ***МЕНЮ ПРОГРАММЫ*** \n");
- printf("\n 0 - Ввод");
- printf("\n 1 - Вывод");
- printf("\n 2 - Выход из программы");
- printf("\n Введите номер: ");
- scanf("%d",&key);
- switch(key)
- {
- case 0: vvod(); break;
- case 1: vivod(); break;
- case 2: break;
- default: printf("\n Введите, пожалуйста, другой номер");
- }
- }
- while(key!=2);
- }
Листинг программы
- #include <stdio.h>
- #include <locale.h>
- #include <math.h>
- #include <string.h>
- #define N 3
- struct tort
- {
- char name[16];
- char post[12];
- float price1;
- float price2;
- float uc1;
- float uc2;
- int kprsr;
- float prsr;
- int sg;
- int k;
- int ub;
- } M[N];
- void fvvod()
- {
- FILE *fptz;
- fptz=fopen("Baza.txt", "a");
- int i;
- for (i=0; i<N; i++)
- {
- M[i].prsr=0;
- M[i].uc1=0;
- M[i].uc2=0;
- M[i].kprsr=0;
- }
- for (i=0; i<N; i++)
- {
- printf("\n Название товара: ");
- scanf("%s", &M[i].name);
- printf("\n Поставщик товара: ");
- scanf("%s", &M[i].post);
- printf("\n Количество: ");
- scanf("%d", &M[i].k);
- printf("\n Цена за единицу товара: ");
- scanf("%f", &M[i].price1);
- printf("\n Дней на складе ");
- scanf("%d", &M[i].sg);
- M[i].price2=(M[i].price1)*(M[i].k);
- if (M[i].sg==3) {
- (M[i].uc1=(M[i].price1)*0.5); (M[i].uc2=(M[i].price2)*0.5);}
- if (M[i].sg>3) (M[i].kprsr=M[i].k);
- M[i].prsr=M[i].kprsr*M[i].price1;
- fwrite(M, sizeof(tort), 1, fptz);
- } fclose(fptz);
- }
- void fvivod()
- {
- FILE *fin, *fout;
- fin=fopen("Baza.txt", "r");
- fout=fopen("Print.txt", "w");
- printf(" База данных 'Склад' \n"
- "____________________________________________________________________________________________________________\n"
- " Исходные данные | Результаты |\n"
- "_______________________________________________________|____________________________________________________|\n"
- " Имя | Поставщик |Кол-во| Цена |Дней | Цена | Уценка | Уценка |Кол-во| Цена | \n"
- " товара | товара | |(за шт) |на складе|всего товара|(единицы)|(партии) |прсроч| просроченн.| \n"
- "________________|____________|______|________|_________|____________|_________|_________|______|____________|\n");
- fprintf(fout, " База данных 'Склад' \n"
- "____________________________________________________________________________________________________________\n"
- " Исходные данные | Результаты |\n"
- "_______________________________________________________|____________________________________________________|\n"
- " Имя | Поставщик |Кол-во| Цена |Дней | Цена | Уценка | Уценка |Кол-во| Цена | \n"
- " товара | товара | |(за шт) |на складе|всего товара|(единицы)|(партии) |прсроч| просроченн.| \n"
- "________________|____________|______|________|_________|____________|_________|_________|______|____________|\n");
- int i;
- fread(&M, sizeof(tort), 1, fin);
- while(!feof(fin))
- {
- printf("\n %-16.15s| %-12.12s| %6d| %8.2f| %9d| %9.2f|%9.2f|%6d|%12.2f|", M[i].name, M[i].post, M[i].k, M[i].price1, M[i].sg, M[i].price2, M[i].uc1, M[i].uc2, M[i].kprsr,M[i].prsr );
- fprintf(fout, "\n %-16.15s| %-12.12s| %6d| %8.2f| %9d|%12.2f| %9.2f|%9.2f|%6d|%12.2f|", M[i].name, M[i].post, M[i].k, M[i].price1, M[i].sg, M[i].price2, M[i].uc1, M[i].uc2, M[i].kprsr,M[i].prsr );
- fread(&M, sizeof(tort), 1, fin);
- }
- fclose(fin), fclose(fout);
- }
- main()
- {
- setlocale(LC_ALL, "Rus");
- int key;
- do
- {
- printf("\n \n ***МЕНЮ ПРОГРАММЫ*** \n");
- printf("\n 0 - Ввод");
- printf("\n 1 - Вывод");
- printf("\n 2 - Выход из программы");
- printf("\n Введите номер: ");
- scanf("%d",&key);
- switch(key)
- {
- case 0: fvvod(); break;
- case 1: fvivod(); break;
- case 2: break;
- default: printf("\n Введите, пожалуйста, другой номер");
- }
- }
- while(key!=2);
- }
Решение задачи: «Неправильные подсчёты при файловом вводе-выводе»
textual
Листинг программы
- int i=0;
- while(fread(&M[i], sizeof(struct tort), 1, fin)) {
- printf("\n %-16.15s| %-12.12s| %6d| %8.2f| %9d|%12.2f| %9.2f|%9.2f|%6d|%12.2f|",
- M[i].name, M[i].post, M[i].k, M[i].price1, M[i].sg, M[i].price2, M[i].uc1, M[i].uc2, M[i].kprsr,M[i].prsr );
- fprintf(fout, "\n %-16.15s| %-12.12s| %6d| %8.2f| %9d|%12.2f| %9.2f|%9.2f|%6d|%12.2f|",
- M[i].name, M[i].post, M[i].k, M[i].price1, M[i].sg, M[i].price2, M[i].uc1, M[i].uc2, M[i].kprsr,M[i].prsr );
- }
Объяснение кода листинга программы
- Объявлена переменная
i
типаint
со значением 0. - Запущен цикл
while
, который будет выполняться до тех пор, пока функцияfread()
успешно читает данные из файлаfin
в массивM
(структураstruct tort
) и записывает их в файлfout
. - Внутри цикла происходит вывод данных из массива
M
в консоль с помощью функцииprintf()
. - Также происходит запись данных из массива
M
в файлfout
с помощью функцииfprintf()
. - Значения переменных, которые выводятся и записываются, соответствуют полям структуры
struct tort
в массивеM
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д