Неправильные подсчёты при файловом вводе-выводе - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Исходная программа выглядит так, тут всё выводит и считает правильно:
Листинг программы
  1. #include <stdio.h>
  2. #include <locale.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #define N 3
  6. struct tort
  7. {
  8. char name[16];
  9. char post[12];
  10. float price1;
  11. float price2;
  12. float uc1;
  13. float uc2;
  14. int kprsr;
  15. float prsr;
  16. int sg;
  17. int k;
  18. int ub;
  19. } M[N];
  20. void vvod()
  21. {
  22. int i;
  23. for (i=0; i<N; i++)
  24. {
  25. printf("\n---------------------------"
  26. "\n Введите данные о товаре %d \n"
  27. "---------------------------", i+1);
  28. printf("\n Название товара: ");
  29. scanf("%s", &M[i].name);
  30. printf("\n Поставщик товара: ");
  31. scanf("%s", &M[i].post);
  32. printf("\n Количество: ");
  33. scanf("%d", &M[i].k);
  34. printf("\n Цена за единицу товара: ");
  35. scanf("%f", &M[i].price1);
  36. printf("\n Дней на складе ");
  37. scanf("%d", &M[i].sg);
  38. M[i].prsr=0;
  39. M[i].uc1=0;
  40. M[i].uc2=0;
  41. M[i].kprsr=0;
  42. M[i].price2=(M[i].price1)*(M[i].k);
  43. if (M[i].sg==3) (M[i].uc1=(M[i].price1)*0.5)&&(M[i].uc2=(M[i].price2)*0.5);
  44. if (M[i].sg>3) (M[i].kprsr=M[i].k);
  45. M[i].prsr=M[i].kprsr*M[i].price1;
  46.  
  47. }
  48. }
  49.  
  50. void vivod()
  51. {
  52.  
  53. int i;
  54. float ub=0;
  55.  
  56. printf(" База данных 'Склад' \n"
  57. "____________________________________________________________________________________________________________\n"
  58. " Исходные данные | Результаты |\n"
  59. "_______________________________________________________|____________________________________________________|\n"
  60. " Имя | Поставщик |Кол-во| Цена |Дней | Цена | Уценка | Уценка |Кол-во| Цена | \n"
  61. " товара | товара | |(за шт) |на складе|всего товара|(единицы)|(партии) |прсроч| просроченн.| \n"
  62. "________________|____________|______|________|_________|____________|_________|_________|______|____________|\n");
  63. for (i=0; i<N; i++)
  64. {
  65. ub=ub+M[i].prsr+(M[i].uc2*0.5);
  66. printf("%-16.15s|", M[i].name);
  67. printf("%-12.12s|", M[i].post);
  68. printf("%6.1d|", M[i].k);
  69. printf("%8.2f|", M[i].price1);
  70. printf("%9.1d|", M[i].sg);
  71. printf("%12.2f|", M[i].price2);
  72. printf("%9.2f|", M[i].uc1);
  73. printf("%9.2f|", M[i].uc2);
  74. printf("%6.1d|", M[i].kprsr);
  75. printf("%12.2f|", M[i].prsr);
  76. printf("\n");
  77.  
  78. } printf("____________________________________________________________________________________________________________|\n");
  79. printf("\n Убытки: %f", ub);
  80. }
  81. main()
  82. {
  83. setlocale(LC_ALL, "Rus");
  84. int key;
  85. do
  86. {
  87. printf("\n \n ***МЕНЮ ПРОГРАММЫ*** \n");
  88. printf("\n 0 - Ввод");
  89. printf("\n 1 - Вывод");
  90. printf("\n 2 - Выход из программы");
  91. printf("\n Введите номер: ");
  92. scanf("%d",&key);
  93. switch(key)
  94. {
  95. case 0: vvod(); break;
  96. case 1: vivod(); break;
  97. case 2: break;
  98. default: printf("\n Введите, пожалуйста, другой номер");
  99. }
  100. }
  101. while(key!=2);
  102. }
Потребовалось добавить файловый ввод и вывод. В итоге правильно выводит лишь исходные данные и общую цену. Программа с файловым вводом и выводом:
Листинг программы
  1. #include <stdio.h>
  2. #include <locale.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #define N 3
  6. struct tort
  7. {
  8. char name[16];
  9. char post[12];
  10. float price1;
  11. float price2;
  12. float uc1;
  13. float uc2;
  14. int kprsr;
  15. float prsr;
  16. int sg;
  17. int k;
  18. int ub;
  19. } M[N];
  20.  
  21. void fvvod()
  22. {
  23. FILE *fptz;
  24. fptz=fopen("Baza.txt", "a");
  25. int i;
  26. for (i=0; i<N; i++)
  27. {
  28. M[i].prsr=0;
  29. M[i].uc1=0;
  30. M[i].uc2=0;
  31. M[i].kprsr=0;
  32. }
  33. for (i=0; i<N; i++)
  34. {
  35. printf("\n Название товара: ");
  36. scanf("%s", &M[i].name);
  37. printf("\n Поставщик товара: ");
  38. scanf("%s", &M[i].post);
  39. printf("\n Количество: ");
  40. scanf("%d", &M[i].k);
  41. printf("\n Цена за единицу товара: ");
  42. scanf("%f", &M[i].price1);
  43. printf("\n Дней на складе ");
  44. scanf("%d", &M[i].sg);
  45. M[i].price2=(M[i].price1)*(M[i].k);
  46. if (M[i].sg==3) {
  47. (M[i].uc1=(M[i].price1)*0.5); (M[i].uc2=(M[i].price2)*0.5);}
  48. if (M[i].sg>3) (M[i].kprsr=M[i].k);
  49. M[i].prsr=M[i].kprsr*M[i].price1;
  50. fwrite(M, sizeof(tort), 1, fptz);
  51. } fclose(fptz);
  52. }
  53. void fvivod()
  54. {
  55. FILE *fin, *fout;
  56. fin=fopen("Baza.txt", "r");
  57. fout=fopen("Print.txt", "w");
  58. printf(" База данных 'Склад' \n"
  59. "____________________________________________________________________________________________________________\n"
  60. " Исходные данные | Результаты |\n"
  61. "_______________________________________________________|____________________________________________________|\n"
  62. " Имя | Поставщик |Кол-во| Цена |Дней | Цена | Уценка | Уценка |Кол-во| Цена | \n"
  63. " товара | товара | |(за шт) |на складе|всего товара|(единицы)|(партии) |прсроч| просроченн.| \n"
  64. "________________|____________|______|________|_________|____________|_________|_________|______|____________|\n");
  65. fprintf(fout, " База данных 'Склад' \n"
  66. "____________________________________________________________________________________________________________\n"
  67. " Исходные данные | Результаты |\n"
  68. "_______________________________________________________|____________________________________________________|\n"
  69. " Имя | Поставщик |Кол-во| Цена |Дней | Цена | Уценка | Уценка |Кол-во| Цена | \n"
  70. " товара | товара | |(за шт) |на складе|всего товара|(единицы)|(партии) |прсроч| просроченн.| \n"
  71. "________________|____________|______|________|_________|____________|_________|_________|______|____________|\n");
  72.  
  73. int i;
  74. fread(&M, sizeof(tort), 1, fin);
  75. while(!feof(fin))
  76. {
  77. 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 );
  78. 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 );
  79. fread(&M, sizeof(tort), 1, fin);
  80. }
  81. fclose(fin), fclose(fout);
  82.  
  83. }
  84. main()
  85. {
  86. setlocale(LC_ALL, "Rus");
  87. int key;
  88. do
  89. {
  90. printf("\n \n ***МЕНЮ ПРОГРАММЫ*** \n");
  91. printf("\n 0 - Ввод");
  92. printf("\n 1 - Вывод");
  93. printf("\n 2 - Выход из программы");
  94. printf("\n Введите номер: ");
  95. scanf("%d",&key);
  96. switch(key)
  97. {
  98. case 0: fvvod(); break;
  99. case 1: fvivod(); break;
  100. case 2: break;
  101. default: printf("\n Введите, пожалуйста, другой номер");
  102. }
  103. }
  104. while(key!=2);
  105. }

Решение задачи: «Неправильные подсчёты при файловом вводе-выводе»

textual
Листинг программы
  1.     int i=0;      
  2.     while(fread(&M[i], sizeof(struct tort), 1, fin)) {     
  3.         printf("\n %-16.15s| %-12.12s| %6d| %8.2f| %9d|%12.2f| %9.2f|%9.2f|%6d|%12.2f|",
  4.             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 );
  5.         fprintf(fout, "\n %-16.15s| %-12.12s| %6d| %8.2f| %9d|%12.2f| %9.2f|%9.2f|%6d|%12.2f|",
  6.             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 );
  7.     }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы