Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
 Аватар для Nikolay K
1 / 1 / 0
Регистрация: 12.01.2020
Сообщений: 28
Записей в блоге: 11

Используя указатели на функцию вычислить значение функции в точке X в соответствии с выбором функции пользователем

27.01.2020, 15:23. Показов 2039. Ответов 6

Студворк — интернет-сервис помощи студентам
Решил выложить свои лабораторные работы 1-10 за первый курс, первого семестра (01.09.2019-10.01.2020). Искренне надеюсь, что они кому-нибудь пригодятся.

Примечания к программе смотрите в исходном файле Source.cpp (архив находится по веб-адресу ниже). Здесь я их удалил, чтобы не нагромождать программу.

1 / 7. Source.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/*
 *Лабораторная работа: 8.
 *Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
 *Пункт: 5.2. Указатели на функцию.
 *Файл: Lab08_YaP_2019_1S.pdf
 *
 *Язык: C++.
 *Среда: Microsoft Visual Studio 2019 v16.3.0.
 *Платформа: x64.
 *Изменение: 03.01.2020.
 *
 *Вариант: 13.
 *Защита: 29.11.2019.
 *Задание: БН. Используя указатели на функцию вычислить значение функции в точке X в соответствии с выбором функции пользователем. При
 *     невозможности вычисления функции в точке x выдать соответствующее сообщение:
 *1. (1 + x) / (1 - x).
 *2. SIN (x)^(1 / 2).
 *3. ARCTG (1 / x).
 *4. LN^2 (x - 1 / x).
 */
 
#include <iostream>                                                  // Требуется для SETLOCATE, PRINTF, CIN. //
#include "Header.h"
 
void main () {
     setlocale (LC_ALL, "Russian");
     int Choice = 0;
     void (*PointerOnFunction []) () = {ExitProgramFunction, FirstFunction, SecondFunction, ThirdFunction, FourthFunction};
     printf ("1. С помощью какой функции вы хотите вычислить значение?\n\n   1 + x              _               1           2      1\n1) "
          "-----.     2) Sin Vx.     3) Arctg -.     4) Ln  (x - -).\n   1 - x                              x                  x\n\nВаш в"
          "ыбор: ");
     cin >> Choice;
     if ((Choice < 1) || (Choice > 4)) {
          printf ("\nОшибка ввода. Программа завершает свою работу.\n\n");
          (*PointerOnFunction [0]) ();
     }
     (*PointerOnFunction [Choice]) ();
     (*PointerOnFunction [0]) ();
}
2 / 7. Header.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
 *Лабораторная работа: 8.
 *Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
 *Пункт: 5.2. Указатели на функцию.
 *Файл: Lab08_YaP_2019_1S.pdf
 *
 *Язык: C++.
 *Среда: Microsoft Visual Studio 2019 v16.3.0.
 *Платформа: x64.
 *Изменение: 03.01.2020.
 *
 *Вариант: 13.
 *Защита: 29.11.2019.
 *Задание: БН. (...)
 */
 
using namespace std;
 
void ExitProgramFunction ();                                         // Объявление EXITPROGRAMFUNCTION. //
void FourthFunction ();                                              // Объявление FOURTHFUNCTION. //
void ThirdFunction ();                                               // Объявление THIRDFUNCTION. //
void SecondFunction ();                                              // Объявление SECONDFUNCTION. //
void FirstFunction ();                                               // Объявление FIRSTFUNCTION. //
3 / 7. FirstFunction.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
 *Лабораторная работа: 8.
 *Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
 *Пункт: 5.2. Указатели на функцию.
 *Файл: Lab08_YaP_2019_1S.pdf
 *
 *Язык: C++.
 *Среда: Microsoft Visual Studio 2019 v16.3.0.
 *Платформа: x64.
 *Изменение: 03.01.2020.
 *
 *Вариант: 13.
 *Защита: 29.11.2019.
 *Задание: БН. (...)
 */
 
#include <iostream>                                                  // Требуется для PRINTF, CIN. //
#include "Header.h"
 
void FirstFunction () {                                              // Определение FIRSTFUNCTION. //
     float X = 0;
     printf ("\n2. Область определения функции: X E (-oo, 1) U (1, +oo).\n\n3. Введите значение переменной X: ");
     cin >> X;
     if (X == 1) {
          printf ("\n4. При X = 1 функция не определена.\n\n");
          ExitProgramFunction ();
     }
     printf ("\n       1 + %.2f\n4. Y = -------- = %.3f.\n       1 - %.2f\n\n", X, (1 + X) / (1 - X), X);
}
4 / 7. SecondFunction.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
 *Лабораторная работа: 8.
 *Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
 *Пункт: 5.2. Указатели на функцию.
 *Файл: Lab08_YaP_2019_1S.pdf
 *
 *Язык: C++.
 *Среда: Microsoft Visual Studio 2019 v16.3.0.
 *Платформа: x64.
 *Изменение: 03.01.2020.
 *
 *Вариант: 13.
 *Защита: 29.11.2019.
 *Задание: БН. (...)
 */
 
#include <iostream>                                                  // Требуется для PRINTF, CIN, SIN, SQRT. //
#include "Header.h"
 
void SecondFunction () {                                             // Определение SECONDFUNCTION. //
     float X = 0;
     printf ("\n2. Область определения функции: X E [0, +oo).\n\n3. Введите значение переменной X: ");
     cin >> X;
     if (X < 0) {
          printf ("\n4. При X E (-oo, 0) функция не определена.\n\n");
          ExitProgramFunction ();
     }
     printf ("            ____\n4. Y = Sin V%.2f = %.3f.\n\n", X, sin (sqrt (X)));
}
5 / 7. ThirdFunction.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
 *Лабораторная работа: 8.
 *Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
 *Пункт: 5.2. Указатели на функцию.
 *Файл: Lab08_YaP_2019_1S.pdf
 *
 *Язык: C++.
 *Среда: Microsoft Visual Studio 2019 v16.3.0.
 *Платформа: x64.
 *Изменение: 03.01.2020.
 *
 *Вариант: 13.
 *Защита: 29.11.2019.
 *Задание: БН. (...)
 */
 
#include <iostream>                                                  // Требуется для PRINTF, CIN, ATAN. //
#include "Header.h"
 
void ThirdFunction () {                                              // Определение THIRDFUNCTION. //
     float X = 0;
     printf ("\n2. Область определения функции: X E (-oo, 0) U (0, +oo).\n\n3. Введите значение переменной X: ");
     cin >> X;
     if (X == 0) {
          printf ("\n4. При X = 0 функция не определена.\n\n");
          ExitProgramFunction ();
     }
     printf ("\n               1\n4. Y = Arctg ---- = %.3f.\n             %.2f\n\n", atan (1 / X), X);
}
6 / 7. FourthFunction.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
 *Лабораторная работа: 8.
 *Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
 *Пункт: 5.2. Указатели на функцию.
 *Файл: Lab08_YaP_2019_1S.pdf
 *
 *Язык: C++.
 *Среда: Microsoft Visual Studio 2019 v16.3.0.
 *Платформа: x64.
 *Изменение: 03.01.2020.
 *
 *Вариант: 13.
 *Защита: 29.11.2019.
 *Задание: БН. (...)
 */
 
#include <iostream>                                                  // Требуется для PRINTF, CIN, POW, LOG. //
#include "Header.h"
 
void FourthFunction () {                                             // Определение FOURTHFUNCTION. //
     float X = 0;
     printf ("\n2. Область определения функции: X E (-1, 0) U (1, +oo).\n\n3. Введите значение переменной X: ");
     cin >> X;
     if ((X <= -1) || ((X >=0) && (X <= 1))) {
          printf ("\n4. При X E (-oo, -1] U [0, 1] функция не определена.\n\n");
          ExitProgramFunction ();
     }
     printf ("\n         2           1\n4. Y = Ln  (%.2f - ----) = %.3f.\n                   %.2f\n\n", X, pow (log (X - (1 / X)), 2), X);
}
7 / 7. ExitProgramFunction.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
 *Лабораторная работа: 8.
 *Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
 *Пункт: 5.1. Динамические массивы. Имя массива как указатель.
 *Файл: Lab08_YaP_2019_1S.pdf
 *
 *Язык: C++.
 *Среда: Microsoft Visual Studio 2019 v16.3.0.
 *Платформа: x64.
 *Изменение: 03.01.2020.
 *
 *Вариант: 13.
 *Защита: 29.11.2019.
 *Задание: БН. (...)
 */
 
#include <iostream>                                                  // Требуется для SYSTEM, EXIT. //
#include "Header.h"
 
void ExitProgramFunction () {                                        // Определение EXITPROGRAMFUNCTION. //
     system ("pause");
     exit (true);
}
Архив с исходными файлами (Cyberforum.ru, 11 MB)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.01.2020, 15:23
Ответы с готовыми решениями:

Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции
Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции пользователем. При невозможности...

Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции
Используя указатели на функцию вычислить значение функции в точке х в соответствии с выбором функции пользователем. При невозможности...

Вычислить значение функции в точке используя сумму ряда
Задание: Вычислить значение функции y=x/2 в точке x=2 с точностью Eps, пользуясь представлением функции суммой ряда...

6
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,918
27.01.2020, 15:42
Цитата Сообщение от Nikolay K Посмотреть сообщение
Используя указатели на функцию вычислить значение функции в точке X
Цитата Сообщение от Nikolay K Посмотреть сообщение
void FirstFunction ()
Ужасно.
По смыслу функции не должны вообще общаться с пользователем, они должны только вычислять свой алгоритм.
Ну и разнесение жалких четырех функций по разным файлам тоже то еще извращение.
В общем, если на планируете доводить это поделие до вменяемого состояния, лучше попросите модеров удалить тему.
0
 Аватар для Nikolay K
1 / 1 / 0
Регистрация: 12.01.2020
Сообщений: 28
Записей в блоге: 11
27.01.2020, 22:03  [ТС]
COKPOWEHEU
Посоветуйте, как лучше написать программу, чтобы значение переменной Х передавалось в функцию (в cpp) и затем возвращались блок главной программы (в main)? Дело в том, что из функции (любой, хоть в main, хоть в cpp) в любом случае придется объявлять выходной поток, поскольку она должна проверять значение Х на соответствие области определения функции (ООФ).

На псевдоязыке программа будет выглядеть так:

1. Пользователь выбирает функцию (в main) и инициализирует X.
2. Значение Х передается в функцию (в main).
3. В функции (в main) проверяется соответствие ООФ.
4. Если соответствует, то значение из функции (main) передается в функцию (в cpp) и начинается вычисление.
5. Если не соответствует, то выводится сообщение из функции (в main).

В любом случае, в Source.cpp придется делать дополнительные 4 функции, которые будут проверять на соответствие ООФ, и только после этого передавать значение Х в функции (из файла) для вычисления. Итого получается будет 8 функций! Разумно ли это?

Насчет извращений категорически не согласен: вкус - дело субъективное. Я считаю, что наоборот, так удобнее отлаживать программу: в случае необходимость просто не копируете в проект лишние файлы cpp, и в main закомментируете всего несколько строк, вместо того, чтобы комментировать целые блоки кода, которые во время отладки программы начинают "глаза" мозолить.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
27.01.2020, 22:57
Цитата Сообщение от Nikolay K Посмотреть сообщение
1. Пользователь выбирает функцию (в main) и инициализирует X.
2. Значение Х передается в функцию (в main).
3. В функции (в main) проверяется соответствие ООФ.
4. Если соответствует, то значение из функции (main) передается в функцию (в cpp) и начинается вычисление.
5. Если не соответствует, то выводится сообщение из функции (в main).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Псевдокод
 
typedef double(*foo)(double, bool&);
double foo1(double x, bool& ok)
{
    double result{};
    if (<x не из ООФ>)
    {
        ok = false;
    }
    else
    {
        ok = true;
        reuslt = <че - то там>;
    }
    return result;
}
 
double foo2(double x, bool& ok){<аналагично>}
//...
int main()
{
    foo arr[]{ foo1, foo2, ... };
    size_t choice{};
    double x{};
    std::cin >> x >> choice;
    if (choice < std::size(arr))
    {
        bool ok;
        double result = arr[choice](x, ok);
        if (ok) std::cout << result;
        else ...
    }
}
0
 Аватар для Nikolay K
1 / 1 / 0
Регистрация: 12.01.2020
Сообщений: 28
Записей в блоге: 11
27.01.2020, 23:22  [ТС]
zayats80888
Не знаю, что сказать, просто развожу руками от недоумения, насколько это далеко от задания. Но не будем об этом.

Спасибо большое.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
27.01.2020, 23:26
Цитата Сообщение от Nikolay K Посмотреть сообщение
просто развожу руками от недоумения, насколько это далеко от задания.
где конкретно "далеко"?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,918
28.01.2020, 10:29
Цитата Сообщение от Nikolay K Посмотреть сообщение
Посоветуйте, как лучше написать программу, чтобы значение переменной Х передавалось в функцию (в cpp) и затем возвращались блок главной программы (в main)?
А как оно передается в любые другие функции, sin() хотя бы? Вот точно так же и ваша должна.
Цитата Сообщение от Nikolay K Посмотреть сообщение
она должна проверять значение Х на соответствие области определения функции (ООФ).
Проверять она должна (поскольку программа по определению не должна вылетать ни на каких входных данных, хорошо бы еще сообщать пользователю что он дурак как входные данные исправить), но вот сообщать пользователю - нет. Для индикации выхода за пределы диапазона можете воспользоваться стандартным способом с errno.
Цитата Сообщение от Nikolay K Посмотреть сообщение
Насчет извращений категорически не согласен: вкус - дело субъективное.
не вижу смысла вообще таскать такие простые функции из проекта в проект...
Мне, сидящему по ту сторону форума, удобнее скопировать один кусок кода в один файл и набрать короткую команду, чем создавать десяток файлов со странными именами и компилировать их по отдельности.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <errno.h>
 
double func1(double x){
  errno = 0;
  if( (x < 1e-10) && (x > -1e-10) ){
    errno = EDOM;
    return 0;
  }
  return 1/x;
}
 
int main(){
  double x, y;
  scanf("%lf", &x);
  y = func1(x);
  if( errno != 0 ){
    fprintf(stderr, "Value %lf is out of domain\n", x);
    return -1;
  }
  printf("f(%lf) = %lf\n", x, y);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.01.2020, 10:29
Помогаю со студенческими работами здесь

Вычислить значение функции в произвольной точке интервала, используя линейную аппроксимацию
Сразу по делу задача: Дана функция {y}_{i}= f ({x}_{i}), определенная в . (a,b числа можно дать самому) Значение y = f (x) (a &lt;= x...

Вычислить значение функции, используя суммы с точностью.заданной пользователем
Нужно посчитать значение функции y=(e^x )* sin(x),не пользуясь функциями экспоненты и синуса,а раскладывая в суммы.И посчитать это значение...

Используя понятие дифференциала, найдите приближенное значение функции в точке
4. Используя понятие дифференциала, найдите приближенное значение функции f (x;y) =ln(x^2+y^2) в точке (1,04;0,04)

Вычисление значение функции в точке х, используя разложение в ряд Маклорена
надо написать программу для вычисление значение функции в точке х, с помощью разложения в ряд Маклорена. x, ε вводятся с клавиатуры. ...

вычислить значение функции используя разложение в ряд - 3 функции
Если были похожие темы, то указывайте ссылки, пожалуйста. 1. e=1+1/1!+1/2!+...+1/к!+... - сделано проверить. domains ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru