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

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


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

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

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

Micren
Статус: Студент
Рейтинг: 158
∙ повысить рейтинг >>
Лысков Игорь Витальевич
Статус: Профессионал
Рейтинг: 150
∙ повысить рейтинг >>
Николай // Programmator
Статус: Студент
Рейтинг: 141
∙ повысить рейтинг >>

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

Выпуск № 1229
от 01.02.2009, 00:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 474, Экспертов: 40
В номере:Вопросов: 4, Ответов: 5

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

Вопрос № 158712: Помогите пожалуйста,программа никак не получается((((((((( Нужно создать программу по сравнению двух комплексных чисел с операторами перегрузок > < == пояснение: одно из чисел УЖЕ ЗАДАНО программой (я попыталась,но ничего не получи...


Вопрос № 158767: Не понимаю почему, мной написанный метод интегрирования Рунгк-Кутта, считает не правильно. С каждым шагом погрешность увеличивается, до невозможного. Подскажите пожалуйста кто что знает... Мой метод... #include "stdafx.h" #incl...
Вопрос № 158808: Здравствуйте, дорогие эксперты! Помогите решить эту задачу... Вопрос : Раскопки (Время: 1 сек. Память: 16 Мб) Во время недавних раскопок на Марсе были обнаружены листы бумаги с таинственными символами на них. После долгих исследова...
Вопрос № 158817: У меня есть ещё один вопрос , помогите п ожалуйста! Вопрос : Римские числа (Время: 1 сек. Память: 16 Мб Сложность: 50%) Необходимо сократить дробь, записанную в римской системе счисления. Напомним, что в римской записи используются сим...

Вопрос № 158.712
Помогите пожалуйста,программа никак не получается(((((((((

Нужно создать программу по сравнению двух комплексных чисел с операторами перегрузок > < ==
пояснение: одно из чисел УЖЕ ЗАДАНО программой
(я попыталась,но ничего не получилось)
Буду заранее благодарна)

Приложение:

Отправлен: 25.01.2009, 15:49
Вопрос задала: klepka (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: Micren
Здравствуйте, klepka!
Советую обратить внимание на следующую цитату.

"Два комплексных числа считаются равными, если у них равны вещественные и мнимые части. Но вот операции типа «больше» и «меньше» для комплексных чисел не имеют смысла. Комплексные числа не упорядочены."

Исходя из этого написаны операторы сравнения.

Приложение:

Ответ отправил: Micren (статус: Студент)
Ответ отправлен: 25.01.2009, 21:59

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

    Оценка за ответ: 5


    Вопрос № 158.767
    Не понимаю почему, мной написанный метод интегрирования Рунгк-Кутта, считает не правильно. С каждым шагом погрешность увеличивается, до невозможного. Подскажите пожалуйста кто что знает...

    Мой метод...
    #include "stdafx.h"
    #include<iostream>
    #include<math.h>

    FILE *fout;

    using namespace System;
    using namespace std;
    void print_y(double t, double y1, double y2, FILE* fout)
    {
    printf("t=%g y1=%g y2=%g ",t,y1,y2);
    fprintf(fout,"%f %f %f ",t,y1,y2);
    }
    double f1(double y1, double y2)
    {
    return y2; //Ф-ия 1
    }

    double f2(double y1, double y2)
    {
    //return exp(y1)-exp(y2);
    return -y1; //ф-ия 2
    }

    int main(array<System::String ^> ^args)
    {
    fout=fopen("data.txt","w");
    fprintf(fout,"t y1 y2 ");

    double A, B; // пользовательский ввод
    const int r=2;
    double t;
    double h;
    int i;
    cout<<"enter left bound: ";
    cin>>A;
    cout<<"enter right bound: ";
    cin>>B;
    Console::Write("Введите h= ");
    cin>>h;
    int m = (B-A)/h+1;
    double** y = new double * [m];
    for(i=0; i<m; i++)
    y[i] = new double[2];
    cout<<"y1[0]= ";
    cin>>y[0][0];
    cout<<"y2[0]= ";
    cin>>y[0][1];
    t = A;

    print_y(t,y[0][0],y[0][1],fout);
    double k1,k2,k3,k4;
    for(i=0;i<m-1;i++)
    {
    t+=h;

    k1=f1(y[i][0]*h,y[i][1]);
    k2=f1(y[i][0]+k1*h/4,y[i][1]+k1*h/4);
    k3=f1(y[i][0]+h/10*(k1+4*k2),y[i][1]+h/10*(k1+4*k2));

    y[i+1][0]=y[i][0]+h/3*(2*k1+4*k2+5*k3);

    k1=f2(y[i][0]*h,y[i][1]);
    k2=f2(y[i][0]+k1*h/4,y[i][1]+k1*h/4);
    k3=f2(y[i][0]+h/10*(k1+4*k2),y[i][1]+h/10*(k1+4*k2));

    y[i+1][1]=y[i][1]+h/3*(2*k1+4*k2+5*k3); //ур-е
    print_y(t,y[i+1][0],y[i+1][1],fout);// печать y
    }

    return 0;
    }
    Отправлен: 26.01.2009, 08:37
    Вопрос задал: Cemenkov N A (статус: Посетитель)
    Всего ответов: 1
    Мини-форум вопроса >>> (сообщений: 0)

    Отвечает: Сандров Алекс
    Здравствуйте, Cemenkov N A!

    Да потому что фамилия Рунге неправильно написана! Шутка.

    Посмотрите вот эту ссылку: метод Рунге-Кутта
    И вот эту с исходниками на с++
    Ответ отправил: Сандров Алекс (статус: Студент)
    Ответ отправлен: 26.01.2009, 09:15

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


    Вопрос № 158.808
    Здравствуйте, дорогие эксперты!
    Помогите решить эту задачу...
    Вопрос :
    Раскопки
    (Время: 1 сек. Память: 16 Мб)

    Во время недавних раскопок на Марсе были обнаружены листы бумаги с таинственными символами на них. После долгих исследований учёные пришли к выводу, что надписи на них на самом деле могли быть обычными числовыми равенствами. Кроме того, из других источников было получено веское доказательство того, что марсиане знали только три операции - сложение, умножение и вычитание (марсиане никогда не использовали «унарный минус»: вместо «-5» они писали «0-5»). Также ученые доказали, что марсиане не наделяли операции разным приоритетом, а просто вычисляли выражения (если в них не было скобок) слева направо: например, 3+3*5 у них равнялось 30, а не 18. К сожалению, символы арифметических действий стерлись. Например, если была запись «18=7 (5 3) 2», то возможно восстановить эту запись как «18=7+(5-3)*2». Требуется написать программу, находящую требуемую расстано вку знаков или сообщающую, что таковой не существует.

    Входные данные:
    Первая строка входного файла INPUT.TXT состоит из натурального числа, не превосходящего 230, знака равенства, и последовательности натуральных чисел (не более десяти), произведение которых также не превосходит 230. Некоторые группы чисел (одно или более) могут быть окружены скобками. Длина входной строки не будет превосходить 80 символов, и других ограничений на количество и вложенность скобок нет. Между двумя соседними числами, не разделенными скобками, всегда будет хотя бы один пробел, во всех остальных местах может быть любое (в том числе и 0) число пробелов (естественно, внутри числа пробелов нет).

    Выходные данные:
    В выходной файл OUTPUT.TXT необходимо вывести одну строку, содержащую полученное равенство (т.е., исходное равенство со вставленными знаками арифметических действий без лишних пробелов). В случае если требуемая расстановка знаков невозможна, вывести строку, состоящую из единственного числа «-1». Выходная строка не должна содержать пробелов.

    Примеры:

    1.
    input.txt : 18=7 (5 3) 2
    OUTPUT.TXT : 18=7+(5-3)*2
    2.
    input.txt : 5= 3 3
    OUTPUT.TXT : -1
    Отправлен: 26.01.2009, 14:18
    Вопрос задал: SAHIBDJAN TAJOV DUSH
    Всего ответов: 1
    Мини-форум вопроса >>> (сообщений: 1)

    Отвечает: Micren
    Здравствуйте, !
    Программа с краткими комментариями.
    Решение на основе бинарных деревьев.

    Код:

    #include <locale>
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <algorithm>

    #ifdef _DEBUG
    #include <crtdbg.h>
    #endif

    using namespace std;

    enum type
    {
    operation,
    number
    };

    enum operation
    {
    plus=0,
    minus,
    mult
    };

    class TreeNode
    {
    public:
    TreeNode(type type=number,int value=0,TreeNode* left=0,TreeNode* right=0);
    TreeNode(const TreeNode& node);
    virtual ~TreeNode(void);
    // Возвращает указатель на левую ветвь
    TreeNode* const Left(void) const;
    // Возвращает указатель на правую ветвь
    Tr eeNode* const Right(void) const;
    type Type(void) const;
    int Value(void) const;
    bool Brackets(void) const;
    // Оператор присваивания
    TreeNode& operator=(const TreeNode& node);
    protected:
    // Ветвь дерева
    TreeNode* _left;
    // Ветвь дерева
    TreeNode* _right;
    // Значение
    int _value;
    // Тип(операция/число)
    type _type;
    bool _brackets;
    friend TreeNode* term(wstring& str);
    friend bool nextOp(TreeNode& tree);
    };

    wstring process(wstring& str);

    int main()
    {
    #ifdef _DEBUG
    _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)|_CRTDBG_LEAK_CHECK_DF);
    #endif
    locale::global(locale("Russian"));
    wstring ifname;
    wcout<<L"Введите имя входного файла:";
    getline(wcin,ifname);
    wifstream in(ifname.c_str());
    if(in)
    {
    wstring ofname;
    wcout<<L"Введите имя выходного файла:";
    getline(wcin,ofname);
    wofstream out(ofname.c_str());
    if(out)
    {
    while(!in.eof())
    {
    wstring str;
    getline(in,str);
    wstring res=process(str);
    wcout<<res<<endl;
    out<<res<<endl;
    }
    out.close();
    }
    else wcout<<L"Не могу открыть файл: "<<ofname;
    in.close();
    }
    else wcout<<L"Не могу открыть файл: "<<ifname;
    system("PAUSE");
    return 0;
    }

    // Удаляет лишние whitespaces
    void trim(wstring& str)
    {
    while(str.length()&&iswspace(str[0]))str.erase(0,1);
    while(str.length()&&iswspace(str[str.length()-1]))str.resize(str.length()-1);
    for(int i=0;i<static_cast<int>(str.length())-1;)
    {
    if(iswspace(str[i])&&iswspace(str[i+1]))
    {
    str[i]=L' ';
    str.erase(i+1,1);
    }
    else i++;
    }
    }

    // Извлекает подстроку в скобках
    wstring extract(wstring& str)
    {
    int numL=0;
    wstring::iterator it=st r.begin();
    while(it!=str.end())
    {
    switch(*it)
    {
    case L'(':
    numL++;
    break;
    case L')':
    numL--;
    if(!numL)
    {
    wstring res=str.substr(1,it-str.begin()-1);
    str.erase(str.begin(),it+1);
    return res;
    }
    }
    it++;
    }
    return L"";
    }

    TreeNode* parsestr(wstring& str);

    // Возвращает следующий элемент дерева
    TreeNode* term(wstring& str)
    {
    trim(str);
    if(str[0]==L'(')
    {
    wstring tmp=extract(str);
    if(tmp.length())
    {
    TreeNode* tree=parsestr(tmp);
    if(tree)tree->_brackets=true;
    return tree;
    }
    else return 0;
    }
    if(str.length()&&iswdigit(str[0]))
    {
    int value=0;
    while(str.length()&&iswdigit(str[0]))
    {
    wstring digit=str.substr(0,1);
    value=value*10+_wtoi(digit.c_str());
    str.erase(0,1);
    }
    return new TreeNode(number,value);
    }
    else ret urn 0;
    }

    // Преобразует строку в бинарное дерево
    TreeNode* parsestr(wstring& str)
    {
    if(TreeNode* l=term(str))
    {
    while(str.length())
    {
    if(str[0]==L' ')
    {
    str.erase(0,1);
    if(TreeNode* r=term(str))
    {
    l=new TreeNode(operation,0,l,r);
    }
    else
    {
    delete l;
    return 0;
    }
    }
    else return 0;
    }
    return l;
    }
    else return 0;
    }

    // Вычисляет значение выражения сохраненного в дереве
    int calc(const TreeNode& tree)
    {
    switch(tree.Type())
    {
    case number:
    return tree.Value();
    case operation:
    switch(tree.Value())
    {
    case plus:
    return calc(*tree.Left())+calc(*tree.Right());
    case minus:
    return calc(*tree.Left())-calc(*tree.Right());
    case mult:
    return calc(*tree.Left())*calc(*tree.Right());
    }
    }
    return 0;
    }

    // Изменить порядок опрераций
    bool nextOp(Tr eeNode& tree)
    {
    if(tree.Type()==operation)
    {
    ++tree._value%=3;
    if(!tree._value)
    {
    return nextOp(*tree._left)||nextOp(*tree._right);
    }
    else return true;
    }
    else return false;
    }

    // Обратное преобразование дерева в строку
    wstring format(const TreeNode& tree)
    {
    wchar_t num[10];
    wstring res;
    switch(tree.Type())
    {
    case number:
    _itow_s(tree.Value(),num,10,10);
    res=num;
    break;
    case operation:
    switch(tree.Value())
    {
    case plus:
    res=format(*tree.Left())+L'+'+format(*tree.Right());
    break;
    case minus:
    res=format(*tree.Left())+L'-'+format(*tree.Right());
    break;
    case mult:
    res=format(*tree.Left())+L'*'+format(*tree.Right());
    break;
    }
    }
    if(tree.Brackets())res=L'('+res+L')';
    return res;
    }

    // Делает всю работу
    wstring process(wstring& str)
    {
    trim(str);
    wstring::iterator it=find(str.begin(),str.end(),L'=');
    if(it!=str.end())
    {
    wstring resultStr=str.substr(0,it-str.begin());
    trim(resultStr);
    int result=_wtoi(resultStr.c_str());
    str.erase(str.begin(),it+1);
    TreeNode *tree=parsestr(str);
    if(tree)
    {
    do
    {
    if(calc(*tree)==result)
    {
    wstring res=resultStr+L'='+format(*tree);
    delete tree;
    return res;
    }
    }
    while(nextOp(*tree));
    delete tree;
    return L"-1";
    }else return L"Неверное выражение";
    }
    else return L"Неверный формат входных данных";
    }

    TreeNode::TreeNode(type type,int value,TreeNode* left,TreeNode* right)
    : _left(left)
    , _right(right)
    , _value(value)
    , _type(type)
    , _brackets(false)
    {
    }

    TreeNode::~TreeNode(void)
    {
    if(_left)
    {
    delete _left;
    _left=0;
    }
    if(_right)
    {
    delete _rig ht;
    _right=0;
    }
    }

    TreeNode::TreeNode(const TreeNode& node)
    : _left(0)
    , _right(0)
    , _value(node._value)
    , _type(node._type)
    , _brackets(node._brackets)
    {
    if(node._left)_left=new TreeNode(*node._left);
    if(node._right)_right=new TreeNode(*node._right);
    }

    // Оператор присваивания
    TreeNode& TreeNode::operator=(const TreeNode& node)
    {
    if(&node!=this)
    {
    if(_left)delete _left;
    if(_right)delete _right;
    if(node._left)_left=new TreeNode(*node._left);
    else _left=0;
    if(node._right)_right=new TreeNode(*node._right);
    else _right=0;
    _value=node._value;
    _type=node._type;
    _brackets=node._brackets;
    }
    return *this;
    }

    // Возвращает указатель на левую ветвь
    TreeNode* const TreeNode::Left(void) const
    {
    return _left;
    }

    // Возвращает указатель на правую ветвь
    TreeNode* const TreeNode::Right(void) const
    {
    return _right;
    }

    type Tre eNode::Type(void) const
    {
    return _type;
    }

    int TreeNode::Value(void) const
    {
    return _value;
    }

    bool TreeNode::Brackets(void) const
    {
    return _brackets;
    }


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

    Введите имя входного файла:e:file.txt
    Введите имя выходного файла:e:out.txt
    18=7+(5-3)*2
    -1
    14879=213-233*(65-98+65)+87+(65*(675-87)-(54*(434-12)))
    Ответ отправил: Micren (статус: Студент)
    Ответ отправлен: 27.01.2009, 20:10

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


    Вопрос № 158.817
    У меня есть ещё один вопрос , помогите пожалуйста!
    Вопрос :
    Римские числа
    (Время: 1 сек. Память: 16 Мб Сложность: 50%)

    Необходимо сократить дробь, записанную в римской системе счисления. Напомним, что в римской записи используются символы M, D, C, L, X, V и I. Приведем таблицу с примерами перевода римских чисел в арабскую систему: I - 1 VII - 7 XLVI - 46 CCCII - 302
    II - 2 VIII - 8 L - 50 CDXLI - 441
    III - 3 IX - 9 LXXV - 75 ID - 499
    IV - 4 X - 10 XCII - 92 D - 500
    V - 5 XVIII - 18 IC - 99 DCXCV - 695
    VI - 6 XXXI - 31 C - 100 CM - 900

    Входные данные

    Во входном файле INPUT.TXT записана дробь в римской системе счисления. Формат записи считается корректным, если запись представляет собой: римское число, деление, римское число (без пробелов), и каждое из чисел находится в диапазоне от 1 до 999.

    Выходные данные
    В выходной файл OUTPUT.TXT выведите сокращенную дробь в римской системе счисления. В тех случаях, когда первое число делится на второе, следует выводить результат в виде только одного римского числа. В том случае, когда во входных данных содержится ошибка, следует вывести ERROR.

    Примеры :
    1.
    input.txt: II/IV
    output.txt:I/II

    2.
    input.txt: XXIV/VIII
    output.txt:III

    3.
    input.txt :12/16
    output.txt: ERROR

    Спасибо!!!
    Отправлен: 26.01.2009, 15:47
    Вопрос задал: SAHIBDJAN TAJOV DUSH
    Всего ответов: 2
    Мини-форум вопроса >>> (сообщений: 0)

    Отвечает: Ross
    Здравствуйте!

    Решение можно найти здесь: http://rusfaq.ru/upload/1386
    Преобразование обратно в римскую систему сделано "в лоб", с целью упростить алгоритм.
    ---------
    Доступно только то, что видимо (c) Б. Керниган
    Ответ отправил: Ross (статус: Практикант)
    Ответ отправлен: 28.01.2009, 02:23

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


    Отвечает: Лысков Игорь Витальевич
    Здравствуйте, !
    Хочу предложить свой вариант
    Программа работает с числами 1-3899

    Приложение:

    ---------
    Удачи!

    Ответ отправил: Лысков Игорь Витальевич (статус: Профессионал)
    Украина, Кировоград
    ICQ: 234137952
    ----
    Ответ отправлен: 28.01.2009, 17:52

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


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

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

    Приложение (если необходимо):

    * Код программы, выдержки из закона и т.п. дополнение к вопросу.
    Эта информация будет отображена в аналогичном окне как есть.

    Обратите внимание!
    Вопрос будет отправлен всем экспертам данной рассылки!

    Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
    экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


    Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
    Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.

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

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

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

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

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


    © 2001-2009, Портал RusFAQ.ru, Россия, Москва.
    Авторское право: ООО "Мастер-Эксперт Про"
    Техподдержка портала, тел.: +7 (926) 535-23-31
    Хостинг: "Московский хостер"
    Поддержка: "Московский дизайнер"
    Авторские права | Реклама на портале

    ∙ Версия системы: 5.13 от 01.12.2008

    Яндекс Rambler's Top100
    RusFAQ.ru | MosHoster.ru | MosDesigner.ru
    RusIRC.ru | Kalashnikoff.ru | RadioLeader.ru

    В избранное