246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 33
Текст из файла (страница 33)
Не приступайте к изучению материаласледующей главы, если для вас остались неясными хотя бы некоторые из предложенных нижевопросов.Контрольныевопросы1.Можноливциклеforинициализироватьсразунесколькопеременных-счетчиков?2.Почемуследуетизбегатьиспользованиеоператораgoto?3.
Можно ли с помощью оператора for организовать цикл, тело которого не будетвыполняться?4.Можнолиорганизоватьциклwhileвнутрициклаfor?5.Можнолиорганизоватьцикл,которыйникогданезавершится?Приведитепример.6.Чтопроисходитпризапускебесконечногоцикла?Упражнения1.Какимбудетзначениепеременнойxпослезавершенияциклаfor(intx=0;x<100;x++)?2.Создайтевложенныйциклfor,заполняющийнулямимассивразмером10x10.3.Организуйтециклfor,счетчиккоторогоизменяетсяот100до200сшагом2.4.Организуйтециклwhile,счетчиккоторогоизменяетсяот100до200сшагом2.5.Организуйтециклdo...while,счетчиккоторогоизменяетсяот100до200сшагом2.6.Жучки:найдитеошибкувприведенномфрагментепрограммы.intcounter=0;while(counter<10){cout<<"counter:"<<counter;}7.Жучки:найдитеошибкувприведенномфрагментепрограммы.for(intcounter=0;counter<10;counter++);cout<<counter<<"";8.Жучки:найдитеошибкувприведенномфрагментепрограммы.intcounter=100;while(counter<10){cout<<"counter:"<<counter;counter--;}9.Жучки:найдитеошибкувприведенномфрагментепрограммы.cout<<"Enterаnumberbetween0and5:";cin>>theNumber;switch(theNumber){case0:doZero();case1://идемдальшеcase2://идемдальшеcase3://идемдальшеcase4://идемдальшеcase5:doOneToFive();break;default:doDefault();break;}ПодведениеитоговЛистинг.Итогипервойнедели1:#include<iostream.h>2:intintboolfalsetrue3:enumCHOICE{DrawRect=1,GetArea,4:GetPerim,ChangeDimensions,Quit};5://ОбъявлениеклассаRectangle6:classRectangle7:{8:public:9://constructors10:Rectangle(intwidth,intheight);11:~Rectangle();12:13://Методыдоступа14:intGetHeight()const{returnitsHeight;}15:intGetWidth()const{returnitsWidth;}16:intGetArea()const{returnitsHeight*itsWidth;}17:intGetPerim()const{return2*itsHeight+2*itsWidth;}18:voidSetSize(intnewWidth,intnewHeight);19:20://Прочиеметоды21:22:23:private:24:intitsWidth;25:intitsHeight;26:};27:28://Выполнениеметодовкласса29:voidRectangle::SetSize(intnewWidth,intnewHeight)30:{31:itsWidth=newWidth;32:itsHeight=newHeight;33:}34:35:36:Rectangle::Rectangle(lntwidth,intheight)37:{38:itsWidth=width;39:itsHeight=height;40:}41:42:Rectangle::~Rectangle(){}43:44:intDoMenu();45:voidDoDrawRect(Rectangle);46:voidDoGetArea(Rectangle);47:voidDoGetPerim(Rectangle);48:49:intmain()50:{51://Инициализацияобъектаrectangleзначением30,552:RectangletheRect(30,5);53:54:intchoice=DrawRect;55:intfQuit=false;56:57:while(!fQuit)58:{59:choice=DoMenu();60:if(choice<DrawRect||choice>Quit)61:{62:cout<<"\nInvalidChoice,pleasetryagain.\n\n"63:continue;64:}65:switch(choice)66:{67:caseDrawRect:68:DoDrawRect(theRect);69:break;70:caseGetArea:71:DoGetArea(theRect);72:break;73:caseGetPerim:74:DoGetPerim(theRect);75:break;76:caseChangeDimensions:77:intnewLength,newWidth;78:cout<<"\nNewwidth:";79:cin>>newWidth;80:cout<<"Newheight:";81:cin>>newLength;82:theRect.SetSize(newWidth,newLength);83:DoDrawRect(theRect);84:break;85:caseQuit:86:fQuit=true;87:cout<<"\nExiting...\n\n";88:break;89:default:90:cout<<"Errorinchoioe!\n";91:fQuit=true;92:break;93:}//endswitch94:}//endwhile95:return0;96:}//endmain97:98:intDoMenu()99:{100:intchoice;101:cout<<"\n\n***Menu***\n";102:cout<<"(1)DrawRectangle\n";103:cout<<"(2)Area\n";104:cout<<"(3)Perimeter\n";105:cout<<"(4)Resize\n";106:cout<<"(5)Quit\n";107:108:cin>>choice;109:returnchoice;110:}111:112:voidDoDrawRect(RectangletheRect)113:{114:intheight=theRect.GetHeight();115:intwidth=theRect.GetWidth();116:117:for(inti=0;i<height;i++)118:{119:for(intj=0;j<width;j++)120:cout<<"*";121:cout<<"\n";122:}123:}124:125:126:voidDoGetArea(RectangletheRect)127:{128:cout<<"Area:"<<theRect.GetArea()<<endl;129:}130:131:voidDoGetPerim(RectangletheRect)132:{133:cout<<"Perimeter:"<<theRect.GetPerim()<<endl;134:}Результат:***Menu***(1)DrawRectangle(2)Area(3)Perimeter(4)Resize(5)Quit1*********************************************************************************************************************************************************Menu***(1)DrawRectangle(2)Area(3)Perimeter(4)Resize(5)Quit2Area:150***Menu***(1)DrawRectangle(2)Area(3)Perimeter(4)Resize(5)Quit3Perimeter:70***Menu***(1)DrawRectangle(2)Area(3)Perimeter(4)Resize(5)Quit4NewWidth:10Newheight:8***********************************************************************************Menu***(1)DrawRectangle(2)Area(3)Perimeter(4)Resize(5)Quit2Area:80>>**Menu***(1)DrawRectangle(2)Area(3)Perimeter(4)Resize(5)Quit3Perimeter:36***Menu***(1)DrawRectangle(2)Area(3)Perimeter(4)Resize(5)Quit5Exiting...Анализ: В данной программе сведено большинство тех средств и подходовпрограммирования, с которыми вы познакомились в течение первой недели.
Вы должны нетолько уметь ввести программный код, скомпилировать, скомпоновать и запустить этупрограмму, но также и понимать, что и как в ней работает. Если все это вам удалось, значит,неделяпрошланезря.Впервыхшестистрокахделаютсяобъявленияновыхтиповданныхиважныеопределения,которыезатембудутиспользоватьсянапротяжениивсейпрограммы.В строках 6—26 объявляется класс Rectangle. Он содержит открытые методы доступа длявозвращения и установки ширины и высоты прямоугольника, а также для вычисления егоплощадиипериметра.Строки29-40содержатопределениятехфункций-членовкласса,которыенеобъявлялисьсключевымсловомinline.Прототипыобычныхфункций,неявляющихсячленамикласса,находятсявстроках44—47,а основной блок программы начинается со строки 49.
Суть программы состоит в построениивиртуального прямоугольника с выводом меню, предлагающего выбор из пяти опций: выводпрямоугольника на экран, определение его площади, определение периметра, изменениеразмерапрямоугольникаивыходизпрограммы.Флаг устанавливается в строке 55, и если пользователь установит неверное значение, товывод меню на экран повторится. Это будет продолжатся до тех пор, пока пользовательправильнонеукажетодинизрежимовработылибоневыберетзавершениепрограммы.В случае выбора одного из режимов работы, за исключением ChangeDimensions, будетвызываться соответствующая функция, выбираемая с помощью оператора switch. Выборконстанты ChangeDimensions не вызывает никакой функции, поскольку в этом случаепользовательдолженввестиновыезначенияразмерапрямоугольника.Еслипредположить,чтодля изменения размеров прямоугольника в программе существовала бы специальная функцияDoChangeDimensions(), в которую объект Rectangle передавался бы как значение, то всеизменения в функции производились бы над копией существующего объекта, а сам объект вфункцииmain()оставалсябынеизменным.Назанятии8,посвященномуказателям,иназанятии10,гдеречьидеторазработкеболеесложныхфункций,выузнаете,какобойтиэтоограничение,передавая объекты в функции как ссылки.
Но пока все изменения значения объекта можноосуществлятьтольковфункцииmain().Обратите внимание, что использование перечисления сделало конструкцию оператораswitch более понятной. Если бы вместо констант, о назначении которых можно судить по ихименам, проверялись бы вводимые пользователем числовые значения от 1 до 5, нам быпришлоськаждыйразвозвращатьсякописаниюменю,чтобынезапутатьсявтом,какойномерсоответствуеттойилиинойопции.В строке 60 осуществляется проверка, входит ли значение, введенное пользователем, вдиапазондопустимыхзначений.Еслиэтонетак,будетпоказаносообщениеобошибкеивыводменюнаэкранповторится.Темнеменееобратитевнимание,чтоконструкцияоператораswitchсодержит оператор default, хотя в этой программе он никогда не будет выполняться.
Этотоператор добавлен исключительно для облегчения отладки программы, а также на случайбудущихизмененийвпрограмме.Итогипервойнедели Поздравляем вас! Вы завершили первую неделю обучения программированию на C++!Теперьвывполнеготовынетолькокпониманию,ноиксозданиюдовольносложныхпрограмм.Конечно, еще многое нужно узнать, и следующая неделя начнется с довольно сложной изапутанной темы — использование указателей. Не расслабляйтесь, вам предстоит еще болееуглубиться в пучину объектно-ориентированного программирования, виртуальных функций имногихдругихсовременныхимощныхсредствязыкапрограммированияC++.Немного передохните, наградите себя шоколадной медалью за проделанный путь и,перелистнувстраницу,приступайтекследующейнеделе.Неделя№2ОсновныевопросыМы завершили первую неделю обучения и научились основным принципам и средствампрограммированиянаC++.Длявастеперьнедолжносоставлятьтруданаписаниеикомпиляциянебольшой программы.
Также вы должны четко представлять, что такое классы и объекты,составляющиеосновуобъект-ориентированногопрограммирования.ЧтодальшеВторую неделю начнем с изучения указателей. Указатели традиционно являются сложнойтемой для освоения начинающими программистами на C++. Но в этой книге вы найдетеподробные и наглядные разъяснения того, что такое указатель и как он работает, поэтому, мынадеемся,чточерезденьвыужесвободнобудетевладетьэтимсредствомпрограммирования.Назанятии 9 вы познакомитесь со ссылками, которые являются близкими родственникамиуказателей.
На занятии 10 вы узнаете как замешать функции, а занятие 11 будет посвященонаследованию и разъяснению фундаментальных принципов объект-ориентированногопрограммирования. На занятии 12 вы узнаете как создавать структуры данных от простыхмассивов до связанных списков. Занятие 13 расширит ваши представления об объекториентированном программировании и познакомит с полиморфизмом, а занятие 14 завершитвторуюнеделюобучениярассмотрениемстатическихфункцийифункцийдрузейкласса.День8-й.УказателиВозможность непосредственного доступа к памяти с помощью указателей — одно ихнаиболеемощныхсредствпрограммированиянаC++.Сегоднявыузнаете:•Чтотакоеуказатели•Какобъявляютсяииспользуютсяуказатели•КакработатьспамятьюПриработесуказателямипрограммистыподчассталкиваютсясдовольноспецифическимипроблемами, поскольку в некоторых ситуациях механизм работы указателей может оказатьсявесьма запутанным.