1 / 1 / 0
Регистрация: 12.01.2020
Сообщений: 28
Записей в блоге: 11
1

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

27.01.2020, 15:23. Показов 1109. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2020, 15:23
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

Насчет извращений категорически не согласен: вкус - дело субъективное. Я считаю, что наоборот, так удобнее отлаживать программу: в случае необходимость просто не копируете в проект лишние файлы cpp, и в main закомментируете всего несколько строк, вместо того, чтобы комментировать целые блоки кода, которые во время отладки программы начинают "глаза" мозолить.
0
5539 / 3024 / 1262
Регистрация: 07.02.2019
Сообщений: 7,647
27.01.2020, 22:57 4
Цитата Сообщение от 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
1 / 1 / 0
Регистрация: 12.01.2020
Сообщений: 28
Записей в блоге: 11
27.01.2020, 23:22  [ТС] 5
zayats80888
Не знаю, что сказать, просто развожу руками от недоумения, насколько это далеко от задания. Но не будем об этом.

Спасибо большое.
0
5539 / 3024 / 1262
Регистрация: 07.02.2019
Сообщений: 7,647
27.01.2020, 23:26 6
Цитата Сообщение от Nikolay K Посмотреть сообщение
просто развожу руками от недоумения, насколько это далеко от задания.
где конкретно "далеко"?
0
3504 / 2124 / 395
Регистрация: 09.09.2017
Сообщений: 8,824
28.01.2020, 10:29 7
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.01.2020, 10:29
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru