Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика и программирование - часть 1

.pdf
Скачиваний:
75
Добавлен:
13.02.2015
Размер:
1.12 Mб
Скачать

if (логическое_выражение)

{

оператор_1_1; оператор_1_2;

...

оператор_1_n;

}

[else

{

оператор_2_1; оператор_2_2;

...

оператор_2_m;

}]

Оператор switch.

Частным, но важным случаем выбора из нескольких вариантов является ситуация,

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

Соответствующий оператор C#, унаследованный от C++, но с небольшими изменениями в

синтаксисе, называется оператором switch.

Начало

 

 

 

 

 

 

 

 

 

 

Выражение

 

 

Условие 1

 

 

Операторы 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Условие 2

 

 

Операторы 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Условие n

 

 

Операторы n

 

 

 

 

 

 

 

 

Конец

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

switch ( выражение ){

case константное_выражение_1: [ список_операторов_1 ] case константное_выражение_2: [ список_операторов_2 ]

...

case константное_выражение_n: [ список_операторов_n ] [ default: операторы ]

}

Ветвь default может отсутствовать. Заметьте, по синтаксису допустимо, чтобы после двоеточия следовала пустая последовательность операторов, а не последовательность, заканчивающаяся оператором перехода. Константные выражения в case должны иметь тот же тип, что и switch-выражение.

Семантика оператора switch чуть запутана. Вначале вычисляется значение switch-

выражения. Затем оно поочередно в порядке следования case сравнивается на совпадение с константными выражениями. Как только достигнуто совпадение, выполняется соответствующая последовательность операторов case-ветви. Поскольку последний оператор этой последовательности является оператором перехода (чаще всего это оператор break), то обычно он завершает выполнение оператора switch. Использование операторов перехода - это плохая идея. Таким оператором может быть оператор goto,

передающий управление другой case-ветви, которая, в свою очередь, может передать управление еще куда-нибудь, получая блюдо "спагетти" вместо хорошо структурированной последовательности операторов. Семантика осложняется еще и тем,

что case-ветвь может быть пустой последовательностью операторов. Тогда в случае совпадения константного выражения этой ветви со значением switch-выражения будет выполняться первая непустая последовательность очередной case-ветви. Если значение switch-выражения не совпадает ни с одним константным выражением, то выполняется последовательность операторов ветви default, если же таковой ветви нет, то оператор switch эквивалентен пустому оператору.

Задачи для самостоятельной работы

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

в противном случае. Все числа, для которых указано количество цифр (двузначное число,

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

Дано целое число A. Проверить истинность высказывания: «Число A

является

положительным».

 

Дано ненулевое целое число A. Проверить истинность высказывания:

«Число A

является нечетным».

 

Дано ненулевое целое число A. Проверить истинность высказывания:

«Число A

является четным».

 

Даны два целых числа A и B. Проверить истинность высказывания: «Справедливы неравенства A > 2 и B 3».

Даны два целых числа A и B. Проверить истинность высказывания: «Справедливы

неравенства A > 0 или B < –2».

Даны три целых числа A, B, C. Проверить истинность высказывания: «Справедливо

двойное неравенство A < B < C».

Даны три целых числа A, B, C. Проверить истинность высказывания: «Число B

находится между числами A и C».

Даны два ненулевых целых числа A и B. Проверить истинность высказывания: «Каждое из чисел A и B нечетное».

Даны два ненулевых целых числа A и B. Проверить истинность высказывания:

«Хотя бы одно из чисел A и B нечетное».

Даны два ненулевых целых числа A и B. Проверить истинность высказывания: «Ровно

одно из чисел A и B нечетное».

Даны два ненулевых целых числа A и B. Проверить истинность высказывания:

«Числа A и B имеют одинаковую четность».

Даны три целых числа A, B и C. Проверить истинность высказывания: «Каждое

из чисел A, B, C положительное».

Даны три целых числа A, B и C. Проверить истинность высказывания: «Хотя бы одно

из чисел A, B, C положительное».

Даны три целых числа A, B и C. Проверить истинность высказывания: «Ровно два

из чисел A, B, C являются положительными».

Проверить истинность высказывания: «Квадратное уравнение A·x2 + B·x + C = 0

с данными коэффициентами A, B, C имеет вещественные корни».

Проверить истинность высказывания: «Данные числа x, y являются координатами точки, лежащей во второй координатной четверти».

Проверить истинность высказывания: «Данные числа x, y являются координатами точки, лежащей во второй или третьей координатной четверти».

Проверить истинность высказывания: «Данные числа x, y являются координатами точки, лежащей в первой или третьей координатной четверти».

Даны целые числа a, b, c, являющиеся сторонами некоторого треугольника. Проверить истинность высказывания: «Треугольник со сторонами a, b, c является равнобедренным».

Даны целые числа a, b, c. Проверить истинность высказывания: «Существует треугольник со сторонами a, b, c».

Даны действительные числа x,y. Получить:

max(x,y),

min(x,y),

Даны действительные числа x, y, z. Вычислить:

max(x + y + z, x · y · z),

min (x + y + z/2, x · y · z) + 1.

Найти минимальное значение из трёх величин, определяемых арифметическими выражениями a =sin(x), b = cos(x), c = ln(x) при заданных значениях x.

Даны действительные числа a, b, c. Удвоить эти числа, если a > b > c и заменить их абсолютными значениями, если это не так.

Даны два действительных числа. Заменить первое число нулём, если оно меньше или равно второму, и оставить числа без изменения иначе.

Даны действительные числа x,y. Меньшее из этих двух чисел заменить их полусуммой, а большее – их удвоенным произведением.

Даны действительные числа a, b, c, d. Если a < b < c < d, то каждое число заменить наибольшим из них; если a > b > c > d, то числа оставить без изменения; иначе все числа заменяются их квадратами.

Даны действительные числа a, b, c. Выяснить, имеет ли уравнение ax2+bx+c=0

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

Даны действительные положительные числа a, b, c, x, y. Выяснить, пройдёт ли кирпич с рёбрами a, b, c в прямоугольное отверстие со сторонами x и y. Просовывать кирпич в отверстие разрешается только так, чтобы каждое из рёбер было параллельно или перпендикулярно каждой из сторон отверстия.

Даны два действительных числа. Вывести первое число, если оно больше второго, и

оба числа, если это не так.

Даны три действительных числа. Выбрать из них те, которые принадлежат интервалу

(1,3).

Даны три действительных числа. Возвести в квадрат те из них, значения которых не отрицательны.

Если сумма трёх попарно различных действительных чисел x,y,z меньше единицы, то наименьшее из этих трёх чисел заменить полусуммой двух других; иначе заменить меньшее из x и y полусуммой двух оставшихся значений.

Даны два числа. Если первое число больше второго по абсолютной величине, то необходимо уменьшить первое в 5 раз, иначе оставить числа без изменения.

Даны действительные положительные числа x, y, z.

Выяснить, существует ли треугольник с длинами сторон x, y, z.

Если треугольник существует, то ответить - является ли он остроугольным,

тупоугольным или прямоугольным.

Даны действительные числа x1,x2,x3,y1,y2,y3. Принадлежит ли начало координат треугольнику с вершинами (x1,y1), (x2,y2), (x3,y3)?

Составить программу определения большей площади из двух фигур круга или квадрата. Известно, что сторона квадрата равна а, радиус круга равен r. Вывести и напечатать значение площади большей фигуры.

Даны действительные, положительные числа a,b,c,d . Выяснить, можно ли построить четырёхугольник с такими длинами сторон.

Операторы повтора.

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

Оператор for

Наследованный от С++ весьма удобный оператор цикла for обобщает известную конструкцию цикла типа арифметической прогрессии. Его синтаксис:

for (инициализатор; условие; выражение) оператор;

for (int i = 0; i < length; i++)

{

Оператор_1;

Оператор_n;

}

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

вычислении должно получать значение true или false. Список выражений, записанный через запятую, показывает, как меняются счетчики цикла на каждом шаге выполнения.

Если условие цикла истинно, то выполняется тело цикла, затем изменяются значения счетчиков и снова проверяется условие. Как только условие становится ложным, цикл завершает свою работу. В цикле for тело цикла может ни разу не выполняться, если условие цикла ложно после инициализации, а может происходить зацикливание, если условие всегда остается истинным. В нормальной ситуации тело цикла выполняется конечное число раз.

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

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

Циклы While

Цикл while (выражение) является универсальным видом цикла, включаемым во все языки программирования. Тело цикла выполняется до тех пор, пока остается истинным выражение while. В языке C# у этого вида цикла две модификации - с проверкой условия в начале и в конце цикла. Первая модификация имеет следующий синтаксис:

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

while (i<10)

{

Console.WriteLine(Convert.ToString(i)); i++;

}

Эта модификация соответствует стратегии: "сначала проверь, а потом делай". В

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

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

do

оператор

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

{

Console.WriteLine(Convert.ToString(i)); i++;

}

while (i<10);

Задачи для самостоятельной работы

Дано натуральное число n. Вычислить

2n;

n!;

an;

a(a+1)…(a+n-1);

a(a-n)(a-2n)…(a-n·n).

Дано натуральное число n (n>99). Определить число сотен в нём.

Найти сумму квадратов чисел от m до n.

Найти сумму квадратов нечётных чисел в интервале, заданном значениями переменных m и n;

Найти сумму квадратов четных чисел в интервале, заданном значениями переменных m и n;

Найти сумму целых положительных чисел, кратных 4 и меньших 100.

Вложенные циклы.

Дано натуральное число n. Получить все натуральные числа, меньшие n и взаимно просты с ним.

Даны целые числа p и q. Получить все делители числа q, взаимно простые с p.

Дано натуральное число n. Получить все простые делители этого числа.

Найти 100 первых простых чисел.

Даны натуральные числа n,m. Получить все меньшие n натуральные числа, квадрат суммы цифр которых равен m.

Натуральное число называется совершенным, если оно равно сумме всех своих делителей за исключением самого себя. Например, 6=1+2+3. Дано натуральное число n. Получить все совершенные числа, меньшие n.

Дано пять различных целых чисел. Найти среди них два числа, модуль разности которых имеет:

наибольшее значение;

наименьшее значение.

Функции и процедуры.

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

Уже с первых шагов процедуры и функции позволяли решать одну из важнейших задач,

стоящих перед программистами, - задачу повторного использования программного кода.

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

Долгое время процедуры и функции играли не только функциональную, но и архитектурную роль. Весьма популярным при построении программных систем был метод функциональной декомпозиции "сверху вниз", и сегодня еще играющий важную роль. Но с появлением ООП архитектурная роль функциональных модулей отошла на второй план. Для ООП-языков, к которым относится и язык C#, в роли архитектурного модуля выступает класс. Программная система строится из модулей, роль которых играют классы, но каждый из этих модулей имеют содержательную начинку, задавая некоторую абстракцию данных.

В языке C# нет специальных ключевых слов - procedure и function, но присутствуют сами эти понятия. Синтаксис объявления метода позволяет однозначно определить, чем является метод - процедурой или функцией.

Прежнюю роль библиотек процедур и функций теперь играют библиотеки классов.

Библиотека классов FCL, доступная в языке C#, существенно расширяет возможности языка. Знание классов этой библиотеки и методов этих классов совершенно необходимо для практического программирования на C# с использованием всей его мощи.

Функция отличается от процедуры двумя особенностями:

всегда вычисляет некоторое значение, возвращаемое в качестве результата

функции;

вызывается в выражениях.

Процедура C# имеет свои особенности:

возвращает формальный результат void, указывающий на отсутствие результата;

вызов процедуры является оператором языка;

имеет входные и выходные аргументы, причем выходных аргументов - ее результатов - может быть достаточно много.

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

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

Синтаксически в описании метода различают две части - описание заголовка и описание тела метода:

заголовок_метода тело_метода

Рассмотрим синтаксис заголовка метода:

[атрибуты][модификаторы]{void| тип_результата_функции} имя_метода([список_формальных_аргументов])

Имя метода и список формальных аргументов составляют сигнатуру метода.

Заметьте, в сигнатуру не входят имена формальных аргументов - здесь важны типы аргументов. В сигнатуру не входит и тип возвращаемого результата.

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

описанные в блоке, считаются локализованными в этом блоке.

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

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

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

Сам вызов метода, независимо от того, процедура это или функция, имеет один и тот же синтаксис:

имя_метода([список_фактических_аргументов])

Рекурсивные функции

В окружающем нас мире часто можно встретить объекты, обладающие самоподобием. То есть часть большого объекта в чем-то сходна с самим объектом.

Например, ветка дерева повторяет форму и характер ветвления, схожие с самим деревом.

Приведенные ниже графические объекты также обладают самоподобием (рис. 1). Такие объекты называются рекурсивными.

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

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