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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2008, 23:51   #1
bondik
Форумчанин
 
Регистрация: 24.04.2008
Сообщений: 300
По умолчанию Шаблоны

Вот такая задача:дан массив ,найти все числа кратные трем,сделать шаблон этой фукциий.
И тут трудность - если тип int то остаток а следовательно и кратность находим % а если double или float то modf().
Я решил сделать так:программно с помощью typeid() определяем тип переменной и исходя из этого либо % либо modf()
В этом и вопрос возможно ли более просто это реализовать?
bondik вне форума Ответить с цитированием
Старый 03.05.2008, 12:16   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Есть способ(ы)... Но я думаю с помощь typeid() будет быстрее и проще. Я помню, делал игру "Дилемма заключенного" (мутовская до невозможности) на Билдере. Так вот я не знал тогда про typeid() и сделал проверку на индекс (там надо было стратегии игры из ComboBox выбирать) и передавать конструктору класса. Но когда я пришел показывать преподавателю он мне сделал с typeid() и вышло гораздо проще. Так что тебе решать.
MaTBeu вне форума Ответить с цитированием
Старый 03.05.2008, 18:02   #3
bondik
Форумчанин
 
Регистрация: 24.04.2008
Сообщений: 300
По умолчанию

хм.вроде все правильно сделал если передаю интовый массив то все отлично,если же дабл то не комилиться
Код:
#include <clx.h>
#pragma hdrstop
#include <conio.h>
#include <iostream.h>
#include <math.h>
#include <typeinfo.h>

//---------------------------------------------------------------------------

#pragma argsused

template< class lol >
lol funct(lol (*b)[12])
{
 int x,y,n;lol min;
 n=0;
//-------------------
if (typeid(x).name()==typeid(int).name())
 for (y=1;y<12;y++){
 for (x=11;x>0;x--)
 { if ((b[x][y]>0) && (b[x][y]%3==0) && (b[x][y]<min)) min=b[x][y];n++;
  if (n==y) break;};n=0;}
 //-------------------
 else
 for (y=1;y<12;y++){
 for (x=11;x>0;x--)
 { if ((b[x][y]>0) && (b[x][y]%3==0) && (b[x][y]<min)) min=b[x][y];n++;
  if (n==y) break;};n=0;};
return min;


};



int main(int argc, char* argv[])
{
  int x,y;
 double a[12][12]={{1,2,3,4,5,6,7,8,9,10,11,12},
              {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,114,115,116,117,118,119,120,3}};



  for (x=0;x<10;x++)
 {
  for (y=0;y<12;y++){
 cout<<a[x][y]<<" ";
  }
  cout<<"\n" ;
  }  ;

 cout<<funct(a);

 getch();



        return 0;
}
//---------------------------------------------------------------------------
bondik вне форума Ответить с цитированием
Старый 03.05.2008, 19:50   #4
cout
 
Регистрация: 03.05.2008
Сообщений: 7
По умолчанию

Тёма, ты чё всё ищё со 2й лабой е**ся?
З.Ы я тя узнал)
cout вне форума Ответить с цитированием
Старый 03.05.2008, 20:29   #5
bondik
Форумчанин
 
Регистрация: 24.04.2008
Сообщений: 300
По умолчанию

Да =( а ты кто? Люди плиз помогите ктонить!
bondik вне форума Ответить с цитированием
Старый 03.05.2008, 21:05   #6
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Мда... код у тебя еще тот...
Строка 18 - а зачем ты x проверяешь на тип переменной??? Тебе ведь нужно определить тип массива, а не тип переменной, которая в цикле служит итератором (и к тому же всегда типа int).

Вопрос второй. А чем у тебя отличается обработка массива типа int от обработки массива типа double или float? Что там, что там стоит %.
MaTBeu вне форума Ответить с цитированием
Старый 03.05.2008, 23:02   #7
bondik
Форумчанин
 
Регистрация: 24.04.2008
Сообщений: 300
По умолчанию

хи,тупанул =) ,ща исправлю и попробую
bondik вне форума Ответить с цитированием
Старый 03.05.2008, 23:05   #8
bondik
Форумчанин
 
Регистрация: 24.04.2008
Сообщений: 300
По умолчанию

Код:
if (typeid(b[1][1]).name()==typeid(int).name())
сделал так всеравно нихрена не работает =(
bondik вне форума Ответить с цитированием
Старый 04.05.2008, 08:14   #9
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

ИМХО, не проще внутри шаблона преобразовать элемент массива в double и работать только с ним ? Шаблон будет в два раза меньше и никаких typeid()
alexBlack вне форума Ответить с цитированием
Старый 04.05.2008, 08:57   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

если мне не изменяет память, для решения подобных задач используется специализация шаблона, т.е. создаем еще одну функцию funct, где lol меняем на double и пишем код для обработки массива double. а в вышеоприведенной функции пишем код, как-будто у нас lol == int. никаких typeid, а уже какую функцию вызывать надо - не наша проблема
pu4koff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
шаблоны функций с++6.0 tanya Общие вопросы C/C++ 18 20.12.2008 19:39
Шаблоны пользовательских классов MaTBeu Общие вопросы C/C++ 2 23.03.2008 19:02
сделать шаблоны из сайта flyby HTML и CSS 6 04.01.2008 23:38
Word и шаблоны. Gambler Microsoft Office Word 0 29.10.2006 20:44