Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

_Ayl_
Статус: Студент
Рейтинг: 1088
∙ повысить рейтинг »
Micren
Статус: Бакалавр
Рейтинг: 622
∙ повысить рейтинг »
Matrix
Статус: 3-й класс
Рейтинг: 369
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Номер выпуска:1370
Дата выхода:18.08.2009, 23:35
Администратор рассылки:Dr_Andrew, Модератор
Подписчиков / экспертов:637 / 160
Вопросов / ответов:1 / 2
IRC-канал по теме:#C

Вопрос № 171324: Здравствуйте! У меня возниклапроблемма. Есть задание: Запросить начальный аргумент в градусах и приращение изменения аргумента, (1рад=1гр*P/180) для вычисления функций Sin(x), записав в первый типизированный файл значения аргумента; во вто...



Вопрос № 171324:

Здравствуйте! У меня возниклапроблемма.
Есть задание:
Запросить начальный аргумент в градусах и приращение изменения аргумента, (1рад=1гр*P/180) для вычисления функций Sin(x), записав в первый типизированный файл значения аргумента; во второй - значения функций Sin(x). Организовать вывод данных из файлов.
Я разобрался с типизированными файлами ввод/вывод, проблемма с вычислением значения функции Sin(x).
Подскажите пожалуйста как решить эту задачу.
Заранее благодарю.

Отправлен: 13.08.2009, 23:07
Вопрос задал: Грибанов Фёдор, Посетитель
Всего ответов: 2
Страница вопроса »


Отвечает Micren, Бакалавр :
Здравствуйте, Грибанов Фёдор.
Понятие типизированного файла к C++ не совсем применимо. В паскале, например, есть file of type. В C++ есть текстовые и бинарные потоки.
Программа. C++. MS Visual Studio 2008. Данные, вводимые в градусах, приводятся к радианам и дальше вся обработка и вывод идет в радианах. Поскольку не сказано о конечном угле считается в пределах окружности.
Код:

#define _USE_MATH_DEFINES
#include <cmath>
#include <locale>
#include <limits>
#include <iostream>
#include <fstream>
#include <string>
#include <exception>

using namespace std;

// Тип данных с которым будем работать
typedef double datatype;

// Шаблонная футкция для ввода с подсказко й
template<class T> T input(const char* const message);
// Считает синусы и выводит все по файлам
void calculate_and_save(datatype x,datatype delta,fstream& arg_out,fstream& val_out);
// Читает из файлов и выводит на экран
void read_and_print(fstream& arg_in,fstream& val_in);

int main()
{
try
{
setlocale(LC_ALL,"russian_russia");

// Вводим данные
datatype x=input<datatype>("Введите начальное значение(x):")*M_PI/180.0;
datatype delta=input<datatype>("Введите приращение аргумента(delta):")*M_PI/180.0;
// Режим открытия файлов
const ios::openmode mode=ios::binary|ios::out|ios::in|ios::trunc;
// Открываем
fstream argument_out("argument.dat",mode);
fstream value_out("value.dat",mode);
// Вычисляем и сохраняем
calculate_and_save(x,delta,argument_out,value_out);
// Читаем и печатаем
read_and_print(argument_out,valu e_out);
}
catch(exception& e)
{
cout<<"Возникло исключение:"<<e.what()<<endl;
}
catch(...)
{
cout<<"Необработанное исключение"<<endl;
}

system("PAUSE");
return 0;
}

template<class T>
T input(const char* const message)
{
T result=T();
while(true)
{
cout<<message;
cin>>result;
if(cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cout<<"Ошибка ввода"<<endl;
}
else
{
cin.ignore(numeric_limits<streamsize>::max(),'\n');
break;
}
}
return result;
}

void calculate_and_save(datatype x,datatype delta,fstream& arg_out,fstream& val_out)
{
// Минимально возможное приращение аргумента для данного алгоритма
const double min_delta=2.0*M_PI/(numeric_limits<siz e_t>::max()-1);
if(abs(delta)<min_delta)
{
throw invalid_argument("Параметр delta слишком мал");
}
// Количество итераций
size_t steps=static_cast<size_t>(ceil(2.0*M_PI/abs(delta)));
// Сохраним состояние флагов генерации исключений
ios::iostate arg_iostate=arg_out.exceptions();
ios::iostate val_iostate=val_out.exceptions();
// Исключения при ошибках
arg_out.exceptions(ios::failbit);
val_out.exceptions(ios::failbit);
try
{
for(size_t i=0;i<steps;++i)
{
// Считаем аргумент и синус
datatype arg=x+i*delta;
datatype val=sin(arg);
// Выводим по потокам
arg_out.write(reinterpret_cast<char*>(&arg),sizeof(arg));
val_out.write(reinterpret_cast<char*>(&val),sizeof(val));
}
// Сброс буфера
arg_out.flush();
val_out.flush();
}
catch(...)
{
arg_out.exceptions(arg_iostate);
val_out.exceptions(val_iostate);
throw exception("Ошибка записи в файл");
}
arg_out.exceptions(arg_iostate);
val_out.exceptions(val_iostate);
}
void read_and_print(fstream& arg_in,fstream& val_in)
{
// Сохраним состояние флагов генерации исключений
ios::iostate arg_iostate=arg_in.exceptions();
ios::iostate val_iostate=val_in.exceptions();
// Исключение при неисправимых ошибках
arg_in.exceptions(ios::badbit);
val_in.exceptions(ios::badbit);
try
{
// Указатели чтения на начало
arg_in.seekg(0);
val_in.seekg(0);
datatype arg,val;
// Читаем
arg_in.read(reinterpret_cast<char*>(&arg),sizeof(arg));
val_in.read(reinterpret_cast<char*>(&val),sizeof(val));
// Пока не установлен failbit, который установится при ошибке и чтении за концом файла
while(arg_in && val_in)
{
// Печатаем
cout<<"sin("<<arg<<")="<<val<<endl;
arg_in.read(reinterpret_cast<char*>(&arg),sizeof(arg));
val_in.read(reinterpret_cast<char*>(&val),sizeof(val));
}
}
c atch(...)
{
arg_in.exceptions(arg_iostate);
val_in.exceptions(val_iostate);
throw;
}
arg_in.exceptions(arg_iostate);
val_in.exceptions(val_iostate);
}

Пример вывода:
Код:

Введите начальное значение(x):10
Введите приращение аргумента(delta):25
sin(0.174533)=0.173648
sin(0.610865)=0.573576
sin(1.0472)=0.866025
sin(1.48353)=0.996195
sin(1.91986)=0.939693
sin(2.35619)=0.707107
sin(2.79253)=0.34202
sin(3.22886)=-0.0871557
sin(3.66519)=-0.5
sin(4.10152)=-0.819152
sin(4.53786)=-0.984808
sin(4.97419)=-0.965926
sin(5.41052)=-0.766044
sin(5.84685)=-0.422618
sin(6.28319)=-2.44929e-016

Ответ отправил: Micren, Бакалавр
Ответ отправлен: 14.08.2009, 02:14

Оценка ответа: 5
Комментарий к оценке:
Благодарю за ответ, Вы мне очень помогли.
Во всём разобрался, теперь стало всё понятно, ещё раз спасибо за то что ответили на мой вопрос.

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 253214 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Veder, 1-й класс :
    Здравствуйте, Грибанов Фёдор!
    Для вычисления синуса какого-либо аргумента используйте стандартную функцию double sin(double a)

    Для ее использования вам надо подключить библиотеку
    #include <math.h>

    Ответ отправил: Veder, 1-й класс
    Ответ отправлен: 16.08.2009, 18:09

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 253266 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.7 от 15.08.2009

    В избранное