+171
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#include <iostream>
template <int n>
struct Solution
{
static const int count = Solution<n / 10>::count + 1;
static const int sum = Solution<n / 10>::sum + n % 10;
static const int last = n % 10;
static const int first = Solution<n / 10>::first;
};
#define DECLARE_ONE_DIGIT_SOLUTION(n) template <>\
struct Solution<n>\
{\
static const int count = 1;\
static const int sum = n;\
static const int last = n;\
static const int first = n;\
};
DECLARE_ONE_DIGIT_SOLUTION(0)
DECLARE_ONE_DIGIT_SOLUTION(1)
DECLARE_ONE_DIGIT_SOLUTION(2)
DECLARE_ONE_DIGIT_SOLUTION(3)
DECLARE_ONE_DIGIT_SOLUTION(4)
DECLARE_ONE_DIGIT_SOLUTION(5)
DECLARE_ONE_DIGIT_SOLUTION(6)
DECLARE_ONE_DIGIT_SOLUTION(7)
DECLARE_ONE_DIGIT_SOLUTION(8)
DECLARE_ONE_DIGIT_SOLUTION(9)
int main()
{
const int number = 1024; // <-- то самое число a
std::cout << "Number of digits: " << Solution<number>::count << std::endl;
std::cout << "Sum: " << Solution<number>::sum << std::endl;
std::cout << "Last digit: " << Solution<number>::last << std::endl;
std::cout << "First digit: " << Solution<number>::first << std::endl;
return 0;
}
Это один из ответов к слезной просьбе какого-то школьника (студента) выполнить за него д/з на С++ в разделе development форума на ЛОРе. Такую программу нарочно хрен напишешь.
Само задание: «Дано натуральное число а (a≤100). Напишите программу, определяющую количество цифр в этом числе, сумму его цифр, выводящую на экран первую и последнюю цифру через два пробела».
Запостил: deniska,
16 Февраля 2011
7ion 16.02.2011 19:59 # −6
deniska 16.02.2011 20:08 # −3
gegMOPO4 17.02.2011 11:56 # +11
TarasB 16.02.2011 20:39 # −5
guest 16.02.2011 23:12 # +6
Анонимус 16.02.2011 23:33 # +9
Анонимус 16.02.2011 22:02 # −3
сначала надо человека сям научить и процедруному подходу
потом грузить неокрепший мозг темплейтами
Altravert 17.02.2011 07:03 # +5
Кстати, и не школьник это писал -- это ответ на его просьбу. Так что школота в этот раз только свою лень показала.
koodeer 16.02.2011 23:21 # +4
Вычисления в компайл-тайме - уважаю!
ЗЫ: любопытно, примут ли работу у того школьника?
absolut 16.02.2011 23:28 # +1
gegMOPO4 17.02.2011 11:58 # +2
absolut 17.02.2011 12:04 # 0
gegMOPO4 17.02.2011 12:32 # 0
absolut 17.02.2011 12:55 # −2
gegMOPO4 17.02.2011 13:03 # +1
koodeer 17.02.2011 15:53 # +3
pushkoff 17.02.2011 01:53 # 0
enum
{
count = Solution<n / 10>::count + 1,
sum = Solution<n / 10>::sum + n % 10,
last = n % 10,
first = Solution<n / 10>::first,
};
компилятор может забить на разворачивание интов и тупо вставить код который их вычисляет...
Altravert 17.02.2011 07:05 # 0
pushkoff 17.02.2011 07:09 # +3
в гсс с такой проблемой сталкивался сам год назад, в жизни до main были неинициализированные константы...
AxisPod 17.02.2011 07:21 # −2
Altravert 17.02.2011 08:19 # −1
Altravert 17.02.2011 08:18 # 0
gegMOPO4 17.02.2011 11:59 # −2
Altravert 18.02.2011 07:54 # −7
guest 18.02.2011 14:36 # 0
Не у поминайте её всуе.
gegMOPO4 18.02.2011 14:54 # 0
guest 18.02.2011 15:20 # −1
gegMOPO4 18.02.2011 15:37 # −2
Lure Of Chaos 18.02.2011 20:48 # 0
gegMOPO4 18.02.2011 21:08 # +2
AxisPod 17.02.2011 07:19 # +1
pushkoff 17.02.2011 07:27 # 0
AxisPod 17.02.2011 14:51 # 0
gegMOPO4 17.02.2011 18:41 # 0
pushkoff 17.02.2011 20:47 # 0
приведу псевдокод еще раз
// c1.cpp
const int& some_val_ref = Some_template<param>::value;
// c2.cpp
extern const int& some_val_ref;
некоторый класс в жизни до main обращался к этой переменной и получал в ответ 0, при этом в main этот же код читал правильное значение...
gegMOPO4 17.02.2011 21:00 # 0
pushkoff 17.02.2011 21:19 # −3
gegMOPO4 17.02.2011 21:29 # 0
pushkoff 17.02.2011 21:31 # −1
AxisPod 17.02.2011 07:22 # 0
pushkoff 17.02.2011 07:29 # 0
AxisPod 17.02.2011 07:39 # −1
pushkoff 17.02.2011 07:48 # 0
extern const int& use_some;
extern const bool& enable_something;
AxisPod 17.02.2011 07:52 # 0
pushkoff 17.02.2011 07:53 # 0
guest 17.02.2011 13:33 # −1
В стандарте до С++0х не с компилируется.
По крайней мере майкрософсткий компилятор до 2010 студии это делать не будет.
absolut 17.02.2011 13:51 # +1
Инициализация статических интегральных типов возможна внутри класса.
guest 17.02.2011 13:54 # −2
Например:
gegMOPO4 17.02.2011 21:03 # 0
guest 17.02.2011 21:38 # −1
Зато другая и более надёжная половина библиотек использует заместо этого приёма enum.
Altravert 18.02.2011 07:55 # −3
guest 18.02.2011 14:37 # −1
guest 17.02.2011 13:56 # −2
Конечно, только не во всех компиляторах. Например майкрософстская 2008 студия - сольёт.
absolut 17.02.2011 14:07 # 0
работает
guest 17.02.2011 14:16 # −1
И при зависимости от шаблона тоже работает?
absolut 17.02.2011 14:39 # 0
guest 17.02.2011 14:18 # −1
gegMOPO4 17.02.2011 18:43 # 0
Altravert 17.02.2011 07:08 # 0
AxisPod 17.02.2011 07:19 # 0
Altravert 17.02.2011 08:21 # 0
bober_maniac 17.02.2011 09:15 # −1
AxisPod 17.02.2011 09:17 # +1
pushkoff 17.02.2011 18:07 # +2
int array[Solution<10>::count];
метод с enum лишен этого недостатка...
gegMOPO4 17.02.2011 18:37 # 0
pushkoff 17.02.2011 20:36 # +1
gegMOPO4 17.02.2011 20:56 # 0
pushkoff 17.02.2011 21:20 # +2
gegMOPO4 17.02.2011 21:33 # 0
Интересно, и как STL, а тем более Boost, где такое применяется в шерсть и в гриву, чувствуют себя на таких компиляторах?
guest 17.02.2011 21:41 # +1
gegMOPO4 17.02.2011 22:11 # −2
Но немалая часть enum употреблена по делу, для перечислений, или в комментариях.
guest 17.02.2011 22:22 # +1
То есть в большинстве случаев может быть: ,а не:
gegMOPO4 17.02.2011 22:35 # 0
guest 18.02.2011 00:28 # −2
gegMOPO4 18.02.2011 00:33 # +1
Да что я тут грепом машу -- см. 9.4.2.
guest 18.02.2011 00:39 # −1
Жалко MS VS дома не стоит...
guest 18.02.2011 00:41 # −1
gegMOPO4 18.02.2011 14:58 # 0
pushkoff 17.02.2011 21:46 # 0
pushkoff 17.02.2011 18:08 # 0
gegMOPO4 17.02.2011 18:48 # 0
eth0 17.02.2011 20:16 # 0
Lure Of Chaos 17.02.2011 20:28 # +1
pushkoff 17.02.2011 20:35 # 0
Lure Of Chaos 17.02.2011 20:42 # 0
pushkoff 17.02.2011 21:16 # 0
Altravert 18.02.2011 08:00 # −3
pushkoff 18.02.2011 12:34 # 0
Altravert 18.02.2011 13:59 # 0
pushkoff 18.02.2011 14:18 # +1
паскалисты верят что именно уголочки делают С++ настолько крутым...
Анонимус 17.02.2011 21:57 # −5
pushkoff 17.02.2011 23:16 # +1
Анонимус 17.02.2011 23:19 # −2
там действительно допустимо превратить код в кусок говна ради скорости
bugmenot 17.02.2011 23:29 # +3
Анонимус 17.02.2011 23:32 # 0
bugmenot 18.02.2011 00:46 # 0
Анонимус 18.02.2011 00:48 # +1
там надо к кристмасу выпустить
pushkoff 18.02.2011 00:52 # 0
bugmenot 18.02.2011 00:52 # 0
pushkoff 18.02.2011 00:51 # 0
только говнокодят обычно в ноч перед дедлайном, а потом живут по принципу "работает - не трогай"...
обидно, что можно жить по другому, но в это мало кто верит...
pushkoff 18.02.2011 00:16 # 0
bugmenot 18.02.2011 00:44 # 0
тоже явно не в коде дело :-D
guest 18.02.2011 00:48 # 0
bugmenot 18.02.2011 00:51 # 0
pushkoff 18.02.2011 00:55 # +2
время программистов дороже времени геймдизайнеров и артистов, поэтому все стараются выносить из кода в данные...
отсюда любовь ко всяким луа, хмл, и тп...
Анонимус 18.02.2011 01:00 # +1
в хорошем энтерпрайзе тоже есть DSL
gegMOPO4 18.02.2011 00:34 # 0
Altravert 18.02.2011 10:47 # 0
gegMOPO4 17.02.2011 21:06 # 0
Lure Of Chaos 17.02.2011 21:30 # +1
gegMOPO4 17.02.2011 21:36 # +2
Lure Of Chaos 17.02.2011 21:49 # +1
gegMOPO4 17.02.2011 22:06 # +4
Try 18.02.2011 08:54 # 0
Lure Of Chaos 18.02.2011 20:54 # 0
Govnoeb 20.02.2011 16:36 # 0
нужна специализация только для нуля. потом last и надо выкинуть из шаблона first. вместо него ввести степень 10.
gegMOPO4 20.02.2011 18:22 # 0
Ну и использовать enum вместо static const int не нужно.
Kotik 24.02.2011 23:36 # +1
niXman 01.03.2011 02:07 # 0