
- •2 Сравнительный анализ языков программирования высокого уровня Си и Паскаль
- •2.1 Структура программы
- •2.2.2 Пользовательские типы
- •2.3 Арифметические операции
- •Окончание таблицы 2.3.1
- •Окончание таблицы 2.3.2
- •2.4 Указатели и векторные типы данных
- •2.5.2 Операторы-переключатели
- •2.6.2 Безусловный переход
- •2.7 Пользовательские подпрограммы
- •2.8 Итоги анализа сравнения языков программирования Паскаль и Си
- •3.2 Реализация задания
- •3.3 Алгоритмы, реализованные в процессе решения задачи
2.5.2 Операторы-переключатели
Конструкция переключателя имеет несколько (две или более) ветвей. Переключатель выполняет одну заданную ветвь в зависимости от значения вычисляемого ключевого выражения. Принципиальным отличием этой инструкции от условного оператора является то, что выражение, определяющее выбор исполняемой ветви, возвращает не логическое, а целое значение, либо значение, тип которого может быть приведён к целому [12].
В языке Паскаль в переключателе допустимо использовать в качестве выражения переменные целого и символьного типа. В качестве меток переключения могут использоваться как константы указанных типов, так и диапазоны; переменные в качестве меток не допускаются. Синтаксис: на первое место выносится ключевое слово CASE, после которого следует выражение, завершающееся ключевым словом OF. После OF без дополнительных символов начинается перечисление меток переключения, указываемых как простые константные выражения. После самой метки следует через двоеточие оператор, выполняющийся для этой метки. В качестве метки «по умолчанию» при необходимости используют ключевое слово ELSE. Завершается оператор ключевым словом END.
В языке Си в качестве переключателя используется оператор switch. Синтаксис его описания следующий: вначале ставится ключевое слово switch, после которого в круглых скобках располагается выражение для переключения по меткам переключателя. Затем начинается тело переключателя, оформляемое фигурными скобками. Метки внутри тела переключателя обозначаются при помощи ключевого слова case, после которого располагают константное выражение или символьную переменную для определения значения метки. После ставится двоеточие и следует набор операторов, количество которых не ограничивается языком. Метка «по умолчанию» задается ключевым словом default.
У переключателей в Си есть особенность, которую можно охарактеризовать как «проваливание» [4]. Оно обрабатывается при помощи оператора break, использующегося для выхода из тела переключателя. В том случае, если в конце набора операторов метки и перед новой меткой нет оператора break, то управление перейдет к следующим операторам до первого оператора break либо до завершения тела переключателя. Эта особенность имеет как свои плюсы, так и свои минусы. К положительным качествам можно отнести то, что оно позволяет связать несколько случаев с одним действием; но в то же время оно обычно приводит к необходимости заканчивать каждый случай оператором break, чтобы избежать перехода к следующему случаю. Проваливание с одного случая на другой неустойчиво, поэтому не рекомендуется использовать его часто [4].
В обоих языках операторы переключения работают намного быстрее обычных условных переходов, так как они используют исключительно целые типы, а в Паскале даже допустима работа с множествами и диапазонами. Вследствие громоздкости конструкции switch из-за «проваливания», а так же отсутствия в Си диапазонов и множеств, оператор переключения в Паскале превосходит соответствующий оператор языка Си как по удобству использования, так и по быстродействию и объему решаемых задач.
2.6 Циклы
2.6.1 Организация операторов циклов
Цикл [7] - в программировании - оператор языка программирования, позволяющий многократно повторять одну и ту же последовательность команд (тело цикла). Различают:
- операторы циклов с заранее известным числом повторений;
- циклы с предусловиями;
- циклы с постусловиями.
Вследствие схожести структур рассмотрение всех типов циклов пройдет одним блоком.
Циклы в Паскале. [12] У циклов выделяют заголовок и тело. Заголовок определяет, до каких пор или сколько раз тело цикла будет выполняться. Тело содержит выражения, которые выполняются, если в заголовке цикла выражение вернуло логическую истину (True, не ноль). После того как достигнута последняя инструкция тела, поток выполнения снова возвращается к заголовку цикла. Снова проверяется условие выполнения цикла. В зависимости от результата тело цикла либо повторяется, либо поток выполнения переходит к следующему выражению после всего цикла. В языке программирования Паскаль существует три вида циклических конструкций. Цикл for используется, когда число повторений не связано с тем, что происходит в теле цикла. Т.е. количество повторений может быть вычислено заранее (хотя оно не вычисляется). В заголовке цикла указываются два значения. Первое значение присваивается так называемой переменной-счетчику, от этого значения начинается отсчет количества итераций (повторений). Отсчет идет всегда с шагом равным единице. Второе значение указывает, при каком значении счетчика цикл должен остановиться. Другими словами, количество итераций цикла определяется разностью между вторым и первым значением плюс единица. В Паскале тело цикла не должно содержать выражений, изменяющих счетчик. Цикл while является циклом с предусловием. В заголовке цикла находится логическое выражение. Если оно возвращает true, то тело цикла выполняется, если false – то нет. Когда тело цикла было выполнено, то ход программы снова возвращается в заголовок цикла. Условие выполнения тела снова проверяется (находится значение логического выражения). Тело цикла выполнится столько раз, сколько раз логическое выражение вернет true. Поэтому очень важно в теле цикла предусмотреть изменение переменной, фигурирующей в заголовке цикла, таким образом, чтобы когда-нибудь обязательно наступала ситуация false. Иначе произойдет так называемое зацикливание, одна из самых неприятных ошибок в программировании. Цикл while может не выполниться ни разу, если логическое выражение в заголовке сразу вернуло false. Однако такая ситуация не всегда может быть приемлемой. Бывает, что тело цикла должно выполниться хотя бы один раз, не зависимо оттого, что вернет логическое выражение. В таком случае используется цикл repeat – цикл с постусловием. В цикле repeat логическое выражение стоит после тела цикла. Причем, в отличие от цикла while, здесь всё наоборот: в случае true происходит выход из цикла, в случае false – его повторение.
Циклы в языке Си мало чем отличаются от циклов языка Паскаль. Также существует три конструкции для реализации цикла; это оператор «for(…;…;…)…;», оператор «while(…) …;» и оператор «do … while(…);». Первые два цикла предусловные, последний постусловный. Все циклы подразумевают выполнение одного оператора и в качестве условия продолжения цикла требуют логическую истину (неравенство нулю в Си). Условие выхода в операторе while помещается в круглые скобки и должно быть неравным нулю для продолжения работы цикла. Оператор for внутри скобок параметров цикла содержит следующие выражения: первый параметр выполняется один раз перед стартом цикла, второй является условием для выполнения цикла (также как и для while он не должен равняться нулю), а третий выполняется каждый проход в конце тела цикла. Каждый из параметров может быть опущен, однако символ точки с запятой опускать запрещается. Внутри параметров допускается использование оператора запятая.
Постусловный оператор do … while в Си устроен следующим образом: после ключевого слова do следует один оператор тела цикла, затем после символа точки с запятой следует ключевое слово while с условием выхода в круглых скобках. Для выхода из цикла значение условия должно быть равно нулю.
Циклы в обоих языках имеют примерно сходный синтаксис и мало отличаются; исключение из всего ряда составляет конструкция REPEAT … UNTIL, не вписывающаяся в общую концепцию подобия. Из этого можно сделать вывод, что циклы языка Си более удобны для восприятия.