Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите переделать программу, с++ 
V
    Опции темы
rememberme
Дата 9.7.2006, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 5.7.2006

Репутация: нет
Всего: нет



препод установил какую-то версию visual c++ которая не поддерживает заголовочный файл iostream.h
помогите плиз переделать прогу ..если б там были только cout и cin ..я бы сама заменила на printf scanf ..но там ещё есть другие функции ..помогите, мне пора уже преподу показывать ..
Код

#include <iostream>       // Потоки ввода-вывода
#include <iomanip>        // Параметризованные манипуляторы
#include <fstream>        // Потоки ввода-вывода для файлов
#include <vector>         // Шаблон вектора
#include <algorithm>      // Различные функции STL

using namespace std;

// Эта структура задает узел интерполяции полиномом Эрмита
class node {
public:
 double x, fx, dfx;       // Абсцисса узла, значение функции и производной
// Эта функция читает данные узла из потока ifs
 void read(istream &ifs)  {ifs >> x >> fx >> dfx;}
// Перегруженная операция сравнения "меньше" для узлов - нужна для сортировки
// (для интерполяции узлы должны быть отсортированы по возрастанию абсцисс)
 bool operator<(const node &n) const {return x<n.x;}
};

typedef vector<node> node_vector;    // Тип массива узлов

class hermit_eval                    // Класс вычислителя полинома Эрмита по точкам
{
public:
 node_vector nodes;                  // Заданные узлы
 bool read(const char *fname);       // Функция, читающая узлы из файла fname
 void show();                        // Функция, выводящая узлы на консоль
 bool eval(double arg, double &res); // Функция вычисления значения
};

// Чтение узла из файла с именем fname
// Эта функция возвращает true при успехе и false при ошибке
// (если, например, файл не удается открыть)
bool hermit_eval::read(const char *fname)
{
 ifstream ifs(fname, ios::in);      // Открываем файл для чтения
                                    // Он будет закрыт автоматически деструктором ifstream
 if (!ifs) return false;            // Если открыть не удалось
 unsigned size;
 ifs >> size;                       // Читаем из файла число узлов
 nodes.resize(size);
 for (unsigned i=0; i<size; i++) {  // Читаем сами узлы
  if (ifs.eof()) return false;      // Если достигли конца файла раньше времени...
  nodes[i].read(ifs);
 }
// Для правильного вычисления узлы следует отсортировать по возрастанию
// абсцисс
 sort(nodes.begin(), nodes.end());
 return true;
}

// Эта функция просто выводит таблицу узлов на консоль
void hermit_eval::show()
{
 cout << setw(15) << "x" << setw(15) << "f(x)" << setw(15) << "f\'(x)" << endl;
 for (unsigned i=0; i<nodes.size(); i++) {
  cout << setw(15) << nodes[i].x << setw(15) << nodes[i].fx
       << setw(15) << nodes[i].dfx << endl;
 }
}

// Вычисление приближенных значений функции с помощью полинома Эрмита
// (кусочная интерполяция). В каждом узле известны значения функции и производной
// Для нахождения функции нужно сначала выбрать пару узлов, между
// которыми находится аргумент, построить для нее полином Эрмита (3-й степени)
// и с помощью его найти функцию. Т.к. производные на границах интервалов
// (в узлах) одинаковые, то переходы между функциями плавные
bool hermit_eval::eval(double arg, double &res)
{
 for (unsigned i=0; i<nodes.size()-1; i++) {
  if (arg>=nodes[i].x && arg<=nodes[i+1].x) {   // Если аргумент попадает в интервал от узла № i до i+1
   double h = nodes[i+1].x - nodes[i].x;        // Расстояние между узлами
// Узлы вообще-то совпадать не должны, если таблица задана правильно...
   if (!h) continue;
// Вычисление коэффициентов
   double u = (arg - nodes[i].x)/h;
   double a0 = 1-3*u*u+2*u*u*u;
   double a1 = 3*u*u-2*u*u*u;
   double b0 = u-2*u*u+u*u*u;
   double b1 = -u*u+u*u*u;
// Вычисление значения функции
   res = a0*nodes[i].fx + a1*nodes[i+1].fx + b0*nodes[i].dfx*h + b1*nodes[i+1].dfx*h;
   return true;
  }
 }
// false возвращается, когда аргумент не находится внутри таблицы
 return false;
}

// Главная функция
int main()
{
 char buf[255];
 cout << "Input file name - ";         // Ввод имени файла
 cin.getline(buf, 255);
 hermit_eval e;
 if (!e.read(buf)) {                   // Попытка чтения файла
  cout << "Unable to read file " << buf << endl;
  return 1;
 }
 cout << "Table:" << endl;
 e.show();                             // Вывод таблицы
 char ch;
 do {                                  // Вычисление значений
  double x, res;
  cout << "Input x = "; cin >> x;
  cout << "Evaluating... ";
  if (e.eval(x, res)) cout << "Success: y = " << res << endl;
  else cout << "Error!" << endl;
  cout << "Repeat ?[y/any other key to exit] - "; cin >> ch;
 } while(ch=='y' || ch=='Y');
 return 0;
}

 
PM MAIL   Вверх
bsa
Дата 9.7.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 1
Всего: 196



Код
//#include <iostream>       // Потоки ввода-вывода
#include <iomanip>        // Параметризованные манипуляторы
#include <fstream>        // Потоки ввода-вывода для файлов
#include <vector>         // Шаблон вектора
#include <algorithm>      // Различные функции STL
#include <cstdio>

using namespace std;

// Эта структура задает узел интерполяции полиномом Эрмита
class node
{
    public:
        double x, fx, dfx;       // Абсцисса узла, значение функции и производной
// Эта функция читает данные узла из потока ifs
        void read(FILE * f) {
            //ifs >> x >> fx >> dfx;
            fscanf(f, "%lf %lf %lf", &x, &fx, &dfx);
        }
// Перегруженная операция сравнения "меньше" для узлов - нужна для сортировки
// (для интерполяции узлы должны быть отсортированы по возрастанию абсцисс)
        bool operator<(const node &n) const { return x < n.x; }
};

typedef vector<node> node_vector;    // Тип массива узлов

class hermit_eval                    // Класс вычислителя полинома Эрмита по точкам
{
    public:
        node_vector nodes;                  // Заданные узлы
        bool read(const char *fname);       // Функция, читающая узлы из файла fname
        void show();                        // Функция, выводящая узлы на консоль
        bool eval(double arg, double &res); // Функция вычисления значения
};

// Чтение узла из файла с именем fname
// Эта функция возвращает true при успехе и false при ошибке
// (если, например, файл не удается открыть)
bool hermit_eval::read(const char *fname)
{
    //ifstream ifs(fname, ios::in);      // Открываем файл для чтения
    FILE *f = fopen( fname, "rt" );
                                    // Он будет закрыт автоматически деструктором ifstream
    if ( f == NULL)
        return false;            // Если открыть не удалось

    unsigned size;
    //ifs >> size;                       // Читаем из файла число узлов
    fscanf(f, "%u", &size);
    nodes.resize(size);
    for (unsigned i=0; i < size; i++) {  // Читаем сами узлы
        if (feof(f))
            return false;      // Если достигли конца файла раньше времени...
        nodes[i].read(ifs);
    }
// Для правильного вычисления узлы следует отсортировать по возрастанию
// абсцисс
    sort(nodes.begin(), nodes.end());
    fclose(f);
    return true;
}

// Эта функция просто выводит таблицу узлов на консоль
void hermit_eval::show()
{
    //cout << setw(15) << "x" << setw(15) << "f(x)" << setw(15) << "f\'(x)" << endl;
    printf("%15s%15s%15s%15s\n", "x", "f(x)", "f\'(x)");
    for (unsigned i=0; i<nodes.size(); i++) {
/*        cout << setw(15) << nodes[i].x << setw(15) << nodes[i].fx
                << setw(15) << nodes[i].dfx << endl;*/
        printf("%15f%15f%15f\n", nodes[i].x, nodes[i].fx, nodes[i].dfx );
    }
}

// Вычисление приближенных значений функции с помощью полинома Эрмита
// (кусочная интерполяция). В каждом узле известны значения функции и производной
// Для нахождения функции нужно сначала выбрать пару узлов, между
// которыми находится аргумент, построить для нее полином Эрмита (3-й степени)
// и с помощью его найти функцию. Т.к. производные на границах интервалов
// (в узлах) одинаковые, то переходы между функциями плавные
bool hermit_eval::eval(double arg, double &res)
{
    for (unsigned i=0; i<nodes.size()-1; i++) {
        if (arg>=nodes[i].x && arg<=nodes[i+1].x) {   // Если аргумент попадает в интервал от узла № i до i+1
            double h = nodes[i+1].x - nodes[i].x;        // Расстояние между узлами
// Узлы вообще-то совпадать не должны, если таблица задана правильно...
            if (!h)
                continue;
// Вычисление коэффициентов
            double u = (arg - nodes[i].x)/h;
            double a0 = 1-3*u*u+2*u*u*u;
            double a1 = 3*u*u-2*u*u*u;
            double b0 = u-2*u*u+u*u*u;
            double b1 = -u*u+u*u*u;
// Вычисление значения функции
            res = a0*nodes[i].fx + a1*nodes[i+1].fx + b0*nodes[i].dfx*h + b1*nodes[i+1].dfx*h;
            return true;
        }
    }
// false возвращается, когда аргумент не находится внутри таблицы
    return false;
}

// Главная функция
int main()
{
    char buf[255];
//    cout << "Input file name - ";         // Ввод имени файла
    fprintf(stdout, "Input file name - ");
    fflush(stdout);
//    cin.getline(buf, 255);
    scanf("%s", buf);
    hermit_eval e;
    if (!e.read(buf)) {                   // Попытка чтения файла
        //cout << "Unable to read file " << buf << endl;
        fprintf(stderr, "Unable to read file %s\n", buf);
        return 1;
    }
//    cout << "Table:" << endl;
    printf("Table:\n");
    e.show();                             // Вывод таблицы
    char ch;
    do {                                  // Вычисление значений
        double x, res;
        //cout << "Input x = "; cin >> x;
        fprintf(stdout, "Input x = ");
        fflush(stdout);
        scanf("%ld", &x);
        //cout << "Evaluating... ";
        fprintf(stdout, "Evaluating...");
        fflush(stdout);
        if (e.eval(x, res))
            printf("Success: y = %f\n", res);    //cout << "Success: y = " << res << endl;
        else
            printf("Error!\n");    //cout << "Error!" << endl;
        //cout << "Repeat ?[y/any other key to exit] - "; cin >> ch;
        fprintf(stdout, "Repeat ?[y/any other key to exit] - ");
        fflush(stdout);
        scanf("%1c", &ch);
    } while( (ch=='y') || (ch=='Y') );
    return 0;
}
Делал без отладки. Возможны некоторые глюки. smile
fflush нужен для форсирования вывода строчки на экран. Иначе она не будет выведена до блиюайшего символа конца строки '\n' (или до переполнения буфера).
 
PM   Вверх
rememberme
Дата 10.7.2006, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 5.7.2006

Репутация: нет
Всего: нет



bsa, спасибо..да глючит немного ..буду пытаться отладить - впереди вся ночь!
спасибо-) smile  
PM MAIL   Вверх
Pete
Дата 10.7.2006, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

Репутация: 7
Всего: 12



Цитата(rememberme @  9.7.2006,  20:27 Найти цитируемый пост)
...какую-то версию visual c++ которая не поддерживает заголовочный файл iostream.h...

Интересный компилятор...
 


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
Oleg_Ci
Дата 11.7.2006, 04:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 25
Всего: 30



А может так работать будет  #include <iostream>   ??? 

Чёрт, плохо почитал первый пост. 

Это сообщение отредактировал(а) Олег4 - 11.7.2006, 04:26
PM MAIL   Вверх
rememberme
Дата 12.7.2006, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 5.7.2006

Репутация: нет
Всего: нет



Олег4, неа.. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0797 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.