Составной оператор, или блок 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Составной оператор, или блок



Составной оператор (называемый также "блок", что эквивалентно) дает возможность использовать несколько операторов в том месте, где предполагается использование одного:

          составной_оператор:          { список_описаний opt список_операторов opt }          список_описаний:          описание          описание список_описаний          список_операторов:          оператор          оператор список_операторов

Если какой-либо из идентификаторов в списке_описаний был ранее описан, то внешнее описание выталкивается на время выполнения блока, и снова входит в силу по его окончании.

Каждая инициализация auto или register переменных производится всякий раз при входе в голову блока. В блок делать передачу; в этом случае инициализации не выполняются. Инициализации переменных, имеющих класс памяти static осуществляются только один раз в начале выполнения программы.

Условный оператор

Есть два вида условных операторов

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

В обоих случаях вычисляется выражение, и если оно не ноль, то выполняется первый подоператор. Во втором случае второй подоператор выполняется, если выражение есть 0. Как обычно, неоднозначность "else" разрешается посредством того, что else связывается с последним встреченным if, не имеющим else.

Оператор whilе

Оператор while имеет вид

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

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

Оператор dо

Оператор do имеет вид

          do оператор while (выражение);

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

Оператор for

Оператор for имеет вид

          for (выражение_1 opt; выражение_2 opt; выражение_3 opt)          оператор

Этот оператор эквивалентен следующему:

          выражение_1;          while                                       (выражение_2)                                                                  {                                                           оператор                                                       выражение_3;          }

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

Каждое или все выражения могут быть опущены. Отсутствие выражения_2 делает подразумеваемое while-предложение эквивалентным while(1); остальные опущенные выражения просто пропускаются в описанном выше расширении.

Оператор switch

Оператор switch вызывает передачу управления на один из нескольких операторов в зависимости от значения выражения. Он имеет вид

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

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

          case константное_выражение:

где константное выражение должно иметь тот же тип что и выражение- переключатель; производятся обычные арифметические преобразования. В одном операторе switch никакие две константы, помеченные case, не могут иметь одинаковое значение.

Может также быть не более чем один префикс оператора вида

          default:

Когда выполнен оператор switch, проведено вычисление его выражения и сравнение его с каждой case константой. Если одна из констант равна значению выражения, то управление передается на выражение, следующее за подошедшим префиксом case. Если никакая case константа не соответствует выражению, и есть префикс default, то управление передается на выражение, которому он предшествует. Если нет соответствующих вариантов case и default отсутствует, то никакой из операторов в операторе switch не выполняется.

Префиксы case и default сами по себе не изменяют поток управления, который после задержки идет дальше, перескакивая через эти префиксы. Для выхода из switch.

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

Оператор break

Оператор

          break;

прекращает выполнение ближайшего охватывающего while, do, for или switch оператора; управление передается на оператор, следующий за законченным.

Оператор contiпие

Оператор

          continue;

вызывает передачу управления на управляющую продолжением цикла часть наименьшего охватывающего оператора while, do или for; то есть на конец петли цикла. Точнее, в каждом из операторов

          while (...)    do             for (...)          {              {              {         ...           ...           ...          contin:;       contin:;       contin:;          }              }              }                         while (...);

continue эквивалентно goto contin.

Оператор returп

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

           return;          return выражение;

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

Оператор gotо

Можно осуществлять безусловную передачу управления с помощью оператора

           goto идентификатор;

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

Помеченные операторы

Перед любым оператором может стоять префикс метка, имеющий вид

          идентификатор:

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

Пустой оператор

Пустой оператор имеет вид

         ;

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

Оператор deletе

Оператор delete имеет вид

          delete выражение;

Результатом выражения должен быть указатель. Объект, на который он указывает, уничтожается. Это значит, что после оператора уничтожения delete нельзя гарантировать, что объект имеет определенное значение; Эффект от применения delete к указателю, не полученному из операции new не определен. Однако, уничтожение указателя с нулевым значением безопасно.

Оператор asм

Оператор asm имеет вид

          asm (строка);

Смысл оператора asm не определен. Обычно он используется для передачи информации через компилятор ассемблеру.

 

Массивы. Разработка программ с использованием одномерных и двумерных массивов.

Массивтер. Бірөлшемді және екіөлшемді массивтерді қолдану арқылы программаны өңдеу.

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

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

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

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

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

Описание массива

В C++ можно определить массив любого типа.

int mas[3];

Описан массив из 3 целых чисел.

Нумерация в массивах начинается с 0-го элемента. Поэтому массив mas содежит: mas[0], mas[1], mas[2]

Массив можно инициализировать при описании. В этом случае нет необходимости указывать его размер.

int mas[]={23, 25, 81};

Далее создан массив mas из 3-х элементов:

mas[0]= 23,

mas[1]= 25,

mas[2]= 81.

 

char city [ ] = "Москва";

Массив city будет содержать строку из 7 элементов: 6 букв и 0-символ. 0-символ является признаком конца строки, в программе он обозначается \0.

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

Можно описать название города по-другому.

char city1[ ] = {'М', 'о', 'с', 'к', 'в', 'а' }

Массив city1 - это массив символов, он будет содержать 6 элементов

Таблица 1.7.1.

City City1
0 М 0 М
1 О 1 о
2 С 2 с
3 К 3 к
4 В 4 в
5 А 5 а
6 /0    

Вышеописанный способ инициализации возможен только при объявлении массива. В программе используйте поэлементную инициализацию.

city [0]='м';

Кроме стандартного доступа к элементам массива C++ обеспечивает еще один. В C++ имя массива представляет собой не только имя, которое вы используете в своих программах, но и является адресом, по которому в памяти находится первый элемент массива. Поэтому к элементам массива можно обращаться следующими способами:

int m[6] = {4, 3, 1, 4, 7, 8 };

m[3] или (m + 3)[0]       Обращение к 4-му элементу массива.

 Возможны и другие варианты:

(m + 0)[3]

(m + 2)[1]

(m - 2)[5]

Наиболее полезно использовать такой подход к массивам, содержащим символьные строки.

Пример.

char names [ ]={'Иван', 'Петр', 'Елена' }

будет выглядеть в памяти следующим образом:

Таблица 1.7.2.

0 И
1 В
2 А
3 Н
4 \0
5 П
6 Е
7 Т
8 Р
9 \0
10 Е
11 Л
12 Е
13 Н
14 А
15 \0

Команда cout << names; выведет Иван (до признака конца строки)

cout << names+5; выведет Петр.

Многомерные массивы

Многомерные массивы - это массивы с более чем одним индексом.

Чаще всего используются двумерные массивы.

При описании многомерного массива необходимо указать C++, что массив имеет более чем одно измерение.

Пример 1.

int t[3][4];

Описывается двумерный массив, из 3 строк и 4 столбцов.

Элементы массива:

t[0][0] t[0][1] t[0][2] t[0][3]

t[1][0] t[1][1] t[1][2] t[1][3]

t[2][0] t[2][1] t[2][2] t[2][3]

При выполнении этой команды под массив резервируется место. Элементы массива располагаются в памяти один за другим.

Пусть это линейка памяти:

Рисунок 1.7.1.

Пример 2.

int temp [3] [15] [10];

резервируется место под 3-х мерный массив.

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

Рассмотрим на примере двумерного массива.

int a[3][2]={4, l, 5,7,2, 9};

Представляется в памяти:

Таблица 1.7.3.

a[0][0] заносится значение 4
a[0][1] заносится значение 1
a[1][0] заносится значение 5
a[1][1] заносится значение 7
a[2][0] заносится значение 2
a[2][1] заносится значение 9

Второй способ инициализации при описании массива

int а[3][2]={ {4,1}, {5, 7}, {2, 9} };

Обращение к элементу массива производится через индексы.

cout<< а[0][0];

Выдаст значение 4.

cout << a[1][1];

Выдаст знaчение 7.

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

#include <iostream.h>

main ()

{

int a[3] [2]={

{1,2}, {3,4}, {5,6}

};

int i,j;

for (i=0; i<=2; i++)

for(j=0;j<=l;j++)

 cout <<"\n a["<< i <<"," << j <<"] ="<< a[i]|j];

return 0;

}

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

#include < iostream.h>

#define I 3

#define J 2

main()

{ int a[I][J]={ {l,2}, {3,4}, {5,6} };

int i, j;

for (i=0; i< I; i++)

for(j=0; j< J; j++)

cout <<"\n a["<< i <<"," << j << "] ="<< a[i][j];

return 0;

}

При передаче массива в функцию всегда происходит передача его адреса. Т.о. в C++ все массивы передаются по адресу.

Пример.

Вводится квадратная матрица с максимальным размером 10 на 10. Ввод матрицы оформлен в виде отдельной функции vvod. Программа заменяет все отрицательные числа их модулями.

#include <iostream.h>

 

void vvod (int u[10][10], int n)

{

 int i,j;

 for (i=0; i<n; i++)

 { cout <<"\nVvedi "<< i<<" stroky";

for (j=0; j< n; j++)

cin>> u[i][j];

 }

}

 

void main()

{

int a[10][10];

int n,i,j,min;

cout<<"\nВведите количество строк и столбцов";

cin>>n;

vvod(a, n);

for (i=0; i< n; i++)

 for (j=0; j< n; j++)

if (a[i][j] < 0) a[i][j]=-a[i][j];

 

// Вывод матрицы

cout <<"\n";

for (i=0; i< n; i++)

{

for (j=0; j< n; j++)

cout<< u[i][j]<<" ";

cout<<"\n";

}

}

Принимающая функция получает не весь массив, а только адрес первого элемента массива. Несмотря на то, что в блоке main массив называется а, а в функции vvod - u это один и тот же массив.

Функции в Си. Создание и использование функций.Классы памяти и разработка программ.

Си-дегі функциялар. Функцияны құру және қолдану. Жадылар кластары ж ә не программаны өң деу.

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

Обязательными для функции являются два компонента: определение и вызовы.

 

Определение функции

Определение функции должно располагаться в глобальной области видимости, до начала функции main. Рассмотрим пример, простого определения:

 

int simple_function ()

{

return 0;

}

Определение функции состоит из заголовка и тела. Заголовок фукнции включает в себя:

Тип возвращаемого значения

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

 

int simple_function()

float simple_function()

char simple_function()

 

В первом случае функция должна вернуть целое число (int), во втором - вещественное число (float), а в третьем случае - символ (char).

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

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 34; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.147.104.120 (0.074 с.)