русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Циклы - WHILE и FOR


Дата добавления: 2015-01-16; просмотров: 505; Нарушение авторских прав


Мы уже сталкивались с операторами цикла WHILE и FOR. Вконструкции WHILE (выражение) оператор вычисляется выражение. Если его значение отлично от нуля, товыполняется оператор и выражение вычисляется снова. Этотцикл продолжается до тех пор, пока значение выражения нестанет нулем, после чего выполнение программы продолжается сместа после оператора. Оператор FOR (выражение 1; выражение 2; выражение 3) оператор эквивалентен последовательности выражение 1;WHILE (выражение 2) { оператор выражение 3;} Грамматически все три компонента в FOR являются выражениями.наиболее распространенным является случай, когда выражение 1и выражение 3 являются присваиваниями или обращениями к фун-кциям, а выражение 2 - условным выражением. любая из трехчастей может быть опущена, хотя точки с запятой при этомдолжны оставаться. Если отсутствует выражение 1 или выраже-ние 3, то оно просто выпадает из расширения. Если же отсутс-твует проверка, выражение 2, то считается, как будто оновсегда истинно, так что FOR (;;) { ... } является бесконечным циклом, о котором предполагается, чтоон будет прерван другими средствами (такими как BREAK илиRETURN). Использовать ли WHILE или FOR - это, в основном деловкуса. Например в WHILE ((C = GETCHAR()) == ' ' \!\! C == '\N' \!\! C == '\T') ; /* SKIP WHITE SPACE CHARACTERS */ нет ни инициализации, ни реинициализации, так что цикл WHILевыглядит самым естественным. Цикл FOR, очевидно, предпочтительнее там, где имеетсяпростая инициализация и реинициализация, поскольку при этомуправляющие циклом операторы наглядным образом оказываютсявместе в начале цикла. Это наиболее очевидно в конструкции FOR (I = 0; I < N; I++) которая является идиомой языка "C" для обработки первых Nэлементов массива, аналогичной оператору цикла DO в фортранеи PL/1. Аналогия, однако, не полная, так как границы цикламогут быть изменены внутри цикла, а управляющая переменнаясохраняет свое значение после выхода из цикла, какова бы нибыла причина этого выхода. Поскольку компонентами FOR могутбыть произвольные выражения, они не ограничиваются толькоарифметическими прогрессиями. Тем не менее является плохимстилем включать в FOR вычисления, которые не относятся к уп-равлению циклом, лучше поместить их в управляемые цикломоператоры. В качестве большего по размеру примера приведем другойвариант функции ATOI, преобразующей строку в ее численныйэквивалент. Этот вариант является более общим; он допускаетприсутствие в начале символов пустых промежутков и знака +или -. (В главе 4 приведена функция ATOF, которая выполняетто же самое преобразование для чисел с плавающей точкой). Общая схема программы отражает форму поступающих данных: - пропустить пустой промежуток, если он имеется - извлечь знак, если он имеется - извлечь целую часть и преобразовать ее Каждый шаг выполняет свою часть работы и оставляет все вподготовленном состоянии для следующей части. Весь процессзаканчивается на первом символе, который не может бытьчастью числа. ATOI(S) /* CONVERT S TO INTEGER */CHAR S[];{INT I, N, SIGN;FOR(I=0;S[I]==' ' \!\! S[I]=='\N' \!\! S[I]=='\T';I++) ; /* SKIP WHITE SPACE */SIGN = 1;IF(S[I] == '+' \!\! S[I] == '-') /* SIGN */ SIGN = (S[I++]=='+') ? 1 : - 1;FOR( N = 0; S[I] >= '0' && S[I] <= '9'; I++) N = 10 * N + S[I] - '0';RETURN(SIGN * N);} Преимущества централизации управления циклом становятсяеще более очевидными, когда имеется несколько вложенных цик-лов. Следующая функция сортирует массив целых чисел по мето-ду шелла. основная идея сортировки по шеллу заключается втом, что сначала сравниваются удаленные элементы, а не смеж-ные, как в обычном методе сортировки. Это приводит к быстро-му устранению большой части неупорядоченности и сокращаетпоследующую работу. Интервал между элементами постепенносокращается до единицы, когда сортировка фактически превра-щается в метод перестановки соседних элементов.SHELL(V, N) /* SORT V[0]...V[N-1] INTO INCREASING ORDER */INT V[], N;{ INT GAP, I, J, TEMP; FOR (GAP = N/2; GAP > 0; GAP /= 2) FOR (I = GAP; I < N; I++) FOR (J=I-GAP; J>=0 && V[J]>V[J+GAP]; J-=GAP) { TEMP = V[J]; V[J] = V[J+GAP]; V[J+GAP] = TEMP; }} Здесь имеются три вложенных цикла. Самый внешний цикл управ-ляет интервалом между сравниваемыми элементами, уменьшая егоот N/2 вдвое при каждом проходе, пока он не станет равнымнулю. Средний цикл сравнивает каждую пару элементов, разде-ленных на величину интервала; самый внутренний цикл перес-тавляет любую неупорядоченную пару. Так как интервал в концеконцов сводится к единице, все элементы в результате упоря-дочиваются правильно. Отметим, что в силу общности конструк-ции FOR внешний цикл укладывается в ту же самую форму, что иостальные, хотя он и не является арифметической прогрессией. Последней операцией языка "C" является запятая ",", ко-торая чаще всего используется в операторе FOR. Два выраже-ния, разделенные запятой, вычисляются слева направо, причемтипом и значением результата являются тип и значение правогооперанда. Таким образом, в различные части оператора FORможно включить несколько выражений, например, для параллель-ного изменения двух индексов. Это иллюстрируется функциейREVERSE(S), которая располагает строку S в обратном порядкена том же месте. REVERSE(S) /* REVERSE STRING S IN PLACE */ CHAR S[]; { INT C, I, J; FOR(I = 0, J = STRLEN(S) - 1; I < J; I++, J--) { C = S[I]; S[I] = S[J]; S[J] = C; } } Запятые, которые разделяют аргументы функций, переменные вописаниях и т.д., не имеют отношения к операции запятая и необеспечивают вычислений слева направо. Упражнение 3-2 --------------- Составьте программу для функции EXPAND(S1,S2), котораярасширяет сокращенные обозначения вида а-Z из строки S1 вэквивалентный полный список авс...XYZ в S2. Допускаются сок-ращения для строчных и прописных букв и цифр. Будьте готовыиметь дело со случаями типа а-в-с, а-Z0-9 и -а-Z. (Полезноесоглашение состоит в том, что символ -, стоящий в начале иликонце, воспринимается буквально).


<== предыдущая лекция | следующая лекция ==>
Переключатель | Цикл DO - WHILE


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.664 сек.