include iostream ввод вывод include fstream работа файлами using names

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream> //ввод и вывод
#include <fstream>//работа с файлами
using namespace std;
bool check_number(char *s)//функция проверки: является ли строка числом?
{
for (int i=0; s[i]!='\0'; i++)//пробегаем по всем символам строки s до символа конца строки \0
if (!(s[i]>='0' && s[i]<='9' || s[i]=='.')) return false;//если текущий символ не цифра и не точка, то наша строка не число, выходим
return true;//возвращаем true, т.е. наша строка - это число
}
bool read_file(float *&x, float *&y, int &n, char *filename)//чтение данных из файла. & означает, что ф-ия оставит изменёнными эти параметры
{
ifstream file;
file.open(filename);//открываем файл
if (file.fail())//если открыть не удалось, выводим ошибку и выходим из проги
{
cout<<"Error! Can't open file "<<filename<<endl;
return false;
}
char *str=new char[128];//строку в которую будем считывать из файла
while (!file.eof())//пока не достигнем конца файла
{
file>>str;//считываем строку
n++;//подсчитываем кол-во чисел в файле
if (!check_number(str))//если считанная строка не число, выводим ошибку и выходим из проги
{
cout<<"Error! Wrong data in file!"<<endl;
return false;
}
}
delete[] str;//освободим память от уже ненужной строки
if (n%2!=0)//если кол-во чисел нечётное, то не хватает какого-то элемента, выводим ошибку и выходим из проги
{
cout<<"Error! No full data in file!"<<endl;
return false;
}
n=n/2;//в каждом массиве будет ровно половина из всех чисел
x=new float[n];//создаём массивы
y=new float[n];
file.seekg(0, ios::beg);//переходим к началу файла
file.clear();
for (int i=0; !file.eof(); i++) file>>x[i]>>y[i];//пока не достигнем конца файла считываем значения х и у в массивы
file.close();//после чтения закрываем файл
return true;//если дошли до этого момента, то ошибок нет и данные успешно прочитаны
}
float calc_lagrange(float *x, float *y, int n, float num)//ф-ия вычисления полинома лагранжа для заданных массивов x и y, размера n, и какого-то значения num
{
float drob=1.0;//каждая дробь в полиноме
float res=0.0;//конечный результат
for (int i=0; i<n; i++)//перебираем все значения x
{
for (int j=0; j<n; j++)//для текущего значения x перебираем все остальные
{
if (i!=j) drob=drob*(num-x[j])/(x[i]-x[j]);//вычисляем дробь для текущего x
//числитель: произведение разностей заданного значения и всех x кроме текущего
//знаменатель: произведения разностей текущего значения x и всех остальных x, кроме него самого
}
res+=drob*y[i];//прибавляем к результату новую дробь, умноженную на соответствующее значение y
drob=0.0;//обнуляем дробь для новых вычислений
}
return res;//возвращаем результат вычислений
}
int main()//главная ф-ия
{
cout<<"Enter name of file with data: ";
char *filename=new char[128];//строка для имени файла
cin>>filename;//читаем имя файла
float *x, *y;//массивы значений x и y
int n=0;//сколько элементов в массивах (изначально 0)
if (!read_file(x, y, n, filename)) return -1;//если при чтении из файла произошли ошибки, то выходим из проги
delete[] filename;//удаляем строку с именем файла
float num=0.0;//число х, которое нужно подставить в полином лагранжа
while (num!=-1.0)
{
cout<<"Enter x for calculations (for exit enter -1): ";
cin>>num;
if (num!=-1.0) cout<<"Result: "<<calc_lagrange(x, y, n, num)<<endl;
else cout<<"Good bye!"<<endl;
}
delete[] x;//освобождаем память
delete[] y;
return 0;//успешный выход
}