Считывание массива из файла - C (СИ)
Формулировка задачи:
Листинг программы
- #include <stdio.h>
- #include <malloc.h>
- #include <conio.h>
- #include <locale.h>
- #include <stdlib.h>
- #include <time.h>
- float mas(FILE*in, FILE*out);
- void InsertionSort(int n, float mass[]);
- float linpoisk(float mass[], int N);
- #define BORDER_HIGH 100
- #define BORDER_LOW -100
- int k;
- int inenull;
- float* mass;
- int i;
- FILE *in;
- FILE *out;
- float* i_find;
- char fname[20] = "output.dat";
- int main()
- {
- float mas(FILE*in, FILE*out), A;
- setlocale(LC_ALL, "RUS");
- int N;
- int a;
- while (2) {
- printf("Какую задачу решить? \n 1)массив неупорядочен, найти сумму эл-тов, которые следуют за минимальным эл-том\n 2)упорядочен массив, вывести номера эл-тов, меньше заданного числа\n 3)считать с файла массив и сохранить в файл номера эл-тов меньше заданного числа\n 4)1 только через считывание из файла\n 5)выход\n");
- scanf_s("%ld", &a);
- switch (a)
- {
- case 1:
- printf("Введите кол-во эл-тов массива: ");
- scanf_s("%d", &N);
- mass = (float*)malloc(N * sizeof(float));
- srand((unsigned int)(time(NULL)));
- printf("Заполните массив элементами:\n");
- for (i = 0; i < N; i++)
- {
- mass[i] = BORDER_LOW + (BORDER_HIGH - BORDER_LOW)*((float)rand() / RAND_MAX);
- printf("a[%d] = %.3f\n", i, mass[i]);
- }
- printf("Сумма равна : %lf \n", linpoisk(mass, N));
- free(mass); // освобождение памяти
- system("pause"); break;
- case 2:
- printf("Введите кол-во эл-тов массива: ");
- scanf_s("%d", &N);
- mass = (float*)malloc(N * sizeof(float));
- srand((unsigned int)(time(NULL)));
- printf("Заполните массив элементами:\n");
- for (i = 0; i < N; i++)
- {
- mass[i] = BORDER_LOW + (BORDER_HIGH - BORDER_LOW)*((float)rand() / RAND_MAX);
- printf("a[%d] = %.3f\n", i, mass[i]);
- }
- printf("Введите число, чтобы вывести номера эл-тов меньше этого числа\n");
- scanf_s("%f", &A);
- InsertionSort(N, mass);
- printf("Cортируем массив:\n");
- for (int i = 0; i < N; i++)
- printf("a[%d] = %.3f\n", i, mass[i]);
- printf("\n");
- printf("Номера элеметов, которые меньше заданного числа:\n");
- i_find = (float*)malloc(N * sizeof(float));
- for (int i = 0; i < N; i++) {
- if (mass[i] < A) {
- i_find[i] = (float)i;
- printf("%.f \n", i_find[i]);
- }
- else printf(" ");
- }
- system("pause"); break;
- case 3:
- setlocale(LC_ALL, "RUS");
- puts("Чтение из файла");
- if (!(in = fopen("input.txt", "rt")))
- {
- printf("Ошибка открытия файла");
- system("pause");
- }
- puts("Запись в файла");
- if (!(out = fopen("output.dat", "wt")))
- {
- printf("Ошибка открытия файла");
- system("pause");
- }
- printf("Введите число, чтобы вывести номера эл-тов меньше этого числа\n");
- scanf_s("%f", &A);
- while (!feof(in))
- {
- mas(in, out);
- mass = (float*)malloc(k * sizeof(float));
- InsertionSort(k, mass);
- fprintf(out, "Cортируем массив:\n");
- for (int i = 0; i < k; i++)
- fprintf(out, "a[%d] = %.3f\n", i, mass[i]);
- printf("\n");
- fprintf(out, "Номера элеметов, которые меньше заданного числа:\n");
- i_find = (float*)malloc(k * sizeof(float));
- for (int i = 0; i < k; i++) {
- if (mass[i] < A) {
- i_find[i] = (float)i;
- fprintf(out, "%.f \n", i_find[i]);
- }
- else printf(" ");
- }
- }
- fclose(in);
- fclose(out);
- system("pause"); break;
- case 4: ////////////////////////////////////////
- setlocale(LC_ALL, "RUS");
- puts("Чтение из файла");
- if (!(in = fopen("input.txt", "rt")))
- {
- printf("Ошибка открытия файла");
- system("pause");
- }
- puts("Запись в файла");
- if (!(out = fopen("output.dat", "wt")))
- {
- printf("Ошибка открытия файла");
- system("pause");
- }
- while (!feof(in))
- {
- mas(in, out);
- mass = (float*)malloc(k * sizeof(float));
- }
- fprintf(out, "Сумма равна : %lf \n", linpoisk(mass, N));
- fclose(in);
- fclose(out);
- system("pause");
- ////////////////////////////////////////
- break;
- case 5: exit(5); break;
- default:
- break;
- }
- system("pause");
- }
- }
- float linpoisk(float mass[], int N)
- {
- int i_find;
- float sum = 0;
- i_find = 0;
- for (int i = 1; i < N; i++)
- {
- if (mass[i_find] > mass[i])
- i_find = i;
- }
- printf("Номер минимального эл-та массива: %d \n", i_find);
- for (int i = i_find + 1; i < N; i++)
- {
- sum += mass[i];
- }
- return sum;
- }
- void InsertionSort(int n, float mass[])
- {
- float newElement;
- int location;
- for (int i = 1; i < n; i++)
- {
- newElement = mass[i];
- location = i - 1;
- while (location >= 0 && mass[location] > newElement)
- {
- mass[location + 1] = mass[location];
- location = location - 1;
- }
- mass[location + 1] = newElement;
- }
- }
- float mas(FILE*in, FILE*out)
- {
- fscanf(in, "%d", &k);
- fprintf(out, "Кол-во эл-тов %d \n", k);
- for (int i = 0; i < k; i++)
- {
- fscanf(in, "%f", &mass[i]);
- fprintf(out, "a[%d] = %6.2f\n", i, mass[i]);
- }
- }
Решение задачи: «Считывание массива из файла»
textual
Листинг программы
- mass = (float*)malloc(k * sizeof(float));
Объяснение кода листинга программы
В данном коде происходит следующее:
- Объявляется переменная
k
типа int, которая содержит размер массива. - С помощью оператора malloc выделяется память под массив float типа. Выделенная память будет использоваться для хранения значений массива.
- В операторе присваивания переменная
mass
получает значение, которое является адресом выделенной памяти. - Переменная
mass
приводится к типу float*, чтобы можно было обращаться к ней как к массиву float значений. - Размер массива
k
умножается на размер одного элемента float, чтобы получить общую длину выделенной памяти. - Результат умножения записывается в оператор sizeof, который возвращает размер памяти, занимаемой объектом типа float.
- Выделенная память заполняется значениями типа float.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д