|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Пример 3.. Пример 4.. Пример 5. ⇐ ПредыдущаяСтр 3 из 3 Пример 3. //Определение и использование указателей на функции #include "stdafx.h" #include <iostream> using namespace std; //Определение и использование указателей на функции void f1(); //объявление (прототип)функции f1 void f2(); //объявление (прототип)функции f2 int _tmain(int argc, _TCHAR* argv[]) { void (*ptr)(); //ptr - указатель на функцию f2(); //явный вызов функции f2 ptr=f2;//указателю присваивается адрес функции f2 (*ptr)(); //вызов функции f2 по ее адресу с разыменованием указателя ptr=f1;//указателю присваивается адрес функции f1 (*ptr)(); //вызов функции f1 по ее адресу с разыменованием указателя ptr(); // вызов функции f1 без разыменования указателя system("pause"); return 0; } //описание функции f1 и f2 void f1() { cout << "Выполняется f1\n"; } void f2() { cout << "Выполняется f2\n"; } Пример 4. //Вариант 1 использования указателя на функцию #include "stdafx.h" #include <iostream> using namespace std; float plus(float, float); //Объявление (прототип) функции int _tmain(int argc, _TCHAR* argv[]){ float x=2.1, y=4.89; float (*func)(float,float); //определение указателя func на функцию printf("Сумма равна %.3f\n",plus(x,y)); func=plus; //указателю присвоить адрес func точки входа в функцию plus // Используем указатель на функцию printf("Сумма = %.3f\n",func(x,y)); system("pause"); return 0; } //Описание функции сложения двух аргументов float plus(float a, float b) { return a+b; } Пример 5. //Вариант 2 использования указателя на функцию #include "stdafx.h" #include <iostream> using namespace std; float plus(float, float); //Объявление (прототип)функции int _tmain(int argc, _TCHAR* argv[]){ float x=2.1, y=4.89; float (*func)(float, float)=+ //определение указателя на функцию plus printf("Сумма равна %.3f\n",plus(x,y)); //указателю присвоить адрес точки входа в функцию plus (Используем указатель на функцию) printf("Сумма = %.3f\n",func(x,y)); system("pause"); return 0; } //Описание функции сложения двух аргументов float plus(float a, float b) { return a+b; } Указатели на функции как параметры позволяют создавать функции, реализующие тот или иной метод обработки другой функции, которая заранее не определена. Например, можно определить функцию для вычисления определенного интеграла от произвольной функции. Подынтегральная функция может быть передана в функцию вычисления интеграла с помощью параметра-указателя. Пример 6: Вычислите приближенное значение интегралов с помощью формулы прямоугольников, задав пределы интегрирования [a, b] и число интервалов разбиения и . #include "stdafx.h" #include <iostream> using namespace std; //Объявление (прототипы) функций: /*функция rectangle() возвращает значение типа double, ее параметры:*/ /*pf–указатель на функцию с параметром типа double, возвращающую значение double*/ /*a, b – пределы интегрирования, величины типа double*/ double rectangle(double(*pf)(double), double a, double b); /*функция ratio() возвращает значение типа double, ее параметр типа double*/ double ratio(double x); /*функция cos4_2() возвращает значение типа double, ее параметр типа double*/ double cos4_2(double v); int _tmain(int argc, _TCHAR* argv[]){ double a,b,c; printf("\nВведите значения пределов интегрирования:"); printf("\na= "); scanf("%lf",&a); printf("\nb= "); scanf("%lf",&b); c=rectangle(ratio,a,b); printf("Первый интеграл = %f\n",c); printf("Второй интеграл = %f\n",rectangle(cos4_2,a,b)); system("pause"); return 0; } double rectangle(double(*pf)(double), double a, double b){ /*Вычисление определенного интеграла с помощью формулы прямоугольников*/ int N, i; double h,s=0.0; printf("\nВведите количество интервалов разбиения: N= "); scanf("%d",&N); printf("\na= "); h=(b-a)/N; //Длина интервала разбиения for (i=0;i<N;i++) s+=pf(a+h/2+i*h); return h*s; } double ratio(double x) { //Подынтегральная функция double z; //Вспомогательная переменная z=x*x+1; return x/(z*z); } double cos4_2(double v){ //Подынтегральная функция double w; //Вспомогательная переменная w=cos(v); return 4*w*w; }
Задания для выполнения 1. Задано натуральное число. Разместите в памяти последовательно все его цифры, используя указатели и операции над ними. 2. Методом половинного деления решите уравнения на отрезке с данной точностью . При решении считать, что на данном отрезке существует единственный корень. Решите первое уравнение на отрезке [0, 1], а второе на отрезке [100, 150]. 3. Решите задачу, используя один указатель на функцию. Разработайте четыре функции над двумя целыми параметрами, соответствующие арифметическим операциям (+, -, *, /). В основной программе задавайте два целых параметра и символьный знак операции до тех пор, пока не будет введен пробел в качестве знака операции. В выходных данных выводите значения функций. 4. Вычислите суммы с данной точностью е. Используйте указатели на функции как параметры: и . 5. Напишите функцию для вычисления значения многочлена Pn(x)=anxn+an-1xn-1+...+a1x1+a0. Коэффициенты an,an-1,...,a0, аргумент x и коэффициенты передавайте в функцию с помощью списка параметров изменяемой длины. В основной программе вычислите и напечатайте значения нескольких полиномов. Для вычисления полиномов используйте схему Горнера: Pn(x)=(...(anx+an-1)x+an-2)x+...+a1)x+a0. 6. Индивидуальное задание. Напишите функцию, где признаком конца списка является 0. Выведите полученный список элементов. Решите задачу, используя указатели.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|