Неправильные подсчёты при файловом вводе-выводе - 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.