Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi] Простая задачка на строки


Автор: Denwer 26.11.2007, 20:42
Помогите плиз с задачкой на строки, 

Нужно вывести слово в котором первая буква ходит в него только ОДИН раз, 
если больше, то слово не выводиться. 

Пример:
тетрадь - выводиться;
анапа - не выводиться;

Задачку то я решил, но у меня выводяться слова
даже если первая буква входит в него больше двух раз.

Function TwoWord (var word: string) : boolean;
var i: integer;
first: string;
begin
Result := False;
first := word[1];
for i:=2 to Length(Word) do
if (Word[i] = first) then
Result := True;
end;

Вот моя функця. Подправьте плиз

Автор: Alexeis 26.11.2007, 21:22
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: ivan219 27.11.2007, 01:10
Тебе нужен счетчик вхождения букв в слово:
Код

function TwoWord(Word: String) : Boolean;
var 
   I, I1: Integer;
begin
 Result := False;
 if Length(Word) < 2 then Exit; // Если меньше 2 букв то выход.
 I1 := 0;
 for I := 2 to Length(Word) do
  if Word[I] = Word[1] then Inc(I1);
 if I1 = 1 then Result := True;
end;


Автор: Denwer 27.11.2007, 01:42
Спасибо, всё работает !!! smile 

Автор: THandle 27.11.2007, 10:51
Я бы ещё Length(Word) вынес бы в отдельную переменную

Автор: Denwer 30.11.2007, 18:21
Не подскажете, например та же самая задача, только вторая буква не первая?
 это типа так (if Word[I] = Word[2] then Inc(I1);)???


Автор: mr.Anderson 30.11.2007, 19:15
Denwer, именно.

Автор: ivan219 30.11.2007, 19:30
Любая позиция буквы:
Код

function TwoWord(Word: String; PosChar: Integer) : Boolean;
var 
   I, I1, LengthW, PosC: Integer;
begin
 Result := False;
 LengthW := Length(Word);
 PosC := PosChar + 1;
 I1 := 0;
 if LengthW < PosC then Exit;
 for I := PosC to LengthW do
  if Word[I] = Word[PosChar] then Inc(I1);
 if I1 = 1 then Result := True;
end;

На все случаи smile 
Код

function TwoWord(Word: String; PosChar, Max: Integer) : Boolean;
var 
   I, I1, LengthW, PosC: Integer;
begin
 Result := False;
 LengthW := Length(Word);
 PosC := PosChar + 1;
 I1 := 0;
 if LengthW < PosC then Exit;
 for I := PosC to LengthW do
  if Word[I] = Word[PosChar] then Inc(I1);
 if I1 = Max then Result := True;
end;

Автор: Denwer 1.12.2007, 22:11
Спасибо, все понял, но ещё один вопрос.
1. Функция ведь должна возвращать и вот такое слово, например (vvcccccc),
так как вторая буква входит в слово ещё раз. 

Можно было бы конечно добавить типа того: 

for I := PosC to LengthW do
  if (Word[I] = Word[PosChar])
  then Inc(I1);
  if (I1 = 1) or (Word[1] = Word[2]) then Result := True;

но тогда она будет и возвращать и (vvcccccvv), к примеру.
Вот как тут быть? 

Автор: ivan219 4.12.2007, 15:32
Denwer, что-то я не соображу что тебе надо smile эта функция возвращяет все буквы от позиции и в право т.е. если у тебя позиция 2 то в слово vvcccccc вернёт False так как поле v стоят одни только cccc а это слово vvcccccvv тоже вернёт False так как в нём больше чем 1 буква v.

Цитата(Denwer @  1.12.2007,  22:11 Найти цитируемый пост)
1. Функция ведь должна возвращать и вот такое слово, например (vvcccccc),так как вторая буква входит в слово ещё раз. 

Да если позиция будет 1 а число вхождений то же 1 иначе False

Вобщем разясни что тебе нужно поконкретнее!!!

Автор: Denwer 5.12.2007, 21:00
Я точно узнаю условие, и тогда если что обращусь.

Ещё одно, у меня здесь есть процедура которая бежит по Memo
и находит самое короткое слово. Но к сожалению выводит
только одно слово. А надо чтоб выводило все  самые коротке
слова одинаковой длины.

Вот код. 

procedure TForm1.btnFindClick(Sender: TObject);
var i: integer;
word: string;
begin
  if (Memo1.Lines.Count >= 2) and (Memo1.Lines.Count < 50) then
  begin
    for i := 0 to Memo1.Lines.Count - 1 do
    begin
      if i = 0 then word := Memo1.Lines[0]
      else
        if Length(Memo1.Lines[i]) < Length(word) then word := Memo1.Lines[i];
    end;
  end;
 Memo2.Lines.Add(word);
end;

Может подправите...?

Автор: ivan219 6.12.2007, 02:18
Но вобщето эта процедура всё правильно делает, не много подправил:
Код

procedure TForm1.btnFindClick(Sender: TObject);
var
  I: Integer;
  Word: String;
begin
 if (Memo1.Lines.Count >= 2) and (Memo1.Lines.Count < 50) then
  begin
   Word := Memo1.Lines[0];
   for I := 1 to Memo1.Lines.Count - 1 do
    if Length(Memo1.Lines[I]) < Length(Word) then Word := Memo1.Lines[I];
  end;
 Memo2.Lines.Add(Word);
end;

А найти все короткие можно так:
Код

procedure TForm1.btnFindClick(Sender: TObject);
var
  I: Integer;
  Word: String;
begin
 if (Memo1.Lines.Count >= 2) and (Memo1.Lines.Count < 50) then
  begin
   Word := Memo1.Lines[0];
   for I := 1 to Memo1.Lines.Count - 1 do
    if Length(Memo1.Lines[I]) < Length(Word) then Word := Memo1.Lines[I];

   for I := 0 to Memo1.Lines.Count - 1 do
    if Length(Memo1.Lines[I]) = Length(Word) then Memo2.Lines.Add(Memo1.Lines[I]);
  end;
end;


Конечно алгоритм не ахти и написан на коленках но должен работать.

P.S. Используй подсветку синтаксиса кнопка Код

Автор: Denwer 6.12.2007, 09:15
Спасибо, с меня пиво...  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)