Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
YaSiTP_attestatsia_1.doc
Скачиваний:
17
Добавлен:
20.05.2015
Размер:
649.22 Кб
Скачать

16. Синтаксис и семантика оператора цикла с предусловием. Примеры применения оператора цикла с предусловием.

Синтаксис оператора:

while ( < выражение целого типа >) <оператор>

Оператор тела цикла может быть простым или составным

Семантика оператора:

Вычисляется значение целого выражения и если оно не равно 0, то выполняется тело цикла.

В противном случае выполнение оператора цикла завершается

Целое выражения является условием продолжения цикла.

Условие цикла может иметь значение 0 уже на первом шаге – тогда цикл завершится, и тело цикла не будет выполнено ни разу

Тело оператора цикла с предусловием может быть выполнено ноль или более раз

Число шагов для цикла с предусловием заранее не определено

Для завершения цикла после конечного числа шагов необходимо, чтобы условие продолжения

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

17. Синтаксис и семантика оператора цикла с постусловием. Примеры применения оператора цикла с постусловием.

Цикл состоит из заголовка do, тела цикла и завершающего условия.

Условие записывается в круглых скобках после слова while, цикл продолжает выполняться, пока условие верно; когда условие становится неверно, цикл заканчивается.

Цикл do—while используется тогда, когда количество повторений цикла заранее неизвестно и не может быть вычислено.

• Условие проверяется только в конце очередного шага цикла (это цикл с постусловием),

таким образом, цикл всегда выполняется хотя бы один раз.

• Если условие никогда не становится ложным (неверным), то цикл никогда не заканчивается;

в таком случае говорят, что программа «зациклилась» — это серьезная логическая ошибка.

• Тело цикла заключается в фигурные скобки; если в теле цикла стоит всего один оператор, скобки можно не ставить.

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

цикл с постусловием (то есть условие проверяется не в начале, а в конце цикла).

Пример: do { // начало цикла

cout << "Введите натуральное число:";

cin >>N; }

while ( N <= 0 ); // условие цикла «пока N <= 0»

18. Синтаксис и семантика оператора цикла с параметром. Примеры применения оператора цикла с параметром.

Если число шагов цикла известно заранее, то для его реализации можно использовать оператор цикла с параметром

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

Этот оператор может рассматриваться как частный случай оператора цикла с предусловием.

Синтаксис оператора:

for <имя параметра цикла>:=<выражение1> to <выражение2> do <оператор>

Оператор тела цикла может быть простым или составным

Оператор цикла с параметром может быть записан с использованием служебного слова to или downto

Семантика оператора:

Значения выражения1 и выражения2 являются начальным и конечным значениями параметра цикла, соответственно

Параметр цикла будет принимать все промежуточные значения между начальным и конечным

Число шагов цикла равно количеству значений, принимаемых его параметром, включая начальное и конечное значения

Условием продолжения цикла является:

<значение параметра цикла> <= <значение выражения2>, в случае использования служебного слова to

(значения параметра цикла на каждом шаге увеличиваются)

Ход выполнения:

1.Вычисляются начальное и конечное значения параметра цикла (выражение1 и выражение2)

2.Начальное значение присваивается параметру цикла

3.Проверяется условие продолжения цикла

4.В случае его выполнения выполняется тело цикла

5.Параметру цикла присваивается следующее значение

6.Переход к п. 3

Начальное и конечное значения параметра цикла вычисляются только один раз перед началом выполнения оператора

и в дальнейшем не меняются

После завершения выполнения оператора значение параметра цикла становится неопределенным

19. Структурные типы данных. Массивы. Описание массива. Размер и размерность массива.

*Структурны данных

Элементарными единицами данных являются значения того или иного стандартного типа, связанные с литералами, поименованными константами или переменными

Эти значения можно группировать и создавать более или менее сложные структуры данных

Каждая такая структура может получить свое имя и рассматриваться как переменная составного или структурированного типа

Отдельные значения – элементы структуры данных – выделяются путем указания имени структуры, дополненного специальными расширениями –селекторами

*Наиболее простой и часто используемой структурой данных является массив

Массив – это набор некоторого числа однотипных данных, расположенных в последовательных ячейках памяти

Количество элементов массива называется его размером, а тип элементов – типом массива

*Синтаксис объявления массива:

<тип массива> <имя массива> “[“<размер массива>”]”

<размер массива> – это литерал или константное выражение

В соответствии с объявлением массива для его размещения будет выделена область памяти длиной

<размер массива> * sizeof <тип массива> байт, которая будет заполнена нулями

Например: int a[5]; float x[n+m]; double q[4];

*Объявление массива может сопровождаться его инициализацией

Синтаксис объявления массива с инициализацией:

<тип массива> <имя массива> “[“<размер массива>”]” = {<список значений>}

В этом случае элементы массива получают значения из списка инициализации

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

Одномерный массив:int a[5] = { 3, 45, 11, -8, 74}; double q[4] = {1.7, 4.53};

Во втором случае инициализируются только два первых элемента массива x, а оставшиеся два элемента получают нулевые значения

При наличии списка инициализации размер массива можно не указывать, он определяется по числу инициализирующих значений: int a[ ] = { 3, 45, 11, -8, 74};

*размер - это кол-во элементов (вообще), размерность - кол-во измерений (a[i]- размерность один, a[i,j] - размерность два… )

20. Заполнение массива случайными числами.

* Генерация таких чисел осуществляется функцией rand() из библиотеки stdlib (заголовочный файл <stdlib.h>)

При генерировании псевдослучайных чисел мы получаем целые числа в диапазоне от 0 до 32767.

Но нам же не всегда необходимы числа из столь большого диапазона чисел. Чтобы получить целое число из диапазона [0, max], нам необходимо осуществить деление по модулю:   int k = rand ()%max;

   Так мы сможем получить числа из диапазона от 0 до max–1. Но чтобы получить числа из диапазона [min,max], мы должны еще добавить к нашей формуле min:  K= rand () %max + min;

    А чтобы получить случ. Веществ. числа из диапазона [min,max], нам необходима формула в таком виде:

K=(float) rand () * (max-min)/RAND_MAX +min;   где RAND_MAX– это граница нашего диапазона в 32767.

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

21. Задача поиска в массиве. Алгоритмы поиска.

Существует две основных формулировки задачи поиска:

найти элемент массива (первый или последний), удовлетворяющий заданному условию;

найти все элементы массива, удовлетворяющие некоторому условию;

Любой поиск связан с последовательным просмотром элементов массива и проверкой их соответствия условию поиска *Поиск единственного элемента:

Цикл поиска в нотации C++ принимает вид: i=0; // while (A[i] != x && i<n) i++;

Условие in заменено на i<n, чтобы не допустить выхода за границу массива

Инкремент переменной i можно выполнить непосредственно в условии продолжения, так что окончательно цикл поиска примет вид: i=0; // while (A[i] != x && i++<n)

Поскольку условие цикла является конъюнкцией двух простых условий, то после завершения цикла необходимо проверить основное из них:

if (A[i] == x) cout << “Элемент найден”; // else cout << “Элемент не найден”;

*Поиск всех элементов: В этом случае проверка условия поиска осуществляется в теле цикла for,

Который просматривает все элементы массиваНапример, требуется подсчитать сумму s всех отрицательных значений в целочисленном массиве A длиной n

Цикл поиска будет иметь вид: s=0; // for (int i=0; i<n; i++) // if (A[i] < 0) s +=A[i];

К этому типу поиска относятся и алгоритмы поиска миниального или максимального значения в массиве:

min=A[0]; // for (int i=1; i<n; i++) //if (A[i] < min) min=A[i];

22 . Задача сортировки массива. Алгоритм сортировки методом выбора. 

*Сортировкой массива называется упорядочение значений его элементов по возрастанию или убыванию

*Основная идея этого метода заключается в последовательном формировании отсортированной части массива

путем добавления в ее конец очередного элемента, выбранного в его неотсортированной части.

const int N = 10;

void main()

{ int i, j, nMin, A[N], c;

// здесь нужно ввести массив A

for ( i = 0; i < N-1; i ++ )

{ nMin = i; // ищем минимальный, начиная с A[i]

for ( j = i+1; j < N; j ++ ) ;

if ( A[j] < A[nMin] ) nMin = j;

if ( nMin != i ) // если минимальный не стоит на своем месте,…

{ c = A[i]; A[i] = A[nMin]; A[nMin] = c; } // ставим его на место

}

cout << "Отсортированный массив:";

for ( i = 0; i < N; i ++ )

cout << "%d " << A[i];

}

23 . Задача сортировки массива. Алгоритм сортировки методом включения.

*Сортировкой массива называется упорядочение значений его элементов по возрастанию или убыванию

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

const int N = 10;

void main()

{ int i, j, nMin, A[N], c;

// здесь нужно ввести массив A

for ( i = 1; i < N; i ++ )

{ c = A[i];

j = i -1; // ищем минимальный, начиная с A[i]

while (j > =0 && A[j] > c) A[j+1] = A[j--];

A[j+1] = c;

}

cout << "Отсортированный массив:";

for ( i = 0; i < N; i ++ )

cout << "%d " << A[i];

}

24 . Задача сортировки массива. Алгоритм сортировки методом обмена.

*Сортировкой массива называется упорядочение значений его элементов по возрастанию или убыванию

Этот метод сортировки имеет жаргонное наименование «метод пузырька» и заключается в многократном упорядочении пар соседних элементов.

const int N = 10;

void main()

{

int i, j, A[N], c;

// здесь надо ввести массив A

for ( i = 0; i < N-1; i ++ ) // цикл повторных проходов по массиву

for ( j = N-2; j >= i; j -- ) // идем с конца массива в начало

if ( A[j] > A[j+1] ) // если они стоят неправильно, ...

{

c = A[j]; A[j] = A[j+1]; A[j+1] = c; // переставить A[j] и A[j+1]

}

cout << "Отсортированный массив;

for ( i = 0; i < N; i ++ ) cout << "%d " << A[i]);

}