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

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

27.01.2020, 15:23. Показов 2093. Ответов 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,929
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,929
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
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru