Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
52
Добавлен:
02.05.2014
Размер:
543.23 Кб
Скачать

1.4 Строки

Строковая константа - это последовательность символов, заключенная в двойные кавычки

"это строка"

Каждая строковая константа содержит на один символ боль­ше, чем кажется; все они заканчиваются пустым символом '\0' со значением 0. Например:

sizeof("asdf")==5;

Строка имеет тип "вектор из соответствующего числа сим­волов", поэтому "asdf" имеет тип char[5]. Пустая строка запи­сывается "" (и имеет тип char[1]). Заметьте, что для каждой строки s strlen(s)==sizeof(s)-1, поскольку strlen() не учиты­вает завершающий 0.

Соглашение о представлении неграфических символов с об­ратной косой можно использовать также и внутри строки. Это дает возможность представлять двойные кавычки и escape-сим­вол. Самым обычным символом этого рода является, безусловно, символ новой строки '\n'. Например:

cout << "гудок в конце сообщения\007\n"

где 7 - значение ASKII символа bel (звонок).

В строке невозможно иметь "настоящую" новую строку:

"это не строка,

а синтаксическая ошибка"

Однако в строке может стоять обратная косая, сразу после которой идет новая строка; и то, и другое будет проигнориро­вано. Например:

cout << "здесь все \

ok"

напечатает: здесь все ok

Новая строка, перед которой идет escape (обратная ко­сая), не приводит к появлению в строке новой строки, это просто договоренность о записи.

В строке можно иметь пустой символ, но большинство прог­рамм не будет предполагать, что есть символы после него. Нап­ример, строка "asdf\000hjkl" будет рассматриваться стандарт­ными функциями, вроде strcpy() и strlen(), как "asdf".

2. Оператор if

Формат оператора:

if (выражение) оператор-1; [else оператор-2;]

Выполнение оператора if начинается с вычисления выражения.

Далее выполнение осуществляется по следующей схеме:

- если выражение истинно (т.е. отлично от 0), то выполняется оператор-1.

- если выражение ложно (т.е. равно 0),то выполняется оператор-2.

- если выражение ложно и отсутствует оператор-2 (в квадратные скобки заключена необязательная конструкция), то выполняется следующий за if оператор.

После выполнения оператора if значение передается на следующий оператор программы, если последовательность выполнения операторов программы не будет принудительно нарушена испо Пример:

if (i < j) i++:

else { j = i-3; i++; }

Этот пример иллюстрирует также и тот факт, что на месте оператор-1, так же как и на месте оператор-2 могут находиться сложные конструкции.

Допускается использование вложенных операторов if. Оператор if может быть включен в конструкцию if или в конструкцию else другого оператора if. Чтобы сделать программу более читабельной, рекомендуется группировать операторы и конструкции во вложенных операторах if, используя фигурные скобки. Если же фигурные скобки опущены, то компилятор связывает каждое ключевое слово else с наиболее близким if, для которого нет else.

Билет 6

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

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

int MyArray1[10]; // Одномерный массив размерности 10.

int MyArray2[20][10]; // 20 одномерных массивов размерности 10.

int MyArray3[30][20][10]; // 30 двумерных массивов размерности 20*10.

По крайней мере, для Borland C++ 4.5, элементы многомерного массива располагаются в памяти в порядке возрастания самого правого индекса, т.е. самый младший адрес имеют элементы

MyArray1[0],

MyArray2[0][0],

MyArray3[0][0][0],

затем элементы

MyArray1[1],

MyArray2[0][1],

MyArray3[0][0][1]

и т.д.

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

int MyArray[3][3][3] = {0,1,2,3,4,5,6,7,8,9,10,11};

Начальные значения получают следующие элементы трёхмерного массива:

MyArray[0][0][0] == 0

MyArray[0][0][1] == 1

MyArray[0][0][2] == 2

MyArray[0][1][0] == 3

MyArray[0][1][1] == 4

MyArray[0][1][2] == 5

MyArray[0][2][0] == 6

MyArray[0][2][1] == 7

MyArray[0][2][2] == 8

MyArray[1][0][0] == 9

MyArray[1][0][1] == 10

MyArray[1][0][2] == 11

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

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

int MyArray[3][3][3] = {

{{0,1}},

{{100},{200,210},{300}},

{{1000},{2000,2100},{3000,3100,3200}}

};

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

MyArray[0][0][0] == 0

MyArray[0][0][1] == 1

MyArray[1][0][0] == 100

MyArray[1][1][0] == 200

MyArray[1][1][1] == 210

MyArray[1][2][0] == 300

MyArray[2][0][0] == 1000

MyArray[2][1][0] == 2000

MyArray[2][1][1] == 2100

MyArray[2][2][0] == 3000

MyArray[2][2][1] == 3100

MyArray[2][2][2] == 3200

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

int MyArray[ ][3][3] = {

{{0,1}},

{{100},{200,210},{300}},

{{1000},{2000,2100}}

};

Транслятор понимает, что речь идёт об определении массива размерности 3*3*3.

А в таком случае

int MyArray[ ][3][3] = {

{{0,1}},

{{100},{200,210},{300}},

{{1000},{2000,2100}},

{{10000}}};

предполагается размерность 4*3*3. В результате MyArray оказывается массивом из четырёх частично проинициализированных двумерных массивов. Следует помнить, что в C++ нет принципиальной разницы между массивом массивов произвольной размерности и обычным одномерным массивом. Потому и простор для творчества в деле инициализации многомерных массивов ограничивается левым индексом.

2. 2. Операция присваивания и ее разновидности (изменить и заменить).

СЛОЖНО: К операциям присваивания относятся все операции, которые меняют значение одного из операндов. В Си их целых три группы:

-обычное присваивание (=);

-присваивание, соединенное с одной их бинарных операций (+=, -=, *=, /=, %=, <<=, >>=, &=, |=, ^=);

-операции инкремента и декремента (увеличения и уменьшения на 1).

Операция присваивания "=" сохраняет значение выражения, стоящего в левой части, в переменной, а точнее, в адресном выражении, стоящем а правой части. Термин "АДРЕСНОЕ ВЫРАЖЕНИЕ" (или l-value) используется для обозначения тех выражений, которым соответствуют объекты (переменные) в памяти программы. На данном уровне знакомства со структурами данных -это простые переменные и элементы массивов.

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

long a; char b; int c;

a = b = c; // эквивалентно b = c; a = b;

В данном случае при первом (правом) присваивании тип int преобразуется к char, а результатом операции является значение переменной b типа char после выполнения этого присваивания.

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

a +=b; // эквивалентно a = a + b;

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

A[i++] +=b; // эквивалентно A[i] = A[i] + b; i++;

Операции инкремента и декремента увеличивают или уменьшают значение единственного операнда до или после использования его значения в выражении:

int a; // Эквивалент Интерпретация

a++; // Rez=a; a=a+1; Увеличить на 1 после использования

++a; // a=a+1; Rez=a; Увеличить на 1 до использования

a--; // Rez=a; a=a-1; Уменьшить на 1 после использования

--a; // a=a-1; Rez=a; Уменьшить на 1 до использования

ПРОСТО: Переменную можно изменять при помощи операции ПРИСВАИВАНИЯ.

В языке она обозначается знаком равенства.

x = 12 ;

Это читается не как "икс равно 12", а как "присвоить переменной икс значение 12".

Такая строка является простейшим ОПЕРАТОРОМ, то есть ДЕЙСТВИЕМ. В конце операторов ставится точка с запятой.

Рассмотрим оператор

x = x + 3;

Это не уравнение. Если рассматривать эту строку как математическое уравнение, оно не имеет решений. На самом деле тут написано:

1) "взять значение переменной ИКС"

2) "прибавить к нему 3"

3) "положить новое значение в переменную ИКС", стерев в ней прежнее значение.

У оператора присваивания есть две части: ЛЕВАЯ и ПРАВАЯ.

ЛЕВАЯ_ЧАСТЬ = ПРАВАЯ_ЧАСТЬ ;

В левой части обычно стоит просто имя переменной В КОТОРУЮ записывается вычисленный справа результат.

Если имя переменной встречается в ПРАВОЙ части, то это

означает "подставить сюда текущее значение этой переменной".

При этом текущее значение самой переменной НЕ изменяется, берется его копия. То есть, "вынутое из ящика значение" не оставляет ящик пустым! Вынимается копия, другая копия остается в ящике.

В правой части значение переменной может использоваться несколько раз:

z = x * x + 2 * x;

Тут есть две переменные:

z - для результата.

x - уже имеющая какое-то значение.

x * x означает "умножить икс на икс" (при этом само значение,лежащее в ящике икс не изменяется!)

x * 2 означает "взять два значения икс"

+ означает сложение.

В операторах присваивания используются такие сокращения:

ДЛИННАЯ ЗАПИСЬ СМЫСЛ СОКРАЩАЕТСЯ ДО

x = x + 1; "увеличить на 1" x++; (или ++x; )

x = x - 1; "уменьшить на 1" x--; (или --x; )

x = x + y; "прибавить y" x += y;

x = x * y; "умножить на y" x *= y;

x = x / y; "поделить на y" x /= y;

В том числе x++; можно записать как x += 1;

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

Соседние файлы в папке Програмки на C++