
2к3с Языки программирования / Конспект лекций
.pdfТЕМА 5. ЦИКЛЫ.
Цели: |
изучить |
реализацию |
циклических |
алгоритмов |
на |
языке |
программирования СИ.
Задачи:
изучить синтаксис различных видов циклов в СИ;
ознакомиться с операторами безусловного перехода и функцией exit();
сформировать практические навыки использования циклических конструкций.
После изучения темы Вы должны знать:
понятия: цикл, тело цикла, итерация, счетчик цикла;
назначение и использование различных видов циклов;
синтаксис циклов «for», «while», «do…while»;
назначение и использование операторов безусловного перехода;
назначение и использование функции exit().
Циклические структуры. Цикл – это часть программного кода, которая выполняется до тех пор, пока не будет нарушено определенное условие,
называемое условием работы цикла. Циклы являются одной из важнейших программных конструкций.
Тело цикла – это действия, которые выполняются в цикле.
Итерация – это однократное выполнение тела цикла.
Счетчик – специальная переменная, как правило применяемая в цикле фиксированным числом итераций, т.е. в цикле for.
В языке СИ существуют следующие виды циклов: for, while, do…while.
Условие, которое управляет выполнением работы цикла представляет собой выражение, составленное из операторов отношения и логических операторов.
Цикл «for». Цикл for имеет следующий синтаксис:
for (initialize counter; conditional test; re-evaluation parameter)
{
Statement (s)
}
Блок initialize counter (задание начального значения счетчику) служит для присвоения переменной-счетчику начального значения. Этот блок выполняется только один раз перед началом работы цикла. Параметр conditional test
(проверка условия) служит для проверки условия выхода из цикла. Как правило,
этим условием является достижение счетчиком какого-либо значения.
Параметр re-evaluation parameter (изменение счетчика) используется для изменения (как правило, увеличения или уменьшения на единицу) значения счетчика. Эти параметры разделяются между собой точками с запятой. Раздел
Statement (s) (тело цикла) может состоять как из одного, так и из нескольких операторов.
Цикл for продолжает работать до тех пор, пока истинным является результат вычисления параметра «условие». Как только условие становится ложным, выполнение цикла немедленно прекращается.
Оператор «запятая». Возможности цикла for могут быть расширены за счет включения нескольких действий в параметры инициализации и изменения счетчика. В этом случае действия записываются через запятую:
действие 1, действие 2
Выражения, разделенные оператором «запятая» выполняются слева направо. Это может быть важным в случае, когда значение параметра действие
2 зависит от значения параметра действие 1.
Вложенные «for». Цикл for может быть расположен внутри другого цикла for.
При этом код программы выглядит примерно следующим образом: for (i=1; i<max; i++)
{
for (j=0; j<=max2; j++)
{
}
}
Цикл «while». Синтаксис:
while (условие)
тело цикла;
Если в тело цикла входит более одного оператора, то все они должны быть заключены в фигурные скобки. В качестве условия может быть использовано выражение. Цикл продолжает свою работу до тех пор, пока условие остается истинным. Как только оно становится ложным, цикл завершает свою работу.
Как правило, цикл for используют в случае, когда число итераций заранее известно. Если число итераций неизвестно, используется цикл while.
Так же как и for, while сначала проверяет условие и, лишь затем,
выполняет тело цикла.
Цикл «do… while…». Цикл do… while… работает примерно также, как и цикл while. Однако, в отличии от for и while, этот цикл сначала выполняет тело цикла, и лишь затем проверяет условие работы. То есть, тело цикла do… while… всегда выполняется хотя бы один раз.
Цикл do… while… имеет следующий синтаксис: do {
тело цикла;
} while (условие);
Фигурные скобки могут отсутствовать, если тело цикла состоит только из одного оператора, однако использовать их желательно. Цикл do… while…
выполняется до тех пор, пока условие не станет ложным.
Вложенные «while» и «do… while…». Также как и for, циклы while.. и «o…
while… могут быть вложенными.
Операторы безусловного перехода. СИ позволяет работать с четырьмя операторами перехода. Это return, goto, break и continue. Безусловный переход выполняется в специальную, заранее установленную точку. Операторы return и
goto могут быть использованы в любом месте программы, а break и continue
только в циклах.
Оператор return. Оператор return позволяет завершить работу функции. При этом управление передается в точку, из которой был произведен вызов функции. Оператор return также позволяет вернуть из функции значение. В
общем виде его можно записать следующим образом: return выражение;
Наличие выражения не является обязательным. Функция может содержать более чем один оператор return. Более подробно этот оператор будет изучаться при изучении функций.
Оператор «goto». Несмотря на то, что СИ является языком структурного программирования, он, тем не менее, позволяет работать и с некоторыми неструктурными элементами, таковыми являются:
оператор безусловного перехода goto;
метки.
Оператор goto позволяет передать управление любой другой инструкции в пределах одной функции. Однако, при этом возможен выход за пределы блоков, что нарушает требования структурного программирования.
Синтаксис оператора goto:
goto label;
где label – это имя, дополнительно задаваемое оператору, к которому необходимо совершить переход. Использование goto и меток снижает удобочитаемость программы, уменьшает ее надежность и усложняет процесс внесения изменений и дополнений. Однако, метки используются, так как они позволяют быстро и эффективно осуществлять выход из циклов большой степени вложенности.
Оператор «break» и «continue».
Оператор break может использоваться в двух случаях. В первом он применяется для указания завершения ветви case в операторе switch, а во
втором – для выхода из цикла. При этом управление передается на оператор,
следующий после цикла.
Оператор continue позволяет прервать текущую итерацию цикла и сразу перейти к выполнению следующий за ней.
Функция «exit()». Функция exit( ) является одной из стандартных функций языка СИ. Она позволяет немедленно завершить работу всей программы. Она имеет следующую форму вызова:
exit (return_code);
где return_code – это возвращаемое значение. Ноль используется для указания нормального завершения работы программы. Любое другой значение интерпретируется как ошибка.
Выводы
В данной теме рассмотрены следующие вопросы: циклы, виды циклов;
синтаксис различных видов циклов в языке СИ; операторы безусловного перехода (return, goto, break, continue) и функция exit().
Вопросы для самопроверки
1.Определение цикла в программе.
2.Охарактеризуйте понятия: тело цикла, итерация, счетчик цикла.
3.Виды циклов.
4.Синтаксис цикла «for».
5.Синтаксис цикла «while».
6.Синтаксис цикла «do…while».
7.Перечислите и охарактеризуйте операторы безусловного перехода.
8.Назначение оператора return.
9.Назначение оператора goto.
10.Назначение операторов break и continue.
11. Назначение функции exit().
ТЕМА 6. МАССИВЫ.
Цели: изучить основные операции по работе с различными типами массивов в
СИ.
Задачи:
ознакомиться с основными понятиями (массив, элемент (член), индекс элемента массива, размерность массива, границы массива);
рассмотреть различные типы массивов;
изучить характеристики массива;
изучить синтаксис объявления массива;
рассмотреть правила формирования имен массива;
изучить объявление символьных массивов;
ознакомиться с основными строковыми функциями;
изучить объявление и инициализацию многомерных массивов;
сформировать практические навыки работы с различными типами массивов.
После изучения темы Вы должны знать:
основные понятия (массив, элемент (член), индекс элемента массива,
размерность массива, границы массива);
различные типы массивов;
характеристики массива;
синтаксис объявления массива;
правила формирования имен массива;
объявление символьных массивов;
основные строковые функции;
объявление и инициализацию многомерных массивов;
основные операции по обработке различных типов массивов.
Элементы и индексы массива. Хранение набора однотипных элементов данных в различных переменных является неудобным. Массив – это набор элементов данных одного типа. Каждый элемент массива имеет один и тот же тип данных, одинаковый класс памяти и одинаковые характеристики. Каждый элемент хранится в следующих друг за другом ячейках основной памяти. Эти элементы носят название члены массива.
Определение массива. Каждый элемент массива однозначно определяется соответствующим ему индексом.
Размерность массива считается равной количеству индексов,
необходимых для однозначного определения каждого элемента. Индексом является положительное целое число, заключенное в квадратные скобки,
располагающееся сразу после имени массива без каких-либо пробельных символов между именем и открывающей квадратной скобкой. Любой индекс содержит целые значения, начиная с нуля. Нумерация индексов массивов начинается с нуля, то есть, для массива, состоящего из N элементов, индекс последнего элемента будет равен N-1. Ограничения на допустимые значения индекса называются границами индекса массива (или границы массива):
нижняя и верхняя граница. Допустимый индекс должен иметь целое значение,
не превосходящее границ массива, или равное одной из них.
Любой массив имеет несколько особых характеристик, и должен быть определен с их помощью. Эти характеристики включают:
класс памяти;
тип данных элементов массива;
имя массива, которое указывает на место расположения (ячейку)
первого элемента массива;
размер массива, константа, которая может быть представлена
целочисленным выражением с положительным значением.
Объявление массива:
тип_данных имя_массива[размер];
где размер является выражением, обозначающим количество членов массива, и результат его должен быть положительным целым числом.
Правила формирования имен массивов те же самые, что и для имен переменных. Имя массива не может совпадать с именем переменной, так как это приводит к возникновению неоднозначности.
Несколько правил для массива:
все элементы массива имеют один и тот же тип;
каждый элемент массива может быть использован в тех случаях,
когда разрешается или требуется использование переменной;
к любому элементу массива можно получить доступ, используя переменную или выражения целого типа.
Работа с массивами в языке СИ. В языке Си трактовка массивов отличается от трактовки переменных. Даже если два массива имеют один и тот же тип и размеры их совпадают, невозможно проверить их равенство. Более того,
невозможно, напрямую выполнить присваивание одного массива другому.
Вместо этого придется присваивать каждый элемент одного массива соответствующему элементу другого массива. Невозможно присваивать значения массиву в целом, как объекту, исключение составляет лишь время инициализации массива.
Инициализация массива. Массивы с классом памяти automatic не могут быть инициализированы, если только не присваиваются значения каждому элементу в отдельности. Автоматические массивы не должны использоваться без надлежащей инициализации, иначе результаты подобного использования будут непредсказуемыми. Это происходит потому, что участок памяти, выделенный под массив, не инициализируется автоматически. При включении элементов такого массива в состав арифметического выражения будут использоваться значения, которые содержатся в этих ячейках памяти (так называемый
«мусор»), при этом нет никакой гарантии, что тип этих значений совпадет с объявленным типом массива, если элементы массива не были явно
инициализированы. Это утверждение справедливо не только для массивов, но и для обычных переменных.
Строки (символьные массивы). Строка (string) может быть определена как массив символьного типа, который завершается NULL-символом. Каждый символ занимает один байт, а последним символом строки всегда является символ «\0». Массив mass, который предназначается для 10-символьных строк,
будет объявлен следующим образом:
char mass[11];
Язык СИ поддерживает большой набор строковых функций, которые объявлены в стандартном заголовочном файле string.h, таблица 11.
Таблица 11. Строковые функции
Функция |
Выполняемая операция |
strcpy(s1,s2) |
копирует строку из s2 в s1 |
strcat(s1,s2) |
присоединяет строку s2 к концу строки s1 |
strlen(s1) |
возвращает длину строки s1 (без учета null-символа) |
strcmp(s1,s2) |
возвращает 0, если строки s1 и s2 одинаковы; значение |
|
меньше 0, если s1<s2; значение больше 0, если s1>s2 |
strchr(s1,ch) |
возвращает указатель на первый встретившийся символ ch |
|
в строке s1 |
strstr(s1,s2) |
возвращает указатель на начало первой встретившейся |
|
подстроки s2 в строке s1 |
Двумерные массивы. Массивы могут иметь размерность больше единицы.
Многомерные массивы упрощают представление многомерных объектов.
Многомерные массивы определяются почти так же, как и одномерные, с той разницей, что на каждое измерение требуется дополнительная пара квадратных скобок.
тип имя_массива[число1] [число2] [число3] ….[число N];
где число1, число2, число3…. числоN – положительные целые выражения,
которые определяют количество элементов массива, соответственно каждому индексу (измерению).
Простейшей и наиболее часто используемой формой многомерных массивов является двумерный массив. Двумерный массив может быть представлен в виде массива, состоящего из двух одномерных массивов.
Инициализация многомерных массивов. При определении многомерного массива можно присваивать элементам начальные значения. Особое значение следует уделить порядку, в котором начальные значения присваиваются элементам массива. В первую очередь значения присваиваются элементам первой строки массива, затем элементам второй строки так далее (если размерность массива больше 2).
Двумерные массивы и строки. Как было указано ранее, строки могут быть представлены в виде одномерных символьных массивов. Каждый символ в строке будет записан в отдельный элемент массива. Такой строковый массив может быть создан с использованием двумерного символьного массива. Левый индекс определяет количество строк, а правый индекс задает максимальную длину любой строки массива.
Выводы
В данной теме рассмотрены следующие вопросы: основные понятия
(массив, элемент (член), индекс элемента массива, размерность массива,
границы массива); типы массивов; характеристики массива; объявление массива; правила формирования имен массива; объявление символьных массивов; основные строковые функции; объявление многомерных массивов;
инициализация многомерных массивов; двумерные массивы и строки.
Вопросы для самопроверки
1.Охарактеризовать понятия: массив, элемент (член) массива, индекс элемента массива, размерность массива, границы массива.
2.Типы массивов.
3.Характеристики массива.
4.Объявление массива.
5.Правила формирования имен массива.
6.Правила для массива.
7.Объявление символьных массивов.