Считывание массива из файла - C (СИ)

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

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

Листинг программы
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <conio.h>
  4. #include <locale.h>
  5. #include <stdlib.h>
  6. #include <time.h>
  7.  
  8. float mas(FILE*in, FILE*out);
  9. void InsertionSort(int n, float mass[]);
  10. float linpoisk(float mass[], int N);
  11. #define BORDER_HIGH 100
  12. #define BORDER_LOW -100
  13. int k;
  14. int inenull;
  15. float* mass;
  16. int i;
  17. FILE *in;
  18. FILE *out;
  19. float* i_find;
  20. char fname[20] = "output.dat";
  21. int main()
  22. {
  23. float mas(FILE*in, FILE*out), A;
  24. setlocale(LC_ALL, "RUS");
  25. int N;
  26. int a;
  27. while (2) {
  28. printf("Какую задачу решить? \n 1)массив неупорядочен, найти сумму эл-тов, которые следуют за минимальным эл-том\n 2)упорядочен массив, вывести номера эл-тов, меньше заданного числа\n 3)считать с файла массив и сохранить в файл номера эл-тов меньше заданного числа\n 4)1 только через считывание из файла\n 5)выход\n");
  29. scanf_s("%ld", &a);
  30. switch (a)
  31. {
  32. case 1:
  33. printf("Введите кол-во эл-тов массива: ");
  34. scanf_s("%d", &N);
  35. mass = (float*)malloc(N * sizeof(float));
  36. srand((unsigned int)(time(NULL)));
  37. printf("Заполните массив элементами:\n");
  38. for (i = 0; i < N; i++)
  39. {
  40. mass[i] = BORDER_LOW + (BORDER_HIGH - BORDER_LOW)*((float)rand() / RAND_MAX);
  41. printf("a[%d] = %.3f\n", i, mass[i]);
  42. }
  43. printf("Сумма равна : %lf \n", linpoisk(mass, N));
  44. free(mass); // освобождение памяти
  45. system("pause"); break;
  46. case 2:
  47. printf("Введите кол-во эл-тов массива: ");
  48. scanf_s("%d", &N);
  49. mass = (float*)malloc(N * sizeof(float));
  50. srand((unsigned int)(time(NULL)));
  51. printf("Заполните массив элементами:\n");
  52. for (i = 0; i < N; i++)
  53. {
  54. mass[i] = BORDER_LOW + (BORDER_HIGH - BORDER_LOW)*((float)rand() / RAND_MAX);
  55. printf("a[%d] = %.3f\n", i, mass[i]);
  56. }
  57. printf("Введите число, чтобы вывести номера эл-тов меньше этого числа\n");
  58. scanf_s("%f", &A);
  59. InsertionSort(N, mass);
  60. printf("Cортируем массив:\n");
  61. for (int i = 0; i < N; i++)
  62. printf("a[%d] = %.3f\n", i, mass[i]);
  63. printf("\n");
  64. printf("Номера элеметов, которые меньше заданного числа:\n");
  65. i_find = (float*)malloc(N * sizeof(float));
  66. for (int i = 0; i < N; i++) {
  67. if (mass[i] < A) {
  68. i_find[i] = (float)i;
  69. printf("%.f \n", i_find[i]);
  70. }
  71. else printf(" ");
  72. }
  73. system("pause"); break;
  74. case 3:
  75. setlocale(LC_ALL, "RUS");
  76. puts("Чтение из файла");
  77. if (!(in = fopen("input.txt", "rt")))
  78. {
  79. printf("Ошибка открытия файла");
  80. system("pause");
  81. }
  82. puts("Запись в файла");
  83. if (!(out = fopen("output.dat", "wt")))
  84. {
  85. printf("Ошибка открытия файла");
  86. system("pause");
  87. }
  88. printf("Введите число, чтобы вывести номера эл-тов меньше этого числа\n");
  89. scanf_s("%f", &A);
  90. while (!feof(in))
  91. {
  92. mas(in, out);
  93. mass = (float*)malloc(k * sizeof(float));
  94. InsertionSort(k, mass);
  95. fprintf(out, "Cортируем массив:\n");
  96. for (int i = 0; i < k; i++)
  97. fprintf(out, "a[%d] = %.3f\n", i, mass[i]);
  98. printf("\n");
  99. fprintf(out, "Номера элеметов, которые меньше заданного числа:\n");
  100. i_find = (float*)malloc(k * sizeof(float));
  101. for (int i = 0; i < k; i++) {
  102. if (mass[i] < A) {
  103. i_find[i] = (float)i;
  104. fprintf(out, "%.f \n", i_find[i]);
  105. }
  106. else printf(" ");
  107. }
  108. }
  109. fclose(in);
  110. fclose(out);
  111. system("pause"); break;
  112. case 4: ////////////////////////////////////////
  113. setlocale(LC_ALL, "RUS");
  114. puts("Чтение из файла");
  115. if (!(in = fopen("input.txt", "rt")))
  116. {
  117. printf("Ошибка открытия файла");
  118. system("pause");
  119. }
  120. puts("Запись в файла");
  121. if (!(out = fopen("output.dat", "wt")))
  122. {
  123. printf("Ошибка открытия файла");
  124. system("pause");
  125. }
  126. while (!feof(in))
  127. {
  128. mas(in, out);
  129. mass = (float*)malloc(k * sizeof(float));
  130. }
  131. fprintf(out, "Сумма равна : %lf \n", linpoisk(mass, N));
  132. fclose(in);
  133. fclose(out);
  134. system("pause");
  135. ////////////////////////////////////////
  136. break;
  137. case 5: exit(5); break;
  138. default:
  139. break;
  140. }
  141. system("pause");
  142. }
  143. }
  144. float linpoisk(float mass[], int N)
  145. {
  146. int i_find;
  147. float sum = 0;
  148. i_find = 0;
  149. for (int i = 1; i < N; i++)
  150. {
  151. if (mass[i_find] > mass[i])
  152. i_find = i;
  153. }
  154. printf("Номер минимального эл-та массива: %d \n", i_find);
  155. for (int i = i_find + 1; i < N; i++)
  156. {
  157. sum += mass[i];
  158. }
  159. return sum;
  160. }
  161. void InsertionSort(int n, float mass[])
  162. {
  163. float newElement;
  164. int location;
  165. for (int i = 1; i < n; i++)
  166. {
  167. newElement = mass[i];
  168. location = i - 1;
  169. while (location >= 0 && mass[location] > newElement)
  170. {
  171. mass[location + 1] = mass[location];
  172. location = location - 1;
  173. }
  174. mass[location + 1] = newElement;
  175. }
  176. }
  177. float mas(FILE*in, FILE*out)
  178. {
  179. fscanf(in, "%d", &k);
  180. fprintf(out, "Кол-во эл-тов %d \n", k);
  181. for (int i = 0; i < k; i++)
  182. {
  183. fscanf(in, "%f", &mass[i]);
  184. fprintf(out, "a[%d] = %6.2f\n", i, mass[i]);
  185. }
  186. }
Нужно с файла считать массив, поработать с ним, и результат записать в др файл ( в коде кейсы 3 и 4) Так вот при работе с файлом происходят неполадки ( см. скриншот), как исправить- мозг не доходит уже 3 сутки

Решение задачи: «Считывание массива из файла»

textual
Листинг программы
  1. mass = (float*)malloc(k * sizeof(float));

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

В данном коде происходит следующее:

  1. Объявляется переменная k типа int, которая содержит размер массива.
  2. С помощью оператора malloc выделяется память под массив float типа. Выделенная память будет использоваться для хранения значений массива.
  3. В операторе присваивания переменная mass получает значение, которое является адресом выделенной памяти.
  4. Переменная mass приводится к типу float*, чтобы можно было обращаться к ней как к массиву float значений.
  5. Размер массива k умножается на размер одного элемента float, чтобы получить общую длину выделенной памяти.
  6. Результат умножения записывается в оператор sizeof, который возвращает размер памяти, занимаемой объектом типа float.
  7. Выделенная память заполняется значениями типа float.

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


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

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

14   голосов , оценка 4.071 из 5

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

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

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