Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2013, 16:13   #1
Anton94.by
Форумчанин
 
Регистрация: 16.10.2011
Сообщений: 115
Восклицание работа со строками в Delphi

Задание:
1) Удалить из текста символ «?», если количество символов «*» больше 4.
2) Если первая буква последнего слова и первая буква слова минимальной длины одинаковы, то поменять их местами. В противном случае удалить последнее слово.

Код:
procedure TForm1.CBChange(Sender: TObject);
begin
if CB.Text='Задача 1' then
   begin
      Memo1.Lines.Clear;
      LB.Items.Clear;
      ST.Caption:=' Удалить из текста символ «?», если количество символов «*» больше 4';
      Memo1.Enabled:=true;
   end;
 if CB.Text='Задача 2' then
   begin
      ST.Caption:=' Если первая буква последнего слова и первая буква слова минимальной длины одинаковы, то поменять их местами. В противном случае удалить последнее слово';
      Memo1.Lines.Clear;
      LB.Items.Clear;
      Memo1.Enabled:=true;
   end;
   button1.Enabled:=true;
   end;

procedure TForm1.Button1Click(Sender: TObject);
var
s,s_min,s_perv,s1:string;
i,n,ns,d_min,ds,kol_min,n_min:integer;
begin
  if CB.ItemIndex=0 then  //задача 1
  begin

    s:=Memo1.Lines[0]+Memo1.Lines[1]+Memo1.Lines[2];
    n:=length(s);
    i:=1;
     While i<=n do
      begin
        if s[i]='?' then s[i]:='*';
          begin
           Delete (S,i,1);
           i:=i-1>4;
           n:=length(s);
         end;
         i:=i+1
      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[i]=' ') or (S[i]='.') or (S[i]=',')) then
         begin
              if ((s[i]=' ') 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 ;
           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[i]=' ') or (S[i]='.')) 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[i]=' ') or (S[i]='.')) 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[i]=' ' 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.
Помогите исправить код, сома программа с этим кодом работает, но результат выдаёт неправильно. Задание вверху.
Anton94.by вне форума Ответить с цитированием
Старый 21.04.2013, 12:40   #2
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

В раздел "для студентов"
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 21.04.2013, 13:47   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Задача 1:
Код:
//Вложенный метод
procedure CountChar(const aStr:String; const aChar:Char):Integer;
var
 s:string;
begin
 s:=aStr;
 Result:=0; 
 for i:=0 to Length(s)-1 do
 begin
   if (s[i] = aChar) then
   Inc(Result);
 end;
end;
begin
 if CountChar('Это **** и знак ?','*') > 4 then
 s:=StringReplace(s,'?','',[rfREplaceAll]);
end;
как-то так.
" задача тоже не имеет сложностей.
Человек_Борща вне форума Ответить с цитированием
Старый 22.04.2013, 22:13   #4
Anton94.by
Форумчанин
 
Регистрация: 16.10.2011
Сообщений: 115
Восклицание работа со строками в делфи

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Задача 1:
Код:
//Вложенный метод
procedure CountChar(const aStr:String; const aChar:Char):Integer;
var
 s:string;
begin
 s:=aStr;
 Result:=0; 
 for i:=0 to Length(s)-1 do
 begin
   if (s[i] = aChar) then
   Inc(Result);
 end;
end;
begin
 if CountChar('Это **** и знак ?','*') > 4 then
 s:=StringReplace(s,'?','',[rfREplaceAll]);
end;
как-то так.
" задача тоже не имеет сложностей.
Вставил этот код вообще программа неработает, и выдаёт много ошибок.
внизу вложил рабочую программу с моим кодом ( может так будет легче понять где ошибка в моём коде).
Вложения
Тип файла: rar delphi.rar (184.3 Кб, 6 просмотров)

Последний раз редактировалось Anton94.by; 22.04.2013 в 22:21.
Anton94.by вне форума Ответить с цитированием
Старый 22.04.2013, 22:59   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Цитата:
Вставил этот код вообще программа неработает, и выдаёт много ошибок.
А кто сказал, что вам тут готовый код писать будут. Я вам пример дал, его допилить надо и он будет работать.
Человек_Борща вне форума Ответить с цитированием
Старый 24.04.2013, 20:31   #6
Anton94.by
Форумчанин
 
Регистрация: 16.10.2011
Сообщений: 115
Восклицание работа со строками в делфи

В программе первый код отладил, всё работает и правильно считает.
Вот мой код от первый проги:
Код:
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[i]='*' 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;
Помогите пожалуйсто исправить код во второй программе ( сома программа работает, но второе задание считает неправильно). Спасибо.
Вложения
Тип файла: zip Project1.zip (235.5 Кб, 8 просмотров)
Anton94.by вне форума Ответить с цитированием
Старый 24.04.2013, 20:37   #7
Anton94.by
Форумчанин
 
Регистрация: 16.10.2011
Сообщений: 115
Восклицание

Посмотрите пожалуйста ещё и первое задание, там вроде удаляет вопрос если ровно 4 символа '*', а если больше, то неудаляет?

Последний раз редактировалось Anton94.by; 24.04.2013 в 20:39.
Anton94.by вне форума Ответить с цитированием
Старый 24.04.2013, 22:43   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Код:
      if cntzv=4 then
      begin
        s:= stringreplace(s, '?', '',[rfReplaceAll, rfIgnoreCase]);
      end;
4 на любое другое измените и будет столько искать.
Человек_Борща вне форума Ответить с цитированием
Старый 25.04.2013, 01:47   #9
Anton94.by
Форумчанин
 
Регистрация: 16.10.2011
Сообщений: 115
По умолчанию

Исправьте пожалуйста код во втором задании.
Anton94.by вне форума Ответить с цитированием
Старый 25.04.2013, 22:43   #10
Anton94.by
Форумчанин
 
Регистрация: 16.10.2011
Сообщений: 115
Восклицание Если первая буква последнего слова и первая буква слова минимальной длины одинаковы, то поменять их местами.

Задача по Delphi.
Задание:
1) Удалить из текста символ «?», если количество символов «*» больше 4.
2) Если первая буква последнего слова и первая буква слова минимальной длины одинаковы, то поменять их местами. В противном случае удалить последнее слово.
Код:
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;

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[i]='*' 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[i]=' ') or (S[i]='.') or (S[i]=',')) then
         begin
              if ((s[i]=' ') 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 ;
           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[i]=' ') or (S[i]='.')) 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[i]=' ') or (S[i]='.')) 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[i]=' ' 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.
Исправьте пожалуйста второе задание. Программа вложена внизу. Программа рабочая: первое задание работает и считает правильно;
а второе задание работает, но считает неправильно.

Исправьте пожалуйста второе задание. Спасибо.
Вложения
Тип файла: rar program.rar (184.7 Кб, 8 просмотров)
Anton94.by вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строками в Delphi alterius Помощь студентам 2 17.04.2011 01:55
Работа со строками Delphi Яська Помощь студентам 1 03.12.2010 00:15
Работа со строками, delphi <Maria> Помощь студентам 1 19.10.2010 00:14
Delphi (работа со строками) infectbot Помощь студентам 5 28.01.2010 09:00
работа со строками delphi fize Помощь студентам 22 07.01.2010 03:59