246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 29
Текст из файла (страница 29)
Нельзябыло назвать приятным и сам процесс их разработки. В таких программах циклы состояли изметки,последовательностикомандиоператорабезусловногоперехода.В C++ меткой называют идентификатор, за которым следует двоеточие (:). Метка всегдаустанавливается перед оператором, на который необходимо будет передать управление. Дляпереходананужнуюметкуиспользуетсяоператорgoto,закоторымследуетимяметки.Примериспользованияоператораgotoприведенвлистинге7.1.Листинг7.1.Организацияцикласпомощьюоператораgoto1://Листинг7.1.2://Организацияцикласпомощьюgoto3:4:#include<iostream.h>5:6:intmain()7:{8:intcounter=0;//инициализациясчетчика9:loop:counter++;//началоцикла10:cout.<<"counter:"<<counter<<"\n";11:if(counter<5)//проверказначения12:gotoloop;//возвращениекначалу13:14:cout<<"Complete.Counter:"<<counter<<".\n";15:return0;16:}Результат:counter:1counter:2countor:3counter:4counter:5Complete.Counter:5.Анализ:Встроке8переменнаяcounterинициализируетсянулевымзначением.Меткаloop:в строке 9 показывает начало цикла.
На каждой итерации значение counter yвeличивaeтcя наединицуивыводитсянаэкран.Встроке11выполняетсяпроверказначенияпеременнойcounter.Еслиономеньшепяти,значитусловиевыполняетсяиуправлениепередаетсяоператоруgoto,врезультате чего осуществляется переход на строку 9. Итеративный процесс выполняется до техпор, пока значение переменной counter не достигнет пяти. После этого программа выходит запределыциклаинаэкранвыводитсяокончательныйрезультат.ПочемуследуетизбегатьоператораgotoСовременемнелестныевысказываниявадресоператораgotoучастились,впрочем,вполнезаслуженно.Спомощьюоператораgotoможноосуществлятьпереходвлюбуюточкупрограммы—впередилиназад.Такоебеспорядочноеиспользованиеэтогооператорапривелокпоявлениюзапутанных и абсолютно непригодных для восприятия программ, получивших жаргонноеназвание"спагетти".Поэтомупоследниедвадцатьлетпреподавателипрограммированиявовсеммиретвердилистудентамоднуитужефразу:"Никогданеиспользуйтеоператорgoto".Насменуоператоруgotoпришликонструкцииснесколькоболеесложнойструктурой,ноис более широкими возможностями: for, while и do...while.
Несмотря на то что после полногоискоренения оператора goto структура программ значительно прояснилась, негативныевысказывания в его адрес следует признать преувеличенными. Как любой инструментпрограммирования, при правильном использовании оператор goto может оказаться достаточнополезным.ВсилуэтогокомитетANS1принялрешениеоставитьэтотоператорвязыке.Правда,вместе с этим родилась шутка: "Дети! Использование этого оператора в домашних условияхнебезопасно!"ОрганизацияцикловспомощьюоператораwhileВ циклах, организованных с помощью оператора while, выполнение последовательностиопераций продолжается до тех пор, пока условие продолжения цикла истинно. В примерепрограммывлистинге7.1значениепеременнойcounterувеличивалосьдотехпор,поканесталоравнымпяти.Листинг7.2демонстрируеттотжеалгоритм,реализованныйспомощьюоператораwhile.Листинг7.2.Организацияцикласпомощьюоператораwhile1://Листинг7.2.2://Организацияцикласпомощьюоператораwhile3:4:#include<iostream.h>5:6:intmain()7:{8:intcounter=0;//присвоениеначальногозначения9:10:while(counter<5)//проверкаусловияпродолженияцикла11:{12:counter++;//телоцикла13:cout<<"counter:"<<counter<<"\;n";14:}15:16:cout<<"Complete.Counter:"<<counter<<".\n";17:return0;18:}Результат:counter:1counter:2counter:3counter:4counter:5Complete.Counter:5.Анализ: Эта несложная программа показывает пример организации цикла с помощьюоператора while.
В начале каждой итерации проверяется условие, и, если оно выполняется,управление передается на первый оператор цикла. В нашем примере условию продолженияциклаудовлетворяютвсезначенияпеременнойcounter,меньшиепяти(строка10).Еслиусловиевыполняется, запускается следующая итерация цикла. В строке 12 значение счетчикаувеличивается на единицу, а в строке 13 выводится на экран.
Как только значение счетчикадостигаетпяти,телоцикла(строки11—14)пропускаетсяиуправлениепередаетсявстроку15.СложныеконструкциисоператоромwhileСложность логического выражения, являющегося условием в операторе while, неограничена. Это позволяет использовать в конструкции while любые логические выраженияC++. При построении выражений допускается использование логических операций: &&(логическоеИ),11(логическоеИЛИ),атакже!(логическоеотрицание).Влистинге7.3показанпримериспользованияболеесложныхусловийвконструкцияхсоператоромwhile.Листинг7.3.Сложныеусловиявконструкцияхwhile1://Листинг7.3.2://Сложныеусловиявконструкцияхwhile3:4:include<iostream.h>5:6:intmain()7:{8:unsignedshortsmall;9:unsignedlonglarge;10:constunsignedshortMAXSMALL=65535;11:12:cout<<"Enterasmallnumber:";13:cin>>small;14:cout<<"Enteralargenumber:";15:cin>>large;16:17:cout<<"small:"<<small<<"...";18:19://накаждойитерациипроверяютсятриусловия20:while(small<large&&large>0&&small<MAXSMALL)21:{22:if(small%5000==0)//послекаждых5000строквыводитсяточка23:cout<<".";24:25:small++;26:27:large-=2;28:}39:30:cout<<"\nSmall:"<<small<<"Large:"<<large<<endl;31:return0;32:}Результат:Enterаsmallnumber:2Enterаlargenumber:100000small:2Small:33335Large:33334Анализ: Программа представляет собой простую логическую игру.
Вначале предлагаетсяввести два числа — small и large. После этого меньшее значение увеличивается на единицу, абольшееуменьшаетсянадвадотехпор,покаонине"встретятся".Цельигры:угадатьчисло,накоторомзначения"встретятся".В строках 12—15 осуществляется ввод значений. В строке 20 проверяется три условияпродолженияцикла.1.Значениепеременнойsmallнепревышаетзначенияlarge.2.Значениепеременнойlargeнеотрицательноеинеравнонулю.3.ЗначениепеременнойsmallнепревышаетзначенияконстантыMAXSMALL.Далее,встроке23,вычисляетсяостатокотделениячислаsmallна5000,причемзначениепеременной small не изменяется. Если small делится на 5000 без остатка, результатомвыполнения этой операции будет 0. В этом случае для визуального представления процессавычислений на экран выводится точка. Затем в строке 26 значение переменной smallувеличиваетсяна1,австроке28значениеlargeуменьшаетсяна2.Цикл завершается, если хотя бы одно из условий перестает выполняться. После этогоуправлениепередаетсявстроку29,следующуюзателомцикла.ОператорыbreakиcontinueЧасто бывает необходимо перейти на следующую итерацию цикла еще до завершениявыполнениявсехоператоровтелацикла.Дляэтогоиспользуетсяоператорcontinue.Кроме того, в ряде случаев требуется выйти за пределы цикла, даже если условияпродолженияциклавыполняются.Вэтомслучаеиспользуетсяоператорbreak.Пример использования этих операторов приведен в листинге 7.4.
Это несколькоусложненныйвариантужезнакомойигры.Вэтомслучае,кромеменьшегоибольшегозначений,предлагаетсяввестишагицелевоезначение.Какивпредыдущемпримере,накаждойитерациициклазначениепеременнойsmallувеличиваетсянаединицу.Значениеlargeуменьшаетсянадва,если меньшее число не кратно значению переменной шага (skip). Игра заканчивается, когдазначение переменой small становится больше, чем значение large. Если значение переменнойlargeсовпадаетсцелевымзначением(target),выводитсясообщениеииграпрерывается.Цельигрысостоитвтом,чтобыугадатьчисло,вкоторое"попадет"значениеtarget.Листинг7.4.Использованиеbreakиcontinue1://Листинг7.4.2://Примериспользованияоператоровbreakиcontinue3:4:#include<iostream.h>5:6:intmain()7:{8:unsignedshortsmall;9:unsignedlonglarge;10:unsignedlongskip;11:unsignedlongtarget;12:constunsignedshortMAXSMALL=65535;13:14:cout<<"Enterasmailnumber:";15:cin>>small;16:cout<<"Enteralargenumber:";17:cin>>large;18:cout<<"Enteraskipnumber:";19:cin>>skip;20:cout<<"Enteratargetnumber;";21:cin>>target;22:23:cout<<"\n"24:25://установкаусловийпродолженияцикла26:while(small<large&&large>0&&small<MAXSMALL)27:28:{29:30:small++;31:32:if(small%skip==0)//уменьшитьзначениеlarge?33:{34:cout<<"skippingon:"<<small<<endl;35:continue;36:}37:38:if(large==target)//проверкапопаданиявцель39:{40:cout<<"Targetreached!";41:break;42:}43:44:large-=2;45:}//конеццикла46:47:cout<<"\nSmall:"<<small<<"Large:"<<large<<endl;48:return0;49:}Результат:Enterasmallnumber:2Enteralargenumber:20Enteraskipnumber:4Enteratargetnumber:6skippingon4skippingon8Small:10Large:8Анализ: Как видим, игра закончилась поражением пользователя, поскольку меньшеезначениепревысилобольшее,ацельтакинебыладостигнута.В строке проверяются условия продолжения цикла.
Если значение переменной smallменьшезначенияlarge,атакжееслиlargeбольшенуляиsmallнепревышаетзначениеконстантыSMALLINT,управлениепередаетсяпервомуоператорутелацикла.В строке 32 вычисляется остаток от деления значения переменной small на значение skip.Еслизначениеsmallкратноskip,операторcontinueзапускаетследующуюитерациюцикла(срока26). В результате такого перехода пропускается проверка целевого значения и операцияуменьшениязначенияпеременнойlarge.Сравнениезначенийtargetиlargeвыполняетсявстроке38.Еслиэтизначенияравны,игразаканчивается победой пользователя.