Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК-1_АЯП_рус.doc
Скачиваний:
0
Добавлен:
29.12.2019
Размер:
1.19 Mб
Скачать

Int random ( int n )

{

return rand() % N; // случайное число в интервале [0,N-1]

}

С ее помощью (вызывая ее много раз подряд) можно получать последовательность случайных чисел в интервале [0,N-1] с равномерным распределением.

Теперь попытаемся использовать эту функцию для интервала [a,b]. Очевидно, что формула

k = random(N) + a;

дает последовательность в интервале [a,a+N-1]. Поскольку нам нужно получить интервал [a,b], сразу имеем b=a+N-1, откуда N=b-a+1. Поэтому

Для получения случайных целых чисел с равномерным распределением в интервале [a,b] надо использовать формулу

k = random(b-a+1) + a;

Более сложным оказывается вопрос о случайных вещественных числах. Если разделить результат функции rand() на RAND_MAX:

x = (float) rand() / RAND_MAX;

мы получим случайное вещественное число в интервале [0,1) (при этом надо не забыть привести одно из этих чисел к вещественному типу, иначе деление одного целого числа на большее целое число будет всегда давать ноль).

Длина интервала [0,1) такой последовательности равна 1, а нам надо получить интер-вал длиной b-a. Если теперь это число умножить на b-a и добавить к результату a, мы получаем как раз нужный интервал.

Для получения случайных вещественных чисел с равномерным распределением в интервале [a,b) надо использовать формулу

x = rand()*(b-a)/RAND_MAX + a;

Основная литература: 1[93-96], 2[38-40]

Дополнительная литература:1,2,3,5

Контрольные вопросы:

1. Опишите массив R из пяти элементов, каждый из которых является массивом из 10-ти вещественных чисел.

2. Чему равно значение константы RAND_MAX

3. Заполните массив int x[10][15] случайными числами из диапазона 1..100;

4. Заполните массив float x[15] [15] случайными числами из диапазона 0..1;

5. В каком случае размерность массива можно явно не указывать.

Лекция 8 Функции пользователя. Область действия переменных. Функции и указатели. Функции и массивы.

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

По правилам, принятым в языке С, каждый идентификатор, в том числе и имя функции, должен быть объявлен до его использования в программе. Определение функции состоит из двух частей: заголовка и тела. Заголовок функции, заканчивающийся точкой с запятой, называется прототипом функции и является объявлением функции. При объявлении функции можно сначала объявить только ее заголовок (прототип), а полный текст - тело функции – привести после описания главной функции main.

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

Заголовок определяет имя функции, ее тип и формальные параметры, тело определяет действия над данными, выполняемые функцией. Возращающее функцией значение передается в вызывающюю программу опрератором return   (выражение). Значение "выражения" и есть результат функции (возращаемого значения). Всякая функция имеет вид:     

[тип_результата ] имя([список формальных параметров]) { тело функции ; }

 Здесь квадратные скобки указываютя, что заключенная в них конструкция может отсутствовать. Тип результата определяет тип значения, который возвращается функцией в точку ее вызова при помощи оператора возврата return. Если тип функции не указан, то по умолчанию предполагается тип int. Список параметров состоит из перечня типов и имен параметров, разделенных запятыми. Функция может не иметь параметров, но круглые скобки необходимы в любом случае.

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

Рассмотрим пример программы рисования лестницы.

#include <stdio.h>

void main()

{

printf("|----|\n");

printf("|----|\n");

printf("|----|\n");

}

А теперь напишем эту программу с использованием функции Lestniza.

#include <stdio.h>

void Lestniza(void)

{

printf("|----|\n");

}

void main()

{

Lestniza();

Lestniza();

Lestniza();

}

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

#include <stdio.h>

void Lestniza(int n )/* B - формальный аргумент */

{

int i;

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

printf("|----|\n");

}

void main()

{

Lestniza(3); /* 3 -фактический аргумент */

}

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

mini(int x, int y)_

{ int t;

if (x<y) t=x;

else t=y;

return t;

}

Можно написать функцию mini и таким образом:

mini(int x, int y)

{

return (x<y)? x:y;

}

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

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

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