Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2013, 21:33   #1
Friezi
Новичок
Джуниор
 
Регистрация: 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;
}
Friezi вне форума Ответить с цитированием
Старый 20.05.2013, 22:34   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Странное задание.
Но, что ж, давайте сделаем. Ваша функция считает определитель матрицы a размера nxn, при условии, что элементы матрицы имеют тип double. Определитель матрицы, при этом - также имеет тип double.
Кроме типа "элементов матрицы", функция использует тип "размера" (в его роли int) и... всё.
Действие первое: везде в функции заменяем double на T.
Действие второе: меняем заголовок функции на вот эту конструкцию:
Код:
template <typename T> //Шаблон, параметризуемый типом T
T opredel(T** a, int n){ //Обратите внимание: тип int оставили на месте
  /* тело функции */
}
В принципе, на этом можно бы и закончить: при вызове компилятор сообразит, что, если в качестве первого аргумента передают double**, значит, T=double.
Но можно и продолжить. Правила хорошего тона говорят, что при объявлении шаблонного метода нужно явно указать, какие требования налагаются на тип 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, который будет удовлетворять всему перечисленному - работа адская. Именно поэтому я говорю: "странное задание".
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шаблонная функция 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