246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 31
Текст из файла (страница 31)
Нулевой параметр, как и любой другой, отделяется отостальныхпараметровциклаforсимволомточкисзапятой(;).Еслиопуститьпервыйитретийпараметрыциклаfor,какпоказановлистинге7.11,результатегоприменениябудетаналогиченполученномуприиспользованииоператораwhile.Листинг7.11.Нулевыепараметрыциклаfor1://Листинг7.11.2://Нулевыепараметрыциклаfor3:4:#include<iostream.h>5:6:intmain()7:{8:intcounter=0;9:10:for(;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.Анализ: Очевидно, что результат выполнения такого цикла в точности совпадает срезультатом выполнения цикла while из листинга 7.8.
В строке 8 присваивается значениепеременнойcounter.Установкипараметровциклаfor,показанныевстроке10,содержаттолькопроверкуусловияпродолженияцикла.Операциянадпеременнойциклавконструкцииforтакжеопущена.Такимобразом,этотциклможнопредставитьввидеwhile(counter<5).Рассмотренныйпримерещеразпоказывает,чтовозможностиязыкаC++позволяютрешитьодну и ту же задачу множеством способов.
Листинг 7.11 приведен скорее для иллюстрациигибкости возможностей C++, поскольку ни один опытный программист не будет использоватьциклforподобнымобразом.Темнеменееможноопуститьдажевсетрипараметрациклаfor,адля управления циклом использовать операторы break и continue. Пример использованияконструкцииforбезпараметровприведенвлистинге7.12.Листинг7.12.Использованиеоператораforбезпараметров1://Листинг7.12.2://Использованиеоператораforбезпараметров3:4:#include<iostream.h>5:6:intnain()7:{8:intcounter=0;,//установканачальногозначениясчетчика9:intmax;10:cout<<"Howmanyhellos?";11:cin>>max;12:for(;;)//заданиебесконечногоцикла13:{14:if(counter<max)//проверказначения15:{16:cout<<"Hello!\n";17:counter++;//приращениезначениясчетчика18:}19:else20:break;21:}22:return0;23:}Результат:Howmanyhellos?Hello!Hello!Hello!Анализ: В этом примере набор параметров оператора for максимально минимизирован.Опущены все три параметра — инициализация, условие и операция.
Начальное значениесчетчика присваивается в строке 8 еще до начала работы цикла. Условие продолжения циклатакжепроверяетсявотдельнойстроке(строка14),и,еслионоистинно,выполняетсяоперациятела цикла, после чего в строке 17 увеличивается значение счетчика. Если условие невыполняется,операторbreakвстроке20прерываетвыполнениецикла.Несмотря на то что рассмотренная программа выглядит достаточно нелепо, встречаютсяситуации, когда конструкции for(;;) и while(true) оказываются просто необходимыми. Болееполезный пример использования таких конструкций будет приведен далее в этой главе послерассмотренияоператораswitch.ИспользованиепустыхцикловforПоскольку синтаксис оператора for позволяет использовать при его описании цикладостаточно сложные конструкции, необходимость в теле цикла иногда вообще отпадает.
Этоозначает,чтотелоциклабудетсостоятьизпустойстроки,заканчивающейсясимволомточкисзапятой(;).Данныйсимволможноразмещатьводнойстрокесоператоромfor.Примерпустогоциклаприведенвлистинге7.13.Листинг7.13.Использованиеоператораforдляорганизациипустогоцикла1://Листинг7.13.2://Использованиеоператораfor3://дляорганизации"пустого"цикла4:5:#include<iostream.h>6:intmain()7:{8:for(inti=0;i<5;cout<<"i:"<<i++<<endl)9:;10:return0;11:}Результат:i:0i:1i:2i:3i:4Анализ: Оператор for в строке 8 содержит все три параметра.
Инициализация в данномслучае состоит из описания переменной i и присвоения ей значения 0. Затем проверяетсяусловие i<5, и, если оно выполняется, в третьей части оператора for значение переменнойвыводитсянаэкраниувеличиваетсянаединицу.Поскольку все необходимые операции выполняются в самом операторе for, тело цикламожно оставить пустым. Такой вариант нельзя назвать оптимальным, так как запись в однойстроке большого количества операций значительно усложняет восприятие программы.Правильнеебылобызаписатьэтотциклтакимобразом:8:for(inti=0;i<5;i++)9:cout<<"i:"<<i<<endl;Обавариантазаписиравноценны,однаковторойвариантгораздочитабельнееипонятнее.ВложенныециклыЦикл, организованный в теле другого цикла, называют вложенным.
В этом случаевнутренний цикл полностью выполняется на каждой итерации внешнего цикла. Листинг 7.14демонстрируетзаполнениеэлементовматрицыспомощьювложенногоцикла.Листинг7.14.Вложенныециклы1://Листинг7.14.2://Вложенныециклысоператоромfor3:4:#include<iostream.h>5:6:intmain()7:{8:introws,columns;9:chartheChar;10:cout<<"Howmanyrows?";11:cin>>rows;12:cout<<"Howmanycolumns?";13:cin>>columns;14:cout<<"Whatcharacter?";15;cin>>theChar;16:for(inti=0;i<rows;i++)17:{18:for(intj=0;j<columns;j++)19:cout<<theChar;20:cout<<"\n";21:}22;return0;23:}Результат:Howmanyrows?4Howmanycolumns?12Whatcharacter?xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxАнализ: В начале программы пользователю предлагается ввести количество строк истолбцов матрицы, а также символ, которым будет заполняться матрица.
В строке 16 задаетсяначальноезначениепеременнойi,послечегоначинаетсявыполнениетелавнешнегоцикла.В первой строке тела внешнего цикла (строка 18) инициализируется еще один цикл.Переменной j присваивается значение 0 и начинается выполнение тела внутреннего цикла. Встроке19символ,введенныйприначалеработыпрограммы,выводитсянаэкран.Наэтомперваяитерациявнутреннегоциклазаканчивается.Вывододнойстрокиматрицыпродолжаетсядотехпор,покавыполняетсяусловиевнутреннегоцикла(j<columns).Кактолькозначениепеременнойjстановитсяравнымзначениюcolumns,выполнениевнутреннегоциклапрекращается.Послевыводанаэкранстрокиматрицы(12символов"x")управлениепередаетсявстроку20ивыводитсясимволновойстроки.Послеэтогопроверяетсяусловиевнешнегоцикла(i<rows)и,еслионосправедливо,выполняетсяследующаяитерация.Обратите внимание: во второй итерации внешнего цикла внутренний цикл начинаетвыполняться с начала.
Переменной j присваивается нулевое значение, что позволяет повторновыполнитьвсеитерациивнутреннегоцикла.Основнаяидеявложенныхцикловсостоитвтом,чтонакаждойитерациивнешнегоциклавнутренний цикл выполняется полностью. Таким образом, результат выполнения даннойпрограммы будет следующим: заданный символ выводится для каждой строки столько раз,сколькоуказановпеременнойcolumns,аколичествовыводимыхстрокопределяетсяпеременнойrows.Областьвидимостипеременных-счетчиковцикловforДо недавнего времени область видимости переменных, описанных в цикле for,распространялась на весь текущий блок. Согласно новому стандарту, установленному ANSI,областьвидимостипеременных,описанныхвтакомцикле,должнараспространятьсятольконатело цикла.
Следует заметить, что, несмотря на внесенные изменения, многие компиляторыпродолжают поддерживать только старый стандарт. Набрав приведенный ниже фрагментпрограммногокода,можнопроверитьсвойкомпиляторнасоответствиеновомустандарту.#include<iostream.h>intmain(){//Проверкаобластивидимостипеременнойifor(inti=0;i<5;i++){cout<<"i:"<<i<<endl;}i=7;//iнаходитсязапределамиобластивидимостиreturn0;}Если такая программа будет компилироваться без ошибок, значит, ваш компилятор еще неподдерживаетновогостандартаANSI.Компиляторы, соответствующие новому стандарту, должны сгенерировать сообщение обошибке для выражения i = 7. После внесения некоторых изменений программа будетвосприниматьсявсемикомпиляторамибезошибок.#include<iostream.h>intmain(){inti;//объявлениепеременнойзапределамициклаfor(inti=0;i<5;i++){cout<<"i:"<<i<<endl;}i=7;//теперьпеременнаяiбудеткорректновосприниматьсявсемикомпиляторамиreturn0;}ОбобщениесведенийоциклахНазанятии5рассматривалсяпримерпостроениярядачиселФибоначчисиспользованиемрекурсивного алгоритма.
Напомним, что этот ряд начинается числами 1, 1, 2, 3, а всепоследующиеегочленыявляютсясуммойдвухпредыдущих.1,1,2,3,5,8,13,21,34...Таким образом, n-й член ряда Фибоначчи вычисляется сложением (rt-l)-TO и (n-2)-гочленов.Рассмотримвариантрешенияэтойзадачиспомощьюциклов(листинг7.15).Листинг7.15.Нахождениеn-гочленарядаФибоначчиспомощьюцикла1://Листинг7.15.2://Нахождениеn-roчленарядаФибоначчи3://спомощьюцикла4:5:#include<iostream.h>6:7:8:intfib(intposition);9:10:intmain()11:{12:intanswer,position;13:cout<<"Whichposition?";14:cin>>position;15:cout<<"\n";16:17:answer=fib(position);18:cout<<answer<<"isthe";19:cout<<position<<"Fibonaccinumber.\n";20:return0;21:}22:23:intfib(intn)24:{25:intminusTwo=1,minusOne=1,answer=2;26:27:if(n<3)28:return1;29:30:for(n-=3;n;n--)31:{32:minusTwo=minusOne;33:minusOne=answer;34:answer=minusOne+minusTwo;35:}36:37:returnanswer;38:}Результат:Whichposition?43isthe4thFibonaccinumber.Whichposition?55isthe5thFibonaccinumber.Whichposition?206765isthe20thFibonaccinumber.Whichposition?1003314859971isthe100thFibonaccinumber.Анализ: Программа, представленная в листинге 7.15, позволяет найти значение любогочленарядаФибоначчи.Использованиерекурсиизамененоциклом,организованнымспомощьюконструкцииfor.Крометого,применениециклауменьшаетобъемиспользуемойпамятиивремявыполненияпрограммы.В строке 13 пользователю предлагается ввести порядковый номер искомого члена рядаФибоначчи.