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

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

27.01.2020, 15:23. Показов 2024. Ответов 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
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
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
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru