Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на экзаменационные вопросы(все развернут....doc
Скачиваний:
25
Добавлен:
25.12.2018
Размер:
1.12 Mб
Скачать

Старшинство операций

При выполнении арифметических операций в C++ необходимо знать, что C++ выполняет операции в определенном порядке, основанном на старшинстве операций. Например, операция умножения выполняется до сложения. Чтобы лучше понять старшинство операций, рассмотрите следующие выражения:

result =5+2*3;

В зависимости от порядка, в котором C++ выполняет умножение и сложение, результат будет разным:

result =5+2*3;  =7*3;  = 21;  result =5+2*3;  =5+6;  = 11;

Чтобы избежать путаницы, C++ присваивает каждой операции приоритет, который определяет порядок выполнения операций. Так как C++ выполняет операции в определенном порядке, то и ваши программы будут проводить арифметические вычисления соответствующим образом.

Таблица 5.3 перечисляет старшинство операций C++. Операции, находящиеся в верхней части, имеют более высокий приоритет. Операции внутри каждой части имеют одинаковый приоритет. Если вы рассмотрите таблицу, то увидите, что в C++ умножение имеет более высокий приоритет, чем сложение. Вы не знакомы со многими операциями, представленными в таблице. В настоящее время не думайте об этих операциях. К концу изучения этой книги вы сможете использовать (и понять) каждую из них!

Таблица 5.3. Старшинство операций в C++.

Операция

Имя

Пример

:: Разрешение области видимости classname::classmember_name

::

Глобальное разрешение

::variable_name

.

Выбор элемента

object.member_name

->

Выбор элемента

pointer->membername

[]

Индексация

pointer[element]

()

Вызов функции

expression(parameters)

()

Построение значения

type(parameters)

sizeof

Размер объекта

sizeof expression

sizeof

Размер типа

sizeof(type)

++

Приращение после

variable++

++

Приращение до

++variable

--

Уменьшение после

variable--

--

Уменьшение до

-- variable

&

Адрес объекта

&variable

*

Разыменование

*pointer

new

Создание (размещение)

new type

delete

Уничтожение (освобождение) delete pointer

delete[]

Уничтожение массива

delete pointer

~

Дополнение

~expression

!

Логическое НЕ

! expression

+

Унарный плюс

+1

-

Унарный минус

-1

()

Приведение

(type) expression

.*

Выбор элемента

object.*pointer

->

Выбор элемента

object->*pointer

*

Умножение

expression * expression

/

Деление

expression / expression

%

Взятие по модулю

expression % expression

+

Сложение (плюс)

expression + expression

-

Вычитание (минус)

expression expression

Логическая операция "исключающее или" в языке С.      Кроме трех расмотренных выше классических логических операций в языке С используется еще четвертая логическая операция: "исключающее или".      Если обычно принято  операцию логическое умножение обозначать как "X AND Y",  операцию логическое сложение как "X OR Y", а логическое отрицание как "NOT X", то операцию "исключающее или" обозначают как "X XOR Y".      Сделаем одно очень выжное замечание. Оно касается логической операции XOR. В языке С нет знака логической операции XOR. Однако, она может быть реализована с помощью операций AND, OR и NOT. Покажем теперь таблицу истинности этой новой логической операции в языке С.        1 XOR 1 = 0       0 XOR 1 = 1       1 XOR 0 = 1       0 XOR 0 = 0     Отсюда видно, что, если оба входящих в выражение высказывания истинны или оба ложны, то есть однакового значения истинности, то результат будет в этом случае ложным. То есть как бы отрицается утверждение: оба высказывания имеют одинаковый смысл истинности.      Напротив, если оба высказывания имеею разный смысл истинности, то в результате операции "исключающее или" это отрицается. Поэтому и выходит, что результат будет равен истине.  Приоритет выполнения логических операций.      Логические операции и операции отношения имеют более низкий приоритет, чем арифметические операции. Это значит, что выражение 200>120+50 равносильно выражению 200>(120+50).      Принято следующее старшинство операций отношения и логических операций:        ! - самая старшая из логических операций  Далее старшинство операций распределяется так:        >       <       >=       <= . Затем уже идут операции:       ==       != и самая младшая операция - это ||.      В логических выражениях можно использовать скобки, которые имеют наивысший приоритет. Это положение известно еще из арифметики. Оно сохраняется и здесь. Использование скобок делает выражение более понятным и удобным для чтения. Поэтому рекомекндуется использовать скобки. Условные и логические выражения часто используются в операторе условного перехода if и в других операторах.      Отметим еще одну очень важную особенность операторов && и ||. Если при вычислении операции X && Y первое выражение X окажется нулевым (то есть ложным), то значение второго выражения Y никак не повлияет на результат. Это следует из таблицы истинности операции логическое умножение. Смотрите таблицу истинности этой операции. Поэтому действительно можно игнорировать второе выражение. Аналогично обстоит дело и с оператором ||. Так, если значение первого операнда ненулевое, то значение второго операнда так же не влияет на результат. Потому он так же не вычисляется и игнорируется. Это также следует из таблицы истинности операции логическое сложение. Поэтому нужно учитывать этот факт и не изменять во втором операторе какую-либо переменную, пользуясь операцией ++. 

    Язык С имеет ровно шесть операции отношения. Почему их так называют? Дело в том, что обычно относительно двух величин, например, величины А и величины В, можно с определенностью сказать, что друг по отношению к другу они: или равны, то есть находятся в отношении равенства А=В, или не равны, то есть находятся в отношениях неравенства А не = В. Но тогда в последнем случае можно уточнять и думать уже о том, какая из этих двух величин больше и какая меньше. Тут может быть одна из двух возможностей: либо А<В, либо А>В. Иногда еще рассматривают такое отношение, в котором есть доля неопределенности, например, когда говорят, что А<=В, либо, когда А>=В. Сведем эти соотношения между двумя величинами в одну таблицу. Получим следующее:

"<" - меньше.

"<=" - меньше или равно.

">" - больше.

">=" - больше или равно.

"==" - равно.

"!=" - не равно.

Таким образом, А по отношению к В может быть: либо меньше, либо меньше или равно; либо больше, либо больше или равно; либо равно, либо не равно. Другого нам просто не дано.      Операции отношения используются в условных выражениях. Например, простейшие условия, которые не содержат логических операций, это следующие: "a<0", "1998>2003", "b==B", "C!=D" и так далее.      Следует отметить, что относительно каждого условия решается вопрос: истинно оно или нет. В языке С отсутствует логический (boolean) тип. Поэтому при анализе истинности выражения, содержащего операции отношения, принято находить целочисленное арифметическое значение выражения. При этом считается, что истинность, то есть "true" соответствует ненулевому значению выражения. Обычно для "true" принято значение 1. Тогда 0 принимается за "false", то есть ложь.  Ф

  1. Условный оператор, оператор выбора в С++.

Условный оператор используется для реализации разветвлений на два направления в программе, которые происходят при выполнении некоторого условия и имеет следующую структуру

If (выражение) оператор_1 ; [else оператор_2]

Сначала выполняется выражение которое может иметь арифметический тип или тип указателя. Если оно не равно 0 (имеет значение true), выполняется первый оператор, иначе - второй. После этого управление передается на оператор следующий за условным. Одна из ветвей может отсутствовать.

if (a<b && (a>d || a==0)) b++; else {b*=a; a=0;}

Кроме условного оператора в качестве управляющей структуры довольно часто используется оператор выбора CASE. Эта структура позволяет переходить на одну из ветвей в зависимости от значения заданного выражения (селектора выбора). Ее особенность состоит в том, что выбор решения здесь осуществляется не в зависимости от истинности или ложности условия, а является вычислимым. Оператор выбора позволяет заменить несколько операторов развилки (в силу этого его ещё называют оператором множественного ветвления).

В конструкции CASE вычисляется выражение K и выбирается ветвь, значение метки которой совпадает со значением K. После выполнения выбранной ветви происходит выход из конструкции CASE. Если в последовательности нет метки со значением, равным K, то управление передается внешнему оператору, следующему за конструкцией CASE (в случае отсутствия альтернативы ELSE; если она есть, то выполняется следующий за ней оператор, а уже затем управление передается внешнему оператору).

Оператор switch (переключатель) используется для разветвления процесса вычислений на несколько направлений

Структурная схема:

Switch (<выражение или переменная>){ case <constant_1>: <последовательность операторов>; break;

case<constant _n>: <последовательность операторов>;<break>;

default:<последовательность операторов >

}

  1. Операторы циклов. Пример вычисления факториала числа со всеми операторами цикла.

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

Итерация – один проход цикла (проверка условий осуществляется на каждой итерации)

Цикл с предусловием (while)

While(выражение) оператор

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

Цикл с постусловием (do while)

Do оператор while

Сначала выполняется простой оператор, составляющий тело цикла, а затем вычисляется выражение. Если оно истинно тело цикла выполняется еще раз. Цикл прекратится когда выражение станет равно false. Используется когда цикл требуется обязательно выполнить хотя бы один раз(например если в цикле производится ввод данных)

Цикл с параметром (for)

For (инициализация; выражение; модификации) оператор;

Инициализация – присвоение начального значения параметру цикла

Выражение определяет условие выполнения цикла

Модификации – выполняются после каждой итерации и служат для изменения параметров цикла

Пример вычисления факториала числа:

#include <iostream.h>

#include <windows.h>

char* Rus(const char* text);

void main(void)

{

int i, n ; long fact = 1;

cout <<Rus("Введите любое натуральное число: ");

cin >> n;

i = 1;

while (i <= n)

{ fact = fact*i;

i++;

}

cout << n << "! ="<< fact<<"\n";

}

char bufRus[256];

char* Rus(const char* text){

CharToOem(text,bufRus);

return bufRus;

}

  1. Понятие массива, объявление массива в С++.

Массив – конечная именованная последовательность однотипных величин (это одна из наиболее простых структур данных.)

Объявление массива: тип<имя массива>[размер1][размер2]...[размер N];

В языке С нумерация элементов начинается с нуля. То есть миниальный неотрицательный индекс элемента есть число - ноль. Таким образом, всегда первый элемет массива - это элемент с нулевым номером. Предположим, что Вы объявили массив  int a[100];      Это означает, что массив содержит следующие элементы: a[0], a[1], a[2],..., и так далее, a[99]. Легко подсчитать, сколько байт памти потребуется под одномерный массив.

Количество байт = <размер базового типа> * <количество элементов в массиве>

Размерность может быть задана целой положительноый константой или константным выражением

Строка – массив символов, заканчивающихся нуль – символом.(символом с кодом 0)

Массивы:

Динамические(создаются с помощью операции NEW)

int n=100

float*p=new float [n]

Многомерные а[][][] и тд.

Вот как устанавливаются размеры массивов с помощью констант:  #define iARRAY_MAX 20  #define fARRAY_MAX 15 int iarray[iARRAY_MAX];  char farray[fARRAY_MAX]; 

  1. Вложенные циклы. Пример программы сортировки одномерного массива.

Когда один цикл находится внутри другого, то говорят, что это вложенные циклы. Часто вложенные циклы используются при работе с таблицами чисел (матрицами). Вложенными могут быть любые типы циклов .

При выполнении вложенных циклов быстрее работает внутренний цикл. Для примера рассмотрим следующие вложенные циклы:

for ( i=1 ; i<=5; i++ )

for ( j=1 ; j<= 4; j++ )

sum+=a [i] [j];

Сортировка массива методом выбора (выбирается наименьший элемент массива и местами с первым элементом, затем рассматриваются элементы, начиная со второго, и наименьший из них меняется местами со вторым элементом и так далее n-1 раз)

#include<iostream.h>

int main ()

{

const int n=20; // количество элементов массива

int b[n]; // описание массива

int i;

for(i=0;i<n;i++) cin>>b[n]; //вывод массива

for(i=0;i<n-1;i++){ //т-1 раз ищем наименьший элемент

//принимаем за наименьший первый из рассматриваемых элементов:

int imin = i;

//поиск номера минимального элемента из неупорядоченных:

for(int j=i+1;j<n;j++)

//если нашли меньший элемент запоминаем его номер:

if(b[j]<b[imin]) imin=j;

int a=b[i];

b[i]=b[imin];

b[imin]=a;

}

//вывод упорядоченного массива:

for(i=0;i<n;i++)cout<< b[i]<< " ";

return 0;

}

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

Указатель (pointer) - переменная, предназначенная для хранения адресов областей памяти

  • указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа; формат указателя на объект: тип *имя

  • указатель на функцию содержит адрес по которому передается управление при вызове функции. Он используется для косвенного вызова функции, а также для передачи имени функции в другую функцию в качестве параметра. Формат указателя функции: тип (*имя) (список аргументов)

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

Операции над указателями:

  • Операция разадресации (разименования) предназначена для доступа к величине, адрес которой хранится в указателе. Эту операцию можно использовать как для получения, так и для изменения значения величины.

char a;

char *p=new char;

* p=‘IO’; a=*p;

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

Инкремент перемещает указатель к следующему элементу массива, а декремент к предыдущему.

short * p=new short [5];

p++;

long * q=new long [10];

q++;

Разность двух указателей – это разность их значений, деленная на размер типа в байтах.

Когда компилятор обрабатывает оператор определения переменной (например int a =10), он выделяет в память с соответствующим типом (int) и инициализирует ее указанным значением (10)

Указатели предназначены для хранения адресов областей памяти.

Указатели С++

  1. Способы инициализации указателей. Связь массивов и указателей.

Указатели чаще всего используются при работе с динамической памятью. Доступ к выделенным участкам динамической памяти осуществляется только через указатели. Инициализация указателей (присвоение начального значения) выполняется при определении указателя:

  1. присваивание указателю адреса существующего объекта:

  • с помощью операции получения адреса:

int a=4;

int *p=&a;

int *p=(&a);

  • с помощью значения другого указателя:

int * r=p;

  • с помощью имени массива :

int b[10];

int* t=b; // присвоение адреса начала массива b

  1. Выделение участка динамической памяти и присваивание ее адреса указателю:

  • с помощью операции new:

int* n=new int;

int *m=new int (10);

int * q=new int[10];

Освобождение памяти, выделенной с помощью new выполняется с помощью оператора delete.

delete n; delete m; delete [] q;

Связь массивов и указателей.

Динамические массивы создаются с помощью операции new, при этом надо указать тип и размерность.

int n=100;

float *q=new float [n];

Инициализация указателей:

Присваивание указателю адреса существующего объекта:

С помощью операции получения адреса

int a = 5 // целая постоянная

int*p = &a // в указатель записан адрес а

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

Int*r = p

С помощью имени массива или функции, которая трактуется как адрес

2. Присваивание указателю адреса области памяти в явном виде:

Char*vp=(char*)0*B800000 // шестнадцатеричная константа, (char* - операция приведения типа)

3. Присваивание пустого значения

Int*suxx = null //null это константа определенная в заголовке

Int*rulez = 0

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

- с помощью операции new:

Int*n=new int

- с помощью функции malloc:

Int*u=(int*)malloc(sizeof(int))

Если справа от имени имеются [] – это массив, если () – это функция.

Если слева есть * - это указатель на проинтерпретированную ранее конструкцию.

Если справа закрывающаяся круглая скобка необходимо применить приведенные выше правила внутри скобок, а затем переходить наружу.

В очередь интерпретируется спецификатор типа.

Операции с указателями:

Операции разадресации. (доступ к величине адрес которой хранится в указателе)

Char a; // переменная типа char

Char*p = new char; // выделение памяти под указатель и дин. Переменную типа char

*p=”Ю”; a=*p; // присваивание значения обеим переменным

Арифметические операции (сложение, вычитание, инкремент, декремент)

Инкремент – перемещает указатель к следующему элементу массива, а декремент

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

  1. Динамическое выделение памяти.

Ы Функцию можно рассматривать как операцию, определенную пользователем. В общем случае она задается своим именем. Операнды функции, или формальные параметры, задаются в списке параметров, через запятую. Такой список заключается в круглые скобки. Результатом функции может быть значение, которое называют возвращаемым. Об отсутствии возвращаемого значения сообщают ключевым словом void. Действия, которые производит функция, составляют ее тело; оно заключено в фигурные скобки. Тип возвращаемого значения, ее имя, список параметров и тело составляют определение функции

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

Функции группируют связанные операторы для выполнения определенной задачи.

• Ваша программа вызывает функцию, обращаясь к ее имени, за которым следуют круглые скобки, например bеер ().

• После завершения обработки большинство функций возвращают значение определенного типа, например int или float, которое программа может проверить или присвоить переменной.

• Ваши программы передают параметры (информацию) функциям, например имя, возраст или оклад служащего, заключая параметры в круглые скобки, которые следуют за именем функции.

• C++ использует прототипы функций для определения типа возвращаемого функцией значения, а также количества и типов параметров, передаваемых функции.

Функция C++ по структуре подобна программе main, которую вы использовали во всех предыдущих программах. Другими словами, имя функции предваряется ее типом, а за ним следует список параметров, описание которых появляется в скобках. Вы группируете операторы функций внутри левой и правой фигурных скобок, как показано ниже:

тип_возврата имя_функции (список_параметров)

{

объявления_переменных;  операторы;

}

#include <iostream.h>

void show_title (void)

{     cout << "Книга: Учимся программировать на C++" << endl;  }

void show_lesson (void)  {     cout << "Урок: Знакомство с функциями" << endl;  }

void main (void)  {     show_title ();     show_lesson ();  }

Когда программа начинает выполнение, она сначала вызывает функциюshow_title, которая выводит сообщение с помощью cout. После завершенияshow_title программа вызывает функцию show_lesson, также выводящую сообщение. После завершения show_lesson программа завершается, поскольку в main больше нет операторов.

Функция Представляет собой набор связанных операторов, которые Выполняют определенную задачу. Создавая функции внутри программы, вы можете делить большие задачи на небольшие легко управляемые части.  Ваши программы выполняют операторы функций посредством вызова функции. Для вызова функции программы просто обращаются к имени функции, за которым следуют круглые скобки, как показано ниже:

function_name();

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

payroll(employee_name, employee_id, salary);