Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Си.doc
Скачиваний:
3
Добавлен:
15.11.2019
Размер:
2.72 Mб
Скачать

Int main()

{

Int vector_min, vector_max, temp;

int i, i1, i2, i3, m, per;

time_t t; // текущее время для инициализации

// генератора случайных чисел

srand((unsigned) time(&t)); // инициализация генератора // случайных чисел

printf("\nВведите нижнюю границу:");

scanf(“%d”, &vector_min);

printf("\nВведите верхнюю границу:");

scanf(“%d”, &vector_max);

printf("\nВведите размер вектора:");

scanf(“%d”, &n);

Int vector[n];

printf("\nИсходный вектор:\n");

m= vector_max–vector_min + 1;

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

{

// получение случайного числа в диапазоне

// от vector_min до vector_max

vector[i]=rand()% m + vector_min;

printf(" %5d", vector[i]);

}

printf("\n");

i1=n-1;

while (i1>=1)

{

i1 /= 2;

i2=n-i1-1;

do

{

per=1;

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

{

i3=i+i1;

if (vector[i] > vector[i3])

{

temp=vector[i];

vector[i]=vector[i3];

vector[i3]=temp;

per=0;

} // if (vector[i] > vector[i3])

} // for (i=0; i<=i2; i++)

} // do

while (!per);

} // while (i1>=1)

printf("\nОтсортированный вектор:\n");

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

{

printf(" %5d", vector[i]);

}

printf("\n");

return 0;

}

Функции

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

Подпрограмма, произведя вычисления при заданных (входных) значениях аргументов, обеспечивает возврат в вызвавшую ее программу, причем в то же самое место, откуда она была вызвана. Разбиение большой программы на несколько мелких подпрограмм облегчает процесс программирования: маленькие подпрограммы легко читаются и понимаются, поэтому облегчается их отладка и тестирование. После того, как подпрограмма написана и отлажена, можно забыть, как она сделана. Достаточно знать, какие входные аргументы необходимы для ее работы, и что она дает на выходе.

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

Примерами подпрограмм являются программы вычисления отдельных функций, имеющихся в библиотеках языков программирования – стандартные функции, а также функции ввода-вывода. Эти подпрограммы размещены в системной библиотеке языка, подключаемой к программе пользователя при ее обработке. Значит, используя в своей программе, например, функцию printf, мы обращаемся к стандартной библиотеке ввода-вывода stdio.h, подсоединяемой к нашей программе директивой препроцессора #include <stdio.h>.

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

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

Функция – это подпрограмма, состоящая из заголовка, описания локальных (внутренних) переменных и блока (операторов, реализующих алгоритм вычислений). Она предназначена для вычисления единственного значения, зависящего от нескольких аргументов (формальных параметров).

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

директивы препроцессора

прототипы функций

void main()

{

головная программа с обращениями к функциям

}

описание функций

Таким образом, функции, используемые в программе, должны быть обязательно объявлены – указан их прототип. Прототип – это заголовок функции с указанием ее типа, имени, типов и имен аргументов – формальных параметров:

int summa(int a, int b);

void vorm_mass(int n, int m, int mass[n][m]);

Внимание! После закрывающих скобок точка с запятой ставится обязательно!

Таким образом, прототип функции полностью соответствует ее заголовку, используемому при ее дальнейшем описании.

Сами функции описываются после головной программы:

int summa(int a, int b)

{

int s; // s – локальная переменная

s = a + b;

return s; // возврат вычисленного значения

}

void vorm_mass(int n, int m, int mass[n][m])

{

int i, j;

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

for (j=0; j<m; j++)

{

// задание значений элементам массива mass[n][m]

}

}

Внимание! После заголовка функции и закрывающих фигурных скобок точка с запятой не ставится!

В последнем случае оператор return не нужен, так как функция vorm_mass имеет тип void – ничего не возвращает.

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

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

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

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

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