Задачка по программированию

Продолжу начатое besislandом и задам несложную, но интересную задачку, которую, в частности, мы с ним решали недавно.


Нужно написать такое выражение, которое при вызове его в цикле в первый раз выведет на экран одно значение, а во все остальные разы - другое.

Использовать это можно, например, когда нам нужно пробежаться по массиву и вывести через запятую все его элементы, удовлетворяющие некоторому условию. Тогда, соответственно, это выражение в первый раз не выведет ничего, а в остальные разы - «,».

Метки: ,

 Интересно? Можно читать RSS

Комментарии: 7

  1. Allex Says:

    Хм, или есть переменная цикла, или это выражение должно пользоваться дополнительной информацией. Или я туплю. :)
    С переменной цикла все просто:
    for( int i = S; i < F; i++ )
    {
    System.out.println( i == S );
    }

    daeq: ну, это будет работать только если вызывать выражение каждый проход цикла, что не всегда выполняется

    C дополнительной переменной:
    int count = 0;
    while( condition() )
    {
    System.out.println( count++ == 0 );
    }

    daeq: это работает, но требуется создание переменной вне выражения. а можно ли без этого?

  2. sash_ko Says:

    В лучших традициях Александреску :) без использования if’ов:

    template <int t> void print()
    {
    std::cout<<t<<std::endl;
    print<t-1>();
    }

    template <> void print()
    {
    std::cout<<”—-”<<std::endl;
    }

    print<5>();

    daeq: это красиво, но не решает поставленную задачу - чтобы выражение при первом вызове выводило не то, что при последующих.

  3. Токарь Алексей Says:

    echo $i = isset( $i ) ? “, ” : “”;

    daeq: подходит :) может кто-нибудь сможет сделать подобное не на интерпритируемом языке?

  4. Astap Says:

    Чуток не понятен смысл. Когда переменная объявляется - можешь ей присвоить значение необходимое для использования впервый раз. В теле цикла - просто присваиваешь ей значение необходимое для всех остальных разов.
    a=”"
    for cikl=1 to 10
    print a

    a=”,”
    next

  5. kud9i Says:

    Да тут однозначно -
    template void print()
    {
    std::cout<<t<<std::endl;
    print();
    }

    template void print()
    {
    std::cout<<”—-”<<std::endl;
    }

    print();

    и без всяких вопросов - это помойму наилуший вариант и довольно легко!

  6. vj_o-oy Says:

    вариант 1: статическая переменная внутри цикла.
    (для примера была выбрана задача вывода всех четных чисел из массива)
    for(int i = 0; i < 10; i++)
    {
    static bool condition = false;
    if((arr[i] / 2) * 2 == arr[i])
    {
    if(condition) printf(”, “);
    condition = true;
    printf(”%d”, arr[i]);
    }
    }
    Как вариант вместо були можно назначить разделитель внутри цикла, но, по крайней мере в Си, это будет работать медленней, т.к. копирование строки дольше, чем копирование одного значения.

    Вариант 2: скидываем выхлоп в строковую переменную, соответственно если строка не пустая - добавляем разделитель. Медленно и жрет много рамы. Там уже из беспринципности можно даже выдавать разделитель после вывода значения и в конце его просто “срезать”

  7. Lesha Lomalkin Says:

    <?
    for ($i=0; $i<$max; $i++){
    @echo $str;
    $str=”,”;
    }

Про11те?

Entries (RSS)