Неправильные подсчёты при файловом вводе-выводе - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д