Считать из файла и произвести вычисления - 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;
}

Объяснение кода листинга программы

  1. Объявлены переменные: filename - массив символов для хранения имени файла, fp - указатель на файл, x, b, h, eps - указатели на переменные типа double для хранения значений из файла.
  2. Проверка на открытие файла. Если файл не открылся, выводится сообщение об ошибке и возвращается 0.
  3. Вывод сообщения об успешном открытии файла.
  4. Чтение данных из файла с помощью функции fscanf. Входные параметры: указатель на файл и форматная строка %lf %lf %lf %lf, которая указывает, что необходимо считать четыре значения типа double.
  5. Проверка, что данные успешно считаны, с помощью оператора >0. Если данные считаны, то выводятся значения переменных x, h, b, eps.
  6. Возвращение 1 в случае успешного выполнения всех операций.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы