Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Максимов-Димка
0 / 0 / 0
Регистрация: 26.12.2010
Сообщений: 4
1

Выделить подстроку, которая соответствует записи целого числа

26.12.2010, 18:29. Просмотров 2378. Ответов 26
Метки нет (Все метки)

Необходимо написать программу в делфи:
Дана строка, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи целого числа (т.е. начинается со знака “+” или “-“ и внутри подстроки нет букв, запятых и точек).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2010, 18:29
Ответы с готовыми решениями:

Выделить подстроку, которая соответствует записи вещественного числа
Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков “+” и...

Как выделить цветом записи, содержащиеся в другой таблице
Создаю БД в Delphi+Acsses, Необходимо выделить цветом записи, которые...

Выделить подстроку, которая соответствует записи целого числа
Дана строка, состоящая из букв, цифр, запятых, точек, знаков "+" и "-"....

Выделить подстроку, которая соответствует записи целого числа
Дана строка, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“....

Выделить подстроку, которая соответствует записи вещественного числа
Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков "+" и...

26
Mawrat
29.12.2010, 00:18     Выделить подстроку, которая соответствует записи целого числа
  #21
 Комментарий модератора 
Так, ребята, что-то я эту тему пропустил... Напильнег, что, нельзя обсуждение вести без накала эмоций?
0
kukuruku310
197 / 184 / 26
Регистрация: 14.02.2010
Сообщений: 539
29.12.2010, 00:21 22
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
program Test;
{$APPTYPE console}
 
// вернет разделенные пробелами целые числа из StringValue со знаками + или -, если те непосредственно примыкают к числу
function Func(const StringValue: string): string;
var
  sLen, bPos, ePos: Integer;
  s: string;
  var
    a: array of array of Integer;
begin
  sLen := Length(StringValue);
  bPos := 1;
  Result := '';
  while bPos <= sLen do begin
    while (bPos <= sLen) and not (StringValue[bPos] in ['0'..'9', '+', '-']) do
      Inc(bPos);
    if bPos <= sLen then begin
      ePos := bPos + 1;
      while (ePos <= sLen) and (StringValue[ePos] in ['0'..'9']) do
        Inc(ePos);
      if (ePos - bPos > 1) or (StringValue[bPos] in ['0'..'9']) then begin
        if Result <> '' then Result := Result + ' ';
        Result := Result + Copy(StringValue, bPos, ePos - bPos);
        //WriteLn(Result);
        //Exit;
      end;
 
      //////////////////////////////////////////////////////////////////////////
      // если надо отбросить дробную часть от уже выделенного из ЭТОГО ЧИСЛА целого
      if StringValue[ePos] in ['.', ','] then begin
        Inc(ePos);
        while (ePos <= sLen) and (StringValue[ePos] in ['0'..'9']) do
          Inc(ePos);
      end;
      //////////////////////////////////////////////////////////////////////////
 
      bPos := ePos;
    end;
  end;
end;
 
var
  samples: array [1..5] of string = (
       '+123--123',
       '+-+-+-1+-+-+-',
       '+123++125 или -123--1235',
       '123',
       '1.355 +234.56=2222-3'
    );
 
  idx: Integer;
 
begin
  for idx := Low(samples) to High(samples) do
    WriteLn(samples[idx], '=', Func(samples[idx]));
 
  WriteLn('press enter to exit');
  ReadLn;
end.
1
Напильнег
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
31.12.2010, 00:36 23
Значится так: неоднозначность в этой задаче заключается в том, что понятие целого числа в математике и программировании разнятся. Строка '1234567890123' задает корректную запись целого числа в математическом смысле, но не является записью числа типа integer. Отсюда возникают три варианта постановки задачи:

Вариант 1: выделяем подстроки, являющиеся записью целого числа, возможно со знаком, в математическом виде, т.е. подстрока '1234567890123' выводиться как найденное целое число.
Этот вариант тут все пытались реализовать, у кого-то даже и получилось, свою версию мне предъявлять неинтересно.

Вариант 2а: из подстрок, являющихся записью целого числа возможно со знаком, выделяются только те, которые являются корректной записью числа типа integer, т.е. подстрока '1234567890123' в данном варианте отбрасывается. Вариант получается из варианта 1 легким движением левой ноги и мне тоже не интересен.

Вариант 2б: из последовательности цифр, возможно со знаком, выделяется подпоследовательность до тех пор, пока она является корректной записью числа типа intreger, первая цифра, не попадающая в формат, считается цифрой уже следующего числа. Т.е. наша многострадальная строка '1234567890123' распознается т.о. как два числа типа integer - '1234567890' и '123'. Вот это уже интересно.

Вариант решения варианта 2б:
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
program break_string_2;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
function vall(const s: string): integer;
  procedure out(p, q: integer);
    begin
      writeln(': ', copy(s, p, q-p+1));
      inc(result);
    end;
  var
    slen, p, m, i, ier: integer;
  begin
    result:=0;
    slen:=length(s);
    p:=0; m:=0;
    i:=1; while TRUE do begin
      (**) if (i>slen) then begin
        if (m>0) then begin
          out(p, i-1);
          p:=0; m:=0; // ;)
          end;
        break;
        end
      else if (s[i] in ['0'..'9']) then begin
        (**) if (p=0) then begin
          p:=i; m:=1;
          end
        else if (m<9) then begin
          m:=m+1;
          end
        else begin
          try
            ier:=0; strtoint(copy(s, p, i-p+1)); // Not 10!!!
          except
            ier:=i-p+1;
            end;
          if (ier=0) then begin
            out(p, i);
            p:=0; m:=0;
            end
          else begin
            out(p, i-1);
            p:=i; m:=1;
            end;
          end
        end
      else if (s[i] in ['+', '-']) then begin
        if (m>0) then out(p, i-1);
        p:=i; m:=0;
        end
      else begin
        if (m>0) then out(p, i-1);
        p:=0; m:=0;
        end;
      i:=i+1;
    end;
  end;
 
var
  s: string;
 
begin
  while TRUE do begin
    writeln; write('? '); readln(s);
    if s='' then break;
    writeln(vall(s), ' found');
    end;
end.
Разрешите получить замечания!

(Х\ф " В бой идут одни старики")
1
Максимов-Димка
0 / 0 / 0
Регистрация: 26.12.2010
Сообщений: 4
31.12.2010, 14:52  [ТС] 24
Ребята спасибо вам всем !!!!!!
0
Sergiuz
160 / 158 / 39
Регистрация: 10.10.2010
Сообщений: 461
31.12.2010, 19:19 25
Цитата Сообщение от Напильнег Посмотреть сообщение
Разрешите получить замечания!
Разрешаю и нужно было меньше 10 минут, делфи дольше грузился чем найти у тебя ошибку
Что за странное целое число "01" - не знаю я такого, а ты?
Вот видишь я же говорил что у тебя будет ошибка.

Ну ладно проехали С наступающим Вас всех
0
Напильнег
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
31.12.2010, 21:17 26
Цитата Сообщение от Sergiuz Посмотреть сообщение
Что за странное целое число "01" - не знаю я такого, а ты?
А, понял сакральный смысл выражения inttostr(strtoint(...)). Только пальцем в небо ты попал - в задании требуется выделить подстроки, являющиеся записями целых чисел, а у тебя таким образом подстрока -001 переходит в -1, что не соответствует заданию. А строка 01 вполне себе является корректной записью целого числа.

Правда, косяк у меня таки есть, щаз поправим.

Добавлено через 31 минуту
Собственно, получилось даже проще:
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
program break_string_2;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
function vall(const s: string): integer;
  procedure out(p, q: integer);
    begin
      writeln(': ', copy(s, p, q-p+1));
      inc(result);
    end;
  var
    slen, p, m, i, ier: integer;
  begin
    result:=0;
    slen:=length(s);
    p:=0; m:=0;
    i:=1; while TRUE do begin
      (**) if (i>slen) then begin
        if (m>0) then begin
          out(p, i-1);
          p:=0; m:=0; // ;)
          end;
        break;
        end
      else if (s[i] in ['0'..'9']) then begin
        if (p=0) then begin
          p:=i; m:=1;
          end
        else begin
          try
            ier:=0; strtoint(copy(s, p, i-p+1));
          except
            ier:=i-p+1;
            end;
          if (ier=0) then begin
            m:=m+1;
            end
          else begin
            out(p, i-1);
            p:=i; m:=1;
            end;
          end
        end
      else if (s[i] in ['+', '-']) then begin
        if (m>0) then out(p, i-1);
        p:=i; m:=0;
        end
      else begin
        if (m>0) then out(p, i-1);
        p:=0; m:=0;
        end;
      i:=i+1;
    end;
  end;
 
var
  s: string;
 
begin
  while TRUE do begin
    writeln; write('? '); readln(s);
    if s='' then break;
    writeln(vall(s), ' found');
    end;
end.
С ведущими нулями конечно некузявость, но она неисправима: строку 000123 мы можем конечно усечь до 123, но если -000123 усечь до -123, получится строка, отсутствующая во вводе.
1
Mawrat
12827 / 5735 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
31.12.2010, 22:51 27
Всё, задача решена уже по нескольку раз. Закрываю тему.
0
31.12.2010, 22:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.12.2010, 22:51

Выделить подстроку, которая соответствует записи вещественного числа
Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков «+» и...

Выделить подстроку, которая соответствует записи вещественного числа
Как выделить подстроку, которая соответствует записи вещественного числа с...

Выделить подстроку, которая соответствует записи вещественного числа
Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков “+” и...


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

Или воспользуйтесь поиском по форуму:
27
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru