Считывание массива из файла - 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.