Скачать 1.94 Mb.
|
Библиотечные идентификаторы. Назначение этих слов зависит от среды программирования. В случае серьезной необходимости программист может изменить их смысл. Примеры таких слов: cin, cout и sqrt (имя функции извлечения квадратного корня). Идентификаторы, введенные программистом. Эти слова "создаются" программистом - например, имена переменных (такие, как year_now и an- other_age в программе 1.5.1). Идентификатором не может быть произвольная последовательность символов. По правилам Си++, идентификатор начинается с буквы или символа подчеркивания ("_") и состоит только из английских букв, цифр и символов подчеркивания. 2. Типы данных 2.1 Целые числа Правила Си++ требуют, чтобы в программе у всех переменных был задан тип данных. Тип данных int встречался нам уже неоднократно. Переменные этого типа применяются для хранения целых чисел (integer). Описание переменной, как имеющей тип int, сообщает компилятору, что он должен связать с идентификатором (именем) переменной количество памяти, достаточное для хранения целого числа во время выполнения программы. Границы диапазона целых чисел, которые можно хранить в переменных типа int, зависят от конкретного компьютера. В Си++ есть еще два целочисленных типа -short int и long int. Они представляют, соответственно, более узкий и более широкий диапазон целых чисел, чем тип int. Добавление к любому из этих типов префикса unsigned означает, что в переменной будут хранится только неотрицательные числа. Например, описание: unsigned short int year now, age now, another year, another age; 18 резервирует память для хранения четырех относительно небольших неотрицательных чисел. Приведем несколько полезных правил, касающихся записи целочисленных значений в исходном тексте программ.
2.2 Вещественные числа Для хранения вещественных чисел применяются типы данных float и double. Смысл знаков "+" и "-" для вещественных типов совпадает с целыми. Последние незначащие нули справа от десятичной точки игнорируются. Поэтому варианты записи "+523.5", "523.5" и "523.500" представляют одно и то же значение. В Си++ также допускается запись в формате с плавающей запятой (в экспоненциальном формате) в виде мантиссы и порядка. Например, 523.5 можно записать в виде "5.235e+02" (т.е. 5.235*10*10), а -0.0034 в виде "-3. 4e-03". В большинстве случаев используется тип double, он обеспечивает более высокую точность, чем float. Максимальную точность и наибольший диапазон чисел достигается с помощью типа long double, но он требует больше памяти (в Visual C++ 10 байт на число), чем double (8 байт). 2.3 Преобразование типов в выражениях При выполнении вычислений иногда бывает нужно гарантировать, что определенное значение будет рассматриваться как вещественное число, даже если на самом деле это целое. Чаще всего это нужно при делении в арифметических выражениях. Применительно к двум значениям типа int операция деления "/" означает деление нацело, например, 7/2 равно 3. В данном случае, если необходимо получить результат 3.5, то можно просто добавить десятичную точку в записи одного или обоих чисел: "7.0/2", "7/2. 0" или "7.0/2. 0". Но если и в числителе, и в знаменателе стоят переменные, а не константы, то указанный способ не подходит. Вместо него можно применить явное преобразование типа. Например, значение "7" преобразуется в значение типа double с помощью выражения "double (7)". Поэтому в выражении answer = double(numerator) / denominator операция "/" всегда будет рассматриваться компилятором как вещественное деление, даже если "numerator" и "denumerator" являются целыми числами. Для явного преобразования типов можно пользоваться и другими именами типов данных. Например, "int (14.35)" приведет к получению целого числа 14. 19 2.4 Символьный тип Для хранения символьных данных в Си++ предназначен тип "char". Переменная типа "char" рассчитана на хранение только одного символа (например, буквы или пробела). В памяти компьютера символы хранятся в виде целых чисел. Соответствие между символами и их кодами определяется таблицей кодировки, которая зависит от компьютера и операционной системы. Почти во всех таблицах кодировки есть прописные и строчные буквы английского алфавита, цифры 0, . . ., 9, и некоторые специальные символы, например, #, £, !, +, - и др. Самой распространенной таблицей кодировки, скорее всего, является таблица символов ASCII. В тексте программ символьные константы типа "char" надо заключать в одиночные кавычки, иначе компилятор поймет их неправильно и это может привести к ошибке компиляции, или, что еще хуже, к ошибкам времени выполнения. Например, "'A'" является символьной константой, но "A" будет рассматриваться компилятором в качестве имени переменной. Аналогично, "'9'" является символом, а "9" - целочисленной константой. Т.к. в памяти компьютера символы хранятся в виде целых чисел, то тип "char" на самом деле является подмножеством типа "int". На Си++ разрешается использовать символы в арифметических выражениях. Например, на любом компьютере с таблицей ASCII следующее выражение даст истинное значение (true, или 1): '9'-'0' == 57-48 == 9 В таблице ASCII кодом символа '9' является десятичное число 57 (в шестнадца-теричной записи 0x39), а ASCII-код символа '0' равен десятичному числу 48 (шестна-дцатеричное значение 0x30). Приведенное выражение можно переписать в виде: 57-48 == 0x39-0x30 == 9 Кодами ASCII удобнее пользоваться в шестнадцатеричной форме. При записи шестнадцатеричных чисел в Си++ применяется двухсимвольный префикс "0x". Переменные типа "char" существенно отличаются от "int" при выполнении ввода данных с клавиатуры и вывода на экран. Рассмотрим следующую программу. #include int main() { int number; char character; cout « "Напечатайте символ и нажмите Enter:\n"; cin » character; number = character; cout « "Вы ввели символ '" << character; cout « "' .\n"; cout << "В памяти компьютера он хранится в виде числа "; cout « number « ".\n"; return 0; } Программа 2.1. Программа 2.1 выдает на экран следующие сообщения: 20 Напечатайте символ и нажмите Enter: 9 Вы ввели символ '9'. В памяти компьютера он хранится в виде числа 57. Программу 2.1 можно изменить так, чтобы она печатала всю таблицу символов ASCII. Для этого придется применить "оператор цикла for". "Цикл for" является примером оператора цикла - эти операторы будут рассмотрены подробно в одной из следующих лекций. Оператор for имеет следующий синтаксис: for (инициализация; условие_повторения; изменение_значений) Оператор1; ОператорN; Цикл for выполняется в следующем порядке: (1) Сначала выполняется оператор инициализации. (2) Выполняется проверка, является ли условие_повторения истинным. Если условие ложно, то оператор for завершается. Если условие истинно, то последовательно выполняются операторы тела цикла Оператор1. . . ОператорN, и затем выполняется оператор изменение_значений. После этого происходит переход на начало шага (2). Чтобы код символа вывести на экран в шестнадцатеричной форме, надо сначала послать на экран служебный символ-манипулятор. Программа для печати фрагмента таблицы ASCII (от 32-го символа (пробел) до 126-го (символ '~')), будет выглядеть так: #include int number; char character; for (number = 32; number <= 12 6; number = number + 1 ) character = number; cout « "Символ '" « character; cout « "' имеет код "; cout « dec « number « " (дес.) или "; cout << hex « number « " (шестнд.).\n"; return 0; } Программа 2.2. Программа 2.2 напечатает на экране: Символ ' ' имеет код 32 (дес.) или 2 0 (шестнд.). Символ '!' имеет код 33 (дес.) или 21 (шестнд.). Символ '}' имеет код 125 (дес.) или 7D (шестнд.). Символ '~' имеет код 12 6 (дес.) или 7E (шестнд.). 21 2.5 Символьные строки В большинстве рассмотренных примеров программ для вывода на экран часто используются символьные строки. В Си++ символьные строки заключаются в двойные кавычки. Поэтому в программах часто встречаются операторы вывода вроде: cout « "' имеет код "; На самом деле в Си++ строковый тип ("string") не является стандартным типом данных, таким, как, например, "int", "float" или "char". Строки хранятся в памяти в виде символьных массивов, поэтому строки будут рассматриваться позднее, при изучении массивов. 2.6 Типы данных, определяемые пользователем Вопрос о типах данных, определяемых пользователем, будет обсуждаться намного более подробно в последующих лекциях. Будет показано, как программист может определить собственный тип данных, необходимый для решения конкретной задачи. Средства определения новых типов данных - одна из наиболее мощных возможностей Си++, которые позволяют хранить и обрабатывать в программах на Си++ сложные структуры данных. 3. Вывод вещественных чисел на экран При выводе на экран численных значений типа "float", "double" или "long double" возможно указание точности представления данных на экране и задание некоторых дополнительных параметров отображения, например, отображение значений в формате с фиксированной или плавающей точкой. В программе 3.1 вещественное число отображается в формате с фиксированной точкой и двумя десятичными знаками после запятой. Идентификатор "sqrt" является именем библиотечной функции извлечения квадратного корня. Описание библиотеки математических функций содержится в заголовочном файле "math.h". #include float number; cout << "Введите вещественное число.\n"; cin » number; cout « "Корень из "; cout.setf(ios::fixed); // СТРОКА 12 cout.precision(2); cout « number; cout « " примерно равен " « sqrt( number ) « ".\n"; return 0; } Программа 3.1. Программа 3.1 напечатает на экране: 22 Введите вещественное число. 200 Корень из 200.00 примерно равен 14.14. Если СТРОКУ 12 заменить на "cout.setf (ios::scientific);", то вид результа-та изменится: Введите вещественное число. 200 Корень из 2.00e+02 примерно равен 1.41e+01. В выходные данные можно включить параметры табуляции. Для этого предназначена функция ширины поля, например, "cout.width(20)". Она задает ширину следующего выводимого на экран значения равной, как минимум, 20 символам (при меньшей ширине автоматически будут добавлены пробелы). Эта возможность особенно полезна для печати таблиц. В компиляторе Visual C++ при указании ширины поля по умолчанию предполагается, что значения выравниваются по правой границе. Чтобы задать выравнивание по левой границе поля, потребуется использовать еще несколько манипуляторов ввода-вывода. Это специальные функции и операторы, содержащиеся в библиотеке ввода/вывода Си++. Они описаны в заголовочном файле iomanip.h. Для задания выравнивания по левой границе надо установить специальный флажок (переключатель) С помощью функции setiosflags : #include int main () { int number; cout « setiosflags( ios::left ); cout.width(2 0); cout << "Число" « "Квадратный корень\n\n"; cout.setf( ios::fixed ); cout.precision(2); for ( number = 1 ; number <= 10 ; number = number + 1 ) { cout.width(2 0); cout « number « sqrt(number) « "\n"; return 0; } Программа 3.2. Программа 3.2 выдаст на экран следующие сообщения: Число Квадратный корень
23
(ПРИМЕЧАНИЕ: во всех примерах идентификатор "cout" является именем переменной-объекта класса "stream" (поток). Функции "setf (...)", "precision (. . .)" и "width(...)" являются функциями-членами класса "stream". Понятия "объект", "класс", "функция-член" и др. будут подробно рассматриваться в курсе объектно-ориентированного программирования.) 4. Описания, константы и перечисления Как вы уже знаете, в программах на Си++ переменные обязательно должны быть описаны до первого использования, например, так: float number; После оператора описания до момента выполнения первого оператора присваивания значение переменной "number" будет неопределенным, т.е. эта переменная может иметь случайное значение. В Си++ можно (и желательно) инициализировать переменные конкретными значениями непосредственно при описании переменных. Например, возможен следующий оператор описания с инициализацией: float PI = 3.1416; Если значение переменной в программе никогда не изменяется, то ее целесообразно защитить от случайного изменения с помощью служебного слова "const" - т.е., превратить в константу. 4.1 Тип "Перечисление" Для описания набора связанных по смыслу констант типа "int" в Си++ есть оператор перечисления. Например, описание вида enum { MON, TUES, WED, THURS, FRI, SAT, SUN }; эквивалентно описанию 7 констант-кодов дней недели: const int MON = 0; const int TUES = 1; const int WED = 2; const int THURS = 3; const int FRI = 4; const int SAT = 5; const int SUN = 6; По умолчанию членам перечисления "enum" присваиваются значения 0, 1, 2, и т.д.. При необходимости члены перечисления можно инициализировать другими значениями. Неинициализированным явно членам будут присвоены значения по порядку, начиная от предыдущего проинициализированного члена: enum { MON = 1, TUES, WED, THURS, FRI, SAT = -1, SUN }; В приведенном примере "fri" имеет значение 5, а "sun" - значение 0. 24 4.2 Расположение описаний констант и переменных в исходном тексте В исходном тексте описания констант чаще всего размещаются в заголовке программы перед функцией "main". После них, уже в теле функции "main", размещаются описания переменных. Для иллюстрации этого порядка ниже приведен фрагмент программы, которая рисует на экране окружность заданного радиуса и вычисляет ее длину (набирать этот пример не надо, поскольку он приведен не полностью.) #include const float PI = 3.1416; const float SCREEN_WIDTH = 317.24; int drawCircle(float diameter); /* Это "прототип функции" */ int main() { float radius = 0; cout « "Введите радиус окружности.\n"; cin >> radius; drawCircle(radius*2); cout.setf(ios::fixed); cout.precision (2); cout « "Длина окружности радиуса " « radius; cout « " примерно равна " « 2*PI*radius « ".\n"; return 0; } int drawCircle(float diameter) { float radius = 0; if (diameter > SCREEN_WIDTH) radius = SCREEN_WIDTH/2.0; else radius = diameter/2.0; После определения функции "main ()" в этой программе содержится определение функции рисования окружности "drawCircle (...)". Детали реализации этой функции сейчас не существенны (будем считать, что функция drawCircle (...)" реализована корректно и ею можно пользоваться так же, как, например, функцией "sqrt (...)"). Обратите внимание, что, хотя переменная "radius" используется в обеих функциях "main ()" и "drawCircle (...)", это не одна и та же переменная, а две разных. Если бы переменная "radius" была описана до функции "main", то в таком случае она была бы глобальной переменной (общедоступной). Тогда, предполагая, что внутри функции "drawCircle (...)" описания переменной уже нет, если "drawCir-cle(...)" присвоит глобальной переменной значение "screen_width/2.0", то это значение чуть позже функция "main ()" использует для вычисления длины окружности и получится неверный результат. В приведенной программе глобальной переменной нет, а есть две локальных переменных "radius". Например, первая переменная "radius" является локальной пе- 25 ременной функции "main ()", или, говорят, что функция "main ()" является областью видимости этой переменной. Константы общего назначения, такие, как "pi" и "screen_width", принято описывать глобально, чтобы они были доступны внутри любой функции. Для контроля действий программы в приведенном фрагменте предусмотрено повторное отображение данных, введенных пользователем. Другими словами, заданное пользователем значение "radius" еще раз печатается на экране перед отображением длины окружности. |
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной... Цели: 1 продолжить знакомство с героями поэмы «Полтава»; познакомиться с изображением Полтавской битвы в поэме | И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной... ... | ||
Методические рекомендации по подготовке, оформлению, предзащите и... В. А. Усков, заместитель декана естественно-географического факультета по развитию, доцент кафедры физической географии и методики... | Проблемы коммуникации М. Е. Евсевьева (зав кафедрой, доцент А. А. Ветошкин); С. А. Борисова, директор Института международных отношений Ульяновского государственного... | ||
Программа по формированию навыков безопасного поведения на дорогах... Елена Святославовна Симакова, кандидат педагогических наук, доцент кафедры гуманитарных и естественнонаучных дисциплин Рязанского... | Программа курса по выбору «Орнитология» предназначена для студентов... Автор программы: к б н., доцент, зав кафедрой биологии и химии Марина Николаевна Харламова | ||
Российской Федерации Федеральное государственное образовательное... Петренко И. М., зав кафедрой экономической теории, д-р экон наук профессор Дулин М. П., зав кафедрой педагогики и психологии, д-р... | Рахманкулова Людмила Кузьминична, кандидат филологических наук, доцент... Автор программы: С. А. Виноградова, кандидат филологических наук, доцент, зав кафедрой английского языка и английской филологии | ||
Протокол №5 От 12 января 2012 г Заседания кафедры электроники и вычислительной... Зав кафедрой Хакимова Г. Г. сообщила, что кафедра проводит 2-й Чемпионат по цифровой схемотехнике | Лингвистические проблемы Московского государственного педагогического института иностранных языков им. М. Тореза (зав кафедрой доцент Ю. А. Денисенко); д-р... | ||
Мгпу учебно-методический комплекс дисциплины А. В. Прялухина, кандидат психологических наук, доцент, зав кафедрой психологии Российского государственного социального университета... | Рабочая программа по дисциплине «теория экономического анализа» Рецензент: к с н., доцент, зав кафедрой «Экономики и управления на предприятии и маркетинга» Пятигорского государственного гуманитарно-технологического... | ||
Рабочая программа по дисциплине «международный менеджмент» Рецензент: к с н., доцент, зав кафедрой «Экономики и управления на предприятии и маркетинга» Пятигорского государственного гуманитарно-технологического... | Методические рекомендации по написанию курсовых работ дисциплине Рецензент: к с н., доцент, зав кафедрой «Экономики и управления на предприятии и маркетинга» Пятигорского государственного гуманитарно-технологического... | ||
Учебное пособие Краснодар 2008 В. А. Оробец); кафедра паразитологии и ветсанэкспертизы Донского государственного аграрного университета (зав кафедрой, проф., к... | Рабочая программа по дисциплине «Экономика организаций (предприятий)... Рецензент: к с н., доцент, зав кафедрой «Экономики и управления на предприятии и маркетинга» Пятигорского государственного гуманитарно-технологического... |