Смекни!
smekni.com

Основы программирования на языке Си (стр. 5 из 27)

>= больше илиравно 9 >= 2 TRUE

== равно 20 == 6 FALSE

!= не равно 20 != 6 TRUE

&& Логическое И 5 > 2 && 6 > 10 FALSE

|| Логическое ИЛИ 5 > 2 || 6 > 10 TRUE

18

ЛЕКЦИЯ 2. Переменные, типы данных и выражения

1. Идентификаторы

В исходномтекстепрограммнаСи++ используетсядовольномногоанглий-

ских словиихсокращений. Всеслова (идентификаторы), встречающиесявпрограм-

мах, можноразделитьнатрикатегории:

1) Служебные слова языка. Например, этословаif, int и else. Назначение

этих словпредопределеноиегонельзя изменить. Нижеприведенболее

полный списокслужебныхслов:

asm continue float new signed try

auto default for operator sizeof typedef

break delete friend private static union

case do goto protected struct unsigned

catch double if public switch virtual

char else inline register template void

class enum int return this volatile

const extern long short throw while

По назначениюэтисловаможноразбитьнаотдельныегруппы (прил. 8.1).

2) Библиотечные идентификаторы. Назначение этихсловзависитотсреды

программирования. Вслучаесерьезнойнеобходимостипрограммистможет

изменить ихсмысл. Примерытакихслов: cin, cout и sqrt (имяфункции

извлечения квадратногокорня).

3) Идентификаторы, введенные программистом. Эти слова "создаются"

программистом –например, именапеременных (такие, какyear_now и another_

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;

19

резервирует памятьдляхранениячетырехотносительнонебольшихнеотрицательных

чисел.

Приведем несколькополезныхправил, касающихсязаписицелочисленных

значений висходномтекстепрограмм.

1) Нельзяпользоватьсядесятичнойточкой. Значения 26 и 26.0 одинаковы, но

"26.0" неявляетсязначениемтипа "int".

2) Нельзяпользоватьсязапятымивкачестверазделителейтысяч. Например,

число 23,897 следуетзаписывать как "23897".

3) Целыезначениянедолжныначинатьсяснезначащегонуля. Онприменяется

для обозначенияустаревшихвосьмеричныхчисел, такчтокомпиляторбу-

дет рассматриватьзначение "011" какчисло 9 ввосьмеричнойформе.

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.

20

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 <iostream.h>

int main()

{

int number;

char character;

cout << "Напечатайте символ и нажмите Enter:&bsol;n";

cin >> character;

number = character;

cout << "Вы ввели символ '" << character;

cout << "'.&bsol;n";

cout << "В памяти компьютера он хранится в виде числа ";

cout << number << ".&bsol;n";

return 0;

}

Программа 2.1.

Программа 2.1 выдаетнаэкранследующиесообщения:

21

Напечатайте символ и нажмите Enter:

9

Вы ввели символ '9'.

В памяти компьютера он хранится в виде числа 57.

Программу 2.1 можноизменитьтак, чтобыонапечаталавсютаблицусимволов

ASCII. Дляэтогопридетсяприменить "операторциклаfor". "Циклfor" является

примером оператора цикла –этиоператорыбудутрассмотреныподробноводнойиз

следующих лекций. Операторfor имеет следующийсинтаксис:

for (инициализация; условие_повторения; изменение_значений)

{

Оператор1;

...

...

ОператорN;

}

Цикл for выполняется вследующемпорядке: (1) Сначалавыполняетсяопера-

тор инициализации. (2) Выполняетсяпроверка, являетсялиусловие_повторения истин-

ным. Еслиусловиеложно, тооператор for завершается. Еслиусловиеистинно, то

последовательно выполняютсяоператорытелациклаОператор1...ОператорN, изатем

выполняется операторизменение_значений. Послеэтогопроисходитпереходнанача-

ло шага (2).

Чтобы кодсимволавывестинаэкранвшестнадцатеричнойформе, надоснача-

ла послатьнаэкранслужебный символ-манипулятор. Программадляпечатифраг-

мента таблицы ASCII (от 32-госимвола (пробел) до 126-го (символ '~')), будетвыгля-

деть так:

#include <iostream.h>

int main()

{

int number;

char character;

for (number = 32; number <= 126; number = number + 1 )

{

character = number;

cout << "Символ '" << character;

cout << "' имеет код ";

cout << dec << number << " (дес.) или ";

cout << hex << number << " (шестнд.).&bsol;n";

}

return 0;

}

Программа 2.2.

Программа 2.2 напечатаетнаэкране:

Символ ' ' имеет код 32 (дес.) или 20 (шестнд.).

Символ '!' имеет код 33 (дес.) или 21 (шестнд.).

...

...

Символ '}' имеет код 125 (дес.) или 7D (шестнд.).

Символ '~' имеет код 126 (дес.) или 7E (шестнд.).

22

2.5 Символьные строки

В большинстверассмотренныхпримеровпрограммдлявыводанаэкранчасто

используются символьныестроки. ВСи++ символьныестрокизаключаютсявдвой-

ные кавычки. Поэтомувпрограммахчастовстречаются операторывыводавроде:

cout << "' имеет код ";

На самомделевСи++ строковыйтип ("string") неявляетсястандартнымти-

пом данных, таким, как, например, "int", "float" или "char". Строкихранятсявпамя-

ти ввидесимвольныхмассивов, поэтомустрокибудутрассматриватьсяпозднее, при

изучении массивов.

2.6 Типы данных, определяемые пользователем

Вопрос отипахданных, определяемыхпользователем, будетобсуждатьсяна-