Операции целочисленной арифметики

Литература

1. Алексеев Е.Р. Учимся программировать на Microsoft Visual C++ и Turbo C++ Explorer (под общей редакцией Чесноковой О.В.).- Москва: НТ Пресс, 2007. – 325с.

2. Павловская Т.А. С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2003. – 461с.


 

Программирование на Си++

Язык Си был создан в 1972 году во время работы над операционной системой UNIX.

Паскаль разрабатывался как язык, обучающий принципам программирования.

В Бейсике ударение сделано на синтаксис (он близок к английскому).

Си – язык, облегчающий труд программиста.

Программы на Си отличаются компактностью и быстротой выполнения.

Си используют для создания ОС, средств программирования, языков программирования, программного обеспечения, программ физического, технического и экономического назначения, компьютерных игр, мультфильмов и т.п.

Си – язык структурного программирования. Он позволяет создавать программы, имеющие простую структуру, хорошо читаемые и легко модифицируемые.

1. Базовые средства языка

Текст на любом естественном языке состоит из следующих элементов: символы, слова, словосочетания, предложения.

В алгоритмическом языке:

Алфавит языка, или его символы – это основные знаки, с помощью которых пишутся все тексты на языке.

Лексема, или элементарная конструкция – минимальная единица языка, имеющая самостоятельный смысл.

Выражение задает правило вычисления некоторого значения.

Оператор задает законченное описание некоторого действия. Для описания сложного действия требуется последовательность операторов.

Операторы могут быть исполняемые и неисполняемые.

Исполняемые операторы задают действия над данными.

Неисполняемые операторы служат для описания данных.

Объединенная единым алгоритмом совокупность описаний и операторов образует программу.

Для выполнения программы ее необходимо перевести на язык понятный процессору – в машинные коды. Этот процесс состоит из нескольких этапов.

Программа передается процессору, который выполняет директивы[1], содержащиеся в тексте.

Получившийся полный текст программы поступает на вход компилятора, который выделяет лексемы, а затем на основе грамматики языка распознает выражения и операторы.

При этом компилятор выявляет синтаксические ошибки и в случае их отсутствия строит объектный модуль.

Компоновщик, или редактор связей, формирует исполняемый модуль, в том числе содержащий функции библиотек.

Если программа состоит из нескольких исходных файлов, они компилируются по отдельности и объединяются на этапе компоновки.

Алфавит языка

Алфавит Си включает:

· прописные, строчные латинские буквы и знак подчеркивания;

· арабские цифры от 0 до 9;

· специальные знаки:

“ { } , |, [ ] ( ) + – / % * . \ ‘ : ? < = > ! & # ~ ; ^

· символы пробела, табуляции и перехода на новую строку.

 

Ключевые слова языка

Ключевые слова это зарезервированные слова, которые имеют специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены.

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

Идентификатор – имя программного объекта. Имя состоит из латинских букв, цифр и символа подчеркивания. Прописные и строчные буквы различаются:

ABC, abc, Abc – разные имена.

Первый символ в имени – буква или знак подчеркивания. Имя не должно совпадать с ключевыми словами языка. Идентификатор создается на этапе объявления переменной, функции, константы и т.п. и используется в последующих операторах программы.

Комментарии

Комментарий – это текст, который компилятором игнорируется. Начинается он либо с символов // и заканчивается переходом на новую строку:

//Это комментиарий

либо заключается в скобки:

/* Это комментиарий */

Типы данных Си

В любой программе выполняется обработка каких-либо данных. Данные различного типа хранятся и обрабатываются по разному.

Тип данных определяет:

· внутреннее представление данных в памяти компьютера;

· множество значений, которые могут принимать величины этого типа;

· операции и функции, которые можно применять к величинам этого типа.

Данные в языке Си описываются в начале функции.

 

Обязательное описание типа позволяет компилятору проводить проверку допустимости различных конструкций программы.

Типы языка Си можно разделить на основные и составные.

Основные типы данных:

char – символьный,

