On-line: гостей 1. Всего: 1 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 28.07.12 17:46. Заголовок: Как в С++ напечатать числа от 1 до 100 без использования циклов?


Как в С++ напечатать числа от 0 до 100 без использования циклов?

Этот вопрос я встретил на одном Западном форуме. Казалось бы вопрос не имеет никакой практической пользы, но тем не менее некоторые решения оказались очень остроумными и познавательными!

Естественно, первое, что приходит на ум опытному программисту, это использование рекурсивного вызова функции. Ее можно написать различными способами. Я приведу код, который сам написал, как говорится, на первом порыве. Для простоты можно ограничить последовательность выводимых чисел от 1 до 10.

#include   <iostream> 

void print( size_t n )
{
if ( !n ) return;
print( n - 1 );
std::cout << n << ' ';
}

int main()
{
print( 10 );
}


Как видите, это довольно простой код, и такой или подобный может написать каждый опытный программист, особо не утруждаясь.

Но самое интересное возникает после того, как вы предложите использовать рекурсивный вызов функции: а есть ли другие способы выполнить ту же самую задачу? И, вот, здесь уже лишь единицы могут придумать что-то оригинальное. Два таких решения я и хочу продемонстрировать ниже. Надеюсь, они вам понравятся.

Первое - это использование класса со статическим членом-счетчиком. Этот счетчик и будет выводиться на экран конструктором класса.

#include   <iostream> 

struct S
{
S() { std::cout << ++i << ' '; }
~S() { --i; }
private:
static size_t i;
};

size_t S::i = 0;

int main()
{
S s[10];
}


Вот и весь код! Мы просто объявили массив из 10 элементов структуры S, а конструкторы каждого отдельного элемента массива выполнили всю необходимую работу.

Казалось бы, что еще можно придумать? Но, оказывается, есть и третье не менее оригинальное и остроумное решение с использованием шаблонов. Попробуйте выполнить следующий код:

#include   <iostream> 

template <size_t n = 10>
struct S : public S<n-1>
{
S() { std::cout << n << ' '; }
};

template <>
struct S<0> {};

int main()
{
S s;
}


Не правда ли, блестящая идея? До такого с налету не додумаешься!

Если у кого есть свои идеи, как можно реализовать эту простую задачу оригинальным способом, то выкладывайте свои идеи!

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 2 [только новые]





ссылка на сообщение  Отправлено: 28.07.12 17:47. Заголовок: А вот еще одно ориги..


А вот еще одно оригинальное решение поставленной задачи с помощью стандартного алгоритма.
Хотя все стандартные алгоритмы, имеющие дело с последовательностями, используют в своем теле циклы, тем не менее вызов стандартного алгоритма формально с точки зрения условия задачи является корректным. То есть формально в коде отсутствует явно предложение цикла.
Вот это решение.

#include   <iostream> 
#include <functional>
#include <algorithm>

class value: public std::unary_function<void, size_t>
{
public:
value(): count( 0 ) {}
size_t operator ()() const { return ( ++count ); }
private:
mutable size_t count;
};

int main()
{
std::generate_n( std::ostream_iterator<size_t>( std::cout, " " ), 10, value() );
std::cout << std::endl;
}


Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 17:48. Заголовок: Идею с рекурсивным и..


Идею с рекурсивным инстанцированием шаблона класса можно перенести на шаблонную функцию. Тогда соответствующий код будет выглядеть следующим образом:

#include   <iostream> 

template <size_t n>
void f()
{
f<n-1>();
std::cout << n << ' ';
}

template <>
void f<0>() {}

int main()
{
f<10>();
std::cout << std::endl;
}


Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 29
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет