246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 30
Текст из файла (страница 30)
В этом случае программа выводит сообщение о победе,работациклапрерываетсяоператоромbreakиуправлениепередаетсявстроку46.Использованиеконструкцииwhile(true)В качестве условия, проверяемого при переходе на очередную итерацию цикла, можетвыступать любое выражение, корректное с точки зрения синтаксиса языка C++. Циклвыполняется до тех пор, пока это выражение истинно. Для организации так называемыхбесконечных циклов в качестве такого выражения применяется логическая константа true.Листинг7.5демонстрируетпримербесконечногоцикла,выполняющегосчетдодесяти.Листинг7.5.Ещеодинпримериспользованияоператораwhile1://Листинг7.5.2://Пример"бесконечного"цикла3:4:#include<iostream.h>5:6:intmain()7:{8:intcounter=0;9:10:while(true)11:{12:counter++;13:if(counter>10)14:break;15:}16:cout<<"Counter:"<<counter<<"\n";17:return0;18:}Результат:Counter:11Анализ:Понятно,чтоусловиепродолженияцикла,заданноевстроке10,будетвыполнятьсявсегда.Втелецикла(строка12)значениепеременнойcounterувеличиваетсянаединицу.Работацикла продолжается до тех пор, показначение counter не превысит 10.
Выполнение циклапрерывается оператором break в строке 14, и на экран выводится значение переменной counter(строка16).Несмотрянаточтоданнаяпрограммаработает,ееструктурунельзяназватьоптимальной.Это типичный пример некорректного использования оператора while. Правильным решениембылабыорганизацияпроверкизначенияcounterвусловиипродолженияцикла.ГибкийсинтаксисязыкаC++позволяетрешитьоднуитужезадачумножествомразличныхспособов. Поэтому важно научиться выбирать средство, наиболее подходящее в конкретнойситуации.Организацияцикловспомощьюконструкцииdo...whileПриорганизациицикловспомощьюоператораwhileвозможнаситуация,когдателоциклавообще не будет выполняться.
Поскольку условие продолжения цикла проверяется в началекаждойитерации,принарушенииистинностивыражения,задающегоэтоусловие,выполнениецикла будет прервано еще до запуска первого оператора тела цикла. Пример такой ситуацииприведенвлистинге7.6.Листинг7.6.Преждевременноезавершениецикласwhile1://Листинг7.6.2://Еслиусловиепродолженияцикланевыполняется,3://телоциклапропускается.4:5:#include<iostream.h>6:7:intmain()8:{9:intcounter;10:cout<<"Howmanyhellos?:";11:cin>>counter;12:while(counter>0)13:{14:cout<<"Hello!\n";15:counter--;16:}17:cout<<"CounterisOutPut:"<<counter;18:return0;19:}Результат:Howmanyhellos?:2Hello!Hello!Counteris0utPut:0Howmanyhellos?:0Counteris0utPut:0Анализ: В строке 10 вам предлагается ввести начальное значение счетчика, котороезаписываетсявпеременнуюcounter.Встроке12этозначениепроверяется,азатемвтелециклауменьшается на единицу.
При первом запуске программы начальное значение счетчикаравнялосьдвум,поэтомутелоциклавыполнялосьдважды.Вовторомслучаебыловведеночисло0. Понятно, что в этом случае условие продолжения цикла не выполнялось и тело цикла былопропущено.Врезультатеприветствиенебыловыведенониразу.Как же поступить, чтобы сообщение выводилось по крайней мере один раз? С помощьюоператораwhileэтосделатьневозможно,таккакусловиепроверяетсяещедовыполнениятелацикла. Один из способов решения этой проблемы — использование оператора if для контроляначальногозначенияпеременнойcounter.If(counter<1)//контрольначальногозначенияcounter=1;Правда,этодовольно<<корявый>>выходизситуации.Использованиеконструкцииdo...whileПри использовании конструкции do...while условие проверяется после выполнения телацикла.Этогарантируетвыполнениеоператоровциклапокрайнеймереодинраз.Влистинге7.7приведен измененный вариант предыдущей программы, в котором вместо оператора whileиспользуетсяконструкцияdo...while.Листинг7.7.Использованиеконструкцииdo...while1://Листинг7.7.2://Примериспользованияконструкцииdo...while3:4:include<iostream.h>5:6:intmain()7:{8:intcounter;9:cout<<"Howmanyhellos?";10:cin>>counter;11:do12:{13:cout<<"Hello\n";14:counter--;15:}while(counter>0);16:cout<<"Counteris:"<<counter<<endl;17:return0;18:}Результат:Howmanyhellos?2HelloHelloCounteris:0Анализ: В строке 9 пользователю предлагается ввести начальное значение счетчика,которое записывается в переменную counter.
В конструкции do.. while условие проверяется вконцекаждойитерации,чтогарантируетвыполнениетелациклапоменьшеймереодинраз.Встроке 13 на экран выводится текст приветствия, а в строке 14 значение переменной counterуменьшается на единицу. Условие продолжения цикла проверяется в строке 15.
Если оноистинно, выполняется следующая итерация цикла ,(строка 13). В противном случае циклзавершаетсяиуправлениепередаетсявстроку16.При использовании в конструкциях do.. .while операторы break и continue дают тот жерезультат, что и при использовании с оператором while. Единственное различие этих двухметодоворганизациицикловсостоитвпроверкеусловияпродолженияцикла.Впервомслучаеоноконтролируетсяпередвыполнениемтелацикла,авовтором—посленего.ОператорforДля организации цикла с помощью оператора while необходимо выполнить триобязательных действия: установить начальные значения переменных цикла, а затем на каждойитерации проконтролировать выполнение условия продолжения цикла и изменить значениепеременнойцикла(листинг7.8).Листинг7.8.Ещеодинпримериспользованияоператораwhile1://Листинг7.8.2://Ещеодинпримериспользованияоператораwhile3:4:#include<iostream.h>5:6:intmain()7:{8:intcounter=0;9:10:while(counter<5)11:{12:counter++;13:cout<<"Looping!";14:}15:16:cout<<"\nCounter:"<<counter<<"\n";17:return0;18:}Результат:Looping!Looping!Looping!Looping!Looping!Counter:5.Анализ:Встроке8переменнаяциклаcounterинициализируетсянулевымзначением.Затемв строке 10 проверяется условие продолжения цикла, а в строке 12 значение счетчикаувеличивается на единицу.
В строке 13 на экран выводится сообщение, наглядноиллюстрирующеециклическийпроцесс.Конечно,вциклевашейпрограммымогутвыполнятьсяиболеесерьезныеоперации.Оператор for позволяет объединить три операции, необходимые для работы цикла, в одну.Кратко эти операции можно охарактеризовать так: инициализация, проверка условия иприращениесчетчикацикла.Выражениесоператоромforсостоитизсамогоэтогооператора,закоторым в круглых скобках следуют три выражения, устанавливающих параметры выполненияцикла.Выражениявкруглыхскобкахразделяютсясимволамиточкисзапятой.Первое выражение цикла for устанавливает начальное значение счетчика цикла. Счетчик,как правило, представляет собой целочисленную переменную, которая объявляется иинициализируется прямо в цикле for, хотя в C++ допускается использование в этом местелюбого выражения, выводящего начальное значение счетчика каким-то косвенным путем.Второйпараметрциклаforопределяетусловиепродолженияцикла,котороетакжеможетбытьпредставленолюбымвыражением.Этоусловиевыполняеттежефункции,чтоивконструкцииwhile.Третийпараметрустанавливаетзначениеприращениясчетчикацикла(поумолчаниюшагприращения равен единице).
В этой части также может использоваться любое корректноевыражениеилиоператорC++.Нужнозаметить,что,хотяпараметрыциклаforмогутзадаватьсялюбымикорректнымивыражениямиC++,дляустановкивторогопараметраобязательнодолжноиспользоваться выражение, возвращающее логическое значение. Пример использования циклаforприведенвлистинге7.9.Листинг7.8.Примериспользованияциклаfor1://Листинг7.9.2://Примериспользованияциклаfor3:4:#include<iostream.h>5:6:intmain()7:{8:intcounter;9:for(counter=0;counter<5;counter++)10:cout<<"Looping!";11:12:cout<<"\nCounter:"<<counter<<".\n";13:return0;14:}Результат:Looping!Looping!Looping!Looping!Looping!Counter:5.Анализ: В строке 9 программы с помощью оператора for задается цикл, отсчитывающийчисло итераций с помощью переменной counter. После каждого цикла проверяется условиепродолжения цикла и значение переменной counter увеличивается на единицу.
Тело цикласостоит из одного оператора, записанного в строке 10. В реальных программах тело цикламожетсостоятьизлюбогоколичестваоператоров.СложныевыражениясоператоромforПри профессиональном использовании цикл for становится мощным и гибкиминструментом программирования. Тот факт, что оператор for допускает установку трехнезависимых параметров цикла (инициализацию, условие продолжения и шаг), открываетнеограниченныевозможностивуправленииработойцикла.ПараметрыциклаforСинтаксисустановокпараметровциклаforследующий:for(инициализация,проверка,операция)выражения;Выражение инициализации используется для установки начального значения счетчикациклаилидлявыполнениякакой-нибудьдругойоперации,подготавливающейработуцикла.ПодпроверкойпонимаютнекоевыражениенаязыкеC++,котороевыполняетсяпередкаждойновойитерацией цикла и возвращает логическое значение.
Если возвращается значение true, топрограмма выполняет строки тела цикла. после чего выполняется третье выражение впараметрахцикла,которое,какправило/приращиваетзначениесчетчиканазаданнуювеличину.Пример1://напечататьHelloдесятьразfor(int1=0;i<10;i++)cout<<"Hello!"<<endl;Пример2:for(int1=0;i<10;i++){cout<<"Hello!"<<endl;cout<<"thevalueofiis:"<<i<<endl;}Циклforработаетвтакойпоследовательности:1.Присваиваетсяначальноезначениесчетчикуцикла.2.Вычисляетсязначениявыражения,устанавливающегоусловиепродолженияцикла.3. Если выражение условия возвращает true, то сначала выполняется тело цикла, а затемзаданнаяоперациянадсчетчикомцикла.Накаждойитерациишаги2и3повторяются.МножественныеинициализациииприращениясчетчиковциклаСинтаксис задания цикла for позволяет инициализировать несколько переменныхсчетчиков, проверять сложные условия продолжения цикла или последовательно выполнятьнесколько операций над счетчиками цикла.
Если присваиваются значения несколькимсчетчикам или выполняется несколько операций, они записываются последовательно иразделяются запятыми. В листинге 7.10 инициализируются два счетчика, значения которыхпослекаждойитерацииувеличиваютсянаединицу.Листинг7.10.Использованиенесколькихсчетчиковвциклеfor1://Листинг7.10.2://Использованиенесколькихсчетчиков3://вциклеfor4:5:#include<iostream.h>6:7:intmain()8:{9:for(inti=0,j=0;i<3;i++,j++)10:cout<<"i:"<<i<<"j:"<<j<<endl;11:return0;12:}Результат:i:0j:0i:1j:1i:2j:2Анализ: В строке 9 переменные i и j инициализируются нулевыми значениями.
Затемпроверяется условие i<3 и, так как оно справедливо, выполняется первая итерация цикла. Накаждойитерацииосуществляетсявыводзначенийсчетчиковнаэкран.Послеэтоговыполняетсятретья часть конструкции for, в которой значения переменных-счетчиков увеличиваются наединицу.Послевыполнениястроки10иизменениязначенийпеременныхусловиепроверяетсяснова. Если условие все еще справедливо, запускается следующая итерация цикла. Этопроисходитдотехпор,покаусловиепродолженияцикланенарушится.Вэтомслучаезначенияпеременныхнеизменяютсяиуправлениепередаетсяследующемупослециклаоператору.НулевыепараметрыциклаforЛюбой параметр цикла for может быть опущен. Пропуск означает использование такназываемого нулевого параметра.