Вопрос № 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
Отвечает: Хватов Сергей
Здравствуйте, Biathlonfan!
return x,y означает что возвращается одно значение y - результат операции «,» (запятая), то есть правый операнд. Вы можете определить подходящую структуру и вернуть её.
Приложение:
Ответ отправил: Хватов Сергей (статус: Практикант)
Ответ отправлен: 15.05.2009, 14:34
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 249235 на номер 1151 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Отвечает: Micren
Здравствуйте, Biathlonfan! Вам не кажется, что задача решается гораздо проще и логичнее, чем у Вас? C++
Код:
// Компилировать с опцией /EHa // Можно включить в ProjectProperties->Configuration PropertiesC/C++Code GenerationEnable C++ Exceptions // выбрать /EHa
// Этот класс будем использовать для возврата результата 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 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Вопрос № 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 (Россия) | Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Вопрос № 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; }
Отвечает: 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> > и т.д. В этом универсальность шаблонов. Фактически вы получили не матрицу комплексных чисел, а вообще матрицу чего угодно.
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.