НЕ работает программа на Delphi[выручайте]

Ответить
BHy4ok
Сообщения: 237
Зарегистрирован: 01 май 2007, 09:03
Откуда: г.Находка
Контактная информация:

Всем привет. ЗАвтро надо прогу показывать, а сделать все никак не получается. Очень надеюсь на вашу помощь.
Задача:
Дана символьная строка. Если в ней встречаются числа в диапазоне от 100 до 200. То подсчитать кол-во таких цифр.
Пример:
' 111 345 sdfasha 187 .........' : ответ: 'количество символов от 100 до 200= 2'

Вот пытался написать но не получается:
type
C1=set of '0'..'9';
var
C:c1;
S,L:String;

begin
C:=['0'..'9'];
j:=0;
k:=0;
p:=0;
readln(s);
s:=LInput.Text;

for i:=1 to length(s) do
begin
if s in c then
begin
L[j]:=S;
j:=j+1;
if k=0 then k:=i;
if k<>i then
begin
if (strtoint(l)>=100) and (strtoint(l)<=200) then p:=p+1;
l:='';
j:=0;
k:=k+1;
end;end;end;
LInput.Lines.Add('Цифр= '+inttostr(k));


end;

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

Вообщем прошу помощи.
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

[quote="BHy4ok"]

Код: Выделить всё

...
for i:=1 to length(s) do
begin
if s[i] in c then
begin
L[j]:=S[i]][/quote]
Способ, конечно, не из лучших для решения такой простой задачи. Много ненужных переменных, которые путают тебя и твой алгоритм. Например, 
[code]
L[j]:=S[i];
j:=j+1;
-этот отрывок кода превратит число 124 в 24, и число перестанет удовлетворять условию. (также число 1100 в 100, и число удовлетворит условию). Это потому что символ в начале кода присваиваится в нулевую ячейку строки. Я бы предложил сделать попроще:

Код: Выделить всё

L:=L+S[i];
И ещё, зачем количеству цифр присваивать позицию, с которой начинается проверка? (if k=0 then k:=i;). Но главное, что у тебя нарушена сама "идея": L у тебя всегда однозначное число. Даже если делать L:=L+S в итоге будет "склеп", состоящий только из чисел строки.
Много ошибок, длинный алгоритм, в общем, нужно так:

Код: Выделить всё

  const cifra=['0'..'9'];
  var s,s2: string;
  i,kol,error,c: integer;
  procedure conditionch;
  begin
  if s[i+3] in cifra then exit;
  s2:=copy(s,i,3);
  val(s2,c,error);
  if (c>=100) and (c<=200) and (error=0) then begin
     inc(kol);
     delete(s,i,3);
     end;
  end;
  begin
  readln(s);
  for i:= 1 to length(s) do if (s[i]='1') or (s[i]='2') then conditionch;
  writeln('Количество символов от 100 до 200 = ',kol);
  readln;
  end.
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Аватара пользователя
Колядин Максим
Сообщения: 297
Зарегистрирован: 16 ноя 2006, 19:09
Откуда: Seattle, WA
Контактная информация:

Ой, забыл что нужно на Delphi.

Код: Выделить всё

  const cifra=['0'..'9'];
  var s,s2: string;
  i,kol,error,c: integer;

  procedure conditionch;
  begin
  if s[i+3] in cifra then exit;
  s2:=copy(s,i,3);
  val(s2,c,error); //не помню, есть ли эта функция в Delphi
  if (c>=100) and (c<=200) and (error=0) then begin
     inc(kol);
     delete(s,i,3);
     end;
  end;

 procedure TForm1.Button1Click(Sender: TObject);
  begin
  s:=LInput.Text;
  for i:= 1 to length(s) do if (s[i]='1') or (s[i]='2') then conditionch;
  LInput.Lines.Add(''Количество символов от 100 до 200 = '+kol);
  end;
Программист - это человек, который решает способом, который вы не понимаете, проблемы, о которых вы даже не подозревали...
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):for i:= 1 to length(s)
&quot писал(а):if s[i+3] in cifra
BHy4ok, типичная ошибка для Колядин Максим
для информации http://forum.developing.ru/showthread.php?t=8599
&quot писал(а):LInput.Lines.Add(''Количество символов от 100 до 200 = '+kol);
Kol : Integer, следует читать IntToStr(Kol)
It's a long way to the top if you wanna rock'n'roll
BHy4ok
Сообщения: 237
Зарегистрирован: 01 май 2007, 09:03
Откуда: г.Находка
Контактная информация:

Всем спасибо кто помог.
2Колядин Максим: не знаю но код работать отказывался. Вылезала ошибка как только встречался символ ['1'..'2'].

Отдельно спс somewhere.
Ответить