Считать из файла и произвести вычисления - C (СИ)
Формулировка задачи:
Помогите пожалуйста, нужно сделать такую процедуру, чтобы из файла считались 4 числа, а не при вводе как у меня.
Я пробовала сделать массив, считывать элементы туда и выводить на экран, но у меня сразу вылетела программа.
#include "stdafx.h"
#include <locale.h>
#include <math.h>
#include <stdio.h>
#include <conio.h>
//#include <stdlib.h>
#define size 15
#define element 4
double Input();
//int Open(FILE *fp);
int main()
{
double x = 0, b = 0, h = 0, eps = 0, buf = 0, d;
int prec;
unsigned int k, count;
double s, si, temp;
char *line = "======================================";
char X = 'X', *fx = "F(x)", *nom = "№ чл.р.";
FILE *fp; /*исходный файл*/
FILE *fo;
setlocale(LC_ALL, "Russian");
printf("\tДанная программа предназначена для вычисления таблицы значений функции заданной в виде разложения в ряд.\n");
printf("Введите нижнюю границу интервала x = ");
x=Input();
while (b < x)
{
printf("Введите верхнюю границу интервала b > %.2lf, b = ", x);
b= Input();
}
buf = b - x;
do
{
printf("Введите величину шага изменения аргумента h < %.2lf = ", buf);
h = Input();
} while (h > buf);
do
{
printf("Введите точность вычисления функции eps(0..1), eps = ");
eps = Input();
} while ((eps < 0) && (eps > 1));
/*------------------------------------*/
temp = eps;
prec = 0;
while (temp < 0.9999999)
{
prec++;
temp *= 10;
}
printf("\n\n\n");
printf("%s\n", line);
printf("| #| %*.*c| %*.*s| %*.*s|\n", 5 + prec, 3 + prec, X, 7 + prec, 3 + prec, fx, 6 + prec, 5 + prec, nom);
printf("%s\n", line);
count = 0;
do
{
count++;
s = 0;
si = x;
k = 0;
while (fabs(si) > eps)
{
s += si;
k++;
si = (si*pow(x, 2)) / (2 * k * (2 * k + 1));
}
printf("|%3d| %*.*lf| %*.*lf| %9d|\n", count, 5 + prec, prec, x, 7 + prec, prec, s, k);
x = x + h;
} while (!(x > b));
printf("%s", line);
printf("\n");
return 0;
}
double Input()
{
double loc;
int ver;
do
{
fflush(stdin);
ver = scanf("%lf", &loc);
if (ver != 1)
{
printf("Введено не корректное значение, повторите ввод\n");
}
} while ((ver != 1)& ((getchar()) != '\n') );
return loc;
}#include <locale.h>
#include <math.h>
#include <stdio.h>
#include <conio.h>
//#include <stdlib.h>
#define size 15
#define element 4
double Input();
int Open(double *mas[element]);
int main()
{
double x = 0, b = 0, h = 0, eps = 0, buf = 0, d;
int prec;
unsigned int k, count;
double s, si, temp;
double *mas[element];
char *line = "======================================";
char X = 'X', *fx = "F(x)", *nom = "№ чл.р.";
FILE *fp; /*исходный файл*/
FILE *fo;
setlocale(LC_ALL, "Russian");
printf("\tДанная программа предназначена для вычисления таблицы значений функции заданной в виде разложения в ряд.\n");
/*/////////////////////////////////////////////////////////////////////////////////////*/
Open(mas);
/*////////////////////////////////////////////////////////////////////////////////////*/
printf("Введите нижнюю границу интервала x = ");
x=Input();
while (b < x)
{
printf("Введите верхнюю границу интервала b > %.2lf, b = ", x);
b= Input();
}
buf = b - x;
do
{
printf("Введите величину шага изменения аргумента h < %.2lf = ", buf);
h = Input();
} while (h > buf);
do
{
printf("Введите точность вычисления функции eps(0..1), eps = ");
eps = Input();
} while ((eps < 0) && (eps > 1));
/*------------------------------------*/
temp = eps;
prec = 0;
while (temp < 0.9999999)
{
prec++;
temp *= 10;
}
printf("\n\n\n");
printf("%s\n", line);
printf("| #| %*.*c| %*.*s| %*.*s|\n", 5 + prec, 3 + prec, X, 7 + prec, 3 + prec, fx, 6 + prec, 5 + prec, nom);
printf("%s\n", line);
count = 0;
do
{
count++;
s = 0;
si = x;
k = 0;
while (fabs(si) > eps)
{
s += si;
k++;
si = (si*pow(x, 2)) / (2 * k * (2 * k + 1));
}
printf("|%3d| %*.*lf| %*.*lf| %9d|\n", count, 5 + prec, prec, x, 7 + prec, prec, s, k);
x = x + h;
} while (!(x > b));
printf("%s", line);
printf("\n");
return 0;
}
double Input()
{
double loc;
int ver;
do
{
fflush(stdin);
ver = scanf("%lf", &loc);
if (ver != 1)
{
printf("Введено не корректное значение, повторите ввод\n");
}
} while ((ver != 1)& ((getchar()) != '\n') );
return loc;
}
int Open(double *mas[element])
{
char filename[50]; /*имя файла*/
int i;
// double mas[element];
double x2 = 0, b2 = 0, h2 = 0, eps2 = 0;
FILE *fp;
printf("Введите имя исходного файла/ путь к файлу\n");
/*scanf("%s", filename);
fp = fopen(filename, "r");*/
fp = fopen("C:\\Users\\Ekaterina\\Desktop\\KKR_2.txt", "r");
if (fp == NULL)
{
perror("Error opening file");
return 0;
}
else
{
printf("Файл открыт для чтения\n");
printf("Информация, считанная из файла\n\n");
for (i = 0; i < element; i++)
{
fscanf(fp, "%lf\n", &mas[i]);
printf("%.3lf\n", mas[i]);
}
}
}Решение задачи: «Считать из файла и произвести вычисления»
textual
Листинг программы
int Open(double *x, double *b, double *h, double *eps)
{
char filename[50]; /*имя файла*/
FILE *fp = fopen("C:\\Users\\Ekaterina\\Desktop\\KKR_2.txt", "r");
if (fp == NULL)
{
perror("Error opening file");
return 0;
}
printf("Файл открыт для чтения\n");
printf("Информация, считанная из файла\n\n");
if(fscanf(fp, "%lf %lf %lf %lf", x, h, b, eps)>0)
{
printf("x = %.3lf\n", x);
printf("h = %.3lf\n", h);
printf("b = %.3lf\n", b);
printf("eps = %.3lf\n", eps);
}
return 1;
}
Объяснение кода листинга программы
- Объявлены переменные: filename - массив символов для хранения имени файла, fp - указатель на файл, x, b, h, eps - указатели на переменные типа double для хранения значений из файла.
- Проверка на открытие файла. Если файл не открылся, выводится сообщение об ошибке и возвращается 0.
- Вывод сообщения об успешном открытии файла.
- Чтение данных из файла с помощью функции fscanf. Входные параметры: указатель на файл и форматная строка
%lf %lf %lf %lf, которая указывает, что необходимо считать четыре значения типа double. - Проверка, что данные успешно считаны, с помощью оператора >0. Если данные считаны, то выводятся значения переменных x, h, b, eps.
- Возвращение 1 в случае успешного выполнения всех операций.