Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Шаблон массива не работает с float/double

#cpp #массивы #шаблоны_с++


Здравствуйте. Вот задание:




То есть выполнить задание 2 варианта используя шаблоны.

Я написал такой код. Но он работает только с integer'ом. С флоатом и даблом выдает
какую то хрень. Я делал отладку пошагово и понял что ошибка где то в функции void create(T
*arr, T n); Но в чем именно вообще не понимаю

Если подскажете буду очень благодарен.

#include 
#include 

using namespace std;

template  int func(T n);
template  void create(T *arr, T n);
template  T positiv(T *arr, int n);
template  T proizv(T *arr, int n);
template  void sort(T *arr, int n);
template  void print(T *arr, int n);


int main()
{
    int n;
    cin >> n;
    func(n);
    return 0;
}

template 
int func(T n)
{
    T *arr1 = new T[n];
    create(arr1, n);


    /*T *arr2 = new T[n];
    create(arr2, n);


    T *arr3 = new T[n];
    create(arr3, n);*/

    //T s1 = positiv(arr1, n);
    //T p1 = proizv(arr1, n);
    //sort(arr1, n);

    //T s2 = positiv(arr2, n);
    //T p2 = proizv(arr2, n);
    //sort(arr2, n);

    //T s3 = positiv(arr3, n);
    //T p3 = proizv(arr3, n);
    //sort(arr3, n);

    //cout << s1 << " ";
    //if (p1 == -100)
    //  cout << "No elements between max and min." << endl;
    //else
    //  cout << p1 << endl;

    print(arr1, n);

    /*cout << s2 << " ";
    if (p2 == -100)
        cout << "No elements between max and min." << endl;
    else
        cout << p2 << endl;

    print(arr2, n);

    cout << s3 << " ";
    if (p3 == -100)
        cout << "No elements between max and min." << endl;
    else
        cout << p3 << endl;

    print(arr3, n);*/

    system("pause");
    return 0;

}

template 
void create( T *arr, T n)
{
    for (int i = 0; i < n; i++)
    {
        arr[i] = 0;
    }


    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }
}

template 
T positiv(T *arr, int n)
{
    T  i, summ;
    for (i = summ = 0; i < n; i++)
    {
        if (arr[i] > 0) summ += arr[i];
    }
    return summ;
}

template 
T proizv(T *arr, int n)
{
    int i, maxelem, minelem;
    maxelem = minelem = 0;

    for (maxelem = minelem = i = 0; i < n; i++)
    {
        if (fabs(arr[i]) > fabs(arr[maxelem])) maxelem = i;
        if (fabs(arr[i]) < fabs(arr[minelem])) minelem = i;
    }

    T temp;

    if (abs(maxelem - minelem) > 1)
    {
        int stelem = (maxelem < minelem ? maxelem : minelem);
        int endelem = (maxelem < minelem ? minelem : maxelem);
        for (i = stelem + 1, temp = 1; i < endelem; i++)
            temp *= arr[i];
    }
    else
        temp = -100;
    return temp;

}

template 
void sort(T *arr, int n)
{
    T temp;
    for (int i = 0; i < n - 1; i++)
        for (int j = i + 1; j <= n - 1; j++)
            if (arr[i] < arr[j]) {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
}

template 
void print(T *arr, int n)
{
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
    delete[] arr;
}

    


Ответы

Ответ 1



Итак, ваш шаблон: template int func(T n) { T *arr1 = new T[n]; Подставим для double: int func(double n) { double *arr1 = new double[n]; И как вы себе представляете массив из, скажем, 2.5 элементов? n же у вас - double! В create та же некорректность - вы используете n с плавающей точкой... P.S. А вообще, очень странно смотрится чисто C-шный подход с применением шаблонов :)

Комментариев нет:

Отправить комментарий