Similar presentations:
Простейшие программы. Ввод-вывод.операции в выражениях. Присваивания
1.
02 Простейшие программы. Вводвывод.Операции в выражениях.Операторприсваивания.
02 Простейшие программы. Ввод-вывод.Операции в выражениях.Оператор
присваивания.
Рассмотрена структура простейшей программы, переменные, операции,
выражения, преобразования базовых типов, ввод и вывод данных б…
Оглавление
Описание данных
Классы памяти
Ввод-вывод
Операции в выражениях
Преобразования базовых типов
Типы операторов. Оператор присваивания.
1 Описание данных
Презентация к модулю 2
module2.ppt (738.30 KB)
Любая программа работает с данными. В простейшем случае данные хранят в
переменных. Переменная - это область памяти компьютера, имеющая имя. У
переменной есть тип, имя и значение. Имя служит для обращения к области
памяти, в которой хранится значение, тип определяет возможный диапазон
значений переменной и допустимые операции. Во время выполнения
программы значение переменной можно изменять.
Перед использованием любая переменная должна быть описана. Пример
описания целой переменной с именем a и вещественной переменной x:
int a; float x;
В общем случае описание переменной задает не только ее имя и тип, но и
другие характеристики, например, начальное значение, область действия и
время жизни. Кроме того, имеет значение и место размещения описания в
тексте программы.
2.
Область действия имени - это часть программы, в которой его можноиспользовать для доступа к связанной с ним области памяти. В зависимости от
области действия переменная может быть локальной или глобальной. Если
переменная определена внутри блока (напомним, блок ограничен фигурными
скобками), она называется локальной, область ее действия - от точки описания
до конца блока, включая все вложенные блоки. Если переменная определена
вне любого блока, она называется глобальной и областью ее действия
считается модуль, в котором она определена, от точки описания до его конца.
Имя переменной должно быть уникальным в своей области видимости.
Глобальные переменные нужно стремиться использовать как можно реже.
Переменная должна иметь минимальную из возможных областей видимости и
действия, поскольку это значительно облегчает поиск ошибок. Время жизни
глобальных и локальных переменных отличается: глобальная переменная
"живет", пока работает программа, а локальная - только до конца блока.
Рассмотрим общий вид оператора описания переменных:
[класс_памяти] [const] тип имя [инициализатор];
Квадратными скобками обозначены те элементы, которые могут отсутствовать,
то есть обязательно указывать тип, имя переменной и точку с запятой. С
помощью инициализатора можно присвоить переменной начальное значение
(инициализировать переменную). Инициализатор записывается как =
выражение. Выражение должно быть вычисляемым на момент выполнения
оператора, например:
short int a = 1;
Если тип инициализирующего значения не совпадает с типом переменной,
выполняются преобразования типа (см. далее). Слово const в описании
показывает, что описывается не переменная, а именованная константа.
Константа должна быть обязательно инициализирована при объявлении.
Ключевое слово const можно задавать как перед типом, так и после него.
В одном операторе можно определить несколько величин одного типа,
разделяя их запятыми. Примеры:
const char C = 'C', X = '|'; // символьные константы С и X
int const y = 56;
// целая константа y
char s, sf = 'f';
// инициализация относится только к sf
2 Классы памяти
Классы памяти приведены на слайде 4. Если он не задан явно, и переменная
описана внутри блока (в частности, внутри функции main), она считается
3.
автоматической. Память под нее выделяется при входе в блок. Освобождениепамяти происходит при выходе из блока, в котором описана переменная. Время
жизни локальной переменной - с момента входа в блок и до выхода из блока.
Класс памяти static задает статическую переменную. Время ее жизни равно
времени работы программы (как у глобальных переменных), а
инициализируется она один раз при первом выполнении оператора,
содержащего определение переменной.
Ключевое слово extern служит для объявления переменной, которая должна
быть доступна в другой программе. Если extern задается для переменной, то
она обязательно должна быть проинициализирована, например:
extern double PI = 3.1415926; // это определение переменной PI
Рассмотрим примеры описаний.
int a;
// 1 глобальная переменная a
int main()
{ int b;
// 2 локальная переменная b
static int c; // 3 локальная статическая переменная c
a = 1;
// 4 присваивание глобальной переменной
int a;
// 5 локальная переменная a, для нее отведена другая память по
сравнению с глобальной переменной
a = 2;
// 6 присваивание локальной переменной а, в первую очередь
работаем с локальной переменной
::a = 3;
// 7 присваивание глобальной переменной а, чтобы ее отличить от
локальной, ставятся ::
extern int x; // 8 переменная х объявлена; определение дальше
...
return 0; // 9
}
// 10
int x = 4;
// 11 определение и инициализация x
Здесь глобальная переменная a определена вне всех блоков, областью ее
действия является вся программа. Переменная создается при запуске
программы и уничтожается при окончании ее работы. Область видимости
переменной - вся программа, кроме строк после пятой, так как в ней
определяется локальная переменная с тем же именем, область действия
которой начинается с точки ее описания и заканчивается при выходе из блока.
Переменные b и c - локальные, область их видимости (и действия) - блок, но
время жизни различно: переменная b "рождается" при входе в блок и "умирает"
при выходе из него, а переменная c, как и глобальная переменная a, создается
при запуске программы и существует все время, пока работает программа.
Переменная х является глобальной и определена после тела функции main.
Область действия - вся программа, однако выше точки определения
4.
переменная не видна. Чтобы иметь к ней доступ внутри тела функции,переменная объявлена как extern .
Если при определении переменных их начальные значения явным образом не
заданы, глобальные и статические переменные инициализируются по
умолчанию нулевым значением соответствующего типа. Автоматические
(локальные) переменные не инициализируются. Пример приведен на слайде 6.
3 Ввод-вывод
Любая программа должна получать данные для обработки и выдавать
результат. В простейшем случае происходит ввод информации с клавиатуры и
вывод на экран. При вводе с клавиатуры информация должна считываться с
этого устройства и помещаться в память компьютера для обработки. Если
программа умеет обрабатывать данные, то результаты обработки, хранящиеся
в памяти, должны быть показаны на экране или другом устройстве вывода. В
языке С++ нет встроенных средств ввода/вывода - он осуществляется с
помощью средств, содержащихся в стандартных библиотеках. Рассмотрим
пример.
На слайде 9 приведен формат основных функций ввода-вывода,
унаследованных из языка С:
int scanf ( строка_формата, список адресов вводимых величин )
// ввод
int printf( строка_формата, список выводимых величин )
// вывод
Функции выполняют форматированный ввод и вывод произвольного
количества величин в соответствии со строкой формата. Она содержит
символы, которые копируются на экран при выводе или запрашиваются с
клавиатуры при вводе, и спецификации преобразования, начинающиеся со
знака %, которые при вводе и выводе заменяются конкретными величинами.
Каждой величине должна соответствовать своя спецификация,
показывающая, что это за величина, какого типа.
Спецификации могут быть следующими:
%d, %i - десятичное целое число;
%f - число с плавающей точкой;
%e,%E – число с плавающей точкой в экспоненциальной форме;
%u – десятичное число в беззнаковой форме;
%c - символ;
%s - строка.
В форматную строку также могут входить управляющие символы:
\n - управляющий символ "новая строка";
\t – табуляция;
\a – звуковой сигнал и др.
Также в форматной строке могут использоваться модификаторы формата,
5.
которые управляют шириной поля, отводимого для размещения выводимогозначения. Модификаторы – это числа, которые указывают минимальное
количество позиций для вывода значения и количество позиций для вывода
дробной части числа:
%[-]m[.p]C, где
- задает выравнивание по левому краю,
m – минимальная ширина поля,
p – количество цифр после запятой для чисел с плавающей точкой и
минимальное количество выводимых цифр для целых чисел (если цифр в числе
меньше, чем значение р, то выводятся начальные нули),
С- спецификация формата вывода.
На слайде 10 показано применение модификаторов формата для целых чисел.
Вместо спецификаций при выводе в строку формата подставляются значения
переменных int1 и int2. При этом можно управлять выравниванием выводимых
чисел, шириной поля вывода. Это может быть полезно для вывода таблиц.
На слайде 11 приведен пример форматированного вывода вещественных
чисел, причем они могут быть выведены в форматах с фиксированной и
плавающей точкой.
На слайде 12 показан вывод символа и строки.
Для начинающего программиста намного проще использовать потоковый
ввод-вывод, для которого нужно подключить библиотеку потокового вывода
iostream, которая содержит функции потокового ввода (cin - Console IN, c
консоли-клавиатуры) и потокового вывода (cout - Console OUT, на консольэкран). Знаки после этих ключевых слов показываютнаправление передачи
данных, после cin знак >> показывает, что введенная с клавиатуры информация
помещается в ячейку памяти, хранящую значение указанной после этого знака
переменной. Для вывода направление передачи данных другое - из памяти
(переменной, например) на экран. Пример потокового ввода-вывода приведен
на слайде 13.
4 Операции в выражениях
Для вычисления в программах используются выражения, которые состоят из
операндов, знаков операций и скобок. Операнды задают данные для
вычислений. Операции задают действия, которые необходимо выполнить.
Каждый операнд является, в свою очередь, выражением или одним из его
частных случаев, например, константой или переменной. Операции
выполняются в соответствии с приоритетами. Для изменения порядка
выполнения операций используются круглые скобки. Уровень их вложенности
не ограничен.
Язык С++ предоставляет в наше распоряжение огромный набор операций. Их
список приведен на слайдах 15-19.
6.
Операции расположены в порядке убывания приоритета, операции с разнымиприоритетами отделены горизонтальной чертой. Уровней приоритетов в языке
С++ очень много, поэтому в случае сомнений надо обращаться к справочной
информации. Основные правила, тем не менее, просты и соответствуют
принятым в математике: например, вычитание имеет более низкий приоритет,
чем умножение, поэтому для того, чтобы оно было выполнено раньше,
соответствующая часть выражения заключается в скобки.
Рассмотрим некоторые операции более подробно.
Операции увеличения и уменьшения на 1 (++ и --). Эти операции, называемые
также инкрементом и декрементом, имеют две формы записи - префиксную,
когда операция записывается перед операндом, и постфиксную. В префиксной
форме сначала изменяется операнд, и новое значение является результатом
операции. В постфиксной форме значением выражения является исходное
значение операнда, после чего он изменяется (см. слайд 20).
Операция sizeof позволяет определить размер в байтах выражения или типа.
Пример использования этой операции на слайде 21.
Побитовые операции представлены на слайде 22. Они работают с битовым
представлением чисел,
Деление (/) и остаток от деления (%). Операция деления применима к
операндам арифметического типа. Если оба операнда целочисленные,
результатом операции является целая часть частного (дробная часть
отсекается). Например, результатом 5/2 будет 2. Если же хотя бы один операнд
вещественный, то и результат будет вещественным числом В этом случае тип
результата определяется правилами преобразования типов, которые
рассмотрены в следующем разделе. Операция остатка от деления применяется
только к целочисленным операндам. Знак результата зависит от
реализации.Например, 5%2 будет равно 1. Пример применения этих операций
на слайде 23.
Операции отрицания (-, !). Арифметическое отрицание (унарный минус -)
изменяет знак операнда целого или вещественного типа на противоположный.
Логическое отрицание (!) дает в результате значение false, если операнд есть
true, и значение true, если операнд равен false. Операнд может быть
арифметического типа. В этом случае выполняется неявное преобразование в
тип bool.
Операции отношения или сравнения (<, <=, >, >=, ==, !=) сравнивают первый
операнд со вторым. Операнды могут быть арифметического типа или
указателями. Результатом операции является значение true или false. Операции
7.
сравнения на равенство и неравенство имеют меньший приоритет, чемостальные операции сравнения.
ВНИМАНИЕ!!!
Обратите внимание на разницу между операцией проверки на равенство (==) и
операцией присваивания (=), результатом которой является значение,
присвоенное левому операнду.
Логические операции (&& и ||). Операнды логических операций И (&&) и
ИЛИ (||) должны иметь тип, допускающий преобразование к типу bool, при
этом операнды в одной операции могут быть различных типов. Результатом
операции является true или false. Результат операции логическое И имеет
значение true только если оба операнда имеют значение true. Результат
операции логическое ИЛИ имеет значение true, если хотя бы один из
операндов имеет значение true. Логические операции выполняются слева
направо. Если значения первого операнда достаточно, чтобы определить
результат операции, второй операнд не вычисляется.
Условная операция (?:).Эта единственная в С++ тернарная операция (имеет
три операнда), ее формат:
операнд_1 ? операнд_2 : операнд_3
Операнды вычисляются слева направо. Результат вычисления первого
операнда должен быть того типа, который можно преобразовать к типу bool.
Если результат равен true, то результатом выполнения всей условной операции
будет значение второго операнда, иначе - третьего операнда. Их типы могут
быть различными. Пример: пусть требуется, чтобы некоторая целая величина
увеличивалась на 1, если ее значение не превышает n, а иначе принимала
значение 1. Это можно записать с помощью одной строки кода:
i = ( i < n ) ? i + 1 : 1;
Если в одном выражении записано несколько операций одинакового
приоритета, то унарные операции, условная операция и операции
присваивания выполняются справа налево, остальные - слева направо.
Например, a = b = c означает a = (b = c), а a + b + c означает (a + b) + c.
В составных операциях присваивания (+=, *=, /= и т. п.) при вычислении
выражения, стоящего в правой части, используется и значение из левой части.
Например, при сложении с присваиванием к значению левого операнда
прибавляется значение правого, и результат записывается в левый операнд.
Таким образом, выражение a += b является более компактной записью
выражения a = a + b.
Операция последовательного вычисления "запятая" (,).
8.
Формат операции:выражение_1, выражение_2
Операция выполняется слева направо: сначала вычисляется выражение слева
от знака операции (его результат отбрасывается), затем вычисляется
выражение справа от знака и его результат принимается за результат
операции. Вычисление левого выражения обязательно завершается до того,
как начнется вычисление правого выражения. Это позволяет присваивать
значения переменным в левом выражении, а затем использовать их в правом.
Например, результатом операции j = 2, i = 1 будет 1, результатом операции j = 2,
j++ будет 2, а результатом операции j = 2, ++j будет 3.Стандарт разрешает любое
выражение заменить последовательностью выражений, разделенных
операцией "запятая". Результатом вычисления последовательности выражений
будет значение самого правого выражения.
Результат вычисления выражения характеризуется значением и типом.
Например, пусть описаны две переменные целого типа a и b:
int a = 2, b = 5;
Тогда выражение a + b имеет значение 7 и тип int.
5 Преобразования базовых типов
В выражение могут входить операнды различных типов. Если операнды имеют
одинаковый тип, то результат операции будет иметь тот же тип.
Если операнды разного типа, перед вычислениями автоматически
выполняются неявные преобразования типов. Обычно короткие типы
приводятся к более длинным, что обеспечивает сохранение значимости и
точности. Типы char и short перед выполнением операции обязательно
преобразуются к int. Типом результата выражения обычно является самый
"объемный" из типов операндов.
Однако в выражениях с операцией присваивания встречается и обратный
вариант, когда более "объемный" тип присваивается менее "объемному",
например, float в int. Подобные преобразования связаны с потерей
информации (дробная часть отбрасывается), поэтому называются сужающими
приведениями (преобразованиями). Компилятор предупреждает о таких
операциях.
В логических операциях и условной операции выполняется неявное
преобразование к типу bool. При этом любое значение, не равное нулю (даже
отрицательное), трактуется как true, а нуль считается false. При обратных
преобразованиях величин типа bool к целому типу значение true
преобразуется в целую константу 1, а значение false - в 0.
9.
Программист может задать явное преобразование типа. Операцияпреобразования типа (часто называемая приведением типа) в стиле С может
записываться в двух эквивалентных формах:
( тип ) выражение
тип ( выражение )
Результатом операции является значение заданного типа, например:
int a = 2;
float b = 6.8;
printf( "%lf %d", double ( a ), ( int ) b );
Явное преобразование типа в стиле С оставлено в С++ только для
совместимости. Использовать его не рекомендуется, поскольку оно слишком
универсально, а потому чревато плохо диагностируемыми ошибками.
В стандарте С++ определено четыре специализированных операций
преобразования типа, которые не являются взаимозаменяемыми и
применяются в разных ситуациях:
static_cast<тип>( выражение )
reinterpret_cast<тип>( выражение )
dynamic_cast<тип>( выражение )
const_cast<тип>( выражение )
Пока нет опыта программирования, работать с преобразованием типов не
рекомендуется.
Правила преобразования типов приведены на слайде 26.
6 Типы операторов. Оператор присваивания.
Все операторы языка СИ могут быть условно разделены на следующие
категории:
оператор "выражение", пустой оператор, оператор присваивания;
условные операторы, к которым относятся оператор условия if и оператор
выбора switch;
операторы цикла (for, while, do while);
операторы перехода (break, continue, return, goto);
Операторы в программе могут объединяться в составные операторы с
помощью фигурных скобок. Выполнение составного оператора заключается в
последовательном выполнении составляющих его операторов.
10.
Любой оператор в программе может быть помечен меткой, состоящей изимени и следующего за ним двоеточия. Все операторы языка СИ, кроме
составных операторов, заканчиваются точкой с запятой ( ; ).
Любое выражение, которое заканчивается точкой с запятой, является
оператором. Выполнение оператора-выражения заключается в вычислении
выражения. Полученное значение выражения никак не используется, поэтому,
как правило, такие выражения вызывают побочные эффекты и их использовать
не рекомендуется, хотя и возможно.
Пустой оператор состоит только из точки с запятой. При выполнении этого
оператора ничего не происходит. Он обычно используется в случаях, когда
оператора не требуется, но по синтаксису требуется наличие хотя бы одного
оператора.
Синтаксис языка СИ требует, чтобы после метки обязательно следовал
оператор. Фигурная же скобка оператором не является. Поэтому, если надо
передать управление на фигурную скобку, необходимо перед ней использовать
пустой оператор.
Рассмотрим оператор присваивания. Формат операции простого
присваивания (=):
операнд_1 = выражение;
Сначала вычисляется выражение, стоящее в правой части, а потом его
результат записывается в область памяти, ссылка на которую стоит в левой
части (мнемоническое правило: "присваивание - это передача данных
"налево""). В простейшем и наиболее распространенном случае операнд_1
представляет собой переменную, куда и записывается вычисленное значение.
То, что ранее хранилось в этой переменной, естественно, теряется.
Если тип значения, полученного в результате вычисления, не совпадает с типом
левого операнда, то выполняется преобразование типа.
Выражение с операцией присваивания может участвовать в качестве операнда
в других выражениях. Таким образом, допустимы многократные присваивания
вида a = b = c: сначала вычисляется выражение b = c, а затем его результат
становится правым операндом для операции присваивания переменной a.
programming