Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Флажки для управления циклами 
V
    Опции темы
inside_pointer
Дата 24.3.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Вот пара кодов, интересуют флаги управления циклами
Код

#include <stdio.h>

#define IN  1    /* внутри слова */
#define OUT 0    /* снаружи слова */

/* подсчёт строк, слов и символов во входном потоке */
main()
{
    int c, nl, nw, nc, state;
    
    state = OUT;
    nl = nw = nc = 0;
    while ((c = getchar()) != EOF) {
        ++nc;
        if (c == '\n')
            ++nl;
        if (c == ' ' || c == '\n' || c == '\t')
            state = OUT;
        else if (state == OUT) {
            state = IN;
            ++nw;
        }
    }
    printf("%d %d %d\n", nl, nw, nc);
} 

//


Код

/*   сортировка   пузырьковым   методом           */
float * bubble(float * a, int m, int n)
         {
          char is = 1;
          int i;
          float c;
          
          while(is)
           {
            is = 0;
            for (i = m + 1; i <= n; i++)
             if ( a[i] < a[i-1] ) { c = a[i]; a[i] = a[i-1]; a[i-1] = c; is = 1; }
           }
          
          return(a);
         }


Короче суть: цикл контролируется флагом, или оператор условия контролируется, или ещё там что-нибудь, я всё никак не могу понять, как заранее придумать вот это, у меня получается написать правильно цикл только когда я начинаю его писать и по ходу дела там догоняю куда ставить флаг, чтобы всё работало как надо, но в результате вот из-за того что я заранее не могу этот вариант продумать у меня этот флаг то в начале оказывается то посередине, а я хочу ближе к концу его выносить или так его ставить как в этих примерах.
Если кто юзает такие флаги, где вы про них узнали ?
Чтоб типа научиться их заранее понимать а потом уже писать, а не наоборот.
PM MAIL   Вверх
JackYF
Дата 24.3.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



inside_pointer, пользуйся "С++:код". Вопрос не понял...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
mes
Дата 24.3.2008, 14:32 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



не надо понимать флаги, надо понимать суть алгоритма и записывать его так чтоб было удобно.


--------------------
PM MAIL WWW   Вверх
inside_pointer
Дата 25.3.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата(JackYF)

Вопрос не понял... 


Код

else if (state == OUT) {
            state = IN;

char is = 1;
while(is)
           {
            is = 0;


Вот эти места

Цитата(mes)

не надо понимать флаги, надо понимать суть алгоритма и записывать его так чтоб было удобно. 

Так понимать суть алгоритма можно по-разному, как это поможет расставить флаги в нужных местах(мне или вначале или в конце или в середине, но так чтобы было понятно для чего он там).
А то просто ставить флаг от которого "что-то" зависит - это не то.

Подсветку ставить не буду.
PM MAIL   Вверх
mes
Дата 25.3.2008, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



ты зациклился на флагах.. они совсем не главные.. пиши так чтоб было легко понять и тебе и другим и можно совсем без флагов ))


--------------------
PM MAIL WWW   Вверх
inside_pointer
Дата 25.3.2008, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Да мне нужен этот навык, где-то ж такое объясняют, а если объясняют откуда-то читают.

А из-за этих флажков программа компактнее и понятнее(только если они правильно стоят, когда видно для чего они и как они управляют условием цикла или ветвления)

Если такой навык помогает сделать программу чётче и понятнее, я буду продолжать его искать.
PM MAIL   Вверх
korian
Дата 25.3.2008, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(inside_pointer @  25.3.2008,  00:27 Найти цитируемый пост)
А из-за этих флажков программа компактнее и понятнее

по моему, программа понятнее, когда флагов нету вообще. и, имху, лучше от флагов избавляться, если есть возможность.
использование флагов диктуется алгоритмом и, соответственно, расположение их зависит от алгоритма.
использование флагов, позволяет избавиться от повторяющегося кода.

первый вариант можно записать так:
Код

    c = getchar();
    while (c != EOF)
    {
         while (c == ' ' || c == '\t')
         {
             ++nc;
             c = getchar();
         }

         if (c == '\n')
         {
             ++nc;
             ++nl;
             c = getchar();
             continue;
         }

         if (c == EOF)
             break;

         ++nw;
         ++nc;
         c = getchar();
         while (c != ' ' && c != '\t' && c != '\n' && c != EOF)
         {
             ++nc;
             c = getchar();
         }
    }


здесь каждое состояние оригинального цикла рассматривается своим под-циклом.
+ такой код читать проще (особенно если каждое состоянию выделить в отдельную функцию)
+ такой код работает быстрее (т.к. на каждое состояние свое количество проверок)
- увеличен размер код

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

в обычных ситуациях (в 99.9% случаев) нету необходимости ни в одном, ни в другом.
необходимось определяется в момент тестирования, т.к. зарание не известно, что именно этот кусок кода самый большой или самый медленный. поэтому использовать надо вариант, который первым был написан и работает, и не заморачиваться по этому поводу.
самый дорогой ресурс - время, потраченное на разработку. если алгоритм работает, то мы его используем до тех пор, пока не выяснится необходимость в его доработки.

перевод из оригинала в этот вариант, осуществляется расписыванием каждого состояния.
перевод из этого варианта в оригинал, осуществляется выявлением состояний (под-циклов) и привод к одному циклу. - в наше время смысла, имху, вообще не имеет, т.к. время выполнения дороже размеру кода.

можно расписать так:
Код

template<class function>
inline int SkipChars(int& c, function)
{
    int cnt = 0;
    while(function(c))
    {
       ++cnt;
       c = getchar();
    }
    return cnt;
}

inline bool IsSpaceOrTab(int c)
{
    return (c == ' ') || (c == '\t');
}

inline bool IsNewLine(int c)
{
    return c == '\n';
}

inline bool IsSymbol(int c)
{
    return (c != '\n') && (c != '\t') && (c != ' ') && (c != EOF);
}

int main()
{
    int c, nc, nl, nw;
    c = getchar();
    while (c != EOF)
    {
        nc += SkipChars(c, IsSpaceOrTab);
        int ret = SkipChars(c, IsNewLine);
        if (ret > 0)
        {
            nc += ret;
            nl += ret;
            continue;
        }

        if (c == EOF) break;
        ++nw;
        nc += SkipChars(c, IsSymbol);
    }

    return 0;
}

такой вариант читать, имху, еще проще.
он дает возможность повторного использования кода в других местах программы (выделенные функции).

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


Это сообщение отредактировал(а) korian - 25.3.2008, 08:27
PM   Вверх
comcon1
Дата 25.3.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



обожемой. Я в этих флагах всегда путаюсь. Потому мне чаще всего удобнее поставить 
Код

while (1) {
// ...
if ( ... )  break;
// ... 
}



--------------------
PM MAIL   Вверх
inside_pointer
Дата 25.3.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата(korian)

по моему, программа понятнее, когда флагов нету вообще.

Тут флаги помогают контролировать циклы и они универсальны для любого языка.
+ флаг гибче break или continue, потому что может принимать разные значения

Это вроде такого goto реализованного внутри ветви алгоритма, только флаг по-другому зависит от кода, поэтому таких накладок как с goto не будет.

Ну типа границы для программы, чтобы она не могла пройти куда-нибудь, только память не жрёт.

Цитата(korian)

+ такой код работает быстрее (т.к. на каждое состояние свое количество проверок)

Типа распределённый вариант, у меня я не знаю почему когда всё в одном работает гораздо быстрее, когда разношу работает медленнее, имею ввиду другие коды, которые больше и которые тоже можно разносить а можно сносить.

Вижу минус такого кода в том, что если что-то надо будет поменять, надо будет лазить по всему коду, чтобы ничо случайно не осталось. Код побольше и писец ресурсу - времени.

Цитата(korian)

мое имху - из 3-х вариантов, самый лучший последний, т.к. есть возможность повторно использовать код.

Но он сделан для цпп, а надо универсальный.

Всё равно спасибо за идеи разные подходы к одной и той же реализации это интересно, флаги то тоже разные бывают, бывают такие в которых через месяц ничо неясно, бывают жёстко вшитые в код, что если менять то всё, а бывают вот такие как в пузырьковой сортировке, мало памяти (char) что делает ясно на раз два и главное не мешается, если всегда такой флаг юзать, во всех программах, он просто станет необходим в итоге.

Некоторые goto внутри функций юзают, я как-то не очень к этому.

Цитата(comcon1)

Потому мне чаще всего удобнее поставить 

Флаг работает и в while и в for и в if и в switch одинаково, а эта штука везде по-разному да и не везде есть, не только касаемо операторов, а ещё и языков программирования  smile 
PM MAIL   Вверх
korian
Дата 25.3.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 3
Всего: 17



Цитата(inside_pointer @  25.3.2008,  11:13 Найти цитируемый пост)
Но он сделан для цпп, а надо универсальный.

он вообщем-то и есть универсальный, а точнее легко дорабатываемый.
понадобилась возможность чтения не только из cin, переписываем одну функцию и все.

Код

//псевдо-код
template<class function>
inline int SkipChars(int& c, function, somestream st = cin) 
{
    int cnt = 0;
    while(function(c))
    {
       ++cnt;
       c = getchar(st);
    }
    return cnt;
}

в уже написанном коде ничего менять не нужно.


Цитата(inside_pointer @  25.3.2008,  11:13 Найти цитируемый пост)
Типа распределённый вариант, у меня я не знаю почему когда всё в одном работает гораздо быстрее, когда разношу работает медленнее

ну вообще странно... а медленее и в релизе тоже? а inline используете?

Цитата(inside_pointer @  25.3.2008,  11:13 Найти цитируемый пост)
Вижу минус такого кода в том, что если что-то надо будет поменять, надо будет лазить по всему коду, чтобы ничо случайно не осталось. Код побольше и писец ресурсу - времени.

кода то больше, но сложность восприятия меньше, и не известно что будет быстрее.

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

PM   Вверх
xvr
Дата 25.3.2008, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(inside_pointer @ 24.3.2008,  14:12)
Вот пара кодов, интересуют флаги управления циклами
Код

#include <stdio.h>

#define IN  1    /* внутри слова */
#define OUT 0    /* снаружи слова */

/* подсчёт строк, слов и символов во входном потоке */
main()
{
    int c, nl, nw, nc, state;
    
    state = OUT;
    nl = nw = nc = 0;
    while ((c = getchar()) != EOF) {
        ++nc;
        if (c == '\n')
            ++nl;
        if (c == ' ' || c == '\n' || c == '\t')
            state = OUT;
        else if (state == OUT) {
            state = IN;
            ++nw;
        }
    }
    printf("%d %d %d\n", nl, nw, nc);
} 

//


Короче суть: цикл контролируется флагом, или оператор условия контролируется, или ещё там что-нибудь, я всё никак не могу понять, как заранее придумать вот это,

'Вот это' называется конечный автомат (он же state machine). Флаг (который state) на самом деле хранит состояние автомата. По теории и реализации таких автоматов есть куча литературы - ищи и читай  smile 
Цитата

 у меня получается написать правильно цикл только когда я начинаю его писать и по ходу дела там догоняю куда ставить флаг, чтобы всё работало как надо, но в результате вот из-за того что я заранее не могу этот вариант продумать у меня этот флаг то в начале оказывается то посередине, а я хочу ближе к концу его выносить или так его ставить как в этих примерах.

Машинисцизм - болезнь, когда пациент прибывает в непоколебимой уверенности, что задача, которую он не может не только решить, но даже и внятно сформулировать, будет немедленно решена, как только он сядет за компьютер.  smile 
Цитата

Если кто юзает такие флаги, где вы про них узнали ?
Читайте книги - они rulezz  smile 
Цитата

Чтоб типа научиться их заранее понимать а потом уже писать, а не наоборот.
О! Никогда не пробовал писать программы не думая, надо попробовать - вдруг получится  smile 
Алгоритм обычно придумывают ДО того, как начинают писать.
PM MAIL   Вверх
Alek86
Дата 25.3.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



оффтоп

Цитата(xvr @  25.3.2008,  13:07 Найти цитируемый пост)
Алгоритм обычно придумывают ДО того, как начинают писать.

хехе, xvr, ты живешь в идеальном мире smile

Это сообщение отредактировал(а) Alek86 - 25.3.2008, 13:24


--------------------
user posted image    user posted image
PM MAIL   Вверх
xvr
Дата 25.3.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Alek86 @ 25.3.2008,  13:23)
оффтоп

Цитата(xvr @  25.3.2008,  13:07 Найти цитируемый пост)
Алгоритм обычно придумывают ДО того, как начинают писать.

хехе, xvr, ты живешь в идеальном мире smile

 smile 
Да нет, во вполне реальном мире. И я обычно представляю, что собираюсь писать ДО того, как начинаю собственно писать. Конечно не во всех подробностях, но в общем и целом представляю. И если в процессе написания у меня возникают вопросы 'куда и какой флаг поставить', то я беру бумагу и ручку и разбираюсь с этим на бумаге, и только потом возвращаюсь к компьютеру.
И могу сказать, что за все время, что я програмирую (~20 лет) меня этот подход еще ни разу не подводил.  smile 

PM MAIL   Вверх
inside_pointer
Дата 25.3.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата(xvr)

По теории и реализации таких автоматов есть куча литературы - ищи и читай

Ок

Цитата(korian)

ну вообще странно... а медленее и в релизе тоже? а inline используете?

До inline ещё не дошёл
Короче морской бой консольный рисует символы и кнопки сканирует быстрее когда всё в одном, когда вытаскиваю раскладываю получается медленнее.

Цитата(xvr)

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

Ну обычно так и бывает, когда надо что-то сформулировать и не получается, надо сесть за комп и в блокноте потихоньку догнать.
Для этого иногда надо код переписывать переписывать пока он не примет форму скелета хотя бы какого-то.

Добавлено через 3 минуты и 4 секунды
Цитата(xvr)

И если в процессе написания у меня возникают вопросы 'куда и какой флаг поставить', то я беру бумагу и ручку и разбираюсь с этим на бумаге

Я в блокноте разбираюсь.
PM MAIL   Вверх
inside_pointer
Дата 26.3.2008, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



inline в C нету

Это сообщение отредактировал(а) inside_pointer - 26.3.2008, 02:08
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0816 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.