246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 11
Текст из файла (страница 11)
Использование перечисления облегчает анализпрограммы. Того же эффекта можно добиться, используя константы целочисленного типа, какпоказановлистинге3.8.Примечание:Для этой и всех небольших программ в данной книге я намеренно непредусматривал включения ряда выражений, которые обычно пишутся для обработкиситуаций, связанных с приемом от пользователя неверных данных. Например, в этойпрограмме отсутствует проверка вводимых чисел, которая должна обязательноприсутствовать в настоящей программе и предназначена для предупреждения вводанеразрешенныхчисел.Этобылосделанонамеренно,длятогочтобысэкономитьместовкнигеисосредоточитьвашевниманиетольконарассматриваемойвданномразделетеме.Листинг3.8.Тажепрограмма,носиспользованиемконстантцелочисленноготипа1:#include<iostream.h>2:intmain()3:{4:constintSunday=0;5:constintMonday=1;6:constintTuesday=2;7:constintWednesday=3;8:constintThursday=4;9:constintFriday=5;10:constintSaturday=6:11;12:intchoice;13:cout<<"Enteraday(0-6):";14:cin<<choice;15:16:if(choice=Sunday||choice==Saturday)17:cout<<"\nYou'realreadyoffonweekends!\n";18:else19:cout<<"\nOkay,I'llputinthevacationday.\n";20:21:return0;22:}Результат:Enteraday(0-6):6You'realreadyoffonweekends!Результатыработыэтойпрограммыидентичнырезультатампрограммыизлистинга3.7.Нов этом варианте все константы (Sunday, Monday и пр.) определены в явном виде и отсутствуеттипперечисленияDays.Обратитевнимание,чтопрограммасперечислениемкорочеилогичнее.РезюмеНа этом занятии рассматривались числовые и символьные переменные и константы,которыевC++используютсядляхраненияданныхвовремявыполненияпрограммы.Числовыепеременныемогугбытьлибоцелыми(char,shortиlongint),либовещественными(floatиdouble).Кроме того, они могут быть знаковыми и беззнаковыми (unsigned).
Хотя на различныхкомпьютерах все эти типы могуг иметь разные размеры, но на одном компьютере переменныеодногоитогожетипавсегдаимеютпостоянныйразмер.Переменную нужно объявить до ее использования. При работе с данными необходимоследить, чтобы тип данных соответствовал объявленному типу переменной. Если, например,поместить слишком большое число в целую переменную, возникнет переполнение, котороеприведеткневерномурезультату.Кроме того, вы познакомились с литеральными, символьными и перечислимымиконстантами, а также с двумя способами объявления символьных констант: с помощьюдирективы#defineиключевогословаconst.ВопросыиответыЕслипеременныетипаshortintмогутпреподнестисюрпризввидепереполненияпамяти,топочемубынеиспользоватьвовсехслучаяхпеременныетипаlongint?Как короткие (short), так и длинные (long) целочисленные переменные могутпереполняться,нодлятогочтобыэтопроизошлостипомlongint,нужноужслишкомбольшоечисло.Например,переменнаятипаunsignedshortintпереполнитсяпослечисла65535,втовремякакпеременнаятипаunsignedlongint—толькопослечисла4294967295.Однаконамногихкомпьютерахкаждоеобъявлениедлинногоцелогозначениязанимаетвдвоебольшепамятипосравнениюсобъявлениемкороткогоцелого(четыребайтапротивдвух),ипрограмма,вкоторойобъявлено100такихпеременныхзайметлишних200байтОЗУ.Честноговоря, память сейчас перестала быть проблемой, поскольку большинство персональныхкомпьютеровоснащеномногимитысячами(еслинемиллионами)байтовпамяти.Чтослучится,еслиприсвоитьчислосдесятичнойточкойцелочисленнойпеременной,анепеременнойтипаfloat,каквследующейпрограммнойстроке?intaNumber=5.4;Хороший компилятор выдаст по этому поводу предупреждение, но такое присваиваниесовершенно правомочно.
Присваиваемое число будет в таком случае усечено до целого.Следовательно,еслиприсвоитьчисло5,4целочисленнойпеременной,этапеременнаяполучитзначение 5. Однако налицо потеря информации, и если затем хранящееся в этой целойпеременной значение вы попытаетесь присвоить переменной типа float, то вещественнойпеременнойпридется"довольствоваться"лишьзначением5.Почемувместолитеральныхконстантлучшеиспользоватьсимвольные?Если некоторое значение используется во многих местах программы, то применениесимвольной константы позволяет изменять все значения путем изменения одного, лишьопределения этой константы. Кроме того, смысл символьной константы проще понять по ееназванию.
Ведь иногда трудно разобраться, почему некоторое значение умножается на число360, а если это число будет заменено символьной константой degreesInACircle (градусов вокружности),тосразустановитсяясно,очемидетречь.Чтопроизойдет,еслиприсвоитьотрицательноечислобеззнаковойпеременной?Рассмотритеследующуюстрокупрограммы:unsignedintaPositiveNumber=-1;Хороший компилятор отреагирует на это предупреждением, но такое присвоение вполнезаконно. Отрицательное число будет представлено в беззнаковом побитовом виде.
Так,побитовое представление числа -1 выглядит как 11111111 11111111 (0xFFFF вшестнадцатеричном формате) и соответствует числу 65 535. Если вам что-то непонятно,обратитеськприложениюВ.Можно ли работать с языком C++, не имея представления о побитовом выражениичисловыхзначенийиарифметикедвоичныхишестнадцатеричныхчисел?Можно, но эффективность работы снизится. Мощь языка C++ состоит не в том, чтобыуберечь вас от ненужных деталей работы компьютера, а в том, чтобы заставить компьютерработать с максимальной отдачей. В этом основное отличие C++ от других языковпрограммирования.Программисты,которыенеимеютпредставления,какработатьсдвоичнымизначениями,частообескураженыполучаемымирезультатами.КоллоквиумВэтомразделепредлагаютсявопросыдлясамоконтроляиукрепленияполученныхзнанийи приводится несколько упражнений, которые помогут закрепить ваши практические навыки.Попытайтесьсамостоятельноответитьнавопросытестаивыполнитьзадания,апотомсверьтеполученные результаты с ответами в приложении Г.
Не приступайте к изучению материаласледующейглавы,еслидлявасосталисьнеясными,хотябынекоторыеизпредложенныхнижевопросов.Контрольныевопросы1. В чем разница между целочисленной и вещественной (с плавающей точкой)переменными?2.Каковоразличиемеждутипамиunsignedshortintиlongint?3.Каковыпреимуществаиспользованиясимвольнойконстантывместолитерала?4.Каковыпреимуществаиспользованияключевогословаconstвместодирективы#define?5.Каквлияетнаработупрограммы"хорошее"или"плохое"имяпеременной?6.Еслиперечисление(enum)заданнотакимобразом,токаковозначениеегочленаBlue?enumCOLOR{WHITE,BLACK=100,RED,BLUE,GREEN=300};7.
Какие из следующих имен переменных можно считать хорошими, плохими или вообщенедопустимыми?а)Ageб)!exв)R79Jг)TotalIncomeд)_InvalidУпражнения1.Какойтиппеременнойбылбыправильнымдляхраненияследующейинформации?•Вашвозраст.•Площадьвашегозаднегодвора.•Количествозвездвгалактике.•Среднийуровеньвыпаденияосадковзаянварь.2.Создайтеподходящиеименапеременныхдляхраненияэтойинформации.3.Объявитеконстантудлячислаpi,равного3.14159.4.Объявитепеременнуютипаfloatиинициализируйтеее,используяконстантуpi.День4-й.ВыраженияиоператорыПрограмма представляет собой набор команд, выполняемых в определенной последовательности.Современныепрограммысильнытем,чтовыполняютсянепоследовательно,команда за командой от начала до конца программы, а по блокам. Каждый блок программызапускаетсявзависимостиотвыполнениязаданногоусловия.Сегоднявыузнаете:•Чтотакоеоператоры•Чтотакоеблоки•Чтотакоевыражения• Как реализовать ветвление программы на основе результата выполнения заданногологическогоусловия•ЧтотакоеИСТИННОиЛОЖНОсточкизренияпрограммистанаC++ВыраженияВ языке C++ выражения управляют последовательностью выполнения других выражений,возвращаютрезультатывычисленийилиничегонеделают(нулевыевыражения).Всевыраженияв C++ оканчиваются точкой с запятой.
Нулевое выражение представляет собой просто точку сзапятой.Наиболеепростойпримервыражения—этооперацияприсвоениязначения:Вотличиеоталгебры,этовыражениенеозначает,чтоxравняетсяa+b.Данноевыражениеследует понимать так: присвоим результат суммирования значений переменных а и bпеременнойx,илиприсвоимпеременнойxзначениеa+b.Несмотрянаточтовэтомвыражениивыполняетсясразудвадействия—вычислениесуммыиприсвоениезначения,послевыраженияустанавливается только один символ точки с запятой. Оператор (=) присваивает результатыопераций,выполняемыхнадоперандами,расположеннымисправаотзнакаравенства,операнду,находящемусяслеваотнего.x=а+b;СимволыпробеловСимволы пробелов, к которым относятся не только пробелы, но и символы табуляции иразрыва строки, в выражениях обычно игнорируются. Рассмотренное выше выражение можнозаписатьтак:x=a+b;илитак:x=a+b;Хотя последний вариант абсолютно правомочен, выглядит он довольно глупо.