Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
3 / 3 / 0
Регистрация: 18.10.2012
Сообщений: 180

Непонятки со String

24.07.2013, 01:45. Показов 3880. Ответов 52
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Понять не могу почему после end; значение стринг не одинаковое. Нужны идеи в чем может быть причина.
Изображения
 
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.07.2013, 01:45
Ответы с готовыми решениями:

Нельзя преобразовать тип Tuple<string,string,string,string> к string
Здравствуйте, у меня возникла проблема. При запуске кода, вылезает ошибка &quot;Нельзя преобразовать тип...

Создайте класс Animal. Добавьте поля string Name, string Kind, string Areal, int Population
Создайте класс Animal. Добавьте поля string Name, string Kind, string Areal, int Population. Создание объектов может происходить как без...

Создайте класс Animal. Добавьте поля string Name, string Kind, string Areal, int Population
Здравствуйте! По C# есть задачка, с которой я так и не разобрался :( Задача: Создайте класс Animal. Добавьте поля string...

52
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,978
28.07.2013, 11:00
Студворк — интернет-сервис помощи студентам
В коде ТС в 115, 116 строках:
Delphi
1
2
  ga3:=copy(gama,dec4,leto);
  gama:=ga3;
происходит смена длинны строки gama, а все циклы идут по изначально определенной длинне leto, вот и начинается путаница.
Поэтому в циклах по массивам лучше непосредственно указывать длинну массива, а не какое-то leto.
1
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
28.07.2013, 11:15
Вот подправил косяки. Вроде считает и более-менее сложные выражения правильно.
Кликните здесь для просмотра всего текста
Delphi
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    ListBox1: TListBox;
    TrackBar1: TTrackBar;
    TrackBar2: TTrackBar;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Button2: TButton;
    procedure TrackBar1Change(Sender: TObject);
    procedure TrackBar2Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  alfa1,alfa2,alfa3:integer;
  Form1: TForm1;
  jjj:string;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.TrackBar1Change(Sender: TObject);
var
  r,y1,y2,dier:real;
  i,x,y:integer;
begin
  alfa1:=TrackBar1.Position*20;
  Image1.Canvas.Pen.Color:=clBlack;
  Image1.Canvas.Pen.Width:=1;
  Image1.Canvas.Brush.Color:=clWhite;
  Image1.canvas.Rectangle(0,0,Image1.Width, Image1.Height);
  Image1.Canvas.MoveTo(0,100);
  Image1.Canvas.LineTo(300,100);
  Image1.Canvas.Pen.Color:=clRed;
  Image1.Canvas.Pen.Width:=2;
  dier:=0.0;
  for i:=1 to 300 do
  begin
    dier:=dier+0.1;
    r:=sin(dier);
    y1:=(r*alfa1);
    y2:=100-y1;
    x:=i*alfa2;
    y:=Round(y2);
    ListBox1.Items[i-1]:=floatToStr(r);
    if i=1 then Image1.Canvas.MoveTo(x,y);
    Image1.Canvas.LineTo(x,y);
  end;
end;
 
procedure TForm1.TrackBar2Change(Sender: TObject);
var
  r,y1,y2,dier:real;
  i,x,y:integer;
begin
  alfa2:=TrackBar2.Position;
  Image1.Canvas.Pen.Color:=clBlack;
  Image1.Canvas.Pen.Width:=1;
  Image1.Canvas.Brush.Color:=clWhite;
  Image1.canvas.Rectangle(0,0,Image1.Width, Image1.Height);
  Image1.Canvas.MoveTo(0,100);
  Image1.Canvas.LineTo(300,100);
  Image1.Canvas.Pen.Color:=clRed;
  Image1.Canvas.Pen.Width:=2;
  dier:=0.0;
  for i:=1 to 300 do
  begin
    dier:=dier+0.1;
    r:=sin(dier);
    y1:=(r*alfa1);
    y2:=100-y1;
    x:=i*alfa2;
    y:=Round(y2);
    ListBox1.Items[i-1]:=floatToStr(r);
    if i=1 then Image1.Canvas.MoveTo(x,y);
    Image1.Canvas.LineTo(x,y);
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  alfa1:=1;
  alfa2:=1;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
type
  varOperat =(Plus,Minus,Mult,Divide,None);
var
  gama,ga2:string;
  leto,i,j,k,k1,g,warning,dec1,dec2,dec3:integer;
  k2,k3,k4:Byte;
//  Operat:varOperat;
  Csp:char;
  R,R1,R2:real;
//--------------------------------------------
procedure AlphaA;                       {ПРОЦЕДУРА АЛЬФА. НАЧАЛО}
var
  j:integer;
begin
  dec1:=0; {Поиск знака + - * /. Начало}
  For j:=1 to length(gama) do
  if gama[j] In ['+','-','*','/'] then
  begin
    Csp:=gama[j];
    dec1:=j;
    break;
  end;     {Поиск знака + - * /. Конец "dec1" - позиция}
 
  {Определение числа слева\справа от знака. Начало}
  R1:=0;
  R2:=0;
  dec1:=dec1-1;
  R1:=StrToFloat(copy(gama,1,dec1));
  dec2:=dec1+2;
  k:=0;
  k1:=0;
  For J:= dec2 to length(gama) do
  if gama[j] In ['+','-','*','/'] then
  begin dec3:=j; break; end;
  For J:= dec2 to length(gama) do
  begin
    k:=k+1;
    if gama[j] In ['+','-','*','/'] then
    begin g:=j; k1:=1; break; end;
  end;
  if k1 = 1 then k:=k-1;
  R2:=StrToFloat(copy(gama,dec2,k));
  {Определение числа слева\справа от знака. Конец}
  {Выполнение арифметической операции. Начало}
  Case Csp Of
  '+' : R:=R1+R2;
  '-' : R:=R1-R2;
  '*' : R:=R1*R2;
  '/' : R:=R1/R2;
  End;
  {Выполнение арифметической операции. Конец}
  {Выполнение изменений гамы. Начало}
  gama:=FloatToStr(R)+copy(gama,g,leto);
  {Выполнение изменений гамы. Конец}
end; {ПРОЦЕДУРА АЛЬФА. КОНЕЦ}
//-------------------------------------------
begin {НАЧАЛО ПРОЦЕДУРЫ НАЖАТИЯ КНОПКИ}
  gama:=edit1.Text;  {формула}
  leto:=length(gama); {длина ф-лы}
 
  warning:=0; {Определение количества цыклов операционирования. Начало "leto" - количество}
  For i:=1 to leto do {Определение количества цыклов операционирования}
  if gama[i] In ['+','-','*','/'] then
  warning:=warning+1;
 
  For i:=1 to warning do //Цикл по количеству знаков операций
  begin {Тело главного кода. Начало}
    dec1:=0; {Поиск знака + - * /. Начало}
    For j:=1 to length(gama) do
    if gama[j] In ['+','-','*','/'] then
    begin
      Csp:=gama[j];
      dec1:=j;
      break;
    end;     {Поиск знака + - * /. Конец "dec1" - позиция. Csp -знак}
 
    {Обработка правил умножения. Начало.}
    k4:=0;
    k2:=0;
    k3:=0;
    if Csp In ['+','-'] then
    for j:=dec1+1 to length(gama) do
    begin
      if gama[j] In ['*','/'] then k2:=1;
      if gama[j] In ['+','-'] then k3:=1;
      if k2>k3 then
      begin k4:=1; break; end;
    end;
 
    if k4=1 then
    //Если встретились знаки "*" "/"
    begin  {Изменения над гамой до Альфы. Начало}
      ga2:=copy(gama,1,dec1);
      gama:=copy(gama,dec1+1,leto); //Остаток строки после знака
      Edit4.Text:=ga2;
      Label3.Caption:=inttostr(dec1);
      Label4.Caption:=inttostr(dec1+1);
      Edit3.Text:=gama;
    end else ga2:='';
    Edit2.Text:=gama;
    {Изменения над гамой до Альфы. Конец}
    {Обработка правил умножения. Конец. "к4" применять протокол "1"}
    alphaA;  {Процедура Альфа}
    {Изменения над гамой после Альфы. Начало}
    gama:=ga2+gama;
    {Изменения над гамой после Альфы. Конец}
  end; {Тело главного кода. Конец}
  Edit5.Text:=floattostr(R);
end;
 
end.
0
3 / 3 / 0
Регистрация: 18.10.2012
Сообщений: 180
28.07.2013, 13:41  [ТС]
Просто ТС не умеет пользоваться отладчиком.
А что посоветуете?

Добавлено через 3 минуты
происходит смена длинны строки gama, а все циклы идут по изначально определенной длинне leto, вот и начинается путаница.
Leto это длина изначально гамы и эта длтна фиксируеться на все вычисления.
Хотите сказать что стоит коректировать значения Leto после изменения длины гамы ?

Добавлено через 11 минут
Одиночка, ваш код считает без ошибок.
Я пробовал заменить переменную leto в параметрах цыклов на Length(gama) Но это не давало результатов, потом уже весь предложеный код вставил.
И все же хотелось бы разобраться изза чего конкретно колапс возник.
Это жизненно важно, так как планируеться еще усложнять этот код.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
28.07.2013, 14:15
Drenor, А какой, собственно, коллапс. Я уже писал, что в Edit-ах разные значения были потому что на последнем цикле программа не входила в ветку k4=1 Из-за этого в Edit3 - оставалось значение предыдущего цикла. Замена leto на Length(gama), кажется, особо не влияло, поскольку там всё равно ищется знак. А он всегда присутствует. Хотя более внимательно не смотрел, может и влияло.
Кроме того был ещё один косяк:
Delphi
1
2
3
4
5
6
7
8
9
10
    if k4=1 then
    //Если встретились знаки "*" "/"
    begin  {Изменения над гамой до Альфы. Начало}
      ga2:=copy(gama,1,dec1);
      gama:=copy(gama,dec1+1,leto); //Остаток строки после знака
      Edit4.Text:=ga2;
      Label3.Caption:=inttostr(dec1);
      Label4.Caption:=inttostr(dec1+1);
      Edit3.Text:=gama;
    end else ga2:=''; //Вот здесь вставил !!!!!!!!!!!!!!!
Получалось, если не входило в эту ветвь - то в ga2 - оставалось значение с предыдущего цикла. А далее идёт объединение:
Delphi
1
    gama:=ga2+gama;
вот и получалась фигня. Правда, зависело от порядка знаков операций. Иногда не влияло (если последний цикл).

Кстати, советую убрать из цикла выдачу данных в Label-ы и Edit-ы. Ты всё равно промежуточных результатов не увидишь. Увидишь только последние. если бы ещё понять, что ты там хотел отобразить.
Вот примерно так.
0
3 / 3 / 0
Регистрация: 18.10.2012
Сообщений: 180
28.07.2013, 15:33  [ТС]
Получалось, если не входило в эту ветвь - то в ga2 - оставалось значение с предыдущего цикла. А далее идёт объединение:
так я это пофиксил буквально недавно тем. что пред объединением поставил
Code
1
if k4=1 then объединение
но это никак не влияло на ошибку.
значит дело в другом. и хотелось бы знать каким образом левый счетчик фиксил баг.


Кстати, советую убрать из цикла выдачу данных в Label
я вводил счетчик d:=d+1
и на рахных проходах цыкла смотрел гаму.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
28.07.2013, 15:45
То, что ты внутри цикла вставил выдачу в Edit-ы и Label-ы никак не влияет на отладку. Разве что ты добавлял бы строки в Memo, а потом бы посмотрел, что было на каждом цикле выполнения. А для того, чтобы посмотреть переменную - ставишь точку останова, и когда останавливается - наводишь курсор мыши на эту переменную. Во всплывающем окне получаешь её текущее значение.
но это никак не влияло на ошибку.
Какую ошибку ты имеешь в виду? Результат от этого зависел, но не при всяком выражении.
0
3 / 3 / 0
Регистрация: 18.10.2012
Сообщений: 180
28.07.2013, 16:54  [ТС]
То, что ты внутри цикла вставил выдачу в Edit-ы и Label-ы никак не влияет на отладку.
Я просто смотрел чему гама равна, когда искал ошибку)))
Поставив счетчик и условие выдачи if счетчик = 1,2,3

А для того, чтобы посмотреть переменную - ставишь точку останова, и когда останавливается - наводишь курсор мыши на эту переменную. Во всплывающем окне получаешь её текущее значение.
Нужно будет разобраться, звучит удобно.
Где такую прогонку включать?

Какую ошибку ты имеешь в виду?
А такую что при исходных даных (10-6*2) результат вычислений был (-112), как-то так, а должен был (-2)
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
28.07.2013, 17:14
при исходных даных (10-6*2) результат вычислений был (-112), как-то так, а должен был (-2)
А кто его знает. Может действительно чего-то ещё изменилось. Сейчас поменял Length(gama) на Leto - выражение посчиталось правильно. Убрал очистку ga2 - тоже правильно. Возможно там без Length(gama) происходил выход за пределы строки и кто знает, чего она там выуживала. Какой-то мусор. Вообще, если сильно нужно, уж сам сравни свой код начальный и конечный.
Нужно будет разобраться, звучит удобно.
Где такую прогонку включать?
Щелкаешь мыкой слева строки в коде прямо на границе окна, ограничивающей код. Строка выделяется красным цветом. Это точка останова. Запускаешь как обычно (из Delphi). Когда выполнение дойдёт до этой строки - программа остановится - а на красной точке на бордюрчике появится зелёная стрелка. Теперь программа стоит и ты можешь проверять переменные, наводя на них курсор мыши. Для продолжения работы - F9, можно по шагам - F8, чтобы зайти в процедуру - F7 (По F8 - процедура выполняется как одна команда).
Можно там же на точке останова (на бордюрчике) щелкнуть правой, выбрать Breckpoint Properties и задать выражение останова (Condition) (выражение Delphi только без If Then), или количество пропусков (кажется Pass Count).
Можно открыть окошко: View -> Debug Windows -> Watches и мониторить нужные переменные. Только поставить это окошко Stay On Top (чтобы было на верху всех окон). Это щелкаешь правой кнопкой в нижней части окна.
0
3 / 3 / 0
Регистрация: 18.10.2012
Сообщений: 180
28.07.2013, 17:21  [ТС]
А кто его знает. Может действительно чего-то ещё изменилось.
Это все с расчетом на логику и на то что произошли непредвиденые, изза каких-то упущений, подсчеты, с этим я бы согласился, но при введении левого счетчика ошибка резко пропала, что следуя логике не должно было случиться.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
28.07.2013, 17:26
Из-за введения левого счётчика могло сдвинуться распределение переменных в памяти. Из-за этого и ошибка ушла. Уж какие там тонкости есть, я не могу сказать. Там компилятор как-то выравнивает данные кратно 8 байтам. Так что всяко бывает. Можешь взять свой первый код и пройти отладчиком (теперь уже можешь) и увидишь где отрабатывает не так как нужно.
0
3 / 3 / 0
Регистрация: 18.10.2012
Сообщений: 180
28.07.2013, 17:30  [ТС]
Так и сделаю)
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
29.07.2013, 18:48
Drenor, Попробовал на твоём старом варианте программы. Этот пример (10-6*2) решает правильно. А вот этот (10-6*2+7) вызывает ошибку и в старом и в новом варианте. Ну теперь ты уже можешь и сам отладчиком найти ошибку.

Добавлено через 42 минуты
Вот немного ещё поотлаживал, подправил, убрал лишнее:
Кликните здесь для просмотра всего текста
Delphi
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    ListBox1: TListBox;
    TrackBar1: TTrackBar;
    TrackBar2: TTrackBar;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    Button2: TButton;
    procedure TrackBar1Change(Sender: TObject);
    procedure TrackBar2Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  alfa1,alfa2,alfa3:integer;
  Form1: TForm1;
  jjj:string;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.TrackBar1Change(Sender: TObject);
var
  r,y1,y2,dier:real;
  i,x,y:integer;
begin
  alfa1:=TrackBar1.Position*20;
  Image1.Canvas.Pen.Color:=clBlack;
  Image1.Canvas.Pen.Width:=1;
  Image1.Canvas.Brush.Color:=clWhite;
  Image1.canvas.Rectangle(0,0,Image1.Width, Image1.Height);
  Image1.Canvas.MoveTo(0,100);
  Image1.Canvas.LineTo(300,100);
  Image1.Canvas.Pen.Color:=clRed;
  Image1.Canvas.Pen.Width:=2;
  dier:=0.0;
  for i:=1 to 300 do
  begin
    dier:=dier+0.1;
    r:=sin(dier);
    y1:=(r*alfa1);
    y2:=100-y1;
    x:=i*alfa2;
    y:=Round(y2);
    ListBox1.Items[i-1]:=floatToStr(r);
    if i=1 then Image1.Canvas.MoveTo(x,y);
    Image1.Canvas.LineTo(x,y);
  end;
end;
 
procedure TForm1.TrackBar2Change(Sender: TObject);
var
  r,y1,y2,dier:real;
  i,x,y:integer;
begin
  alfa2:=TrackBar2.Position;
  Image1.Canvas.Pen.Color:=clBlack;
  Image1.Canvas.Pen.Width:=1;
  Image1.Canvas.Brush.Color:=clWhite;
  Image1.canvas.Rectangle(0,0,Image1.Width, Image1.Height);
  Image1.Canvas.MoveTo(0,100);
  Image1.Canvas.LineTo(300,100);
  Image1.Canvas.Pen.Color:=clRed;
  Image1.Canvas.Pen.Width:=2;
  dier:=0.0;
  for i:=1 to 300 do
  begin
    dier:=dier+0.1;
    r:=sin(dier);
    y1:=(r*alfa1);
    y2:=100-y1;
    x:=i*alfa2;
    y:=Round(y2);
    ListBox1.Items[i-1]:=floatToStr(r);
    if i=1 then Image1.Canvas.MoveTo(x,y);
    Image1.Canvas.LineTo(x,y);
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  alfa1:=1;
  alfa2:=1;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
type
  varOperat =(Plus,Minus,Mult,Divide,None);
var
  gama,ga2:string;
  leto,i,j,g,warning,dec1:integer;
  k4:Byte;
//  Operat:varOperat;
  Csp:char;
  R,R1,R2:real;
//--------------------------------------------
procedure AlphaA;                       {ПРОЦЕДУРА АЛЬФА. НАЧАЛО}
var
  j:integer;
begin
  dec1:=0; {Поиск знака + - * /. Начало}
  For j:=1 to Length(gama) do
  if gama[j] In ['+','-','*','/'] then
  begin
    Csp:=gama[j];
    dec1:=j;
    break;
  end;     {Поиск знака + - * /. Конец "dec1" - позиция}
 
  {Определение числа слева\справа от знака. Начало}
  R1:=0;
  R2:=0;
  R1:=StrToFloat(copy(gama,1,dec1-1));
  g:=Length(gama)+1;
  For J:= dec1+1 to Length(gama) do
  if gama[j] In ['+','-','*','/'] then
  begin g:=j; break; end;
 
  R2:=StrToFloat(copy(gama,dec1+1,g-(dec1+1)));
  {Определение числа слева\справа от знака. Конец}
  {Выполнение арифметической операции. Начало}
  Case Csp Of
  '+' : R:=R1+R2;
  '-' : R:=R1-R2;
  '*' : R:=R1*R2;
  '/' : R:=R1/R2;
  End;
  {Выполнение арифметической операции. Конец}
  {Выполнение изменений гамы. Начало}
  gama:=FloatToStr(R)+copy(gama,g,leto);
  {Выполнение изменений гамы. Конец}
end; {ПРОЦЕДУРА АЛЬФА. КОНЕЦ}
//-------------------------------------------
begin {НАЧАЛО ПРОЦЕДУРЫ НАЖАТИЯ КНОПКИ}
  gama:=edit1.Text;  {формула}
  leto:=length(gama); {длина ф-лы}
 
  warning:=0; {Определение количества цыклов операционирования. Начало "leto" - количество}
  For i:=1 to leto do {Определение количества цыклов операционирования}
  if gama[i] In ['+','-','*','/'] then
  warning:=warning+1;
 
  For i:=1 to warning do //Цикл по количеству знаков операций
  begin {Тело главного кода. Начало}
    dec1:=Length(gama)+1; {Поиск знака + - * /. Начало}
    For j:=1 to Length(gama) do
    if gama[j] In ['+','-','*','/'] then
    begin
      Csp:=gama[j];
      dec1:=j;
      break;
    end;     {Поиск знака + - * /. Конец "dec1" - позиция. Csp -знак}
 
    if dec1>Length(gama) then
    //Знак не найден
    begin
      Edit5.Text:=gama;
      Exit;
    end;
 
    {Обработка правил умножения. Начало.}
    k4:=0;
    if Csp In ['+','-'] then
    for j:=dec1+1 to Length(gama) do
    begin
      if gama[j] In ['*','/'] then begin k4:=1; break; end;
      if gama[j] In ['+','-'] then break;
    end;
 
    if k4=1 then
    //Если встретились знаки "*" "/"
    begin  {Изменения над гамой до Альфы. Начало}
      ga2:=copy(gama,1,dec1);
      gama:=copy(gama,dec1+1,leto); //Остаток строки после знака
    end else ga2:='';
    {Изменения над гамой до Альфы. Конец}
    {Обработка правил умножения. Конец. "к4" применять протокол "1"}
    alphaA;  {Процедура Альфа}
    {Изменения над гамой после Альфы. Начало}
    gama:=ga2+gama;
    {Изменения над гамой после Альфы. Конец}
  end; {Тело главного кода. Конец}
  Edit5.Text:=floattostr(R);
end;
 
end.

Уже не успеваю.
Осталась одна проблема: если результат операции получается отрицательный. Тогда 2 знака получаются подряд. Или знак в начале gama. Например: -2+7.

Добавлено через 11 часов 42 минуты
Вот и эта проблема устранена. Сейчас считает правильно разные выражения.
Кликните здесь для просмотра всего текста
Delphi
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
procedure TForm1.Button1Click(Sender: TObject);
type
  varOperat =(Plus,Minus,Mult,Divide,None);
var
  gama,ga2:string;
  leto,i,j,g,warning,dec1:integer;
  k4:Byte;
//  Operat:varOperat;
  Csp:char;
  R,R1,R2:real;
//--------------------------------------------
procedure AlphaA;                       {ПРОЦЕДУРА АЛЬФА. НАЧАЛО}
var
  j:integer;
begin
  dec1:=0; {Поиск знака + - * /. Начало}
  For j:=1 to Length(gama) do
  if gama[j] In ['+','_','*','/'] then
  begin
    Csp:=gama[j];
    dec1:=j;
    break;
  end;     {Поиск знака + - * /. Конец "dec1" - позиция}
 
  {Определение числа слева\справа от знака. Начало}
  R1:=0;
  R2:=0;
  R1:=StrToFloat(copy(gama,1,dec1-1));
  g:=Length(gama)+1;
  For J:= dec1+1 to Length(gama) do
  if gama[j] In ['+','_','*','/'] then
  begin g:=j; break; end;
 
  R2:=StrToFloat(copy(gama,dec1+1,g-(dec1+1)));
  {Определение числа слева\справа от знака. Конец}
  {Выполнение арифметической операции. Начало}
  Case Csp Of
  '+' : R:=R1+R2;
  '_' : R:=R1-R2;
  '*' : R:=R1*R2;
  '/' : R:=R1/R2;
  End;
  {Выполнение арифметической операции. Конец}
  {Выполнение изменений гамы. Начало}
  gama:=FloatToStr(R)+copy(gama,g,leto);
  {Выполнение изменений гамы. Конец}
end; {ПРОЦЕДУРА АЛЬФА. КОНЕЦ}
//-------------------------------------------
begin {НАЧАЛО ПРОЦЕДУРЫ НАЖАТИЯ КНОПКИ}
  gama:=edit1.Text;  {формула}
  leto:=length(gama); {длина ф-лы}
 
  For i:=1 to leto do
  //Меняем знак оперции '-' на нижнюю черту. Чтобы не путать со знаком числа
  If gama[i]='-' Then
  If (i<>1) Then
  If Not (gama[i-1] In ['(','+','_','*','/']) Then
  gama[i]:='_';
 
  warning:=0; {Определение количества цыклов операционирования. Начало "leto" - количество}
  For i:=1 to leto do {Определение количества цыклов операционирования}
  if gama[i] In ['+','_','*','/'] then
  warning:=warning+1;
 
  For i:=1 to warning do //Цикл по количеству знаков операций
  begin {Тело главного кода. Начало}
    dec1:=Length(gama)+1; {Поиск знака + - * /. Начало}
    For j:=1 to Length(gama) do
    if gama[j] In ['+','_','*','/'] then
    begin
      Csp:=gama[j];
      dec1:=j;
      break;
    end;     {Поиск знака + - * /. Конец "dec1" - позиция. Csp -знак}
 
    if dec1>Length(gama) then
    //Знак не найден
    begin
      Edit5.Text:=gama;
      Exit;
    end;
 
    {Обработка правил умножения. Начало.}
    k4:=0;
    if Csp In ['+','_'] then
    for j:=dec1+1 to Length(gama) do
    begin
      if gama[j] In ['*','/'] then begin k4:=1; break; end;
      if gama[j] In ['+','_'] then break;
    end;
 
    if k4=1 then
    //Если встретились знаки "*" "/"
    begin  {Изменения над гамой до Альфы. Начало}
      ga2:=copy(gama,1,dec1);
      gama:=copy(gama,dec1+1,leto); //Остаток строки после знака
    end else ga2:='';
    {Изменения над гамой до Альфы. Конец}
    {Обработка правил умножения. Конец. "к4" применять протокол "1"}
    alphaA;  {Процедура Альфа}
    {Изменения над гамой после Альфы. Начало}
    gama:=ga2+gama;
    {Изменения над гамой после Альфы. Конец}
  end; {Тело главного кода. Конец}
  Edit5.Text:=floattostr(R);
end;

Должен сказать каким образом решил проблему отрицательных чисел в выражении. В самом начале заменил в выражении операционный знак минус на нижнюю черту. И уже при обработке выражения вместо '-' искал '_', считая, что это операция минус. При этом в результатах вычислений мог быть минус, но он не считался знаком операции и при преобразовании в число принадлежал числу. Примерно так.
0
3 / 3 / 0
Регистрация: 18.10.2012
Сообщений: 180
07.08.2013, 21:09  [ТС]
А вот этот (10-6*2+7) вызывает ошибку и в старом и в новом варианте.
Эту ошибку задетектил на примере "13-6*2+1" и пофиксил.

Например: -2+7.
А об этой ошибке я и сам знал с самого начала. Планировал в конце исправить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.08.2013, 21:09

Ошибка PHPOfice: Cannot use PhpOffice\PhpWord\Shared\String as String because 'String' is a special class name
Fatal error: Cannot use PhpOffice\PhpWord\Shared\String as String because 'String' is a special class name in...

Доступ к паре в map<string, vector<pair<string, string>>>Temp
Подскажите пожалуйста как получить данные в векторе пар ? void showData(const map&lt;string, vector&lt;pair&lt;string,...

List<string, string, string> есть ли в C# что-то подобное?
Мне надо добавить в List не только имя файла, но и некоторые строки из этого файла. Т.е. например, у меня есть в определенном директории...

Как использовать String.Substring(string, string)?
Есть у String метод Substring(int, int), но он принимает только числа. Я видел на видео, что можно парсить по словам. Например: string...

AsyncTask<String, String, String> объясните пожалуйста
При описаний класса наследника AsyncTask мы в угловых скобках указываем три типа данных: 1. Тип входных данных. Это данные которые пойдут...


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

Или воспользуйтесь поиском по форуму:
53
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru