Экзаменационные вопросы ОП (800187), страница 2
Текст из файла (страница 2)
{
case константа1: операторы
case константа2: операторы
. . .
default: операторы
}
-
Управляющие операторы break, continue, goto.
Управляющий оператор break осуществляет немедленный выход из циклов while, do-while и for. Одиночный оператор break не может использоваться для выхода из более чем одного уровня вложения циклов.
Оператор break может использоваться и для выхода из оператора switch.
Управляющий оператор continue осуществляет прекращение выполнения текущей итерации цикла, вызывая немедленное выполнение следующей итерации. Оператор continue используется только внутри циклов.
Управляющий оператор goto вызывает безусловный переход управления на выполнение оператора, перед которым указана соответствующая метка.
goto метка;
Метка — это идентификатор, завершаемый двоеточием, который помечает оператор.
-
Цикл while.
Оператор цикла while — управляющий оператор языка Си, реализующий выполнение цикла-пока в алгоритме.
Синтаксис оператора цикла while определяется следующим образом:
while (выражение)
оператор1
-
Цикл do-while.
Оператор цикла do-while — управляющий оператор языка Си, реализующий выполнение цикла-до в алгоритме.
Синтаксис оператора цикла do-while определяется следующим образом:
do
оператор
while (выражение);
-
Цикл for. Операция продолжения ("запятая").
Оператор цикла for — управляющий оператор языка Си, реализующий выполнение цикла в алгоритме.
Этот оператор очень удобен для представления счетных циклов, однако он может использоваться и для итерационных и поисковых циклов.
Синтаксис оператора цикла for определяется следующим образом:
for (выражение1; выражение2; выражение3)
оператор
Операция продолжения ("запятая") — бинарная операция языка Си, значением которой является значение правого операнда.
Операция "запятая" используется следующим образом:
выражение_А, выражение_В
Сначала вычисляется выражение_А, затем выражение_В.
-
Функции. Объявление, определение и вызов функции. Назначение стека.
Функция — это именованный фрагмент программы. Данные могут передаваться в функцию и функция может возвращать значение.
Оператор объявления функции (объявление прототипа функции) имеет следующий вид:
возвращаемый_тип имя_функции (список объявлений типов параметров);
Определение функции может иметь одну из двух форм:
возвращаемый_тип имя_функции (список объявлений формальных параметров)
{
объявления /* тело функции */
операторы
}
возвращаемый_тип имя_функции (список формальных параметорв)
объявление формальных параметров
{
объявления /* тело функции */
операторы
}
Вызов функции влечет выполнение содержащихся в теле функции операторов.
Функции должны быть объявлены перед их вызовом.
Стек — это область памяти, используемая выполняемой программой для временного запоминания значений. При вызове функции все значения фактических параметров функции помещаются на стек. Затем запоминаются значения существенных регистров, таких как, например, указатель текущей команды. Значения регистров восстанавливаются при завершении управления вызванной функцией. При передаче управления вызванной функции значения фактических параметров связываются с соответствующими областями памяти на стеке, выделенными под формальные параметры.
-
Формальные и фактические параметры функции.
-
Возвращаемое значение функции. Оператор return.
Функция может передавать одно значение обратно в вызывающую функцию.
Тип возвращаемого значения определяется в определении прототипа функции и объявляется в объявлении прототипа функции.
Оператора возврата return — оператор, с помощью которого функция возвращает значение в вызывающую функцию.
Синтаксис оператора возврата return:
return [выражение];
-
Рекурсивные функции.
Функция в языке программирования Си может быть рекурсивной, т.е. может вызывать сама себя. Каждый раз, когда функция вызывает себя, на стек помещается новый кадр. Функция должна вызывать себя условно, например, внутри оператора if, иначе бесконечная рекурсия переполнит стек.
-
Классы памяти.
Класс памяти - характеристика переменной, которая определяет способ ее хранения .
Язык Си реализует следующие классы памяти:
-
автоматический
-
регистровый
-
внешний
-
статический
Характеристики классов памяти:
-
область действия — часть программы, в которой определено имя;
-
время жизни — промежуток времени, в течении которого содержимое переменной остается правильным;
-
размещение связанных с идентификатором значений в памяти.
-
Внешний класс памяти.
Внешняя переменная — переменная, которая определяется извне функции. Она доступна всем функциям, определенным далее в файле. В отличии от автоматической переменной, внешняя по умолчанию имеет нулевое значение. Элементы внешнего массива инициализируются нулевыми значениями.
Внешнее определение переменной (например, int status;) выделяет область памяти под переменную.
Внешнее объявление переменной (например, external int status;) памяти не выделяет, оно информирует компилятор о том, что переменная определена где-то еще. Это предотвращает выдачу сообщения об ошибке "неопределенный идентификатор" при использование переменной в файле, в котором она неопределена.
-
Автоматический класс памяти.
Автоматическая переменная — переменная, которая объявляется внутри блока.
Областью действия автоматической переменной является блок, в котором она объявлена. Автоматическая переменная создается динамически (автоматически) при входе в блок и прекращает существование при выходе из него.
Область действия и время жизни параметра функции такие же, как и у автоматической переменной.
-
Статический класс памяти.
Статическая переменная — переменная, значение которой сохраняется после выхода из блока до повторного входа в него. При объявлении статической переменной используется ключевое слово static. Статической может быть объявлена как внешняя, так и внутренняя переменная.
Внешняя статическая переменная объявляется вне функции, но известна лишь в том файле, в котором она объявлена (даже при использовании ключевого слова external). Если внешняя переменная используется лишь в том файле, в котором она объявлена, ее следует сделать статической.
Внутренняя статическая переменная объявляется внутри функции.
-
Регистровый класс памяти.
Регистровая переменная — автоматическая переменная, располагаемая, по возможности, на машинном регистре.
-
Массивы. Объявление массива. Инициализация массива.
Массив – это упорядоченный набор объектов, тип которых совпадает, например, набор целых чисел или символов. В массиве можно хранить множество однотипных объектов без необходимости введения отдельного имени переменной для каждого из них. Массив может быть одномерным или многомерным. Количество измерений и длина каждого из измерений определяет общую длину массива, которая ограничена лишь адресным пространством конкретного компьютера.
-
Доступ к элементу массива.
Операция доступа к элементу массива — операция "квадратные скобки", которая используется следующим образом:
имя_массива[индекс]
-
Массив как аргумент функции.
-
Массив символов.
Символьная строка — это последовательность символов из некоторого набора, например из таблицы кодирования ASCII. В языке Си для хранения символьных строк используются символьные массивы. Например, для того, чтобы зарезервировать место для буфера объемом в 1кбайт, можно воспользоваться следующим объявлением:
char buf[1024];
Строки в языке Си должны заканчиваться признаком конца строки — “нулевым” символом '\0', т.е. байтом, все биты которого равны 0. Библиотечные функции, которые работают со строками, “ищут” нулевой символ, так как это единственный способ определить конец строки. Таким образом, при объявлении символьного массива, в котором будет храниться строка, необходимо предусмотреть дополнительный байт для признака конца строки.
-
Однотипная обработка одномерных массивов.
Примерами поэлементной обработки массивовслужат следующие задачи: нахождение суммы элементов массива, произведения элементов, среднего арифметического, среднего геометрического, подсчет количества элементов, отвечающих определенному условию или обладающих некоторыми признаками, а также их суммы, произведения и т.д.
Задачи выборочной обработки элементов массива по формулировке сходны с задачами поэлементной обработки массива, но операция выполняется не над всеми элементами массива, а только над теми, которые имеют вполне определенное значение индексов.
-
Переформирование массивов.
Примерами переформирование массива с изменением его размеров могут служить вычеркивание и вставка элементов, отвечающих определенным условиям или обладающих заданными признаками и т. д. При этом, для удаления или добавления элемента может производиться как поэлементная, так и выборочная обработка элементов массива. Особенностью этого класса задач является изменение размеров исходного массива.
Примерами переформирования массива без изменения его размеров служат перестановки различного характера, в том числе сортировки. Особенностью этого класса задач является то, что, несмотря на постоянство количества элементов массива, для перестановки элемента сначала его необходимо найти.
-
Одновременная обработка массивов и подмассивов.
К задачам одновременной обработки массивов и подмассивов относятся задачи слияния массивов, переписи элементов одного массива, отвечающих определенному условию или имеющих некоторый признак, в другой, формирование нового массива из элементов исходного, преобразованных по некоторой формуле или подчиняющихся определенному закону. Особенностью таких задач является то, что у каждого массива свой индекс, свой закон и диапазон его изменения.
При синхронной обработке массивов или подмассивов индексы меняются по сходным законам, поэтому можно использовать один индекс для обоих массивов или подмассивов.
Особенностью задач асинхронной обработки массивов является то, что у каждого массива свой индекс, свой закон и диапазон его изменения.
-
Поиск в массиве.
Примерами поисковых задач могут служить поиск первого отрицательного, первого положительного и любого первого элемента, отвечающего некоторому условию, поиск единственного элемента, равного некоторому конкретному значению. Особенность задач этого класса в том, что нет необходимости просматривать весь массив. Просмотр нужно закончить сразу, как только требуемый элемент будет найден.
-
Сортировка массива. Метод выбора.
Метод выбора - один из самых простых прямых методов сортировки.
Находим минимальный элемент массива размерностью n. Найденный элемент меняется местами с первым элементом. Затем процесс повторяется, начиная со второго элемента массива и т.д.
-
Сортировка массива. Метод вставки.
Метод вставки — один из прямых методов сортировки.
В исходном состоянии считаем, что сортируемая последовательность состоит из двух последовательностей: уже сортированной (на первом шаге состоит из единственного — первого элемента) и последовательности, которую еще необходимо сортировать. На каждом шаге из сортируемой последовательности извлекается элемент и вставляется в первую последовательность так, чтобы она оставалась сортированной. Поиск места вставки осуществляется с конца первой последовательности, сравнивая вставляемый элемент ai с очередным элементом сортированной последовательности aj. Если элемент ai больше aj, его вставляют вместо aj+1, иначе сдвигают ajвправо и уменьшают j на единицу. Поиск места вставки завершают, если элемент вставлен или достигнут левый конец массива. В последнем случае элемент ai вставляют на первое место.
-
Сортировка массива. Метод обменов.
Метод обменов или метод пузырька является прямым методом сортировки массива.
Алгоритм метода обмена основан на сравнении пары соседних элементов. Если расположение элементов не удовлетворяет условиям сортировки, то их меняют местами. Сравнения и перестановки продолжаются до тех пор, пока не будут упорядочены все элементы. Определить, что элементы упорядочены, можно, считая количество выполненных перестановок: если количество перестановок равно нулю, то массив отсортирован.
-
Указатели: объявление, инициализация, использование.
Указатель — это переменная, содержащая адрес.
Указатель должен быть объявлен также, как объявляются обычные переменные, но перед идентификатором должен стоять символ *.