Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 10.10.2022
Сообщений: 69

Реализовать программу вычисления площади фигуры (клавиши стрелок)

24.12.2022, 00:15. Показов 2081. Ответов 22

Студворк — интернет-сервис помощи студентам
Здравствуйте нужна помощь.
Обнаружила 2 проблемы:
-Программа реагирует не только на клавиши со стрелками ,но и на другие клавиши позволяющие перемещаться в меню программы, что так не должно быть и я не знаю как это исправить.
-Преподаватель заметил что программа вычисляет у меня всю сумму а по заданию 2 пункта:
*
1. Реализовать программу вычисления площади фигуры, ограниченной кривой
2 * x ^ 3 + (2) * х ^ 2 + (5) * x + (9) и осью ОХ (в положительной части по оси OY).
2. Вычисление определенного интеграла должно выполняться численно, с применением метода левых прямоугольников.
3. Пределы интегрирования вводятся пользователем.
4. Взаимодействие с пользователем должно осуществляться посредством сазе-меню.
5. Требуется реализовать возможность оценки погрешности полученного результата.
6. Необходимо использовать процедуры и функции там, где это целесообразно.
*
Преподаватель нарисовал мне рисунок объяснив что программе нужно считывать только что я пометила красным, а так программа у меня все считывает что не соответствует заданию



Помогите разобраться с этими проблемами.

*Сам код
Pascal
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
program treelab;
 
uses Crt;
 
var
  opt: byte;
  n, i: longint;
  limits, partitions, res: boolean;
  Fu, x, a, b, h, s: real;
 
procedure WriteMenu;
const
  menu: array[1..6] of string =
    ('Information on function and method >',
     'Input limits of x = [a,b]...',
     'Input number of x partitions...',
     'Calculate approx. square of the figure >',
     'Assess result''s inaccuracy >',
     'Exiting the program');
var
  item: integer;
  pressedkey: char;
begin
  TextBackground(Cyan);
  TextColor(white);
  ClrScr;
  for item := 1 to High(menu) do
  begin
    if item = opt then
      begin
        TextBackground(white);
        TextColor(Red);
      end
    else begin
      TextBackground(Cyan);
      TextColor(white);
    end;
    writeln(' ', item, '.', menu[item], ' ');
  end;
  pressedkey := ReadKey;
  case pressedkey of
    #72: Dec(opt);
    #80: Inc(opt);
    #13: exit;
    #27: begin
           opt := 6;
           exit;
         end;
    '1'..'6': begin {to directly enter any menu option by index}
                opt := Ord(pressedkey) - Ord('0');
                exit;
              end;
  end;
  if opt > High(menu)
    then opt := 1
    else if opt < 1 then opt := High(menu);
  WriteMenu;
end;
 
function f(x: real): real;
begin
  f := (2) * x * x * x + (2) * x * x + (5) * x + (9);
end;
 
function f_primitive(x: real): real;
begin
  f_primitive := 1 / 2 * x * x * x * x + 2 / 3 * x * x * x + 5 / 2 * x * x + 9 * x;
end;
 
function s_exact: real;
begin
  s_exact := f_primitive(b) - f_primitive(a);
end;
 
begin
  limits := false;
  partitions := false;
  res := false;
  opt := 1;
  while true do
  begin
    WriteMenu;
    ClrScr;
    case opt of
      1: begin
           writeln(#10#13'  f(x) = 2x^3 + 2x^2 + 5x + 9;');
           writeln(#10#13'Calculation of figure''s square above OX axis using the method of left rectangles');
         end;
      2: while true do
         begin
           res := false;
           partitions := false;
           write('Lower limit (a) = '); readln(a);
           if (a < -1.4378) then begin
             writeln('Lower limit must be >= -1.4378, where f(x) >= 0'#10#13);
             continue
           end;
           write('Upper limit (b) = '); readln(b);
           if b <= a then begin
             writeln('Upper limit must be > Lower limit!'#10#13);
             continue
           end;
           limits := true;
           break;
         end;
      3: while true do
         begin
           res := false;
           write('Number of partitions for x range (n > 1) = '); readln(n);
           if n < 2 then
             writeln('Invalid value!'#10#13)
           else begin
             partitions := true;
             break;
           end;
         end;
      4: if (partitions = true) and (limits = true) then
           begin
             h := (b - a)/n;
             x := a;
             s := 0;
             for i := 1 to n do
             begin
               s :=abs(s + f(x)*h)*n;
               x := x + h;
             end;
             writeln(#10#13'Result (figure''s square) ~= ', s:0:3, ' (sq. units)');
             writeln(#10#13'Approximated within range of x = [',a:0:2,', ',b:0:2,'] devided by ', n, ' partitions');
             res := true;
           end
         else write(#10#13'Not all parameters entered!');
      5: if not res then
             write(#10#13'You need to calculate the result, first!')
         else begin
           Fu := s - s_exact;
           writeln(#10#13'Absolute inaccuracy = ', Fu:0:3, ' (sq. units)');
           writeln(#10#13'Relative inaccuracy = ', (Fu / s * 100):0:3, '%');
         end;
      6: exit;
    end;
    if (opt=1) or (opt>3) then readkey
  end;
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.12.2022, 00:15
Ответы с готовыми решениями:

Реализовать программу вычисления площади фигуры, ограниченной кривой (метод левых прямоугольников)
Здравствуйте, мне нужна помощь в написание программы, задание заключается в следующем: 1. Реализовать программу вычисления площади...

Написать программу вычисления площади фигуры, ограниченной кривой
Приветствую всех! Требуется написать программу вычисления площади фигуры, ограниченной кривой 1*x^3+(2)*x^2+(1)*x+(7) и осью OX (в...

Написать программу вычисления площади фигуры, ограниченной кривой
Реализовать программу, вычисляющую площадь фигуры, ограниченной кривой 2*x^3 + (0)*x^2 + (2)*x + (13) и осью OX (в положительной части по...

22
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8675 / 4512 / 1670
Регистрация: 01.02.2015
Сообщений: 13,949
Записей в блоге: 14
13.01.2023, 08:53
Студворк — интернет-сервис помощи студентам
Как-то не задумывался над столь полноценной изощрённой проверкой преподавателем.

Исходя из представлений по математики, большая погрешность может возникнуть из-за того, что подынтегральная функция не выполняет условия применения формулы Ньютона-Лейбница.
Поэтому для точного вычисления "точного" аналитического значения нужно немного преобразовать:
- если (a>Root) или (b<Root), то s_exact=F(b)-F(a)
- иначе, если (a<Root) и (b>Root), то s_exact=F(b)-F(Root)
Т.е. для кусочной функции и первообразная буде кусочной и формула Ньютона-Лейбница применяться к диапазонам
0
0 / 0 / 0
Регистрация: 10.10.2022
Сообщений: 69
13.01.2023, 11:56  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Поэтому для точного вычисления "точного" аналитического значения нужно немного преобразовать:
- если (a>Root) или (b<Root), то s_exact=F(b)-F(a)
- иначе, если (a<Root) и (b>Root), то s_exact=F(b)-F(Root)
Как я правильно понимаю в коде у меня
Pascal
1
2
3
4
function s_exact(a, b: real): real;
  begin
    s_exact := f_primitive(b) - f_primitive(a);
  end;
и также в коде написано по условию что а < Root, но b<= a
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2:
      begin
        repeat
          Write('Lower limit (a) = ');
          readln(a);
          if (a < Root) then
          begin
            writeln('Lower limit must be >= ', Root, ', where f(x) >= 0'#10#13);
            continue;
          end;
          Write('Upper limit (b) = ');
          readln(b);
          if b <= a then
          begin
            writeln('Upper limit must be > Lower limit!'#10#13);
            continue;
          end;
        until (a > Root) and (a < b);
        LimitsReady := True;
      end;
Я поменяла b<= a на b > Root и при вводе a=1 и b=3 и n=200 результат остался такой же ( но без минуса так как я прописала
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Integral := Integral + f(a + i * DeltaX);
)

Absolute inaccuracy = 0.390 (sq. units)

Relative inaccuracy = 0.410%

Затем я написала что s_exact := f_primitive(b) - f_primitive(Root); и потом ввела предыдущие данные и получила такой результат - Absolute inaccuracy = -19.893 (sq. units)
и
Relative inaccuracy = -20.782%

Я видно опять чего то не поняла и не так сделала, потому что если я ввожу другие данные результат выходит с минусом.

Добавлено через 52 минуты
Сейчас я показала работу другому преподавателю, она сказал что с погрешность проблема решена
то есть это погрешность при вводе вводе a=1 и b=3 и n=200
Absolute inaccuracy = 0.390 (sq. units)

Relative inaccuracy = 0.410% Правильно решена

Есть теперь другая проблема связанною с шагами, вводим данные допустим Lower limit (a) = 200
Upper limit (b) = 400 и n=20, получаем Result (figure's square) ~= 12604846800.000 (sq. units)

Approximated within range of x = [200.00, 400.00] devided by 20 partitions

И теперь меняем на n=1

и получаем результат Result (figure's square) ~= 25664401800.000 (sq. units)

Approximated within range of x = [200.00, 400.00] devided by 1 partitions

Преподаватель сказал что при смене шага и НЕ смене a и b такого не должно быть
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8675 / 4512 / 1670
Регистрация: 01.02.2015
Сообщений: 13,949
Записей в блоге: 14
13.01.2023, 19:13
Цитата Сообщение от Lari76 Посмотреть сообщение
Преподаватель сказал что при смене шага и НЕ смене a и b такого не должно быть
Первообразная растёт довольно быстро, пропорционально 4 степени. Поэтому погрешность методом левых прямоугольников будет огромной.

Воспользуюсь программой из другой темы, чтобы продемонстрировать на графике





Видно, что учтённая площадь при увеличении количества разбиений увеличивается.
При n=1 площадь s=(b-a)*f(a), т.е. значительный рост функции в точке b относительно точки a не учитывается.
При увеличении разбиений, вычисления производятся и ближе к точке b, учитывая её возрастание.

При значениях [200, 400] это проявляется достаточно ярко.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.01.2023, 19:13

Реализовать программу вычисления площади фигуры, ограниченной кривой
1. Реализовать программу вычисления площади фигуры, ограниченной кривой 2 * x * 3 + (2) * x ^ 2 + (2) * x + (0) и осью OX (B...

Реализовать программу вычисления площади фигуры
Реализовать программу вычисления площади фигуры ограниченной кривой 1*x^3+(-1)*x^2+(0)*x+(7) и осью OX(в положительной части по оси OY) ...

Реализовать программу вычисления площади фигуры, ограниченной кривой
1. Реализовать программу вычисления площади фигуры, ограниченной кривой 1*x^3+(2)*x^2+(-3)*x+(0) и осью OX (в положительной части по оси...

Реализовать методы вычисления площади и периметра фигуры
Написать программу, в которой описана иерархия классов: геометрические фигуры (круг, прямоугольник, треугольник). Реализовать методы...

Составить программу приближенного вычисления площади фигуры
Составить программу приближенного вычисления площади фигуры, ограниченной заданными линиями. Использовать метод прямоугольников. Для...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru