Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1. Навроцкий А.А. Основы алгоритмизации и программирования в среде Visual C++.pdf
Скачиваний:
54
Добавлен:
26.03.2016
Размер:
3.6 Mб
Скачать
for ( i = 0; i < n; i++) for (j = 0; j < m; j++) {

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

5.4.2. Оператор break

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

5.4.3. Оператор return

Завершает выполнение текущей функции и передает управление вызывающей функции. Управление передается следующему за вызовом текущей

функции оператору.

 

 

 

Р

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

 

 

 

 

 

 

И

return выражение;

 

 

 

 

 

 

 

Если значение выражения задано, то результат возвращается в вызыва-

ющую функцию в качестве значения вызываемой функцииУ.

 

5.4.4. Функция exit

Г

 

Находится в библиотеке stdlib.lib. Корректно прерывает выполнение про-

 

 

Б

 

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

void exit(int)

 

а

 

 

 

 

 

 

Параметр является служебным сообщением системе. Как правило, 0 гово-

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

 

е

 

 

 

 

5.4.5. Функция abort

 

 

Находится в библи еке stdlib.lib. Генерирует «молчаливое» исключение,

не связанное с сообщением б шибке. Корректно прерывает выполнение про-

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

 

 

л

void abort(void)о

 

б

 

 

5.4.6.иОператор безусловного перехода goto

Передает управ ение оператору, помеченному меткой. Использование

и

 

оператора goto существенно снижает читабельность программы и увеличивает

Б

 

 

вероятность ошибки. Поэтому использование goto в программах нежелательно. Пр мером обоснованного применения оператора безусловного перехода

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

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

}

met: …

33

5.5. Организация циклических алгоритмов

Пример 5.1. Вывести таблицу значений функции y(x) = sin(x) на интервале от a до b с шагом h.

Вариант 1 (с использованием оператора цикла for). for (double x=a; x<b+h/2; x+=h)

cout << "x = " << x << " y = " << sin(x) << endl;

Логическое выражение в операторе равно x < b+h/2, а не x<=b. Это вызвано следующим. Счетчик цикла на x каждом шаге увеличивает свое значение на h. Если h – дробное число, то в переменной x могут накапливаться ошибки

округления, которые приводят к тому, что значение x будет, например, равно

И

 

2.00000000000000001, в то время, когда значение b = 2.0. Результат операции

сравнения x <= b в этом случае будет иметь значение false, и, следовательноР

,

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

правой границы интервала увеличивается на величину, не превышающую h

(например на h/2).

 

 

 

 

 

 

 

 

 

 

У

Вариант 2 (с использованием оператора цикла while).

x = a;

 

 

 

 

 

 

 

Г

 

 

 

 

 

 

 

Б

 

while(x<b+h/2)

 

 

 

 

 

 

{

 

 

 

 

 

 

а

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

cout << "x = " << x << " y = " << sin(x) << endl;

 

x += h;

 

 

 

к

 

 

 

 

 

}

 

 

 

 

е

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

Пример 5.2. Вычислить интеграл s

sinx dx методом средних.

 

 

 

 

т

 

 

0

 

 

 

 

 

 

 

 

о

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

h=(b-a)/100;

 

 

 

 

 

 

 

 

 

 

for (x=a+h/2,иs=0; x<b; s+=sin(x)*h, x+=h) ;

 

 

 

 

 

 

л

 

 

 

 

 

100

 

x

k

 

Пр мер 5.3. Вычислить сумму s(x) ( 1)k

 

 

.

 

 

 

 

б

 

 

 

 

 

k 1

 

k!

 

Вначале необходимо получить рекуррентную формулу. Для получения

и

 

 

 

 

 

 

 

 

 

 

 

 

Б

 

 

 

 

 

 

 

 

 

 

 

 

 

формулы вычисляются значения слагаемых при различных значениях k: при

k 1; a

1

x

;

при k 2; a

 

1

x x

;

при k 3; a

1

x x x

и т. д. Видно,

 

 

 

 

1

1

 

 

2

 

1 2

3

 

1 2 3

 

 

 

 

что на каждом шаге слагаемое дополнительно умножается на 1

x

.

Исходя из

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k

 

 

x

 

этого формула рекуррентной последовательности будет иметь вид a

a

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k

 

k 1 k

34

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

 

 

 

s =0;

 

 

 

 

 

// Начальное значение суммы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a=1;

 

// Начальное значение для вычисление очередного

 

 

 

 

 

 

 

 

//

члена рекуррентной последовательности

 

 

 

 

 

 

 

for ( int k=1; k<=100; k++)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a*=-x/k;

// Вычисление очередного члена

 

 

 

 

 

 

 

 

 

 

 

Р

 

 

 

 

 

 

 

 

// рекуррентной последовательности

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s+=a;

 

// Суммирование всех слагаемых

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

У

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

100

 

 

x

2k

 

 

 

 

 

 

 

 

Пример 5.4. Вычислить сумму s(x) ( 1)k

 

 

 

 

sin(x).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x

Г

И

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k 0

 

 

(2k)!

 

 

 

 

 

В данной формуле получить рекуррентную зависимость для sin(x) слож-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Б

 

 

 

 

 

 

 

 

 

 

 

 

 

 

но, поэтому функция sin(x) будет рассчитываться отдельно (как нерекуррентная

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

100

 

 

2k

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

а

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

часть). Для оставшейся части формулы ( 1)k

 

 

 

 

рассчитываются значе-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k 0

 

(2k)!

 

 

 

 

 

 

 

1

 

 

 

 

 

ния слагаемых

при

различных

значениях

k: при

 

k 0;

 

a

1

; при

k 1;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

последов

 

 

 

 

 

 

 

 

 

 

1

 

 

1

 

2

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

2

 

 

 

 

 

x

 

 

 

 

 

 

 

 

 

x

2

 

2

 

 

 

 

 

 

 

 

 

 

 

x

x

x

 

 

a

1

 

 

; при

k 2; a

 

1

 

xк; при

k 3;

 

a

 

1

 

 

 

 

 

 

и т. д.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k

 

 

k 1

(2k 1) (2k)

 

2

 

чет

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

1 2

 

 

 

 

 

 

 

1 2 3 4

 

 

 

 

 

 

 

 

1 2 3 4 5 6

 

Формула

 

 

рекуррентной

 

 

 

 

 

ательности

 

 

 

будет

 

 

 

иметь

вид

a

a

 

 

 

x2

 

 

о

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

. Рас

удобно начинать не с нулевого элемента, а с

первого. Поэтому значен

е нулевого элемента рассчитывается вручную и под-

 

 

 

 

 

 

л

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ставляется в нача ьное значение суммы.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

б

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Текст программыи:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s = sin(x);

 

 

 

 

 

 

// Значение суммы для нулевого элемента

 

и{

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Б

a = 1;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

for (int k=1; k<=100; k++)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a *= -sqr(x)/(2*k*(2*k-1));

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s += a*sin(x);

 

 

 

// Здесь добавлена нерекуррентная часть

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

35

6. Использование массивов

Массив – структура однотипных данных, каждый элемент которой хранится в отдельной ячейке, доступ к которой осуществляется по ее номеру. Массив характеризуется: имением массива, типом хранимых данных, размером (количеством элементов) и размерностью (формой представления элементов массива). Номер ячейки массива называется индексом. Индексы массивов должны

иметь целый тип, а элементы массивов могут иметь любой тип.

Р

6.1. Одномерные массивы

 

 

 

Объявление одномерного массива:

 

 

тип имя_массива [размер];

У

 

Пример объявления массива:

 

И

int с[4];

Размер статического массива задается константой или константным вы-

ражением целого типа.

 

 

 

 

 

Индексы в языке С/С++ начинаются с 0. НапримерГ, вышеобъявленный

 

 

 

 

 

 

 

 

а

массив состоит из четырех элементов: с[0], c[1], c[2] и c[3]. Расположение эле-

ментов массива в памяти указано на рис. 6.1.

Б

 

 

 

 

 

 

 

к

 

 

 

 

 

о

е

 

 

 

 

 

 

 

 

 

 

 

 

 

и

т

Рис. 6.1

 

 

 

л

 

 

 

 

 

 

Одновременно с объявлением можно инициализировать элементы массива:

 

б

 

 

 

 

 

 

 

 

double b[4] = {1.5, 2.5, 3.75, 3.04};

 

Если

int a[4] = {1, 4};

 

 

 

 

 

 

 

 

 

 

Б

в группе инициализации не хватает начальных значений, то остав-

 

 

 

 

 

 

 

 

 

шиеся элементы заполняются нулями, например, массив a: a[0] = 1, a[1] = 4,

a[2] = 0 a[3] = 0.

При объявлении со списком инициализации количество элементов можно не указывать. В этом случае размер массива будет равен количеству начальных значений. Объявление

char mc[] = {‘3’, ‘f’, w}

создаст массив из трех элементов.

36

Обращение к элементу массива происходит через указание имени массива и в квадратных скобках номера элемента массива. Например:

x = a[3]; a[4] = b[0] + a[2];

6.2. Алгоритмы работы с одномерными массивами

Пример 6.1. Ввод и вывод одномерного массива. int s[10],i,j,n;

//

 

Ввод одномерного массива

 

 

 

Р

cout << "Vvedite razmer";

 

 

 

 

 

 

 

И

cin >> n;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

У

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

cout << "Vvedite s[" << i << "]= " ;

БГ

 

 

 

 

cin >> s[i];

 

 

 

 

 

 

//

 

Вывод одномерного массива

 

 

 

 

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

 

 

а

 

 

 

 

 

к

 

 

 

 

 

 

{

 

 

 

е

 

 

 

 

 

 

 

 

cout << s[i] << " " ;

 

 

 

 

 

 

 

}

 

 

т

 

 

 

 

 

 

 

 

 

 

о

 

 

 

 

 

 

Пример 6.2. Нахождение суммы и произведения элементов одномерного

массива.

 

 

 

и

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

s = 0; p = 1;

 

 

 

 

 

 

 

 

 

 

 

л

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

б

 

 

 

 

 

 

 

 

 

 

 

s += a[i];

 

 

 

 

 

 

 

 

и

 

 

 

 

 

 

 

 

 

 

 

 

p *= a[i];

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

Пример 6.3. Нахождение минимального и максимального элементов од-

номерногоБ

массива.

 

 

 

 

 

 

 

 

min = max = a[0]; for (i=1; i<n; i++)

{

if (a[i] < min) min = a[i];

37