int – целый,

float – вещественный,

double – вещественный с двойной точностью,

bool – логический,

void – без типа (бестиповый).

Спецификаторы типов[2]:

short – короткий;

long – длинный;

signed – знаковый;

unsigned – беззнаковый.

 

1.5.1. Символьный тип (char)

Под величину символьного типа отводится количество байт, достаточное для размещения одного символа. Как правило, это 1байт.

Тип Диапазон Размер
char –128…127 1 байт
unsigned char 0…255 1 байт
signed char –128…127 1 байт

1.5.2. Целый тип (int)

Размера типа int зависит от компьютера и компилятора. Для 16-разрядного процессора под величины этого типа отводится 2 байта, для 32-разрядного – 4 байта.

Спецификатор short перед именем типа указывает компилятору, что под число следует отвести 2 байта не зависимо от разрядности процессора.

Спецификатор long означает, что целая величина будет занимать 4 байта.

По умолчанию все целые типы считаются знаковыми, т.е. спецификатор signed можно не указывать.

Тип Диапазон Размер
int -32767…32767 2 байта 4 байта
unsigned int 0…65535 ---
signed int -32767…32767 ---
short int -32767…32767 2 байта
long int -2147483647 4 байта
unsigned short int 0…65535 2 байта
signed short int -32767…32767 2 байта
long long int –(263–1) … …(263–1) 8 байт
signed long int -2147483647 4 байта
unsigned long int 0… 4 байта
unsigned long long int 0 … 264–1 8 байт

 


1.5.3. Типы с плавающей

точкой (float, double)

Внутреннее представление вещественного числа в памяти компьютера отличается от представления целого числа.

Число с плавающей точкой представлено в экспоненциальной форме mE±p, где m – мантисса (целое или дробное число с десятичной точкой), p – порядок (целое число).

Для того чтобы перейти от экспоненциальной формы к обычному представлению с фиксированной точкой, необходимо мантиссу умножить на десять в степени порядок.

Например,

-6.42Е+2 = -6.42.102 = -642,

3.2E-6 = 3.2.10-6 =0.0000032

Тип Диапазон Размер
float 3.4Е-38…3.4E+38 4 байта
double 1.7Е-308…1.7E+308 8 байт
long double 3.4Е-4932…3.4E+4932 10 байт

Логический тип

Переменная типа bool может принимать только два значения true (истина) или false (ложь). Любое значение не равное нулю интерпретируется как true, а при преобразовании к целому типу принимает значение равное 1. Значение false представлено в памяти как 0.

1.5.5. Тип void

Множество значений этого типа пусто. Он используется для определения функций, которые не возвращают значения, для указания пустого списка аргументов функции, как базовый тип для указателей и в операции приведения типов.

1.6. Переменные в языке С++

Переменная – поименованный участок памяти, в котором хранится значение определенного типа.

У переменной есть имя (идентификатор) и значение.

Имя служит для обращения к области памяти, в которой хранится значение.

Во время выполнения программы значение переменной можно изменить.

Перед использованием любая переменная должна быть описана:

тип список_переменных;

Например,

int a, bc, f;

float g, u, h12;

В Си могут обрабатываться структурированные типы данных: массивы, строки, записи, файлы, множества.

По месту объявления переменные в языке Си можно разделить на три класса:

· локальные (объявляются внутри функции и доступны только в ней),

· глобальные (описываются до всех функций и доступны из любого места программы),

· формальные параметры функции (описываются в списке параметров функции).

1.7. Константы в языке С++

Константы это величины, которые не изменяют своего значения в процессе выполнения программы. Оператор описания константы имеет вид:

сonst тип имя=значение;

Константы могут быть целыми, вещественными, символьными или строковыми.

Компилятор определяет тип константы по внешнему виду, но существует возможность и явного указания типа, например:

const double pi=3.14159

Константа может быть определена до главной функции. В этом случае применяется директива #define:

#define PI 3.141592653

int main()

{…

Операции и выражения

Выражениезадает порядок выполнения действий над данными и состоит из операндов (констант, переменных, обращений к функциям), круглых скобок и знаков операций:

a+b*sin(cos(x)).

Операции делятся на

· унарные (-с)

· бинарные (а+b).

Основные операции языка С++

Операция Описание
Унарные операции
++ увеличение значения на 1
-- уменьшение значения на 1
~ поразрядное отрицание
! логическое отрицание
- арифметическое отрицание (унарный минус)
+ унарный плюс
& взятие адресаа
* разадресация
(type) преобразование типа
Бинарные операции
+ сложение
- вычитание
* умножение
/ деление
% остаток от деления
<< сдвиг влево
>> сдвиг вправо
< меньше
> больше
<= меньше или равно
>= больше или равно
== равно
!= не равно
& поразрядная конъюнкция (И)
^ поразрядное исключающее ИЛИ
| поразрядная дизъюнкция (ИЛИ)
&& логическое И
|| логическое ИЛИ
= присваивание
*= умножение с присваиванием
/= деление с присваиванием
+= сложение с присваиванием
-= вычитание с присваиванием
%= остаток от деления с присваиванием
<<= сдвиг влево с присваиванием
>>= сдвиг вправо с присваиванием
&= поразрядная конъюнкция с присваиванием
|= поразрядная дизъюнкция с присваиванием
^= поразрядное исключающее ИЛИ с присваиванием
Другие операции
?: условная операция
, последовательное вычисление
sizeof определение размера
(тип) преобразование типа
     

Операции присваивания

Обычная операция присваивания имеет вид:

имя_переменной=значение;

где значение это выражение, переменная, константа или функция.

Выполняется операция так.

Сначала вычисляется значение выражения указанного в правой части оператора, а затем его результат записывается в область памяти, имя которой указано слева.

Например, запись a=b означает, что переменной а присваивается значение b.

Если a и b переменные разных типов, происходит преобразование типов: значение в правой части преобразуется к типу переменной левой части. Следует учитывать, что при этом можно потерять информацию или получить другое значение.

В С++ существует возможность присваивания нескольким переменным одного и того же значения. Такая операция называется множественным присваиванием:

имя1=имя2=…=имяN=значение;

Например

a=b=c=3.14159/6;

Операции +=, –=, *=, /= называют составным присваиванием.

В таких операциях при вычислении выражения стоящего справа используется значение переменной из левой части.

Например:

x+=p; //Увеличение x на p,

//то же что и x=x+p.

x-=p; //Уменьшения x на p,

//то же что и x=x-p.

x*=p; //Умножение x на p,

//то же что и x=x*p.

x/=p; //Деление x на p,

//то же что и x=x/p.

Арифметические операции

Операции +, -, *, / относят к арифметическим операциям. Их назначение понятно и не требует дополнительных пояснений.

Операции инкремента ++ и декремента -- так же причисляют к арифметическим, так как они выполняют увеличение и уменьшение на единицу значения переменной.

Эти операции имеют две формы записи

· префиксную (операция записывается перед операндом),

· постфиксную (операция записывается после операнда).

Например,

Оператор Форма
префиксная постфиксная
p=p+1; ++p; p++;

Если знак декремента (инкремента) предшествует операнду, то сначала выполняется увеличение (уменьшение) значения операнда, а затем операнд участвует в выражении.

Например,

x=12;

y=++x; //В переменной y

//будет храниться

//значение 13.

Если знак декремента (инкремента) следует после операнда, то сначала операнд участвует в выражении, а затем выполняется увеличение (уменьшение) значения операнда:

x=12;

y=x++; //Результат –

//число 12 в переменной y.

Операции целочисленной арифметики

Операция целочисленного деления / возвращает целую часть частного (дробная часть отбрасывается) в том случае если она применяется к целочисленным операндам, в противном случае выполняется обычное деление:

11/4=2 или 11.0/4=2.75.

Операция остаток от деления % применяется только к целочисленным операндам: 11%4 = 3.