Литмир - Электронная Библиотека
A
A

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

 

Программирование. Принципы и практика использования C++ Исправленное издание - _002.png
 Для того чтобы понять программу, надо на время стать “компьютером”, т.е. умозрительно выполнять программу строка за строкой. Просто нарисуйте квадратики на бумаге, записывайте в них значения и изменяйте их так, как указано в программе.

ПОПРОБУЙТЕ

Выполните эту программу самостоятельно, записывая промежуточные результаты на лист бумаги. Для проверки используйте фразу “The cat cat jamped”. Даже опытные программисты используют этот прием для визуализации относительно неочевидных действий в небольших фрагментах кода.

ПОПРОБУЙТЕ

Запустите программу для выявления повторяющихся слов. Проверьте предложение “She she laughed He He because what he did did not look very very good good”. Сколько раз повторяются слова в этом предложении? Почему? Что значит слово в этой программе? А что значит повторяющееся слово? (Например, “She she” — это повтор или нет?).

3.6. Составные операторы присваивания

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

++counter

означает

counter = counter + 1

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

<b>7</b>
, вычесть
<b>9</b>
или умножить на
<b>2</b>
. Такие операции также непосредственно поддерживаются в языке С++. Рассмотрим пример.

a += 7; // означает a = a+7

b –= 9; // означает b = b–9

c *= 2; // означает c = c*2

В целом для любого бинарного оператора

oper
выражение
a oper= b
означает
a= a oper b
(см. раздел А.5). Благодаря этому правилу можно составить операторы
+=
,
–=
,
*=
,
/=
и
%=
. Эта компактная запись позволяет просто и ясно выражать свои идеи. Например, во многих приложениях операторы
*=
и
/=
означают масштабирование.

3.6.1. Пример: поиск повторяющихся слов

Вернемся к программе, выявляющей повторяющиеся соседние слова. Ее можно улучшить, если мы сможем определять место повторяющегося слова. Например, можно просто подсчитывать и выводить на экран количество повторяющихся слов.

int main()

{

  int number_of_words = 0;

  string previous = &quot; &quot;;  // не слово

  string current;

  while (cin &gt;&gt; current) {

    ++number_of_words;    // увеличиваем счетчик слов

    if (previous == current)

      cout &lt;&lt; &quot; количество слов &quot; &lt;&lt; number_of_words

      &lt;&lt; &quot; repeated: &quot; &lt;&lt; current &lt;&lt; '\n';

    previous = current;

  }

}

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

++number_of_words;

Таким образом, первое слово имеет номер 1, второе — 2 и т.д. Эту операцию можно записать иначе:

number_of_words += 1;

или даже так:

number_of_words = number_of_words+1;

но выражение 

++number_of_words
 короче и выражает идею инкрементации намного проще. 

 

Программирование. Принципы и практика использования C++ Исправленное издание - _002.png
 Обратите внимание на то, как эта программа похожа на пример из раздела 3.5.1. Очевидно, что мы просто взяли программу из раздела 3.5.1 и слегка переделали ее для своих целей. Этот способ очень распространен: если нам нужно решить какую-то задачу, мы ищем похожую и используем готовое решение, внося в него необходимые изменения. Не начинайте разработку программы с нуля, если есть такая возможность. Использование предыдущего варианта программы в качестве основы для модификации часто экономит много времени и сил.

3.7. Имена

Мы даем своим переменным имена, чтобы запоминать их и ссылаться на них в других частях программы. Какие сущности могут иметь имена в языке С++? В программе на языке С++ имя начинается с буквы и содержит только буквы, цифры и символ подчеркивания. Приведем несколько примеров.

x

number_of_elements

Fourier_transform

z2

Polygon

Приведенные ниже слова не являются именами.

2x             // имя должно начинаться с буквы

time$to$market // символ $ — не буква, не цифра и не подчеркивание

Start menu     // пробел — не буква, не цифра и не подчеркивание

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

 

Программирование. Принципы и практика использования C++ Исправленное издание - _003.png
 Если заглянуть в системные коды или коды, сгенерированные машиной, то можно увидеть имена, начинающиеся с символа подчеркивания, например
_foo
. Никогда не называйте так свои переменные; такие имена зарезервированы для целей реализации и системных сущностей. Таким образом, если вы не будете начинать имена своих переменных символом подчеркивания, то сможете избежать конфликтов с системными именами.

Имена чувствительны к регистру; иначе говоря, буквы, набранные в нижнем и верхнем регистрах, отличаются друг от друга, так что

x
и
X
— это разные имена. Приведем небольшую программу, в которой сделано по крайней мере четыре ошибки.

37
{"b":"847443","o":1}