Лабораторная работа №2. Проектирование программ линейной структуры
Цель и порядок работы
Цель работы – изучить структуру программы на языке C++, операторы присваивания, ввода и вывода данных, используемые при составлении программ линейной структуры.
Порядок выполнения работы:
- ознакомиться с описанием лабораторной работы;
- получить задание у преподавателя, согласно своему варианту;
- написать программу, отладить и решить ее на ЭВМ;
- оформить отчет.
Краткая теория
2.1 Структура программы на языке C++
Выполнение всех программ, написанных на языке C++, начинается с функции, именуемой main. При запуске программы прежде всего выполняется первое выражение функции main.
Выражение – это строка кодов, представляющая собой отдельную инструкцию для компьютера. (Функция состоит из группы выражений, собранных вместе для решения определенной задачи.) Затем поочередно выполняются все остальные выражения – по одному за раз.
Структура программы выглядит следующим образом:
директивы_препроцессора int main() { определения_объектов; исполняемые операторы; return 0; } | директивы_препроцессора void main() { определения_объектов; исполняемые операторы; return; } |
У функции есть имя (main), после которого в круглых скобках перечисляются аргументы или параметры функции (в данном случае у функции main аргументов нет). У функции может быть результат или возвращаемое значение. Если функция не возвращает никакого значения, то это обозначается ключевым словом void. В фигурных скобках записывается тело функции – действия, которые она выполняет. Оператор return 0; означает, что функция возвращает результат – целое число 0.
Вслед за заголовком функции main в фигурных скобках размещается тело функции, которое представляет последовательность определений, описаний и исполняемых операторов. Как правило, определения и описания размещаются до исполняемых операторов. Каждое определение, описание и оператор завершается «;».
Переменные используются для представления данных в программе. Например, если нужно запомнить имя пользователя, можно создать переменную Имя. Затем в любой момент, когда потребуется имя пользователя, можно просто сослаться на значение переменной Имя. В процессе выполнения программы значения переменных могут изменяться. Например, можно присвоить переменной Имя значение «Вася», а потом другим выражением присвоить этой же переменной значение «Степан». Но само по себе значение переменной никогда не меняется – в любом случае вы должны написать какое-нибудь выражение, меняющее одно значение на другое.
Комментарии используются для описания того, что происходит в процессе выполнения программы. Вы можете добавлять их для расшифровки целей, с которыми пишутся те или иные фрагменты кодов, для фиксирования каких-то мыслей и идей, для описания решаемых задач. Добавляя комментарии, вы упрощаете чтение кодов вашей программы пользователями. Для вас комментарии также могут быть очень полезны. Если через некоторое время вы захотите внести изменения в уже набранные коды, вам, скорее всего, трудно будет вспомнить, для чего используется та или иная переменная и зачем нужно было создавать ту или иную функцию. В таких случаях, пожалуй, комментарии могут быть единственным средством, которое поможет вам вспомнить, что же именно вы хотели сделать, набирая эти коды. При преобразовании кодов C++ в машинные коды компилятор игнорирует строки, являющиеся комментариями, и просто пропускает их.
Алфавит языка
Множество символов используемых в языках C и C++ можно разделить на пять групп.
1. Символы, используемые для образования ключевых слов и идентификаторов. В эту группу входят прописные и строчные буквы английского алфавита, а также символ подчеркивания. Следует отметить, что одинаковые прописные и строчные буквы считаются различными символами, так как имеют различные коды.
Таблица 1 – Символы, используемые для образования ключевых слов и идентификаторов
Прописные буквы латинского алфавита | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
Строчные буквы латинского алфавита | a b c d e f g h i j k l m n o p q r s t u v w x y z |
Символ подчеркивания | _ |
2. Группа прописных и строчных букв русского алфавита и арабские цифры.
Таблица 2 – Символы прописных и строчных букв русского алфавита и арабские цифры
Прописные буквы русского алфавита | А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Ь Э Ю Я |
Строчные буквы русского алфавита | а б в г д е ж з и к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я |
Арабские цифры | 0 1 2 3 4 5 6 7 8 9 |
3. Знаки нумерации и специальные символы. Эти символы используются с одной стороны для организации процесса вычислений, а с другой – для передачи компилятору определенного набора инструкций.
Таблица 3 – Знаки нумерации и специальные символы
Символ | Наименование | Символ | Наименование |
, | запятая | ) | круглая скобка правая |
. | точка | ( | круглая скобка левая |
; | точка с запятой | } | фигурная скобка правая |
: | двоеточие | { | фигурная скобка левая |
? | вопросительный знак | < | меньше |
' | апостроф | > | больше |
! | восклицательный знак | [ | квадратная скобка |
| | вертикальная черта | ] | квадратная скобка |
/ | дробная черта | # | номер |
\ | обратная черта | % | процент |
~ | тильда | & | амперсанд |
* | звездочка | ^ | логическое не |
+ | плюс | = | равно |
- | минус | " | кавычки |
4. Управляющие и разделительные символы. К той группе символов относятся: пробел, символы табуляции, перевода строки, возврата каретки, новая страница и новая строка. Эти символы отделяют друг от друга объекты, определяемые пользователем, к которым относятся константы и идентификаторы. Последовательность разделительных символов рассматривается компилятором как один символ (последовательность пробелов).
5. Кроме выделенных групп символов в языках C и C++ широко используются так называемые, управляющие последовательности, т.е. специальные символьные комбинации, используемые в функциях ввода и вывода информации. Управляющая последовательность строится на основе использования обратной дробной черты (\) (обязательный первый символ) и комбинацией латинских букв и цифр.
Таблица 4 – Управляющие последовательности
Управляющая последовательность | Наименование | Шестнадцатеричная замена |
\a | Звонок | |
\b | Возврат на шаг | |
\t | Горизонтальная табуляция | |
\n | Переход на новую строку | 00A |
\v | Вертикальная табуляция | 00B |
\r | Возврат каретки | 00C |
\f | Перевод формата | 00D |
\" | Кавычки | |
\' | Апостроф | |
\0 | Ноль-символ | |
\\ | Обратная дробная черта | 05C |
\0ddd | Символ набора кодов ПЭВМ в восьмеричном представлении | |
\xddd | Символ набора кодов ПЭВМ в шестнадцатеричном представлении |
Последовательности вида \0ddd и \xddd (здесь d обозначает цифру) позволяет представить символ из набора кодов ПЭВМ как последовательность восьмеричных или шестнадцатеричных цифр соответственно. Например, символ возврата каретки может быть представлен различными способами:
\r - общая управляющая последовательность,
\015 - восьмеричная управляющая последовательность,
\x00D - шестнадцатеричная управляющая последовательность.
Следует отметить, что в строковых константах всегда обязательно задавать все три цифры в управляющей последовательности. Например, отдельную управляющую последовательность \n (переход на новую строку) можно представить как \010 или \xA, но в строковых константах необходимо задавать все три цифры, в противном случае символ или символы, следующие за управляющей последовательностью, будут рассматриваться как ее недостающая часть. Например:
"ABCDE\x009FGH" данная строковая команда будет напечатана с использованием определенных функций языка C++, как два слова ABCDE FGH, разделенные символом табуляции (по умолчанию 8-ю пробелами), в этом случае если указать неполную управляющую строку "ABCDE\x09FGH", то на печати появится ABCDE=|=GH, так как компилятор воспримет последовательность \x09F как символ "=+=".
Отметим тот факт, что, если обратная дробная черта предшествует символу не являющемуся управляющей последовательностью (т.е. не включенному в таблицу 4) и не являющемуся цифрой, то эта черта игнорируется, а сам символ представляется как литеральный. Например, символ \h представляется символом h в строковой или символьной константе.
Кроме определения управляющей последовательности, символ обратной дробной черты (\) используется также как символ продолжения. Если за (\) следует (\n), то оба символа игнорируются, а следующая строка является продолжением предыдущей. Это свойство может быть использовано для записи длинных строк.
Переменные и константы
Идентификатор
Для символического обозначения величин, переменных, констант, функций и т.п. используются имена или идентификаторы.
Идентификаторы в языке C++ – это последовательность знаков, начинающаяся с буквы или знака подчеркивания. В идентификаторах можно использовать заглавные и строчные латинские буквы, цифры и знак подчеркивания. Длина идентификаторов произвольная. Примеры правильных идентификаторов:
abc A12 NameOfPerson BITES_PER_WORD
abc и Abc – два разных идентификатора, т.е. заглавные и строчные буквы различаются. Примеры неправильных идентификаторов:
23X a-b
Ряд слов в языке C++ имеет особое значение и не может использоваться в качестве идентификаторов. Такие зарезервированные слова называются ключевыми.
Список ключевых слов:
asm auto bad_cast
bad_typeid bool break
case catch char
class const const_cast
continue default delete
do double dynamic_cast
else enum extern
float for friend
goto if inline
int long mutable
namespace new operator
private protected public
register reinterpret_cast return
short signed sizeof
static static_cast struct
switch template then
this throw try
type_info typedef typeid
union unsigned using
virtual void volatile
while xalloc
Понятие переменной
Программа оперирует информацией, представленной в виде различных объектов и величин. Переменная – это символическое обозначение величины в программе. Как ясно из названия, значение переменной (или величина, которую она обозначает) во время выполнения программы может изменяться.
С точки зрения архитектуры компьютера, переменная – это символическое обозначение ячейки оперативной памяти программы, в которой хранятся данные. Содержимое этой ячейки – это текущее значение переменной.
В языке C++ прежде чем использовать переменную, ее необходимо объявить. Объявить переменную с именем x можно так: int x;
В объявлении первым стоит название типа переменной int (целое число), а затем идентификатор x – имя переменной. У переменной x есть тип – в данном случае целое число. Тип переменной определяет, какие возможные значения эта переменная может принимать и какие операции можно выполнять над данной переменной. Тип переменной изменить нельзя, т.е. пока переменная x существует, она всегда будет целого типа.
Язык C++ строго типизированный язык. Любая величина, используемая в программе, принадлежит к какому-либо типу. При любом использовании переменных в программе проверяется, применимо ли выражение или операция к типу переменной. Довольно часто смысл выражения зависит от типа участвующих в нем переменных.
Например, если записать x+y, где x – переменная, то переменная y должна быть одного из числовых типов.
Соответствие типов проверяется во время компиляции программы. Если компилятор обнаруживает несоответствие типа переменной и ее использования, он выдаст ошибку (или предупреждение). Однако во время выполнения программы типы не проверяются. Такой подход, с одной стороны, позволяет обнаружить и исправить большое количество ошибок на стадии компиляции, а, с другой стороны, не замедляет выполнения программы.
Основные типы данных
В языке C++ существует несколько стандартных основных типов данных. Основные типы, наиболее непосредственно отвечающие средствам аппаратного обеспечения, такие:
char short int long float double
Первые четыре типа используются для представления целых, последние два – для представления чисел с плавающей точкой. Переменная типа char имеет размер, естественный для хранения символа на данной машине (обычно, байт), а переменная типа int имеет размер, соответствующий целой арифметике на данной машине (обычно, слово). Диапазон целых чисел, которые могут быть представлены типом, зависит от его размера. В C++ размеры измеряются в единицах размера данных типа char, поэтому char по определению имеет размер единица.
Для определения данных целого типа используются различные ключевые слова, которые определяют диапазон значений и размер области памяти, выделяемой под переменные.
Тип Размер памяти в байтах Диапазон значений
char 1 от -128 до 127
int 2 от -32768 до 32767
short 2 от -32768 до 32767
long 4 от -2 147 483 648 до 2 147 483 647
unsigned char 1 oт 0 до 255
unsigned int 2 от 0 до 65535
unsigned short 2 от 0 до 65535
unsigned long 4 от 0 до 4 294 967 295
Для переменных, представляющих число с плавающей точкой используются следующие модификаторы-типа: float, double, long double.
Величина с модификатором-типа float занимает 4 байта. Из них 1 байт отводится для знака, 8 бит для избыточной экспоненты и 23 бита для мантиссы. Отметим, что старший бит мантиссы всегда равен 1, поэтому он не заполняется, в связи с этим диапазон значений переменной с плавающей точкой приблизительно равен от 3.14E-38 до 3.14E+38.
Величина типа double занимает 8 бит в памяти. Ее формат аналогичен формату float. Биты памяти распределяются следующим образом: 1 бит для знака, 11 бит для экспоненты и 52 бита для мантиссы. С учетом опущенного старшего бита мантиссы диапазон значений равен от 1.7E-308 до 1.7E+308.
Понятие константы
В программе можно явно записать величину – число, символ и т.п. Например, выражение x + 4 – сложить текущее значение переменной x и число 4. В зависимости от того, при каких условиях будет выполняться программа, значение переменной x может быть различным. Однако целое число четыре всегда останется прежним. Таким образом, явная запись значения в программе – это константа и в данном случае она задаётся своим изображением.
Гораздо чаще используются символические константы. Для определения символической константы используется ключевое слово const. Например, если записать
const int BITS_IN_WORD = 32;
то затем имя BITS_IN_WORD можно будет использовать вместо целого числа 32.
Операторы языка программирования
Оператором называется элементарная структурная единица программы. Оператор предназначен как для записи алгоритмических действий по преобразованию данных, так и для задания порядка выполнения других действий. Операторы выполняются в порядке их следования в программе. Операторы отделятся друг от друга точкой с запятой. Операторы делятся на:
- простые (не содержат в себе других операторов);
- составные (включают в себя один или несколько дополнительных операторов).
Присваивание
Переменной можно присвоить какое-либо значение с помощью операции присваивания. Присвоить – это значит установить текущее значение переменной. По-другому можно объяснить, что операция присваивания запоминает новое значение в ячейке памяти, которая обозначена переменной.
int x; // объявить целую переменную x
int y; // объявить целую переменную y
x = 0; // присвоить x значение 0
y = x + 1; // присвоить y значение x + 1, т.е. 1
x = 1; // присвоить x значение 1
y = x + 1; // присвоить y значение x + 1, теперь уже 2