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