С Новым годом! Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 19

Процедура val работает не так как я хочу

24.12.2016, 22:23. Показов 798. Ответов 2

Студворк — интернет-сервис помощи студентам
У меня есть ввод с клавиатуры f01,f02,f03,f04 формул.
Если записывать вместо процедуры val напрямую присвоение переменной формулы в строках 33,34,41,42, то вычисляются правильные значения,а если использовать процедуру val, то вычисляются не такие значения как через прямое присвоение. Я думаю что эта процедура работает не так как мне нужно. Переменная si из процедуры val = 0, значит все пере Может как то заменить ее,мне надо чтобы я вводил формулу с клавиатуры, а потом эта формула использовалась в вычислениях. Спасибо за внимание.
На всякий: Процедура VAL преобразует строковое представление числа в само число, которое можно записать в целочисленную или вещественную переменную. Процедура имеет 3 параметра: VAL (ST, X, CODE), где ST – строка, которую необходимо преобразовать в число, X – вещественная или символьная переменная, в которую записывается это число, CODE – необязательный параметр, который, в случае ошибки будет содержать номер позиции, в которой обнаружен ошибочный символ.

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
program MetodSetok;
 
uses crt;
const
  a = 5;
  b = 5;
  h = 0.2;
  e = 0.01;
 
var
  k, si: integer;
  u: array [0..5, 0..5] of real;
  x, y, s, f, f1, f2, f3, f4: real;
  f01, f02, f03, f04: string[25];
 
begin
  s := 1;
  writeln('Vvedite f1: ');
  readln(f01);
  writeln('Vvedite f2: ');
  readln(f02);
  writeln('Vvedite f3: ');
  readln(f03);
  writeln('Vvedite f4: ');
  readln(f04);
  writeln('Smoroda Vladislav ID-14');
  writeln('Zadannaya tochnost: e=0.01');
  writeln('Shag: h=0.2');
  writeln('f1=', f01, ' f2=', f02, ' f3=', f03, ' f4=', f04);
  for var i := 0 to a do
  begin
    x := i * h;
    val(f03, f3, si); //ЕСЛИ сюда записать f3:=25*x; то вычисляет правильно
    val(f04, f4, si); //ЕСЛИ сюда записать f4:=25*x*sin((3.14*x)/2); то вычисляет правильно
    u[i, 0] := f3;
    u[i, b] := f4;
  end;
  for var j := 0 to b do
  begin
    y := j * h;
    val(f01, f1, si); //ЕСЛИ сюда записать f1:=45*y*(1-y); то вычисляет правильно
    val(f02, f2, si); //ЕСЛИ сюда записать f2:=25; то вычисляет правильно
    u[0, j] := f1;
    u[a, j] := f2;
  end;
  writeln;
  writeln('Setka s grani4nimi yslovi9mi:');
  writeln;
  writeln('y=1.0', ' ', 'u[0][0]=', u[0][0]:6:1, ' ', 'u[1][0]=', u[1][0]:6:1, ' ', 'u[2][0]=', u[2][0]:6:1, ' ',
  'u[3][0]=', u[3][0]:6:1, ' ', 'u[4][0]=', u[4][0]:6:1, ' ', 'u[5][0]=', u[5][0]:6:1);
  writeln('y=0.8', ' ', 'u[0][1]=', u[0][1]:6:1, ' u[1][1]=', u[1][1]:6:1, ' u[2][1]=', u[2][1]:6:1,
  ' u[3][1]=', u[3][1]:6:1, ' u[4][1]=', u[4][1]:6:1, ' ', 'u[5][1]=', u[5][1]:6:1);
  writeln('y=0.6', ' ', 'u[0][2]=', u[0][2]:6:1, ' u[1][2]=', u[1][2]:6:1, ' u[2][2]=', u[2][2]:6:1,
  ' u[3][2]=', u[3][2]:6:1, ' u[4][2]=', u[4][2]:6:1, ' ', 'u[5][2]=', u[5][2]:6:1);
  writeln('y=0.4', ' ', 'u[0][3]=', u[0][3]:6:1, ' u[1][3]=', u[1][3]:6:1, ' u[2][3]=', u[2][3]:6:1,
  ' u[3][3]=', u[3][3]:6:1, ' u[4][3]=', u[4][3]:6:1, ' ', 'u[5][3]=', u[5][3]:6:1);
  writeln('y=0.2', ' ', 'u[0][4]=', u[0][4]:6:1, ' u[1][4]=', u[1][4]:6:1, ' u[2][4]=', u[2][4]:6:1,
  ' u[3][4]=', u[3][4]:6:1, ' u[4][4]=', u[4][4]:6:1, ' ', 'u[5][4]=', u[5][4]:6:1);
  writeln('y=0.0', ' ', 'u[0][5]=', u[0][5]:6:1, ' ', 'u[1][5]=', u[1][5]:6:1, ' ', 'u[2][5]=', u[2][5]:6:1, ' ',
  'u[3][5]=', u[3][5]:6:1, ' ', 'u[4][5]=', u[4][5]:6:1, ' ', 'u[5][5]=', u[5][5]:6:1);
  writeln(' ', ' x=0', ' x=0.2', ' x=0.4', ' x=0.6', ' x=0.8', ' x=1');
  k := 0;
  while s > e do
  begin
    k := k + 1;
    for var i := 1 to a - 1 do
    begin
      for var j := 1 to b - 1 do
      begin
        f := u[i][j];
        u[i][j] := (u[i + 1][j] + u[i - 1][j] + u[i][j + 1] + u[i][j - 1]) / 4;
        s := abs(f - u[i][j]);
      end;
    end;
    writeln;
    writeln('iterazi9 nomer ', k);
    writeln;
    writeln('y=1.0', ' ', 'u[0][0]=', u[0][0]:6:1, ' ', 'u[1][0]=', u[1][0]:6:1, ' ', 'u[2][0]=', u[2][0]:6:1, ' ',
    'u[3][0]=', u[3][0]:6:1, ' ', 'u[4][0]=', u[4][0]:6:1, ' ', 'u[5][0]=', u[5][0]:6:1);
    writeln('y=0.8', ' ', 'u[0][1]=', u[0][1]:6:1, ' u[1][1]=', u[1][1]:6:1, ' u[2][1]=', u[2][1]:6:1,
    ' u[3][1]=', u[3][1]:6:1, ' u[4][1]=', u[4][1]:6:1, ' ', 'u[5][1]=', u[5][1]:6:1);
    writeln('y=0.6', ' ', 'u[0][2]=', u[0][2]:6:1, ' u[1][2]=', u[1][2]:6:1, ' u[2][2]=', u[2][2]:6:1,
    ' u[3][2]=', u[3][2]:6:1, ' u[4][2]=', u[4][2]:6:1, ' ', 'u[5][2]=', u[5][2]:6:1);
    writeln('y=0.4', ' ', 'u[0][3]=', u[0][3]:6:1, ' u[1][3]=', u[1][3]:6:1, ' u[2][3]=', u[2][3]:6:1,
    ' u[3][3]=', u[3][3]:6:1, ' u[4][3]=', u[4][3]:6:1, ' ', 'u[5][3]=', u[5][3]:6:1);
    writeln('y=0.2', ' ', 'u[0][4]=', u[0][4]:6:1, ' u[1][4]=', u[1][4]:6:1, ' u[2][4]=', u[2][4]:6:1,
    ' u[3][4]=', u[3][4]:6:1, ' u[4][4]=', u[4][4]:6:1, ' ', 'u[5][4]=', u[5][4]:6:1);
    writeln('y=0.0', ' ', 'u[0][5]=', u[0][5]:6:1, ' ', 'u[1][5]=', u[1][5]:6:1, ' ', 'u[2][5]=', u[2][5]:6:1, ' ',
    'u[3][5]=', u[3][5]:6:1, ' ', 'u[4][5]=', u[4][5]:6:1, ' ', 'u[5][5]=', u[5][5]:6:1);
    writeln(' ', ' x=0', ' x=0.2', ' x=0.4', ' x=0.6', ' x=0.8', ' x=1');
  end;
  writeln;
  writeln('Rezultati vipolneni9 programmi:', si);
  writeln('koli4estvo iterazii i=', k);
  writeln;
  writeln('y=1.0', '   ', 'u[0][0]=', u[0][0]:6:1, ' ', 'u[1][0]=', u[1][0]:6:1, ' ', 'u[2][0]=', u[2][0]:6:1, ' ',
  'u[3][0]=', u[3][0]:6:1, ' ', 'u[4][0]=', u[4][0]:6:1, ' ', 'u[5][0]=', u[5][0]:6:1);
  writeln('y=0.8', '   ', 'u[0][1]=', u[0][1]:6:1, ' u[1][1]=', u[1][1]:6:1, ' u[2][1]=', u[2][1]:6:1,
  ' u[3][1]=', u[3][1]:6:1, ' u[4][1]=', u[4][1]:6:1, ' ', 'u[5][1]=', u[5][1]:6:1);
  writeln('y=0.6', '   ', 'u[0][2]=', u[0][2]:6:1, ' u[1][2]=', u[1][2]:6:1, ' u[2][2]=', u[2][2]:6:1,
  ' u[3][2]=', u[3][2]:6:1, ' u[4][2]=', u[4][2]:6:1, ' ', 'u[5][2]=', u[5][2]:6:1);
  writeln('y=0.4', '   ', 'u[0][3]=', u[0][3]:6:1, ' u[1][3]=', u[1][3]:6:1, ' u[2][3]=', u[2][3]:6:1,
  ' u[3][3]=', u[3][3]:6:1, ' u[4][3]=', u[4][3]:6:1, ' ', 'u[5][3]=', u[5][3]:6:1);
  writeln('y=0.2', ' ', 'u[0][4]=', u[0][4]:6:1, ' u[1][4]=', u[1][4]:6:1, ' u[2][4]=', u[2][4]:6:1,
  ' u[3][4]=', u[3][4]:6:1, ' u[4][4]=', u[4][4]:6:1, ' ', 'u[5][4]=', u[5][4]:6:1);
  writeln('y=0.0', ' ', 'u[0][5]=', u[0][5]:6:1, ' ', 'u[1][5]=', u[1][5]:6:1, ' ', 'u[2][5]=', u[2][5]:6:1, ' ',
   'u[3][5]=', u[3][5]:6:1, ' ', 'u[4][5]=', u[4][5]:6:1, ' ', 'u[5][5]=', u[5][5]:6:1);
  writeln(' ', ' x=0', ' x=0.2', ' x=0.4', ' x=0.6', ' x=0.8', ' x=1');
  readln;
end.
Добавлено через 13 минут
UPD: как можно присвоить числовой переменной строку с формулой?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.12.2016, 22:23
Ответы с готовыми решениями:

Double val = 83.1*3; val == 249.29999999999998; Android так считает
Double val = 83.1*3; Log.i("M","val = "+val); M: val = 249.29999999999998 В чем фишка? Или это я в школе на математике...

Цикл работает не так как я хочу. Исключение IndexOutOfRangeException
Программа должна после каждого считывания строки записывать ее в ячейку массива и прибавлять к переменной отвечающей за количество...

Код работает но не так как я хочу. Что делать?
procedure TForm2.N36Click(Sender: TObject); begin if (sDBEdit9.Text='') and (sDBEdit10.Text='') and (sDBEdit11.Text='') then begin ...

2
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8647 / 4482 / 1669
Регистрация: 01.02.2015
Сообщений: 13,889
Записей в блоге: 12
24.12.2016, 23:36
Никак. Написать собственный парсер математических выражений. Или поискать готовый на форуме. Модераторы и администраторы неоднократно публиковали свои наработки.
0
Модератор
10383 / 5671 / 3399
Регистрация: 17.08.2012
Сообщений: 17,319
25.12.2016, 00:07
Viav, процедуре val по барабану, что она работает не так, как Вы желаете. Сами же написали:
Цитата Сообщение от Viav Посмотреть сообщение
Процедура VAL преобразует строковое представление числа в само число
А формула никак не является строковым представлением числа.
Цитата Сообщение от Viav Посмотреть сообщение
как можно присвоить числовой переменной строку с формулой?
Формальный ответ: никак.

Если более подробно, то этот вопрос не имеет простого решения. Варианты:

Универсальное решение: разбирать содержимое строки, то есть, выделять из строки числа, переменные, операции, функции и тому подобное и затем вычислять выражение, используя множество условий. Фактически, включить в программу свой интерпретатор для вычисления формул.

Решение для windows: можно использовать JavaScript. Подходит не для всех диалектов паскаля. Ссылка для примера:
Калькулятор, разбирающий выражения

Ещё подобное решение: можно передавать строку с формулой программе, которая уже умеет вычислять формулы. Считаю это решение плохим, поскольку у конечного пользователя Вашей программы вполне может не быть программы, которая используется для вычисления формул.

Добавлено через 20 минут
Есть и другие варианты.

Да, на всякий случай: если в строке используются переменные, то их обозначения должны быть заменены на их значения до передачи строки какому-либо парсеру.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.12.2016, 00:07
Помогаю со студенческими работами здесь

Процедура val
Возникли проблемы, вообще ничего не получается с этой программой. Нужно что бы программа считала введенное выражение по типу x+y или x-y....

Что такое процедура val
Что за процедура, можно на примере Спасибо!

Процедура Val/StrToInt, выводящая BigInteger
Я написал в дизайнере форм рабочий "переводчик периодической в десятичную дробь". Программа использует Val() для получения числа из...

Процедура VAL с параметрами указанных типов не найдена
Перевод с восьмеричной в десятичную: var oct : string; dec : longint; i,j,k : byte; er : integer; begin dec := 0; ...

Процедура VAL с параметрами указанных типов не найдена
Решал задачу, где приходится использоваться функцию Val. Т.к. использую впервые, то не без косяков обошлось. Выдает: Процедура VAL с...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru