Содержание
- 2. Функции в СИ устроены так, чтобы они являлись эффективными с точки зрения выполнения (затрат) на ЭВМ.
- 3. Из анализа условия поставленной задачи следует, чтобы вычислить значение выражения (1) необходимо уметь вычислять k-ый корень
- 4. Рис. 1. Блок-схема алгоритма
- 5. Теперь необходимо построить блок-схему алгоритма для вычисления значения корня k-ой степени числа x с точностью ε.
- 6. Объявление и описание функции. Описание функции пользователя должно иметь следующий вид: [ ] ( ) [
- 7. После имени в круглых скобках приводится список аргументов, от которых она зависит. Он представляет собой имена
- 8. Кроме того, считается, что функция возвращает значение типа int, если перед ее именем явно не указан
- 9. Существуют также локальные переменные, область действия которых ограничена, например, функцией. Если программа велика и ее текст
- 10. Спецификатор register означает, что пользователь размещает переменную не в оперативной памяти ЭВМ, а на одном из
- 11. Разработка программы. Только теперь можем приступить к написанию программы решения поставленной ранее задачи, учитывая блок-схемы рис.
- 12. Программа 1: #include #include #include void main (void) { float sqr001 (int, float, float); float a,
- 13. /* Функция пользователя */ float sqr001 (int k, float x, float eps) { int i; float
- 15. Скачать презентацию
Функции в СИ устроены так, чтобы они являлись эффективными с
Функции в СИ устроены так, чтобы они являлись эффективными с
Целью данного раздела является изложение основных правил и соглашений, используемых для проектирования пользовательских функций, потребность в которых возникает по смыслу решаемой задачи.
Рассмотрим следующую задачу. Для заданного вещественного числа a > 0 вычислить значение величины
(1)
Корень
вычислять с точностью ε = 0.0001 по следующей итерационной формуле:
За ответ брать приближение yn+1, для которого выполнено неравенство
Из анализа условия поставленной задачи следует, чтобы вычислить значение
Из анализа условия поставленной задачи следует, чтобы вычислить значение
Построим блок-схему алгоритма для вычисления выражения (1) рис. 1.
Рис. 1. Блок-схема алгоритма
Рис. 1. Блок-схема алгоритма
Теперь необходимо построить блок-схему алгоритма для вычисления значения корня k-ой
Теперь необходимо построить блок-схему алгоритма для вычисления значения корня k-ой
Рис. 2. Блок-схема вычисления
функции
Объявление и описание функции. Описание функции пользователя должно иметь следующий
Объявление и описание функции. Описание функции пользователя должно иметь следующий
[<тип>] <имя функции> (<список аргументов>)
[<описание аргументов>]
{
[<описание переменных>]
<оператор>;
⋅
⋅
⋅
<оператор>;
}
По существу функция – это программа, которая оформлена специальным образом. Она имеет "заголовок" (первая строка), начинающийся с ключевого слова, который описывает тип данных возвращаемого ею значения. Затем следует имя функции, которое определяется пользователям по правилам задания идентификаторов переменных.
После имени в круглых скобках приводится список аргументов, от которых
После имени в круглых скобках приводится список аргументов, от которых
return (<выражение>);
с помощью которого осуществляется передача значения некоторого выражения из функции в вызываемую программу.
Сейчас рассмотрим, каким образом транслятор определяет функции. Если ранее в описаниях не встречалось имя, за которым следуют круглые скобки (левая скобка), то транслятор воспринимает это имя как имя функции.
Кроме того, считается, что функция возвращает значение типа int, если
Кроме того, считается, что функция возвращает значение типа int, если
Аргументы функции. Аргументы (параметры) функции передаются двумя способами: по значению, когда функция получает свою собственную копию каждого аргумента, а не его адрес. Это означает, что функция не может воздействовать на оригинал, так как проводит все действия с копиями аргументов. Фактически каждый аргумент внутри функции является просто локальной переменной, инициализированной значением, с которым обратились к этой функции. Таким способом нельзя осуществлять передачу значений из функции в вызывающую ее программу.
Второй способ передачи аргументов основан на указании адреса (места ее хранения) и поэтому называется передачей параметров по ссылке. О нем речь пойдет несколько позднее, когда приступим к изложению материала об указателях.
Классы памяти. Вам уже известно. Что программа на СИ оперирует с множеством объектов: констант и переменных. Причем часть переменных может определяться вне функции и, по отношению к ней, будут являться внешними.
В языке СИ существует такое понятие как область действия переменных. Принято, что область действия переменной простирается от оператора описания и до конца программы.
Существуют также локальные переменные, область действия которых ограничена, например, функцией.
Существуют также локальные переменные, область действия которых ограничена, например, функцией.
Локальные переменные (auto). Если при объявлении явно не указан класс памяти, то переменные считаются локальными и их область видимости определяется классом памяти auto. Область видимости локальных переменных простирается от оператора объявления переменной до момента ее последнего использования. Никаких действий по инициализации таких переменных транслятором не проводится. Поэтому пользователь сам должен позаботиться о присвоении им начальных значений, которые бы соответствовали смыслу решаемой задачи. В противном случае компилятор присвоит им то значение, которое хранилось в ячейке оперативной памяти выделенной для ее хранения. Такой процесс присвоения начального значения локальной переменной называется подбором мусора.
Регистровые переменные (register). Такой класс памяти может быть применен только для локальных переменных или формальных параметров функции (параметры, используемые при описании функции).
Спецификатор register означает, что пользователь размещает переменную не в оперативной памяти
Спецификатор register означает, что пользователь размещает переменную не в оперативной памяти
Статические переменные (static). Такой класс памяти определяет для статических переменных область видимости от точки их объявления до конца файла. Значения таких переменных сохраняется от одного обращения к ней до другого. При этом следует учитывать, что область их видимости по сравнению с локальными переменными расширяется, однако, тем не менее, они будут не видимы вне файла, где они определяются.
Внешние переменные (extern). Внешние переменные используются в тех случаях, когда программа хранится в нескольких файлах (об этом случае уже упоминалось выше). Для того чтобы распространить влияние некоторой переменной на другие файлы необходимо в них объявить эту переменную внешней путем использования спецификатора extern.
Разработка программы. Только теперь можем приступить к написанию программы решения
Разработка программы. Только теперь можем приступить к написанию программы решения
[<тип>] <имя функции> (<список типов аргументов>) ; ,
где <тип> – ключевое слово, описывающее тип возвращаемого значения, <имя функции> – идентификатор, описывающий имя функции пользователя, <список типов аргументов> – список ключевых слов через запятую, описывающих типы данных, принимаемые соответствующими аргументами функции. Для функции sqr001 оператор объявления будет иметь вид
float sqr001 (int, float, float); .
Запишем текст программы.
Программа 1:
#include
#include
#include
void main (void)
{
float sqr001 (int,
Программа 1:
#include
#include
#include
void main (void)
{
float sqr001 (int,
float a, eps, q1, q2, q3;
clrsrc ();
printf ("Введите a, eps:");
scanf ("%f %f", &a, &eps);
q1 = sqr001 (3, a, eps);
q2 = sqr001 (6, pow(a, 2)+1, eps);
q3 = sqr001 (7, a+3, eps);
q1 = (q1 – q2)/q3;
printf ("\nЗначение выражения = %f", q1);
}
/* Функция пользователя */
float sqr001 (int k, float x, float
/* Функция пользователя */
float sqr001 (int k, float x, float
{
int i;
float y0,p;
y0 = 1.0;
m1:p = 1.0;
i = 1;
m2:p *= y0;
i++;
if (i < (k-1)) goto m2;
p = y0 + (x/p – y0)/k;
if (fabs(p-y0) >= eps)
{
y0 = p;
goto m1;
}
return (p);
}