Считывание массива из файла - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д