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

Объяснение кода листинга программы

  1. Объявлена переменная i типа int со значением 0.
  2. Запущен цикл while, который будет выполняться до тех пор, пока функция fread() успешно читает данные из файла fin в массив M (структура struct tort) и записывает их в файл fout.
  3. Внутри цикла происходит вывод данных из массива M в консоль с помощью функции printf().
  4. Также происходит запись данных из массива M в файл fout с помощью функции fprintf().
  5. Значения переменных, которые выводятся и записываются, соответствуют полям структуры struct tort в массиве M.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.4 из 5
Похожие ответы