Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirovanie.docx
Скачиваний:
12
Добавлен:
28.09.2019
Размер:
149.14 Кб
Скачать

7. Назовите отличия итерационных циклов и цикла с параметром. Какова структура циклов с пред- и постусловием? как выполняются эти циклы?

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

циклы с известным заранее числом повторений (классические);

циклы с неизвестным числом повторений (итерационные).

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

начальное значение параметра (обозначим его );

конечное значение параметра (обозначим его );

шаг изменения параметра (обозначим его ).

Зная эти 3 величины, можно вычислить количество повторений цикла по формуле:

Итерационные циклы – это циклы, в которых число повторений циклов заранее не известно и зависит от некоторых условий.

Цикл с предусловием «Пока»

Цикл с постусловием «До»

Характеристика:

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

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

Параметр цикла:

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

Условие выхода

Обязательно должно быть истинным. Является полностью противоположным условию выхода цикла «До»

Обязательно должно быть ложным. Является полностью противоположным условию выхода цикла «Пока»

8. Операция вычисления размерности данных. Встроенная операция sizeof. Привести примеры.

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

Унарная операция sizeof, выполняемая во время компиляции программы, позволяет определить длину операнда в байтах. Например, если компилятор для чисел типа int отводит 4 байта, а для чисел типа double — 8, то следующая программа напечатает 8 4.

double f;

printf("%d ", sizeof f);

printf("%d", sizeof(int));

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

В языке С определяется (с помощью спецификатора класса памяти typedef) специальный тип size_t, приблизительно соответствующий целому числу без знака. Результат операции sizeof имеет тип size_t. Но практически его можно использовать везде, где допустимо использование целого числа без знака.

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

/* Запись шести целых чисел в дисковый файл. */

void put_rec(int rec[6], FILE *fp)

{

int len;

len = fwrite(rec, sizeof(int)*6, 1, fp);

if(len != 1) printf("Ошибка при записи");

}

Приведенная функция put_rec() компилируется и выполняется правильно в любой среде, в том числе на 16- и 32-разрядных компьютерах.

И в заключение: оператор sizeof выполняется во время трансляции, его результат в программе рассматривается как константа

9. УКАЗАТЕЛИ

Указатели предназначены для хранения адресов областей памяти. В C++ различают три вида ука-

зателей – указатель на объект, указатель на функцию и указатель на void, отличающиеся свойствами и

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

либо другим конкретным типом.

Указатель на объект

Указатель на объект содержит адрес области памяти, в которой хранятся данные определенно-

го типа.

Размер указателя зависит от модели памяти. Можно определить указатель на указатель и т. д.

Пустой указатель

Указатель на void (или пустой указатель) применяется в тех случаях, когда конкретный тип объ-

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

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

Указателю на void можно присвоить значение указателя любого типа, а также сравнивать его с лю-

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

ется, требуется преобразовать его к конкретному типу явным образом.

Указатель на функцию

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

код функции, то есть адрес, по которому передается управление при вызове функции. Указатели на

функции используются для косвенного вызова функции (не через ее имя, а через обращение к перемен-

ной, хранящей ее адрес), а также для передачи имени функции в другую функцию в качестве параметра.

Указатель на функцию имеет тип “указатель на функцию, возвращающей значение заданного типа и имеющей аргументы заданного типа”:

тип (*имя) ( список_типов_аргунентов ) ;

Константные указатели

Указатель может быть константой или переменной, а также указывать на константу или переменную.

АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ С УКАЗАТЕЛЯМИ

Арифметические операции с указателями автоматически учитывают размер типа величин, адресуе-

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

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

В C++ определены следующие арифметические операции над указателями.

Наименование операции Пример

Сравнение на равенство р1 == р2 ;

Сравнение на неравенство р1 != р2 ;

Сравнение на меньше р1 < р2 ;

Сравнение на меньше или равно р1 <= р2 ;

Сравнение на больше р1 > р2 ;

Сравнение на больше или равно р1 >= р2 ;

Вычисление числа элементов между указателями р2 – р1 ;

Перемещение указателя к следующему элементу р ++ ;

Перемещение указателя к предыдущему элементу р -- ;

Перемещение указателя на n элементов р1 + n ; р2 – n ;

10 Реализация циклических задач. Операторы циклов.

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

1. Оператор цикла с предусловием

while (выражение 1)

{выражение 2}

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

Например:while(n!=0)

{n=n/10;

M++;} цикл будет идти пока n будет не нулевым значением.

2. Оператор цикла с постусловием

do{}

while (условие);

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

3. Оператор с предусловием и коррекцией

for (выражение 1; выражение 2; выражение 3)

код цикла

где выражение 1 – начальное значение параметра цикла; выражение 2 – проверка условия на продолжение цикла; выражение 3 – изменение (коррекция) параметра цикла.

Вначале вычисляется выражение 1, затем проверяется выражение 2, если оно – истинно, то выполня­ет­ся код цикла, затем производится коррекция в выражении 3, и так до тех пор, пока выражение 2 не примет значение «ложь».

Досрочный выход из операторов цикла выполняет оператор break, а оператор continue выполняет передачу управления в головной оператор цикла.

Например: Написать программу вычисления факториала, используя for или while с клавиатуры.

#include<iostream.h>

void main()

{int factorial=1,i,n;

cin>>n;

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

{factorial*=i;

}

cout<<factorial;

}

11. Назначение функций. Для чего нужны параметры в функции? Как передать одномерный, двумерный массив в качестве параметра? Рекурсия. Привести примеры.

Назначение функций.   тип_результата имя_функции(тип_аргумента необязательное_имя_аргумента[, ...]);  Функция может возвращать значения типа void, int,float и т.д. Имя функции может быть произвольным, но желательно, чтобы оно указывало на ее назначение. Если для выполнения функции нужно предоставить ей некоторую информацию в виде аргумента, то в круглых скобках должен быть указан тип аргумента и, при необходимости, его имя.  Тип аргумента может быть любым. Если аргументов несколько, их описания (тип плюс имя) разделяются запятыми. Не будет ошибкой указание в прототипе только типа аргумента, без имени. Описание функции представляет собой часть программного кода, которая, как правило, следует за телом функции main(). Синтаксис описания следующий:  тип_результата имя_функции(тип_аргумента имя_аргумента[, ...]) { тело функции ) Обратите внимание на то, что строка заголовка функции идентична строке описания ее прототипа, за одним маленьким исключением: она не завершается точкой с запятой. Ниже показана программа, в которой имеется пример описания функции:  /*  * prototyp.c  * Эта программа на языке С содержит описание функции.  * Функция находит сумму двух целочисленных аргументов и возвращает  * результат в виде целого числа.  */ #include ‹stdio.h› int iadder(int ix, int iy) ;  /* прототип функции  */ int main () { int ia = 23;  int ib = 13; int ic; ic = iadder(ia, ib) ;  printf("Сумма равна %d\n",ic) ; return(0);  } int ladder(int ix, int iy) /* описание функции  */ { int iz; iz = ix + iy; return(iz);  /* возвращаемое значение  */  }

Для чего нужны параметры в функции?

 C++ позволяет с помощью параметров передавать информацию в функции.

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

• C++ позволяет программам указывать для параметров значения по умолчанию.

• Значения по умолчанию для параметров указываются в заголовке функции при ее определении.

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

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

Как передать одномерный, двумерный массив в качестве параметра?

Массивы можно передавать в методы в качестве параметров. Поскольку массивы являются ссылочными типами, метод может изменять значение элементов.

Передача одномерных массивов в качестве параметров

Инициализированный одномерный массив можно передать в метод. Пример.

PrintArray(theArray);

Метод, вызываемый в приведенной выше строке, может быть задан как:

void PrintArray(int[] arr)

{

// method code

}

Новый массив можно инициализировать и передать за одно действие. Пример.

PrintArray(new int[] { 1, 3, 5, 7, 9 });

Передача многомерных массивов в качестве параметров

Инициализированный многомерный массив можно передать в метод. Например, если theArray является двумерным массивом:

PrintArray(theArray);

Метод, вызываемый в приведенной выше строке, может быть задан как:

void PrintArray(int[,] arr)

{

// method code

}

Новый массив можно инициализировать и передать за одно действие. Пример.

PrintArray(new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } });

Рекурсия

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]