![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 20.05.2013
Сообщений: 2
|
![]()
здравствуйте, очень нужна помощь, нужно имеющийся код(рабочий) переделать в шаблон функции, сама делала , не получилось, выдает ошибку.
#include "stdafx.h" #include <iostream> #include <stdio.h> using namespace System; using namespace std; double opredel(double ** a,int n); int main() { int size; double opr; double** array; cout<<"Vvedite razmernost` matrici "; cin >> size; array=new double*[size]; for (int i = 0; i < size; i++) { array[i]=new double[size]; } for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { cin>>array[i][j]; } } opr=opredel(array,size); cout<<"Opredelitel` = "<<opr; char TheEnd; cin>>TheEnd; return 0; } double opredel(double ** a,int n) { double det = 1; for (int i = 0; i < n; i++) { int row = i; int mx = a[i][i]; for(int k = i+1; k < n; k++) { if (abs(a[k][i]) > mx) { row = k; mx = abs(a[k][i]); } } if (row != i) { det *= -1; swap(a[row], a[i]); } for (int j = i+1; j < n; j++) { double e = a[j][i]/a[i][i]; for (int k = i; k < n; k++) { a[j][k] -= e*a[i][k]; } } } for (int i = 0; i < n; i++) det *= a[i][i]; return det; } |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]()
Странное задание.
Но, что ж, давайте сделаем. Ваша функция считает определитель матрицы a размера nxn, при условии, что элементы матрицы имеют тип double. Определитель матрицы, при этом - также имеет тип double. Кроме типа "элементов матрицы", функция использует тип "размера" (в его роли int) и... всё. Действие первое: везде в функции заменяем double на T. Действие второе: меняем заголовок функции на вот эту конструкцию: Код:
Но можно и продолжить. Правила хорошего тона говорят, что при объявлении шаблонного метода нужно явно указать, какие требования налагаются на тип T. T должен: 1) Инициализироваться единицей (T det=1 должно иметь смысл); 2) Приводиться к типу int (int mx = a[i][i] должно иметь смысл... кстати, а какого рожна у Вас там int вообще-то?); 3) Должна существовать функция abs(T) или приведение типа T к чему-то, что можно скормить существующей функции abs; результат abs должен быть сравним с int (abs(a[k][i]) > mx должно иметь смысл); 4) Результат оной abs должно быть возможно присвоить int (mx = abs(a[k][i]) должно иметь смысл); 5) Должен быть определён operator*=(T, int) (det *= -1 должно иметь смысл); 6) Должна существовать функция swap(T, T) (спасибо стандарту, она существует для любого T); 7) Должен быть определён operator/(T, T), возвращаемое им значение должно быть возможно присвоить переменной типа T; 8) Должен быть определён operator*(T, T), возвращаемое им значение должно быть такого типа X, что определён operator-=(T, X); 9) Должен быть определён operator*=(T, T). Уф. Как нетрудно заметить, создать новый тип T, который будет удовлетворять всему перечисленному - работа адская. Именно поэтому я говорю: "странное задание". |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Шаблонная функция | bujlka | Общие вопросы C/C++ | 4 | 04.12.2012 13:38 |
Шаблонная функция | bujlka | Помощь студентам | 2 | 02.12.2012 15:43 |
шаблонная разметка... | Student1992 | PHP | 0 | 12.11.2011 15:17 |
шаблонная функция | zhenya.ya | Помощь студентам | 23 | 26.02.2011 17:40 |
одна функция потока, а другая функция - член класса запускающего этот поток | Дмитрий_Ч | Общие вопросы C/C++ | 2 | 27.09.2007 08:50 |