Int sloshenie(int a, int b)




{

return a + b;

}

Int vychitanie(int a, int b)

{

return a - b;

}

Int umnoshenie(int a, int b)

{

return a * b;

}

Int delenie(int a, int b)

{

return a / b;

}

Int ostatok(int a, int b)

{

return a % b;

}

Работа программы:

first argument =5

second argument =2

|---------------|

| Operazii |

|---------------|

| 1. sloshenie |

| 2. vychitanie |

| 3. umnoshenie |

| 4. delenie |

| 5. ostatok |

|---------------|

Vyberite nomer operacii:5

rezultat =1

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

Рассмотрим задачу вычисления корня функции f(x) на заданном интервале [a, b] с заданной точностью eps. Численный метод (метод деления интервала пополам) оформляется в виде функции со следующим заголовком:

Float root(указатель_на_функцию, float a, float b, float eps)

Введем указатель на функцию, для которой нужно определить корень:

float (*point_func)();

Определим корень для функции x2 – 1. Для этого опишем ее в следующем виде: float test_func(float x)

{

return x*x–1.0;

}

Функция, реализующая выбранный численный метод, будет иметь следующий вид:

Float root(point_func f, float a, float b, float eps)

{

float x, y, c, fx, fy, fc;

fx = (*f)(x);

fy = (*f)(y);

if (fx * fy > 0.0)

{

puts(“Неверный интервал!”);

return -1; // аварийное завершение программы

}

do

{

c = (y – x)/2.0; // центр интервала

fc = (*f)(c); // значение функции в нем

if (fc * fx > 0.0)

{

x = c;

fx = fc;

}

Else

{

y = c;

fy = fc;

}

}

while ((fc!=0.0) && (fabs(y-x) > eps));

return c;

}

 

Полный вид программы:

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <math.h>

typedef float (*point_func)(float); // новый тип данных -
//
указатель на функцию

// вещественного типа

float test_func(float x);

float root(point_func f, float a, float b, float eps);

Int main()

{

float left, right, tochn, koren;

printf(“\n левая граница интервала:”);

scanf(“%f”, &left);

printf(“\n правая граница интервала:”);

scanf(“%f”, &right);

if (left >= right)

{

puts(“Error!”);

return -1; // аварийное завершение программы

}

printf(“\n точность вычислений:”);

scanf(“%f”, &tochn);

printf(“\n”);

koren = root(test_func, left, right, tochn);

printf(“\n корень функции в заданном интервале = %3.5f”, koren);

return 0;

}

Float test_func(float x)

{

return x*x–1.0;

}

Float root(point_func f, float a, float b, float eps)

{

float x, y, c, fx, fy, fc;

fx = (*f)(x);

fy = (*f)(y);

if (fx * fy > 0.0)

{

puts(“Неверный интервал!”;

return -1; // аварийное завершение программы

}

do

{

c = (y–x)/2.0; // центр интервала

fc = (*f)(c); // значение функции в нем

if (fc * fx > 0.0)

{

x = c;

fx = fc;

}

Else

{

y = c;

fy = fc;

}

}

while ((fc!=0.0) && (fabs(y-x) > eps));

return c;

}

Работа программы:

Левая граница интервала:0.0

Правая граница интервала:2.0

Точность вычислений:1.0e-5

 

корень функции в заданном интервале = 1.00000

Указатели и строки

Указатели во многом облегчают работу со строками. Строка – это одномерный массив символов. Поэтому указатель на строку эквивалентен имени этой строки и содержит адрес ее начального символа:

char *c_ptr;

char string[10] = “язык Си”;

c_ptr = string;

Более того, если строка задана как

string = “язык Си”;

то это будет эквивалентно оператору присваивания:

c_ptr = “язык Си”;

Мы присвоили указателю на данные символьного типа значение строковой константы. Другими словами, мы поместили в указатель адрес начального символа строки “язык Си”. Остальные символы этой строки будут расположены в последующих ячейках оперативной памяти.

Таким образом, любой указатель на данные символьного типа может рассматриваться как указатель на строку символов, которую можно задать оператором присваивания, ввести или вывести как обычную строку:

char *message;

message = “Славное море – священный Байкал!”;

puts(message);

printf(“\n%s”, message);

При таком задании строки нет необходимости рассчитывать число символов
в ней и добавлять в ее конец нулевой символ‘\0’ – все это выполнится автоматически. Кроме того, сама строка не помещается в указатель: это невозможно сделать, так как указатель – это переменная. Указатель в этом случае будет только содержать адрес первого символа строки, записанной в неизвестной нам области оперативной памяти компьютера.

Массив указателей на строки позволяет задавать сразу несколько строк:

char *message[4];

message[0] = “Славное ”;

message[1] = “море ”;

message[2] = “- ”;

message[3] = “священный Байкал!”;

Элементами этого массива являются адреса первых символов строк. С ними можно работать как с элементами обычных символьных массивов, например выводить их на экран:

printf(“\n%s%s%s%s”, message[0], message[1], message[2], message[3]);

На экран будет выведено сообщение:

Славное море – священный Байкал!

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-03-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: