
6 Примеры программ Пример 1
Необходимо разработать программу, в которой вводится интервал значений и шаг аргумента и вычисляются значения следующей функции:
y = a02 + a12 / x + a22 / x2 + a32 / x3 +...+ an2 / xn
Величина n и значения элементов вводятся из заранее подготовленного файла. Результирующие значения записываются в другой файл. Поскольку функция может быть использована при создании различных приложений (например, при построении графика), функции ввода данных, вычисления и вывода целесообразно разместить в отдельном модуле.
Вначале создается новое консольное приложение. Его главный модуль (с функцией main()) можно назвать UnitMain.cpp. Далее в директории проекта целесообразно создать новый текстовый файл, например файл с именем input.txt и таким содержимым:
2
1 2 1
Первая строка - это величина n, а вторая - коэффициенты a0, a1 и a2 соответственно. Текстовый файл можно создать как с помощью программы "Блокнот", так и в среде MS Visual Studio .NET.
Далее создается новый модуль с именем UnitFunction. Заголовочный файл нового модуля будет содержать следующий код:
#ifndef UnitFunction_h
#define UnitFunction_h
bool getA(char *fileName);
double y(double x);
bool writeTable(double left, double right, double step, char *fileName);
void deleteA();
#endif
Функция getA() будет осуществлять чтение из заданного файла исходных данных. Если чтение пройдет успешно, функция вернет true. Следующая функция должна вычислять y(x). Функция writeTable() должна выводить в заданный файл таблицу значений функции при изменении аргумента на интервале от left до right с шагом step. Функция deleteA() нужна для освобождения памяти, занимаемой массивом.
В файл UnitFunction.cpp помещаем следующий код:
#include <fstream>
#include "UnitFunction.h"
namespace
{
int n;
double* a = 0;
}
bool getA(char *fileName)
{
std::ifstream in(fileName);
if (!(in >> n))
return false;
if (a)
delete [] a;
a = new double [n + 1];
for (int i = 0; i <= n; i++)
{
if (!(in >> a[i]))
return false;
}
return true;
}
double y(double x)
{
double result = 0;
double z = 1;
for (int i = 0; i <= n; i++)
{
result += a[i] * a[i] / z;
z *= x;
}
return result;
}
bool writeTable(double left, double right, double step, char *fileName)
{
std::ofstream out(fileName);
if (!out)
return false;
for (double x = left; x < right + step; x += step)
out << x << "\t" << y(x) << "\n";
return true;
}
void deleteA()
{
if (a)
delete [] a;
}
Переменные внутреннего использования (a и n) целесообразно поместить в безымянное пространство имен. Как видно из примера, объекты-потоки можно сравнивать с целыми (булевыми) значениями. Если входной поток дает 0 после чтения, данные из файла не прочитаны, что означает ошибку.
Основной модуль программы будет выглядеть так:
#include <iostream>
#include "UnitFunction.h"
using namespace std;
int main(int argc, char* argv[])
{
if (getA("input.txt") && writeTable(2, 3, 0.1, "results.txt"))
cout << "OK";
else
cout << "Error!";
deleteA();
return 0;
}
В случае успешного завершения программы в директории проекта появится файл results.txt.