Cpp Инструкция if

#Ulan

Пользователь
Регистрация
12.03.2015
Сообщения
0
Репутация
14
Баллы
3
Уровень
0
Адрес
Бухара
Веб-сайт
pawno.uz
Лучшие ответы
0
Инструкция if обеспечивает выполнение или пропуск инструкции или блока в зависимости от условия. Ее синтаксис таков:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
условие заключается в круглые скобки. Оно может быть выражением, как в этом примере:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
или инструкцией объявления с инициализацией:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Область видимости объекта, объявленного в условной части, ограничивается ассоциированной с if инструкцией или блоком. Например, такой код вызывает ошибку компиляции:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Попробуем для иллюстрации применения инструкции if реализовать функцию min(), возвращающую наименьший элемент вектора. Заодно наша функция будет подсчитывать число элементов, равных минимуму. Для каждого элемента вектора мы должны проделать следующее:

1. Сравнить элемент с текущим значением минимума.
2. Если элемент меньше, присвоить текущему минимуму значение элемента и сбросить счетчик в 1.
3. Если элемент равен текущему минимуму, увеличить счетчик на 1.
4. В противном случае ничего не делать.
5. После проверки последнего элемента вернуть значение минимума и счетчика.
Необходимо использовать две инструкции if:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Довольно часто программист забывает использовать фигурные скобки, если нужно выполнить несколько инструкций в зависимости от условия:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Такую ошибку трудно увидеть, поскольку отступы в записи подразумевают, что и minVal=ivec, и occurs=1 входят в одну инструкцию if. На самом же деле инструкция
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
не является частью if и выполняется безусловно, всегда сбрасывая occurs в 1. Вот как должна быть составлена правильная if-инструкция (точное положение открывающей фигурной скобки является поводом для бесконечных споров):
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Вторая инструкция if выглядит так:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Заметим, что порядок следования инструкций в этом примере крайне важен. Если мы будем сравнивать minVal именно в такой последовательности, наша функция всегда будет ош****ься на 1:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Выполнение второго сравнения не обязательно: один и тот же элемент не может одновременно быть и меньше и равен minVal. Поэтому появляется необходимость выбора одного из двух блоков в зависимости от условия, что реализуется инструкцией if-else, второй формой if-инструкции. Ее синтаксис выглядит таким образом:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
инструкция1 выполняется, если условие истинно, иначе переходим к инструкция2. Например:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Здесь инструкция2 сама является if-инструкцией. Если minVal меньше ivec, никаких действий не производится.
В следующем примере выполняется одна из трех инструкций:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Составные инструкции if-else могут служить источником неоднозначного толкования, если частей else больше, чем частей if. К какому из if отнести данную часть else? (Эту проблему иногда называют проблемой висячего else). Например:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Судя по отступам, программист предполагает, что else относится к самому первому, внешнему if. Однако в С++ неоднозначность висячих else разрешается соотнесением их с последним встретившимся if. Таким образом, в действительности предыдущий фрагмент означает следующее:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Одним из способов разрешения данной проблемы является заключение внутреннего if в фигурные скобки:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
В некоторых стилях программирования рекомендуется всегда употре***** фигурные скобки при использовании инструкций if-else, чтобы не допустить возможности неправильной интерпретации кода.
Вот первый вариант функции min(). Второй аргумент функции будет возвращать количество вхождений минимального значения в вектор. Для перебора элементов массива используется цикл for. Но мы допустили ошибку в логике программы. Сможете ли вы заметить ее?
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Обычно функция возвращает только одно значение. Однако согласно нашей спецификации в точке вызова должно быть известно не только само минимальное значение, но и количество его вхождений в вектор. Для возврата второго значения мы использовали параметр типа ссылка. (Параметры-ссылки рассматриваются в разделе 7.3.) Любое присваивание значения ссылке occurs изменяет значение переменной, на которую она ссылается:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Альтернативой использованию параметра-ссылки является применение объекта класса pair, представленного в разделе 3.14. Функция min() могла бы возвращать два значения в одной паре:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
К сожалению, и эта реализация содержит ошибку. Где же она? Правильно: мы инициализировали minVal нулем, поэтому, если минимальный элемент вектора больше нуля, наша реализация вернет нулевое значение минимума и нулевое значение количества вхождений.
Программу можно изменить, инициализировав minVal первым элементом вектора:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Теперь функция работает правильно. Однако в ней выполняются некоторые лишние действия, снижающие ее эффективность.
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Поскольку ix инициализируется нулем, на первой итерации цикла значение первого элемента сравнивается с самим собой. Можно инициализировать ix единицей и избежать ненужного выполнения первой итерации. Однако при оптимизации кода мы допустили другую ошибку (наверное, стоило все оставить как было!). Сможете ли вы ее обнаружить?
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Если ivec[0] окажется минимальным элементом, переменная occurs не получит значения 1. Конечно, исправить это очень просто, но сначала надо найти ошибку:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
К сожалению, подобного рода недосмотры встречаются не так уж редко: программисты тоже люди и могут ошибаться. Важно понимать, что это неизбежно, и быть готовым тщательно тестировать и анализировать свои программы.
Вот окончательная версия функции min() и программа main(), проверяющая ее работу:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Результат работы программы:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
В некоторых случаях вместо инструкции if-else можно использовать более краткое и выразительное условное выражение. Например, следующую реализацию функции min():
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
можно переписать так:
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
Длинные цепочки инструкций if-else, подобные приведенной ниже, трудны для восприятия и, таким образом, являются потенциальным источником ошибок.
C++:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержания кодов!
В качестве альтернативы таким цепочкам С++ предоставляет инструкцию switch.

Статью подготовил:
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержимого URL-адресов!
Специально для
Пожалуйста, Войдите или Зарегистрируйтесь для просмотра содержимого URL-адресов!

 
Последнее редактирование модератором:

Retag

Пользователь
Регистрация
23.12.2015
Сообщения
0
Репутация
1
Баллы
0
Уровень
0
Лучшие ответы
0
Ждем задач
 

Retag

Пользователь
Регистрация
23.12.2015
Сообщения
0
Репутация
1
Баллы
0
Уровень
0
Лучшие ответы
0
Как бы дополнительные задачи чтобы укрепить полученные знания, и чтобы проверял кто-то их, было-бы хорошо.