О. Л. Викентьева, О. А. Полякова
Программирование на языке С++
Лабораторный практикум для студентов специальности АСУ
Пермь, 2001
Лабораторная работа №1.
"Знакомство с Си++. Выполнение программы простой структуры"
Цель:Знакомство со средой программирования, создание, отладка и выполнение простой программы, содержащей ввод/вывод информации и простейшие вычисления.
Краткие теоретические сведения
Язык Си создан в 1972 г. Деннисом Ритчи при разработке ОС Unix. Он проектировался как инструмент системного программирования с ориентацией на разработку хорошо структурированных программ. Таким образом он сочетает в себе, с одной стороны, средства языка программирования высокого уровня: описание типов данных, операторы for, while, if и т. д. , а , с другой стороны, содержит средства языка типа Ассемблер : регистровые переменные, адресную арифметику, возможность работы с полями бит и т. д.
Структура программы
Программа на языке Си имеет следующую структуру:
#директивы препроцессора
. . . . . . . . .
#директивы препроцессора
функция а ( )
операторы
функция в ( )
операторы
void main ( ) //функция, с которой начинается выполнение программы
операторы
описания
присваивания
функция
пустой оператор
составной
выбора
циклов
перехода
Директивы препроцессора - управляют преобразованием текста программы до ее компиляции. Исходная программа, подготовленная на языке Си в виде текстового файла проходит 3 этапа обработки:
1) препроцессорное преобразование текста;
2) компиляция;
3) компоновка (редактирование связей или сборка).
После этих 3 этапов формируется исполняемый машинный код программы.
Задача препроцессора - преобразование текста программы до ее компиляции. Правила препроцессорной обработки определяет программист с помощью директив препроцессора. Директива начинается с #. Например,
1) #define - указывает правила замены в тексте.
#define ZERO 0.0
Означает , что каждое использование в программе имени ZERO будет заменяться на 0.0.
2) #include< имя заголовочного файла> - предназначена для включения в текст программы текста из каталога «Заголовочных файлов», поставляемых вместе со стандартными библиотеками. Каждая библиотечная функция Си имеет соответствующее описание в одном из заголовочных файлов. Список заголовочных файлов определен стандартом языка. Употребление директивы include не подключает соответствующую стандартную библиотеку, а только позволяют вставить в текст программы описания из указанного заголовочного файла. Подключение кодов библиотеки осуществляется на этапе компоновки, т. е. после компиляции. Хотя в заголовочных файлах содержатся все описания стандартных функций, в код программы включаются только те функции, которые используются в программе.
После выполнения препроцессорной обработки в тексте программы не остается ни одной препроцессорной директивы. Программа представляет собой набор описаний и определений, и состоит из набора функций. Среди этих функций всегда должна быть функция с именем main. Без нее программа не может быть выполнена. Перед именем функции помещаются сведения о типе возвращаемого функцией значения ( тип результата). Если функция ничего не возвращает, то указывается тип void: void main ( ). Каждая функция, в том числе и main должна иметь набор параметров, он может быть пустым, тогда в скобках указывается (void).
За заголовком функции размещается тело функции. Тело функции - это последовательность определений, описаний и исполняемых операторов, заключенных в фигурные скобки. Каждое определение, описание или оператор заканчивается точкой с запятой.
Определения - вводят объекты (объект - это именованная область памяти, частный случай объекта - переменная), необходимые для представления в программе обрабатываемых данных. Примером являются
int y = 10 ; //именованная константа
float x ; //переменная
Описания - уведомляют компилятор о свойствах и именах объектов и функций, описанных в других частях программы.
Операторы - определяют действия программы на каждом шаге ее исполнения.
Константы и переменные
Константа - это значение, которое не может быть изменено. Синтаксис языка определяет 5 типов констант:
· символы;
· константы перечисляемого типа;
· вещественные числа;
· целые числа;
· нулевой указатель (NULL).
Переменные можно изменять. При задании значения переменной в соответствующую ей область памяти помещается код этого значения. Доступ к значению возможен через имя переменной, а доступ к участку памяти - по его адресу. Каждая переменная перед использованием в программе должна быть определена, т. е. ей должна быть выделена память. Размер участка памяти, выделяемой для переменной и интерпретация содержимого зависят от типа, указанного в определении переменной. Простейшая форма определения переменных:
тип список_имен_переменных;
Основные типы данных
тип данных | название | размер, бит | диапазон значений |
unsigned char | беззнаковый целый длиной не менее 8 бит | 0 . . 255 | |
char | целый длиной не менее 8 бит | -128 . . 127 | |
enum | перечисляемый | -32768 . . 32767 | |
unsigned int | беззнаковый целый | 0 . . 65535 | |
short int (short) | короткий целый | -32768 . . 32767 | |
unsigned short | беззнаковый короткий целый | 0 . . 65535 | |
int | целый | -32768 . . 32767 | |
unsigned long | беззнаковый длинный целый | 0 . . 4294967295 | |
long | длинный целый | -214748348 . . 2147483647 | |
float | вещественный одинарной точности | 3.4Е-38 . . 3.4Е+38 | |
double | вещественный двойной точности | 1.7Е-308 . . 1.7Е+308 | |
long double | вещественный максимальной точности | 3.4Е-4932 . . 1.1Е+4932 |
В соответствии с синтаксисом языка переменные автоматической памяти после определения по умолчанию имеют неопределенные значения. Переменным можно присваивать начальные значения, явно указывая их в определениях:
тип имя_переменной = начальное_значение;
Этот прием называется инициализацией.
Примеры:
float pi = 3.14 , cc=1.3456;
unsigned int year = 1999;
Операции
Унарные:
& | получение адреса операнда |
* | обращение по адресу (разыменование) |
- | унарный минус, меняет знак арифметического операнда |
~ | поразрядное инвертирование внутреннего двоичного кода (побитовое отрицание) |
! | логическое отрицание (НЕ). В качестве логических значений используется 0 - ложь и не 0 - истина, отрицанием 0 будет 1, отрицанием любого ненулевого числа будет 0. |
++ | увеличение на единицу: префиксная операция - увеличивает операнд до его использования, постфиксная операция увеличивает операнд после его использования. |
- - | уменьшение на единицу: префиксная операция - уменьшает операнд до его использования, постфиксная операция уменьшает операнд после его использования. |
sizeof | вычисление размера (в байтах) для объекта того типа, который имеет операнд |
Бинарные операции.
Аддитивные:
+ | бинарный плюс (сложение арифметических операндов) |
- | бинарный минус (вычитание арифметических операндов) |
Мультипликативные:
* | умножение операндов арифметического типа |
/ | деление операндов арифметического типа (если операнды целочисленные, то выполняется целочисленное деление) |
% | получение остатка от деления целочисленных операндов |
Операции сдвига (определены только для целочисленных операндов).
Формат выражения с операцией сдвига:
операнд_левый операция_сдвига операнд_правый
<< | сдвиг влево битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого операнда |
>> | сдвиг вправо битового представления значения правого целочисленного операнда на количество разрядов, равное значению правого операнда |
Поразрядные операции:
& | поразрядная конъюнкция (И) битовых представлений значений целочисленных операндов |
| | поразрядная дизъюнкция (ИЛИ) битовых представлений значений целочисленных операндов |
^ | поразрядное исключающее ИЛИ битовых представлений значений целочисленных операндов |
Операции сравнения:
< | меньше, чем |
> | больше, чем |
<= | меньше или равно |
>= | больше или равно |
== | равно |
!= | не равно |
Логические бинарные операции:
&& | конъюнкция (И) целочисленных операндов или отношений, целочисленный результат ложь(0) или истина(1) |
|| | дизъюнкция (ИЛИ) целочисленных операндов или отношений, целочисленный результат ложь(0) или истина(1) |
Условная операция.
В отличие от унарных и бинарных операций в ней используется три операнда.
Выражение1 ? Выражение2 : Выражение3;
Первым вычисляется значение выражения1. Если оно истинно, то вычисляется значение выражения2, которое становится результатом. Если при вычислении выражения1 получится 0, то в качестве результата берется значение выражения3.
Например:
x<0 ? -x : x ; //вычисляется абсолютное значение x.
Операция явного (преобразования) приведения типа.
Существует две формы: каноническая и функциональная:
1) (имя_типа) операнд
2) имя_типа (операнд)
Приоритеты операций.
Ранг | Операции |
( ) [ ] -> . | |
! ~ - ++ -- & * (тип) sizeof тип( ) | |
* / % (мультипликативные бинарные) | |
+ - (аддитивные бинарные) | |
<< >> (поразрядного сдвига) | |
< > <= >= (отношения) | |
== != (отношения) | |
& (поразрядная конъюнкция «И») | |
^ (поразрядное исключающее «ИЛИ») | |
| (поразрядная дизъюнкция «ИЛИ») | |
&& (конъюнкция «И») | |
|| (дизъюнкция «ИЛИ») | |
?: (условная операция) | |
= *= /= %= -= &= ^= |= <<= >>= (операция присваивания) | |
, (операция запятая) |
Выражения
Из констант, переменных, разделителей и знаков операций можно конструировать выражения. Каждое выражение состоит из одного или нескольких операндов, символов операций и ограничителей, в качестве которых чаще всего выступают квадратные скобки. Если выражение формирует целое или вещественное число, то это арифметическое выражение. В арифметических выражениях допустимы операции: + - * / %.
Отношение - это пара арифметических выражений, объединенных знаком операции отношения. Логический тип в Си отсутствует, поэтому принято, что отношение имеет ненулевое значение, если оно истинно и 0, если оно ложно.
Ввод и вывод