Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 16.04.2019, 13:20   #11
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 26,123
Репутация: 5675
По умолчанию

Цитата:
Сообщение от Enotik_1998 Посмотреть сообщение
Переменная st описана как глобальная
во-первых, не используйте глобальных переменных, если не знаете зачем они нужны и не можете обосновать, зачем именно здесь глобальная переменная и почему нельзя её заменить на локальную.

Цитата:
Сообщение от Enotik_1998 Посмотреть сообщение
, там содержится пробел
во-вторых, ну и что Вы пытаетесь в строке, в которой есть один пробел?
Какие слова там появятся? И откуда? Самозарождение слов и двух пробелов?

в-третьих, для чего Вы прочитали текстовый файл в Мемо? Просто так?
Или Вы собирались обрабатывать прочитанный текст?

в-четвёртых, Вы сразу не ту задачу решаете. Вам нужно удалить слова, которые начинаются на одну и ту же букву,
а Вы пытаетесь найти (??? удалить) слова, которые начинаются на первую букву первого слова.
Разницу видите? Или пояснить на примере?
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 16.04.2019, 13:20   #12
Enotik_1998
Форумчанин
 
Регистрация: 09.03.2018
Сообщений: 54
Репутация: 10
По умолчанию

Если я убираю эту строку: st:=' '+st; выдаёт ошибку: Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 0045EF57' in module 'Project1.exe'. Read of address 00000000'. Process stopped. Use Step or Run to continue.
Enotik_1998 вне форума   Ответить с цитированием
Старый 16.04.2019, 13:23   #13
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 26,123
Репутация: 5675
По умолчанию

Цитата:
Сообщение от Enotik_1998 Посмотреть сообщение
Если я убираю эту строку: st:=' '+st;
так Вы ещё пару пробелов добавьте. Может оно само и заработает.


Цитата:
Сообщение от Enotik_1998 Посмотреть сообщение
выдаёт ошибку: Project Project1.exe raised exception class EAccessViolation with message
а ошибку обращения к памяти искать не надо. Эта ошибка сама по себе рассосётся.

перечитайте выше мой пост #11
подумайте, что не так и что надо исправить.
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 16.04.2019, 13:24   #14
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 14,921
Репутация: 2668
По умолчанию

А вы подумайте, что произойдет тут:
Код:
delete(st,i,1);
until (st[i]=' ')
в st у вас был один символ, вы его удалили и читаете что? где?
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Старый 16.04.2019, 13:50   #15
Enotik_1998
Форумчанин
 
Регистрация: 09.03.2018
Сообщений: 54
Репутация: 10
По умолчанию

Вот я сделал, оно удаляет все слова, которые начинаются на 1 букву первого слова:
Код:
procedure TForm1.ComboBox1Change(Sender: TObject);
var
st:string;
h:char;
begin
if combobox1.ItemIndex = 1 then
begin
RadioGroup1.ItemIndex:=1;
For i:=0 to Memo1.Lines.Count-1 do
st:=Memo1.Lines[i];
h:=st[1];
repeat
i:=pos(' '+h,st);
inc(i);
if i<>1 then
repeat
delete(st,i,1);
until (st[i]=' ')or(i=length(st)+1);
until  i=1;
ListBox1.Items.Add('Полученная строка = ' + st);
end;
Как сделать чтобы удалялись слова, которые начинаются на 1 и ту же букву? И как сделать ввод этой буквы?
Enotik_1998 вне форума   Ответить с цитированием
Старый 16.04.2019, 21:23   #16
digitalis
Профессионал
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Адрес: Минск
Сообщений: 1,800
Репутация: 578
По умолчанию

На первом проходе определить повторяющиеся первые буквы слова, для чего, к примеру, завести массив структур {первый_символ char; число_повторений int} Потом уж по этому массиву удалять провинившихся слов.
Ввод буквы делать не надо, она сама определится по результатам первого прохода.

Последний раз редактировалось digitalis; 17.04.2019 в 10:34.
digitalis вне форума   Ответить с цитированием
Старый 17.04.2019, 09:31   #17
Enotik_1998
Форумчанин
 
Регистрация: 09.03.2018
Сообщений: 54
Репутация: 10
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
На первом проходе определить повторяющиеся первые буквы слова, для чего, к примеру, завести массив структур {первый_символ char; число_повторений int} Потом уж по этому массиву удалять провинившихся слов.
Ну и как это сделать? Просто я не шарю в delphi7. Пожалуйста, скиньте готовый код. Просто это последняя задача в контрольной. Помогите её сделать и я покину это форум на полгода.

Последний раз редактировалось Enotik_1998; 17.04.2019 в 10:55.
Enotik_1998 вне форума   Ответить с цитированием
Старый 17.04.2019, 10:14   #18
digitalis
Профессионал
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Адрес: Минск
Сообщений: 1,800
Репутация: 578
По умолчанию

Не, мне лень. Ишшо вникать, как там разбивка текста на слова... Ну его в качель.
Неверов сделает, он это любит.
digitalis вне форума   Ответить с цитированием
Старый 17.04.2019, 11:08   #19
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,998
Репутация: 6725
По умолчанию

Ну коль делфи, то и его возможности, а не просто паскалевские циклы)
Код:
function MyDeleteWords(Text: String): String;
type TMyRecord = record Symbol: Char; Count: Integer; end;
var List: TStringList;
    i,j: Integer;
    m: array of TMyRecord;
function FindSymbol(pSymbol: Char): Integer;
var ti: Integer;
    ts: Char;
begin
  ts:=AnsiUpperCase(pSymbol)[1];
  for ti:=0 to High(m) do if m[ti].Symbol=ts then begin Result:=ti; Exit; end;
  Result:=-1;
end;
begin
  List:=TStringList.Create;
  try
    List.Delimiter:=' ';
    List.DelimitedText:=Text;
    for i:=0 to List.Count-1 do begin
      j:=FindSymbol(List.Strings[i][1]);
      if j=-1 then begin
        SetLength(m,Length(m)+1);
        j:=High(m);
        m[j].Symbol:=AnsiUpperCase(List.Strings[i])[1];
      end;
      Inc(m[j].Count);
    end;
    Result:='';
    for i:=0 to List.Count-1 do begin
      j:=FindSymbol(List.Strings[i][1]);
      if m[j].Count=1 then Result:=Result+' '+List.Strings[i];
    end;
    Result:=Trim(Result);
  finally
    List.Free;
  end;  
end;
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар на форуме   Ответить с цитированием
Старый 17.04.2019, 11:57   #20
Andrey_1998
Новичок
 
Регистрация: 17.04.2019
Сообщений: 1
Репутация: 10
По умолчанию

спасибо
Andrey_1998 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строками в delphi7: преобразовать переменную типа char в строку и наоборот Enotik_1998 Компоненты Delphi 2 12.04.2019 11:55
Работа со строками в delphi7 Enotik_1998 Компоненты Delphi 16 11.04.2019 15:14
Работа со строками в delphi7 Enotik_1998 Компоненты Delphi 0 10.04.2019 14:31
Работа со строками в delphi7 Enotik_1998 Компоненты Delphi 2 08.04.2019 12:39
Беда со строками в delphi7 pimple2006 Общие вопросы Delphi 16 02.12.2012 21:58


20:51.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.