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

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


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

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

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

Hubbitus
Статус: 10-й класс
Рейтинг: 90
∙ повысить рейтинг >>
Micren
Статус: Практикант
Рейтинг: 65
∙ повысить рейтинг >>
Varkon
Статус: 3-й класс
Рейтинг: 43
∙ повысить рейтинг >>

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

Выпуск № 1309
от 21.05.2009, 00:05

Администратор:Dr_Andrew
В рассылке:Подписчиков: 521, Экспертов: 45
В номере:Вопросов: 3, Ответов: 4

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

Вопрос № 167361: Помогите найти и устранить ошибку в программе.Нужно получить Xn, Yn, если X1=X1 =1, Xi=Xi-1 + Yi-1/i*i , Yi=Yi-1+Xi-1/i , i=2,3…. Считает всё правильно, но выводит одно и тоже значение и для X и для Y ...


Вопрос № 167370: Доброго времени суток. Задание: поменять в каждой строке максимальный и минимальный элементы на 0. Код в приложении... я думаю ошибка в функции void SortMatrix(int **X, const int K, const int L). Посмотрите, пожалуйста, в чем проблема...
Вопрос № 167396: Здравствуйте! Подскажите пожалуйста, приведенная ниже программа использует ли шаблоны классов? Дело в том, что преподаватель, которому я сдаю эту программу, на данном этапе не разрешает нам им пользоваться, просит писать самим функции. Можно обрат...

Вопрос № 167.361
Помогите найти и устранить ошибку в программе.Нужно получить Xn, Yn, если
X1=X1 =1, Xi=Xi-1 + Yi-1/i*i , Yi=Yi-1+Xi-1/i , i=2,3….
Считает всё правильно, но выводит одно и тоже значение и для X и для Y

Приложение:

Отправлен: 15.05.2009, 13:52
Вопрос задал: Biathlonfan (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Хватов Сергей
Здравствуйте, Biathlonfan!

return x,y означает что возвращается одно значение y - результат операции «,» (запятая), то есть правый операнд.
Вы можете определить подходящую структуру и вернуть её.

Приложение:

Ответ отправил: Хватов Сергей (статус: Практикант)
Ответ отправлен: 15.05.2009, 14:34

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


    Отвечает: Micren
    Здравствуйте, Biathlonfan!
    Вам не кажется, что задача решается гораздо проще и логичнее, чем у Вас?
    C++
    Код:

    // Компилировать с опцией /EHa
    // Можно включить в ProjectProperties->Configuration PropertiesC/C++Code GenerationEnable C++ Exceptions
    // выбрать /EHa

    #include <locale>
    #include <iostream>
    #include <exception>
    #include <Windows.h>

    using namespace std;

    // Этот класс будем использовать для возврата результата
    class xy
    {
    public:
    xy(double x,double y);
    double x() const;
    double y() const;
    private:
    double _x,_y;
    };

    // Будем использовать для проверки переполнени стека
    class stackoverflowexception:public exception
    {};

    // Рекурсивная функция для вычисления
    xy calc(unsigned int N);

    // Обработчик исключений
    void __cdecl sehTranslator(unsigned int code,_EXCEPTION_POINTERS*);

    // Здесь будем хранить указатель на предыдущий обработчик исключений
    _se_translator_function prevTranslator=0;

    int main()
    {
    setlocale(LC_ALL,"russian");
    // Вводим N
    cout<<"Введите N:";
    int N=0;
    cin>>N;
    if(cin.fail())
    {
    cout<<"Ошибочный ввод"<<endl;
    }
    else
    {
    if(N>0)
    {
    // Не рекурсивное вычисление
    double X=1,Y=1;
    for(unsigned int i=2;i<=static_cast<unsigned int>(N);++i)
    {
    double newX=X+Y/i/i;
    double newY=Y+X/i;
    X=newX;
    Y=newY;
    }
    cout<<"X("<<N<<")="<<X<<endl;
    cout<<"Y("<<N<<")="<<Y<<endl;
    // Рекурсивное вычисление cout<<"Вычисление при помощи рекурсии:"<<endl;
    // Установим собственный обработчик исключений, чтоб перехватить переполнение стека.
    // Т.к. стандартный обработчик просто аварийно завершит программу
    // Так же сохраним предыдуший обработчик в prevTranslator
    prevTranslator=_set_se_translator(sehTranslator);
    // Флаг сигнализирующий, что возникло переполнение стека и требуется его восстановление.
    bool resetRequired=false;
    // Блок обработки исключений
    try
    {
    // Наш рекурсивный вызов
    xy res=calc(N);
    // Выводим результат
    cout<<"X("<<N<<")="<<res.x()<<endl;
    cout<<"Y("<<N<<")="<<res.y()<<endl;
    }
    catch(stackoverflowexception)
    {
    // Стек переполнился - установим флаг
    resetRequired=true;
    }
    catch(exception e)
    {
    cout< <"Исключение:"<<e.what()<<endl;
    }
    catch(...)
    {
    cout<<"Неизвестное исключение"<<endl;
    }
    if(resetRequired)
    {
    cout<<"Возникло переполнение стека"<<endl;
    if(!_resetstkoflw())exit(1);
    }
    // Вернем старый обработчик исключений. Можно и без этого.
    _set_se_translator(prevTranslator);
    }
    else cout<<"Ожидается положительное число"<<endl;
    }
    system("PAUSE");
    return 0;
    }

    // Рекурсивная функция
    xy calc(unsigned int N)
    {
    if(N>1)
    {
    xy t=calc(N-1);
    return xy(t.x()+t.y()/N/N,t.y()+t.x()/N);
    }
    else return xy(1,1);
    }

    xy::xy( double x,double y )
    :_x(x)
    ,_y(y)
    {}

    inline double xy::x() const
    {
    return _x;
    }

    inline double xy::y() const
    {
    return _y;
    }

    // Наш обработчик исключений
    void __cdecl sehTrans lator(unsigned int code,_EXCEPTION_POINTERS* ep)
    {
    // Если переполнился стек то сгенерируем исключение stackoverflowexception
    if(code==EXCEPTION_STACK_OVERFLOW)throw stackoverflowexception();
    else
    {
    // Иначе передадим исключение старому обработчику. Пусть сам разбирается с ним:)
    if(prevTranslator)prevTranslator(code,ep);
    else throw exception("Unknown exception");
    }
    }

    Пример работы:
    Код:

    Введите N:1000
    X(1000)=2.41177
    Y(1000)=14.0074
    Вычисление при помощи рекурсии:
    X(1000)=2.41177
    Y(1000)=14.0074

    Только не забывайте, что при использовании рекурсии возможно переполнение стека.
    Если Вам нужно именно на C, то возьмите только алгоритм. Хотя Ваш компил ятор Microsoft Visual C++ Compiler должен без проблем компилировать этот код.
    Ответ отправил: Micren (статус: Практикант)
    Ответ отправлен: 15.05.2009, 16:03

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


    Вопрос № 167.370
    Доброго времени суток. Задание: поменять в каждой строке максимальный и минимальный элементы на 0. Код в приложении... я думаю ошибка в функции void SortMatrix(int **X, const int K, const int L). Посмотрите, пожалуйста, в чем проблема

    Приложение:

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

    Отвечает: Denisss

    Здравствуйте, Bel9illi!

    Да, действительно в функции SortMatrix() имеются ошибки. Исправленный вариант функции находится в приложении.
    Замечание: одинарный знак равенства ("=") - это присваивание, а сравнение - двойной ("=="). Это очень опасная ошибка.

    Т.е.
    if (x = y) z = x;

    можно рассматривать как:
    1) Присваиваем x значение y
    2) Если значение y не равно нулю, то присваиваем z значение x.

    А
    if (x == y) z = x;

    1) Если x равно y, то присваиваем z значение x.


    Также отмечу ошибку с созданием и удалением матрицы:
    В Вашем примере из файла считываются два числа - размеры матрицы - К и L. Так вот создаете Вы квадратную матрицу размером LxL

    int ** X = CreateMatrix(L, L);

    вместо
    int ** X = CreateMatrix(K, L);


    Ну и удаление производится именно этой матрицы.

    FreeMatrix(X, L);

    вместо
    FreeMatrix(X, K);

    Ошибка может проявиться только при K& gt;L. Но даже в этом случае она может утаиваться очень долго.

    Успехов!

    Приложение:

    ---------
    Все должно быть сделано настолько просто, насколько это возможно. Но не проще. (с) А.Эйнштейн

    Ответ отправил: Denisss (статус: Профессор)
    Россия, Москва
    ICQ: 2412904
    ----
    Ответ отправлен: 16.05.2009, 17:41

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


    Вопрос № 167.396
    Здравствуйте! Подскажите пожалуйста, приведенная ниже программа использует ли шаблоны классов? Дело в том, что преподаватель, которому я сдаю эту программу, на данном этапе не разрешает нам им пользоваться, просит писать самим функции.
    Можно обратиться с еще одним вопросом:
    что означают ниже приведенные функции?(в отчете каждую функцию и метод нужно описать, для чего он создан и что делает..)
    typename matrix<T>::_row& matrix<T>::_row::operator=(const typename matrix<T>::_row& r );
    matrix<T>::_row::_row(const typename matrix<T>::_row& r );
    matrix<T>::_row::_row( unsigned int cols );(не совсем понятно с этими функциями, так как row описывается в нескольких функциях..)
    T& matrix<T>::_row::operator [](unsigned int col);
    T* _data;
    почему используются две функции?.. мы только только проходим эти темы, я совсем не знаю некоторые вещи, использованные в этой функции...
    inline double complex::re(void) const
    {
    r eturn _re;
    }
    inline double complex::re(const complex& val)
    {
    return val._re;
    }



    Приложение:

    Отправлен: 15.05.2009, 21:41
    Вопрос задала: Кашапова Аиша Рифгатовна (статус: Посетитель)
    Всего ответов: 1
    Мини-форум вопроса >>> (сообщений: 56)

    Отвечает: Micren
    Здравствуйте, Кашапова Аиша Рифгатовна!
    Поскольку этот код писал я, то и вопросы лучше было бы задать в мини-форуме по месту.
    • Если Вы имеете ввиду, что нельзя использовать стандартную библиотеку шаблонов STL, то в программе она и не используется. Но в программе используется шаблон
      template<class T> class matrix. Все, что там есть написано, как Вы и спрашивали, самим вручную. Ведь шаблонами можно не только пользоваться но и создавать их самим.
    • typename matrix<T>::_row& matrix<T>::_row::operator=(const typename matrix<T>::_row& r) - это стандартный оператор присваивания для класса _row. Во всех классах, в которых используется динамическое выделение памяти необходимо реализовывать деструктор, конструктор копирования и оператор присваивания. Иначе будут проблемы с освобождением памяти или ее утечками.
    • matrix<T>::_row::_row(const typename matrix&l t;T>::_row& r ) - конструктор копирования для класса _row(читай выше).
    • matrix<T>::_row::_row( unsigned int cols ) - это конструктор класса _row. Выделяет память для строки матрицы. Фактически одномерный массив размером cols элементов.
    • T& matrix<T>::_row::operator [](unsigned int col) - это индексатор. Позволяет обращаться к классу как Вы привыкли это делать с массивами. Например оператор arr[i][j] фактически транслируется в arr.operator[](i).opertor[](j). Так вот arr.operator[](i) возвращает объект типа _row в котором и работает этот индексатор.
    • T* _data - Эта строка описывает указатель на тип данных T в шаблоне template<class T> class matrix. В программе мы используем класс комплексных чисел matrix<complex>. Но п оскольку matrix это шаблон, то никто Вам не запрещает вместо complex использовать любой другой тип данных.Например: matrix<int>, matrix<double>,matrix< vector<int> > и т.д. В этом универсальность шаблонов. Фактически вы получили не матрицу комплексных чисел, а вообще матрицу чего угодно.

    • Код:
      inline double complex::re(void) const
      {
      return _re;
      }
      inline double complex::re(const complex& val)
      {
      return val._re;
      }
      Две функции используются исключительно для Вашего удобства. Получить действительную часть в данном случае можно двумя способами.
      Код:
      complex a;
      double r1=a.re(); // Так
      double r2=complex::re(a); // И так

      В общем там реализован вполне нормальный функционал.
    Ответ отправил: Micren (статус: Практикант)
    Ответ отправлен: 16.05.2009, 10:57

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

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


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

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

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

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

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

    Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
    экспертам другой рассылки портала 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

    В избранное