Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Tema_8.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
119.81 Кб
Скачать

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]