Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_Методичка(часть 1) программирование.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
203.26 Кб
Скачать

1.2. Порядок выполнения работы.

1. Изучить материал данного методического пособия, привлекая лекции и дополнительную литературу;

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

1.3. Варианты заданий

  1. Дано натуральное число N. Вычислить

, где

  1. Даны натуральное число N и вещественное х. Не используя функцию pow() вычислить выражения:

  1. Дано натуральное число N. Вычислить выражение

  1. Выбрать все простые числа из заданного диапазона. Простыми считаются числа, которые делятся без остатка только на 1 и сами на себя.

  1. По двум введенным вещественным числам вычислить коэффициенты b и c приведенного квадратного уравнения, корнями которого являются эти числа. Вывести на экран это уравнение в виде:

x2 + bx + c = 0 .

  1. Даны натуральное число N и вещественное х. Вычислить выражение:

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

  1. Цель и способы объявления и инициализации переменных?

  2. Что означает термин ключевое слово? Может ли ключевое слово использоваться в качестве идентификатора переменной?

  3. Назовите отличие функций printf() и scanf() в их поведении по отношению к аргументам.

  4. Цель использования спецификаторов преобразования?

  5. Что происходит, если программа встречает оператор break?

  6. Что такое вложенный цикл?

ЛАБОРАТОРНАЯ РАБОТА №2

Целью лабораторной работы является освоение:

- Правил создания функций;

- Назначения и состава формальных и фактических параметров;

- Правил вызова функций;

- Правила определения области действия переменных;

- Правил строения и вызова рекурсивных функций.

2.1. Методическая часть Функции. Аргументы функции.

Минимальным исполняемым модулем программы в языке С является функция. Каждая функция имеет единый формат определения:

возвращаемый_тип имя_функции (спецификация_параметров)

{

тело_функции

}

возвращаемый_тип - обозначение типа возвращаемого функцией значения

имя_функции - уникальный идентификатор, не совпадающий со служебными словами

спецификация_параметровлибо пустой список, либо список формальных параметров, каждый элемент которого имеет вид: тип_параметра имя_параметра

тело_функции - набор операторов, один из которых является обязательным – оператор return. Оператор return служит механизмом возврата из функции в точку вызова. Имеются две формы этого оператора:

return – соответствует завершению функции, не возвращающей никакого значения;

return выражение; - возвращает значение, автоматически преобразовываемое к возвращаемому функцией типу.

Чтобы сделать доступ к функции корректным определение функции (прототип) или описание функции в файле приложения размещаются до места ее вызова.

Прототип функции имеет следующий формат:

возвращаемый_тип имя_функции (спецификация_параметров);

Для обращения к функции используется выражение:

имя_функции (список_фактических_параметров);

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

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

Пример фрагмента приложения, содержащего функцию вычисления абсолютной величины числа: int abs ( int X );

main()

{ int x, y;

………

y = abs ( x );

………

}

int abs ( int X )

{ if ( X < 0 )

return ( - X );

else

return ( X );

}

Локальная переменная Х в вызываемой функции никак не влияет не переменную х в главной программе.

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

Пример функции, осуществляющей обмен данными между двумя переменными:

swab( int *X, int *Y);

main()

{ int x=10, y=-1;

swab(&x, &y); // передача адресов в функцию

……….

}

swab( int *X, int *Y);

{ int temp;

temp = *X;

*X = *Y;

*Y = temp;

return;

}

Итак, путем передачи функции адресов переменных x и y мы предоставили возможность доступа к ним.

При вызове функции информация о переменной может передаваться функции двумя способами. Если мы используем форму обращения function(x) происходит передача значения переменной х. Если же мы используем форму обращения function(&x), происходит передача адреса переменной х, что дает возможность влиять на значение самой переменной х.

Все функции в приложении, написанном на языке С равноправны, т.е. каждая из них может вызывать другую функцию, и в свою очередь, каждая может быть вызвана любой другой функцией. Функция main() отличается от других только тем, что после «сборки» программы, состоящей из нескольких функций, выполнение программы начинается с первого оператора функции main(). Даже функция main() может быть вызвана другими функциями. Более того, функция может вызвать сама себя. Рассмотрим следующий пример:

#includestdio.h

main()

{ char ch;

printf (“Укажите произвольный символ. Символ конца работы - *.\n);

сh = getchar ();

printf (“Вы указали символ %c \n” , ch);

if (ch != ‘*’ )

main();

}

Действие, состоящее в том, что функция вызывает сама себя, называется рекурсией. Цикл, который был создан, используя рекурсию, отличается от циклов while и do while. Когда функция main() вызывает сама себя, не происходит передачи управления на ее начало. Вместо этого в памяти машины сначала создаются копии всего набора переменных функции main(), а затем только происходит передача управления на ее начало. В обычном цикле адреса переменных, используемых в нем, не меняются от итерации к итерации. В рекурсивном же цикле адрес переменной ch меняется, поскольку при каждом выполнении тела цикла создается новая копия переменной ch.