Как остановить программу си

Оператор break применяется внутри тела цикла, заключенного в фигурные скобки. Пример: требуется найти корень целочисленной функции f(x) , определенной для целочисленных аргументов.

int f(int x); // Описание прототипа функции . . . int x; . . . // Ищем корень функции f(x) x = 0; while (true) < if (f(x) == 0) < break; // Нашли корень >// Переходим к следующему целому значению x // в порядке 0, -1, 1, -2, 2, -3, 3, . if (x >= 0) < x = (-x — 1); >else < x = (-x); >> // Утверждение: f(x) == 0

Здесь используется бесконечный цикл » while (true) «. Выход из цикла осуществляется с помощью оператора » break «.

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

continue;

Оператор continue , так же, как и break , используется лишь в том случае, когда тело цикла состоит более чем из одного оператора и заключено в фигурные скобки. Его следует понимать как переход на фигурную скобку, закрывающую тело цикла. Пример: пусть задана n+1 точка на вещественной прямой xi , i = 0, 1. n ; точки xi будут называться узлами интерполяции. Элементарный интерполяционный многочлен Лагранжа Lk(x) — это многочлен степени n , который принимает нулевые значения во всех узлах xi , кроме xk . В k -ом узле xk многочлен Lk(x) принимает значение 1 . Многочлен Lk(x) вычисляется по следующей формуле:

Программирование на Си урок 21: Утверждения break, continue, goto

Пусть требуется вычислить значение элементарного интерполяционного многочлена Lk(x) в заданной точке x = t . Это делается с помощью следующего фрагмента программы:

double x[100]; // Узлы интерполяции (не более 100) int n; // Количество узлов интерполяции int k; // Номер узла double t; // Точка, в которой вычисляется значение double L; // Значение многочлена L_k(x) в точке t int i; . . . L = 1.0; // Начальное значение произведения i = 0; while (i // Вычисляем произведение L *= (t — x[i]) / (x[k] — x[i]); ++i; // К следующему узлу > // Ответ в переменной L

Читайте также:
Программа как подобрать одежду

Здесь оператор continue используется для того, чтобы пропустить вычисление произведения при i = k .

Оператор перехода на метку goto

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

L: . ; . . . goto L;

В качестве метки можно использовать любое имя, допустимое в Си (т.е. последовательность букв, цифр и знаков подчеркивания » _ «, начинающуюся не с цифры). Метка может стоять до или после оператора goto . Метка выделяется символом двоеточия » :». Лучше после него сразу ставить точку с запятой » ; «, помечая таким образом пустой оператор — это общепринятая программистская практика, согласно которой метки ставятся между операторами, а не на операторах.

Управление циклом в Си: break, continue

Не следует увлекаться использованием оператора goto — это всегда запутывает программу. Большинство программистов считают применение оператора goto дурным стилем программирования. Вместо goto при необходимости можно использовать операторы выхода из цикла break и пропуска итерации цикла continue (см. раздел 3.5.7). Единственная ситуация, в которой использование goto оправдано, — это выход из нескольких вложенных друг в друга циклов:

while (. ) < . . . while (. ) < . . . if (. ) < goto LExit; // Выход из двух // вложенных циклов >. . . > > LExit: ;

  • В объектно-ориентированном языке Java, синтаксис которого построен на основе языка Си, использование оператора goto запрещено. Вместо него для выхода из нескольких вложенных друг в друга циклов применяется форма оператора break с меткой. Меткой помечается цикл, из которого надо выйти:
Читайте также:
Рассчитываться телефоном вместо карты какая программа Сбербанк

Loop1: while (. ) < . . . while (. ) < . . . break Loop1; // Выход из цикла, // помеченного меткой Loop1 . . . >. . . >

Источник: intuit.ru

Как правильно прервать поток в Си?

Третьего дня начал изучать Си. Сразу же начал писать на нем.
Программа должна каждые 30 секунд посылать ~20-50 запросов к API ВКонтакте,
при том хотелось бы оставить себе право посылать команды из консоли, в том числе quit .
Реализацию накатил простую — вывел запросы в новый поток, который крутится пока
не изменится флаг. Однако в таком случае я таки использую глобальную переменную.
Сделал все примерно так:

#include #include #include #include static bool quit = false; static void* thread_process() < time_t last_cycle = 0; while(!quit) < if(difftime(time(NULL), last_cycle) >30) < last_cycle = time(NULL); // Тут мои грязные дела >> pthread_exit(NULL); return NULL; > int main() < pthread_t th; pthread_create( char cmd[16]; while(true) < scanf(«%s», cmd); if(!strcmp(cmd, «quit»)) < quit = true; break; >// остальные команды > pthread_join(th, NULL); pthread_exit(NULL); return 0; >

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

  • Вопрос задан более трёх лет назад
  • 425 просмотров

Комментировать
Решения вопроса 1

Общее правило при работе с потоками, не специфичное для С или pthreads: состояние резделяемое между потоками должно быть или атомарным или должно быть защищено примитивом синхронизации.
Код функции thread_process никак не гарантирует, что компилятор не выкинет проверку !quit , потому что quit не меняется в этой функции и в функциях вызываемых из неё.

Учитывая, что атомарность и потоки вошли в стандарт С11 имеет смысл смотреть туда.
Если С11 недоступен, смотреть в pthread_mutex_*, pthread_cond_*, .

Может стоит вынести флаг в параметры потока

По-хорошему — да, стоит. Это, однако, ортогонально к синхронизации доступа.

Читайте также:
Как работает программа сканер

while(!quit) < if(difftime(time(NULL), last_cycle) >30) < last_cycle = time(NULL); // Тут мои грязные дела >>

Вместо busy wait лучше использовать sleep или что-нибудь типа pthread_mutex_timedlock / pthread_cond_timedwait .

Я бы оформил код этого примера так:

#include #include #include #include #include struct thread1 < pthread_mutex_t lock; pthread_cond_t cond; bool quit; >; static void* thread_process(void *p) < struct thread1 *arg = p; for (;;) < bool quit; pthread_mutex_lock(lock); if (!arg->quit) < struct timeval now; struct timespec ts; gettimeofday( ts.tv_sec = now.tv_sec + 30; ts.tv_nsec = now.tv_usec * 1000; pthread_cond_timedwait(cond, lock, > quit = arg->quit; pthread_mutex_unlock(lock); if (quit) return NULL; // Тут мои грязные дела > return NULL; > int main() < pthread_t th; struct thread1 arg = < .lock = PTHREAD_MUTEX_INITIALIZER, .cond = PTHREAD_COND_INITIALIZER, .quit = false, >; pthread_create(arg); char cmd[16]; while(true) < scanf(«%s», cmd); if(!strcmp(cmd, «quit»)) < pthread_mutex_lock( arg.quit = true; pthread_cond_broadcast( pthread_mutex_unlock( break; >// остальные команды > pthread_join(th, NULL); return 0; >

Источник: qna.habr.com

Остановить программу на Си

P.S. Все-таки «вызовите» с маленькой буквы, ибо предложение в моей голове звучало как «Еще раз сканф вызовите в конце и все.». Если это грамматически неверно, то поправьте еще раз.

Отслеживать
ответ дан 17 сен 2011 в 13:25
AlexDenisov AlexDenisov
6,432 1 1 золотой знак 19 19 серебряных знаков 29 29 бронзовых знаков
Или getch(); , или while(!kbhit()); .
17 сен 2011 в 13:26

Все дело в том, что при нажатии [Enter] в поток стандартного ввода кроме набранных Вами символов числа заносится символ перевода строки (‘n’). getchar() считывает его и программа не дожидается следующего [Enter], чего Вы видимо хотите.

kbhit() опрашивает клавиатуру без ожидания («жрет процессор») и возвращает 0, если никакая клавиша не нажата и 1 (не код введенного символа!) если что-нибудь нажали. Код нажатой клавиши помещается в конец потока стандартного ввода.

Надеюсь эта информация окажется Вам полезной при программировании ввода с консоли.

Источник: ru.stackoverflow.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru