![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Tribunal |
![]()
Сообщение
#1
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 233 Пол: Женский Реальное имя: Dasha Репутация: ![]() ![]() ![]() |
прграмма должна выполднять следующие действия:
-выяислять произведение отрицательных эл-тов одномерного массива -находить сумму эл-тов до максимального эл-та. но вся прблема в шаблонах. я сделала шаблон (1)для ф-ии нахождения максимума и (2)объединение вышеуказанных действий в одну функцию... до того,как яя сделала (2) всё работало хорошо. а сейчас он говорит,что нет соответствующей ф-ии с названием act. не могу понять в чем проблема=( #include <iostream.h>
template <class T> T iMax(T*x, int k);
template <class Y> Y act(Y*x, Y*p, Y*s, int k);
int main()
{
const int n = 3;
//for int numbers
int a[n],pa,sa;
cout << "Enter " << n << " int numb-s:" << endl;
act(a,pa,sa,n);
//for float numbers
float b[n],pb,sb;
cout << "Enter " << n << " float numb-s:" << endl;
act(b,pb,sb,n);
//for double numbers
double c[n],pc,sc;
cout << "Enter " << n << " float numb-s:" << endl;
act(c,pc,sc,n);
}
template <class T> T iMax(T *x,int k)
{
int imax=0;
for (int i=1;i<k;i++)
if (x[i]>x[imax]) imax=i;
return imax;
}
template <class Y> Y act(Y *x,Y *p,Y *s, int k)
{
for (int i=0;i<k;i++) cin >> x[i];
p=1;
for (int i=0;i<k;i++)
if (x[i]<0) p=p*x[i];
cout << "Multiply of (-) elements: " << p << endl;
s=0;
for (int i=0;i<iMax(x,k);i++) s=s+x[i];
cout << "Sum up to max element: " << s << endl;
}
-------------------- irreparabilium felix olivio rerum
|
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
до того,как яя сделала (2) всё работало хорошо. а сейчас он говорит,что нет соответствующей ф-ии с названием act. не могу понять в чем проблема=( Компилятор прав... Смотри, что ты делаешь внутри act: for (int i=0;i<iMax(x,k);i++) s=s+x[i];
То есть, тебе iMax должна вернуть int в любом случае, так? Почему же ты описываешь тип возвращаемого значения iMax шаблонным типом T? Это должен быть intЭто первое... Второе: int и const int в С++ - совершенно разные вещи, и перемешивать их компилятор тебе не позволит... Автоматически преобразование неконстантной переменной в константную не делается, поэтому при описании шаблона ты должна дописывать const, если не хочешь делать приведение вручную при вызове функции iMax... Ну, и третье... До тех пор, пока ты не перенесешь реализацию шаблонных функций выше основной программы, откуда они вызываются, программа не откомпилируется, потому, что компилятор просто не знает, что подставлять, и допустимо ли это... Кстати, вместо того, чтобы работать с указателями при возвращении параметра (аналог Var-параметров в Паскале), С++ имеет очень хорошую замену в виде ссылок... Вот так я бы переделал твою программу: #include <iostream.h>
template <class T>
int iMax(T *x, const int k)
{
int imax=0;
for (int i = 1; i < k; i++)
if (x[i] > x[imax]) imax = i;
return imax;
}
template <class T> void act(T *x, T &p, T &s, const int k)
{
for (int i=0;i<k;i++) cin >> x[i];
p=1;
for (i=0;i<k;i++)
if (x[i]<0) p=p*x[i];
cout << "Multiply of (-) elements: " << p << endl;
s=0;
for (i=0; i < iMax(x,k); i++) s=s+x[i];
cout << "Sum up to max element: " << s << endl;
}
int main()
{
const int n = 3;
//for int numbers
int a[n],pa,sa;
cout << "Enter " << n << " int numb-s:" << endl;
act(a,pa,sa,n);
// for float numbers
float b[n],pb,sb;
cout << "Enter " << n << " float numb-s:" << endl;
act(b,pb,sb,n);
// for double numbers
double c[n],pc,sc;
cout << "Enter " << n << " float numb-s:" << endl;
act(c,pc,sc,n);
return 0;
}
|
Tribunal |
![]()
Сообщение
#3
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 233 Пол: Женский Реальное имя: Dasha Репутация: ![]() ![]() ![]() |
большое спасибо!
теперь всё предельно ясно =) -------------------- irreparabilium felix olivio rerum
|
![]() ![]() |
![]() |
Текстовая версия | 28.07.2025 6:28 |