Консультация № 173315
15.10.2009, 23:07
0.00 руб.
0 11 1
Здраствуйте Уважаемые эксперты.
Требуется помощь в реализации программы.
В программе имеется компоненты memo1,memo2 и button1.
Нужно сделать так, чтобы при нажатии на кнопку текст в memo1 анализировался следующим образом. Если есть 10 цифр идущих подряд тогда обратится к условию case в котором записаны, некоторые соответствия (текстовые переменные). И чтобы это соответствие выводилось в memo2. В случае если замечена последовательность цифр меньше 10 то ничего с ней не делать. Искать только те что 10. Заранее спасибо.

Обсуждение

давно
Профессионал
153662
1070
15.10.2009, 23:17
общий
А десять цифр записано так 1457896532 или 1 4 5 7 8 9 6 5 3 2? А кроме цифр в memo буквы будут?
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Мастер-Эксперт
425
4118
16.10.2009, 05:07
общий
Dimon4ik:
Каков порядок цифр? Они будут располагаться в любом, каком угодно, порядке или порядок следования вполне определённый?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
16.10.2009, 18:44
общий
Евгений/Genia007/:
Они будут без пробелов. Пробел это отличительный признак начала и конца последовательности.
Неизвестный
16.10.2009, 18:54
общий
sir Henry:
В операторе case будет около 40 вариантов.
Тоесть например в memo1 будет введено следующее:
5132516132 3215112321
5132516132
3215112321
3215111111
Оператор думаю предусмотреть примерно так(переменной s присваивается строка из 10 символов(цифры или буквы почти неважно)-найденная последовательность). :
case s of
'5132516132':w[1]:='Ф';
'3215112321':w[1]:='К';
'3215111111':w[1]:='З';
...
end;
И следовательно на выходе в memo2 получится:
ФК
Ф
К
З
давно
Профессионал
153662
1070
16.10.2009, 20:13
общий
Dimon4ik:
Вот посмотрите на почти готовый код
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
s, s1, s2: string;
i, j: integer;
begin
s:= '';
s1:= '';
s2:= '';
memo2.Clear;
for i := 0 to memo1.Lines.Count - 1 do
begin
s1:= memo1.Lines.Strings[i];
for j := 1 to length(s1) do
begin
if s1[j] <> ' ' then
s:= s + s1[j]
else
begin
if length(s) = 10 then
if s = '5132516132' then
s2:= s2 + 'Ф'
else
if s = '3215112321' then
s2:= s2 + 'К'
else
if s = '3215111111' then
s2:= s2 + 'З';
s:= '';
end;
end;
if s2 <> '' then
memo2.Lines.Add(s2);
s2:= '';
end;
end;
осталось заставить его работать без пробела в конце строки. Кстате использовать для выбора строки оператор case здесь проблематично, потому что он требует порядковый тип. Доделываю, напишите если устраивает, оформлю ответом.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
16.10.2009, 20:42
общий
Евгений/Genia007/:
Вот так сделал:
case s of
begin
s:= '';
s1:= '';
s2:= '';
memo2.Clear;
for i := 0 to memo1.Lines.Count - 1 do
begin
s1:= memo1.Lines.Strings[i];
for j := 1 to length(s1) do
begin
if s1[j] <> ' ' then
s:= s + s1[j]
else
begin
try
strtoint(s);
if length(s) = 10 then
case s of
'1111111111':s2:='dsa';
'0000000000':s2:='kh';
'9999999999':s2:='hj';

end;
finally
s2:= s2 + ' ';
end;
s:= '';
end;
end;
if s2 <> '' then
memo2.Lines.Add(s2);
s2:= '';
end;

end;
И в этих четырех строках, начиная с первой компилятор видит ошибки:
[Error] Unit1.pas(270): Ordinal type required
[Error] Unit1.pas(271): Incompatible types: 'Integer' and 'String'
[Error] Unit1.pas(272): Incompatible types: 'Integer' and 'String'
[Error] Unit1.pas(273): Incompatible types: 'Integer' and 'String'

Может я не до конца понял код.. Не знаю в чем дело.
давно
Профессионал
153662
1070
16.10.2009, 20:45
общий
посмотрите мой предыдущий пост, там есть этому объяснение. Я его уже поправил, осталось разобраться с пробелами в конце текста.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
16.10.2009, 20:56
общий
Евгений/Genia007/:
В принципе суть понял. Очень хорошо. Большое спасибо. Если выйдет то конечно же лучше будет если Вы заставите его работать без пробела в конце строки. Но все равно замечательно.
давно
Профессионал
153662
1070
16.10.2009, 21:16
общий
Dimon4ik:
Вот посмотрите это уже полностью рабочий код
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
s, s1, s2: string;
i, j: integer;
begin
s:= '';
s1:= '';
s2:= '';
memo2.Clear;
j:= 1;
for i := 0 to memo1.Lines.Count - 1 do
begin
s1:= memo1.Lines.Strings[i];
for j := 1 to length(s1) + 1 do
begin
if (s1[j] <> ' ') and (j <> length(s1) + 1) then
s:= s + s1[j]
else
begin
if length(s) = 10 then
if s = '5132516132' then
s2:= s2 + 'Ф'
else
if s = '3215112321' then
s2:= s2 + 'К'
else
if s = '3215111111' then
s2:= s2 + 'З';
s:= '';
end;
end;
if s2 <> '' then
memo2.Lines.Add(s2);
s2:= '';
end;
end;
Напишите результат.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
16.10.2009, 21:19
общий
Отлично! Все замечательно работает!
давно
Профессионал
153662
1070
16.10.2009, 21:23
общий
это ответ
Здравствуйте, Dimon4ik.
Вот мой способ решить Вашу задачу.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
s, s1, s2: string;
i, j: integer;
begin
s:= '';
s1:= '';
s2:= '';
memo2.Clear;
j:= 1;
for i := 0 to memo1.Lines.Count - 1 do
begin
s1:= memo1.Lines.Strings[i];
for j := 1 to length(s1) + 1 do
begin
if (s1[j] <> ' ') and (j <> length(s1) + 1) then
s:= s + s1[j]
else
begin
if length(s) = 10 then
if s = '5132516132' then
s2:= s2 + 'Ф'
else
if s = '3215112321' then
s2:= s2 + 'К'
else
if s = '3215111111' then
s2:= s2 + 'З';
{и так далее}
{....................................}
s:= '';
end;
end;
if s2 <> '' then
memo2.Lines.Add(s2);
s2:= '';
end;
end;
Кстати использовать для выбора строки оператор case здесь проблематично, потому что он требует порядковый тип.
5
Отличный подход к задаче! <br>Большое спасибо за помощь.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа