3 / 3 / 1
Регистрация: 18.03.2011
Сообщений: 85
1

Не работает шаблонная функция с типом char

14.10.2011, 10:37. Показов 1250. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как реализовать шаблон функции для калькулятора для дробей с типом <char>?А то вместо чисел выводатся символы в дробях.
С другими типами работает нормально.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//Ex14_7.cpp
//калькулятор для выполнения арифметических операций 
#include <iostream>
#include <clocale>
#include <cmath>
using namespace std;
char dummychar;
//////////////////////////////////////////////////////////////
template <class Type>
class fraction
{
private:
    Type upval;
    Type dnval;
public:
    fraction():upval(0),dnval(1) {}
    fraction(Type u,Type d):upval (u),dnval (d) {}
    void get()
    {
        cout<<"\nВведите дробь: ";
        cin>>upval>>dummychar>>dnval;
    }
    void display() const
    {cout<<"Результат равен "<<upval<<dummychar<<dnval<<endl;}
    fraction operator+(fraction );
    fraction operator-(fraction );
    fraction operator*(fraction );
    fraction operator/(fraction );
    void lowterms();
};
/////////////////////////////////////////////////////////////
 
int main()
{
    setlocale(LC_CTYPE,"Russian");
    char ch;
    char indicator='y';
    while(indicator!='n')
    {
        fraction<char> frac1,frac2,frac3;
        frac1.get();
        cout<<"Введите операцию,которую хотите выполнить: ";
        cin>>ch;
        frac2.get();
        switch(ch)
        {
        case '+' : frac3=frac1+frac2; break;
        case '-' : frac3=frac1-frac2;break;
        case '*' : frac3=frac1*frac2;break;
        case '/' : frac3=frac1/frac2; break;
        }
        frac3.lowterms();
        frac3.display();
        cout<<"Выполнить еще одну операцию (y/n)?";
        cin>>indicator;
    }
    return 0;
}
//--------------------------------------------------------
template <class Type>
void fraction<Type>::lowterms()//сокращение дроби
{
    Type tnum,tden,temp,gcd;
    tnum=labs(upval);//используем неотрицательные
    tden=labs(dnval);//значения (нужен cmath)
    if (tden==0)//проверка знпменателя на 0
    {cout<<"Недопустимый знаменатель!";exit(1);}
    else if (tnum==0)//проверка числителя на 0
    {upval=0;dnval=1;return;}
    //нахождение наибольшего общего делителя
    while(tnum!=0)
    {
        if(tnum<tden)//если числитель больше знаменателя
        {temp=tnum;tnum=tden;tden=temp;}//меняем их местами
        tnum=tnum-tden;//вычитание
    }
    gcd=tden;//делим числитель и знаменатель на
    upval=upval/gcd;//полученный наибольший общий делитель
    dnval=dnval/gcd;
}
 
//--------------------------------------------------------------------------
template <class Type>
fraction<Type> fraction<Type>::operator +(fraction<Type> fr2)
{
    upval = upval * fr2.dnval + dnval * fr2.upval ;
    dnval = dnval * fr2.dnval ; 
    return fraction<Type>(upval,dnval);
}
//-------------------------------------------------------------------------
template <class Type>
fraction<Type> fraction<Type>::operator -(fraction<Type> fr2)
{
    upval = upval * fr2.dnval - dnval * fr2.upval ; 
    dnval = dnval * fr2.dnval ; 
    return fraction<Type>(upval,dnval);
}
//-------------------------------------------------------------------------
template <class Type>
fraction<Type> fraction<Type>::operator *(fraction<Type> fr2)
{
    upval *= fr2.upval;
    dnval*=fr2.dnval ; 
    return fraction<Type>(upval,dnval);
}
//---------------------------------------------------------------------------
template <class Type>
fraction<Type> fraction<Type>::operator /(fraction<Type> fr2)
{
    upval *= fr2.dnval;
    dnval*=fr2.upval; 
    return fraction<Type>(upval,dnval);
}
 Комментарий модератора 
Используйте теги форматирования кода!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2011, 10:37
Ответы с готовыми решениями:

Шаблонная функция не соотносится с типом bool
предисловие - не даются мне никак шаблоны, хотя очень хочу разобраться... Вроде читаю методички,...

Не работает шаблонная функция
Не могу правильно определить шаблонную функцию. На первый взгляд все правильно, но не понимаю...

Шаблонная функция не работает
#include &lt;iostream&gt; using namespace std; template &lt;class T&gt;void Print_Car(T &amp;a); struct Car...

не работает шаблонная функция
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;list&gt; using namespace std; template &lt;class...

4
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
14.10.2011, 13:05 2
Перед выводом в поток char привести к int.
0
3 / 3 / 1
Регистрация: 18.03.2011
Сообщений: 85
14.10.2011, 18:14  [ТС] 3
Цитата Сообщение от gooseim Посмотреть сообщение
Перед выводом в поток char привести к int.
А как конкретно это сделать?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
14.10.2011, 18:23 4
NaV'i4ok,
C++
1
2
void display() const
{cout<<"Результат равен "<<static_cast<int>(upval)<<dummychar<<static_cast<int>(dnval)<<endl;}
Но это нужно делать в отдельной специализации шаблона для типа char.
А вообще, почему для вычислений был выбран именно char?
0
3 / 3 / 1
Регистрация: 18.03.2011
Сообщений: 85
14.10.2011, 18:37  [ТС] 5
Цитата Сообщение от Nameless One Посмотреть сообщение
NaV'i4ok,
C++
1
2
void display() const
{cout<<"Результат равен "<<static_cast<int>(upval)<<dummychar<<static_cast<int>(dnval)<<endl;}
Но это нужно делать в отдельной специализации шаблона для типа char.
А вообще, почему для вычислений был выбран именно char?
Тип char по условию задачи,а вообще шаблон должен работать со всеми целочисельными типами(он и работает со всеми кроме char)
А после static_cast<int> :
error C2059: syntax error : 'function-style cast'
1> \ex14_7.cpp(24) : while compiling class template member function 'void fraction<Type>::display(void) const'
1> with
1> [
1> Type=char
1> ]
1> c:\documents and settings\admin\мои документы\visual studio 2008\projects\lafore_oop_c++\задания\к гл14\ex14_7\ex14_7\ex14_7.cpp(40) : see reference to class template instantiation 'fraction<Type>' being compiled
1> with
1> [
1> Type=char
1> ]
1>cpp(24) : error C2143: syntax error : missing '>' before '}'
1>ex14_7.cpp(24) : error C2143: syntax error : missing ';' before '>'
0
14.10.2011, 18:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2011, 18:37
Помогаю со студенческими работами здесь

Функция с типом char, которая должна возвращать интовое значение
Всем привет. Странное дело. Есть функция с типом char, которая должна возвращать интовое значение в...

Как работает шаблонная функция countof?
Здравствуйте! Нашел в Интернете следующую шаблонную функцию countof, которая подсчитывает...

Функция insert char to dynamic char array работает не во всех случаях
В порядке изобретения велосипедов написал функцию, но она вставляет значение в массив, если индекс...

Функция fread плохо работает с типом string
Всем доброго времени суток. У меня возникла проблема с чтением из файла. Я храню информацию в виде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru