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

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

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

Студворк — интернет-сервис помощи студентам
Необходимо написать программу в делфи:
Дана строка, состоящая из букв, цифр, запятых, точек, знаков “+” и “-“. Выделить подстроку, которая соответствует записи целого числа (т.е. начинается со знака “+” или “-“ и внутри подстроки нет букв, запятых и точек).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.12.2010, 18:29
Ответы с готовыми решениями:

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

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

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

26
29.12.2010, 00:18
Студворк — интернет-сервис помощи студентам
 Комментарий модератора 
Так, ребята, что-то я эту тему пропустил... Напильнег, что, нельзя обсуждение вести без накала эмоций?
0
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 547
29.12.2010, 00:21
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
Значится так: неоднозначность в этой задаче заключается в том, что понятие целого числа в математике и программировании разнятся. Строка '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  [ТС]
Ребята спасибо вам всем !!!!!!
0
 Аватар для Sergiuz
161 / 159 / 39
Регистрация: 10.10.2010
Сообщений: 461
31.12.2010, 19:19
Цитата Сообщение от Напильнег Посмотреть сообщение
Разрешите получить замечания!
Разрешаю и нужно было меньше 10 минут, делфи дольше грузился чем найти у тебя ошибку
Что за странное целое число "01" - не знаю я такого, а ты?
Вот видишь я же говорил что у тебя будет ошибка.

Ну ладно проехали С наступающим Вас всех
0
481 / 119 / 17
Регистрация: 30.09.2010
Сообщений: 473
31.12.2010, 21:17
Цитата Сообщение от 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
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
31.12.2010, 22:51
Всё, задача решена уже по нескольку раз. Закрываю тему.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.12.2010, 22:51

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
27
Закрытая тема Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru