Новые сообщения · Правила  
Страница 1 из 11
Модератор форума: Berestovskiy 
Форум ПРОГРАММИСТОВ » ПРОГРАММИРОВАНИЕ » Delphi » Delphi (работа со строками)
Delphi
Задача по Delphi.
Задание:
1) Удалить из текста символ «?», если количество символов «*» больше 4.
2) Если первая буква последнего слова и первая буква слова минимальной длины одинаковы, то поменять их местами. В противном случае удалить последнее слово.

Исправьте пожалуйста второе задание. Ссылка на программу вложена внизу. Программа рабочая: первое задание работает и считает правильно; а второе задание работает, но считает неправильно.

Исправьте пожалуйста второе задание. Спасибо.
 
Ссылка на программу :
http://pascalcoder.ru/_fr/7/program.rar
1 | Автор: anton94by | 2013-05-01, 19:25   |  Репутация: [ + 1 ]
Цитата (anton94by)
1) Удалить из текста символ «?», если количество символов «*» больше 4.
for i:=1 to length(my_string) do begin
if my_string = '*' then amount:=amount+1;
if pos('*',my_string) = 0 then break;end;
if amount > 4 then delete(my_string,pos('?',my_string),1);

на счёт второй: кинь сюда код


Нужна помощь? Сюда: vkontakte.ru/berestovskiy
2 | Автор: Berestovskiy | 2013-05-02, 16:01   |  Репутация: [ + 211 ]


Нужна помощь? Сюда: vkontakte.ru/berestovskiy
2 | Автор: Berestovskiy | 2013-05-02, 16:01   |  Репутация: [ + 211 ]
Код
unit Unit1;

Добавлено (02.05.13, 21:44)
---------------------------------------------
unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, Buttons;

 

type

  TForm1 = class(TForm)

    CB: TComboBox;

    ST: TStaticText;

    Button1: TButton;

    GroupBox1: TGroupBox;

    Memo1: TMemo;

    GroupBox2: TGroupBox;

    LB: TListBox;

    BitBtn1: TBitBtn;

    procedure CBChange(Sender: TObject);

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.CBChange(Sender: TObject);

begin

if CB.Text='Задача 1' then

   begin

      Memo1.Lines.Clear;

      LB.Items.Clear;

      ST.Caption:='1.Удалить из текста символ "?", если количество символов "*" больше 4.';
      Memo1.Enabled:=true;

   end;

 if CB.Text='Задача 2' then

   begin
      ST.Caption:='2.Если первая буква последнего слова и первая буква слова минимальной длины одинаковы, то поменять их местами. В противном случае удалить последнее слово.';
      Memo1.Lines.Clear;
      LB.Items.Clear;

      Memo1.Enabled:=true;

   end;

   button1.Enabled:=true;

   end;

Добавлено (02.05.13, 21:46)
---------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);

var

s,s_min,s_perv,s1:string;

i,n,ns,d_min,ds,kol_min,n_min, cntzv:integer;

begin

cntzv:=0; //кол-во звёзд

  if CB.ItemIndex=0 then  //задача 1

  begin

    s:=Memo1.text;

    n:=length(s);

    i:=1;

     While i<=n do

      begin

        if s='*' then

         begin

           cntzv:=cntzv+1;

         end;

         inc(i);

      end;

      if cntzv>=4 then

      begin

        s:= stringreplace(s, '?', '',[rfReplaceAll, rfIgnoreCase]);

      end;

   LB.Items.Add(s);

  end;

  if CB.ItemIndex=1 then  // задача 2

  // слово минимальной длины и его длину

  begin

    s:=Memo1.Lines[0]+Memo1.Lines[1]+Memo1.Lines[2];

    n:=length(s);

    i:=1;

    ns:=1;

    d_min:=100;

       For i:=1 to n do

         If ((S=' ') or (S='.') or (S=',')) then

         begin

              if ((s
=' ') and (s[i-1]=','))

                 then

                 ns:=i+1

                 else

                begin

                  ds:=i-ns;

                    If ds<=d_min then

                       begin

                         d_min:=ds;// длина

                         s_min:=Copy(s,ns,ds);

                         n_min:=ns;

                       end;

                     ns:=i+1;

                end;

         end ;

Добавлено (02.05.13, 21:47)
---------------------------------------------
LB.Items.Add('длина минимального слова='+IntToStr(d_min));

           LB.Items.Add('минимальное слово='+s_min);

    // количество слов минимальной длины

      ds:=0;

      kol_min:=0;

      ns:=1;

      For i:=1 to n do

        If ((S=' ') or (S='.')) then

           begin

             ds:=i-ns;

              If ds=d_min then

                  kol_min:=kol_min+1;

                  ns:=i+1;

           end;

     if kol_min>2  //delete слов минимальной длины

         then

           begin

             i:=1;

             ns:=1;

             n:=length(s);

               While i<=n do

                 begin

                   If ((S=' ') or (S='.')) then

                    begin

                      ds:=i-ns;

                       If ds=d_min then

                         begin

                           Delete (S,i-1,d_min);

                           i:=i-d_min;

                           n:=n-ds;

                         end;

                       ns:=i+1;

                    end;

                  i:=i+1;

                 end;

           end;

    LB.Items.Add('кол-во слов мин длины ='+IntToStr(kol_min));

    LB.Items.Add(s);// полученная строка

    // меняем местами первое слово и слово мин длины

    ns:=1;

    ds:=0;

    if kol_min<=2 then

        begin

          for i:=1 to n do

            if s
=' ' then

              begin

               ds:=i-ns;  // длина первого слова

               s_perv:=copy (s,1,i-1);

               delete (s,1,i-1);

               break;

              end;

               LB.Items.Add('первое слово='+s_perv);

               insert(s_min,s,1); // вставляем минимальное на место первого

               delete (s,n_min-ds+d_min,d_min);//удаляем минимальное

               insert (s_perv,s,n_min-ds+d_min); //вставляем первое на место минимального

               LB.Items.Add(s);

        end;

  end;

end;

end.

Добавлено (02.05.13, 21:50)
---------------------------------------------
Вот весь код программы, вылаживал по частям т.к. из-за ограничения сразу весь нельзя выложить.

3 | Автор: anton94by | 2013-05-02, 21:50   |  Репутация: [ + 1 ]
Цитата (anton94by)
Если первая буква последнего слова и первая буква слова минимальной длины одинаковы, то поменять их местами. В противном случае удалить последнее слово.
давай по другому. вот код, который это делает:
for i:=length(my_string) downto 1 do
if my_string = ' ' then begin IndexOfSpace:=i;break;end; //получаем индекс последнего пробела
CopyString:=my_string;
while pos(' ',CopyString)<>0 do begin
word:=copy(CopyString,1,pos(' ',CopyString));
delete(CopyString,1,pos(' ',CopyString));
if length(word) < MinLengthOfString do begin MinLengthOfString:=length(word); MinLengthWord:=word;end;end;
if MinLengthWord[1] <> my_string[IndexOfSpace+1] then 
delete(my_string,IndexOfSpace,255)
else begin
// тут допиши код, который меняет местами в случае одинаковых букв
end;

Удачи.


Нужна помощь? Сюда: vkontakte.ru/berestovskiy
4 | Автор: Berestovskiy | 2013-05-03, 09:37   |  Репутация: [ + 211 ]
Спасибо.
5 | Автор: anton94by | 2013-05-03, 19:06   |  Репутация: [ + 1 ]
Обращайся ещё)

Нужна помощь? Сюда: vkontakte.ru/berestovskiy
6 | Автор: Berestovskiy | 2013-05-04, 10:45   |  Репутация: [ + 211 ]


Нужна помощь? Сюда: vkontakte.ru/berestovskiy
6 | Автор: Berestovskiy | 2013-05-04, 10:45   |  Репутация: [ + 211 ]
Форум ПРОГРАММИСТОВ » ПРОГРАММИРОВАНИЕ » Delphi » Delphi (работа со строками)
Страница 1 из 11
Поиск: