Что плохого в том, что в этом коде строка не верблюжьей? - PullRequest
2 голосов
/ 28 мая 2010

Вот моя попытка решить проблему Delphi About.com, чтобы найти строку без верблюда .

unit challenge1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
   check = 65..90;
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  var s1,s2 :string;
  int : integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  checks : set of check;
begin
  s1 := edit1.Text;
  for i := 1 to 20  do
  begin
    int  :=ord(s1[i]) ;
    if int in checks then
      insert('  ',s1,i-1);
  end;
  showmessage(s1); 
end;

end.

check - это набор, который содержит заглавные буквы, поэтому, как правило, всякий раз, когда встречается заглавная буква, функция вставки добавляет пробел перед встречением (внутри строки s1), но мой код ничего не делает. ShowMessage просто показывает текст, который был введен в Edit1. Что я сделал не так?

Ответы [ 3 ]

3 голосов
/ 28 мая 2010

Вы правы, что check - это набор, но вы еще не присвоили ему никакого значения, поэтому его значение не определено. В нем нет ожидаемых символов, поэтому тест in, вероятно, всегда будет неудачным. (Разве компилятор не предупреждал вас, что вы еще ничего не присвоили check?)

Вы действительно не хотите определять check как тип поддиапазона. Вместо этого вам следует заменить check на встроенный тип TSysCharSet, представляющий собой набор символов. Затем присвойте check так:

check := ['A'..'Z'];

Кроме того, вместо проверки числового значения строки с помощью int и Ord, просто используйте значения Char напрямую: if s1[i] in check. Вы также захотите использовать функцию Length, чтобы обрабатывать всю строку, а не предполагать, что длина ввода всегда будет ровно 20 символов. Вы также захотите сохранить результат во что-то отличное от s1, поскольку, как Caldon указывает на , вы не хотите изменять его в то время, когда вы все еще читаете больше символов это.

3 голосов
/ 28 мая 2010

, если вы попробуете свою программу, например, строка "MyText", затем в первом цикле он правильно распознает, что "M" является заглавной, и поэтому он вводит один пробел перед ним ... поэтому строка "MyText" ... теперь в следующем цикле, i = 2 и s1 [i] снова "M", и поэтому он вставляет один пробел перед ним ... и так далее ...

2 голосов
/ 28 мая 2010

checks является локальным для метода и никогда не инициализируется. Он может содержать случайные данные, но, скорее всего, не те данные, которые вы ожидаете (возможно, это пустой набор). Поэтому условие IF, вероятно, никогда не станет истинным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...