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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2009, 18:19   #1
SarahConner
Пользователь
 
Аватар для SarahConner
 
Регистрация: 03.01.2009
Сообщений: 32
По умолчанию Уже не студент, и не могу преодолеть сложность (строки, *.txt)

Всем привет, Вот опять ступор.
может подкинете идейку.
Мучую свой *.txt файл. Там строки с именем и действием, типа:

Маша спит
Аня играет на гитаре
поет Вика
Ирина спит
Вика думает
Маша спит
поет Аня
Маша вяжет свитер
Аня спит
шалит Ирина
Вика спит
Аня спит

Мне нужен массив [Маша, Аня, Вика, Ирина],
т.е. всех имен, но без повторений. Причем есть ключевая строка, когда девчонки спят, но таких строк несколько с одинаковым именем.
Я сделал так:

в цикле
while not EOF(f1) do
begin
...
... если строка файла содержит 'спит', то names[i]:= кол-во символов до первого пробела.

т.о. получился массив
\\начало
Маша


Ирина

Маша спит


Аня

Вика
Аня
\\конец
Т.е. с повторением и с пустыми строками.
Может есть возможность удалить пустые строки, а уж упорядочить ( сократить до бесповторяемости) массив я сумею.

Буду рад любой подсказке-идее.
I'll be back
SarahConner вне форума Ответить с цитированием
Старый 12.01.2009, 19:37   #2
goblinyara
Форумчанин
 
Аватар для goblinyara
 
Регистрация: 02.01.2009
Сообщений: 340
По умолчанию

хммм... вам нужно завести переменную, которой перед циклом прочтения файла присваиваете 1, далее в каждой строке вы выделяете имя, смотрите в массиве с именами, есть ли такое имя(дальше этой переменно смотреть не имеет смысла), если такого имени нет в массиве, то записываете это имя в массив и прибавляете к этой переменной единицу... в конце будет массив с каждым именем в единственном экземпляре и без пустых строк...
DelphiWorld 6. Скачай, поставь, и будет тебе счастье=)
Программирование, как и любовь -- одно слово, за которым скрывается бесконечное множество занятий.
goblinyara вне форума Ответить с цитированием
Старый 12.01.2009, 22:58   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

А имена то с большой буквы начинаются...
от этого и пляшем...
решение задачи в архиве.

А вот сам код (если кому проект целиком качать лень, или нет необходимости...):

Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  FirstChar = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЭЮЯ';
var
  TS, TName : TStringList;
  i, j, Pos1 : Integer;
  s, sName : string;
begin
  if Not FileExists(Edit1.Text) then Memo1.Lines.Add('Нет файла '+Edit1.Text)
  else begin
    TS := TStringList.Create;
    TName := TStringList.Create;
    TS.LoadFromFile(Edit1.Text);
    for i:=0 to TS.Count-1 do
      if Length(Trim(TS.Strings[i]))>0 then begin
         sName := '';
         s := Trim(TS.Strings[i]);
         j := 1;
         while (j<=Length(s)) and
           (Pos(s[j],FirstChar)=0) do inc(j);
         if (j<=Length(s)) and (Pos(s[j],FirstChar)>0)
          {нашли большую букву (т.е. имя!}
          then begin
            Pos1 := j;
            j:= Pos1;
            while (j<=Length(s)) and (s[j]<>' ')
              do inc(j);
            sName := Copy(s,Pos1,j-Pos1);
            {Вот. КЛЮЧЕВОЙ МОМЕНТ - проверка, было ли имя раньше}
            if TName.IndexOf(sName)< 0 then TName.Add(SName);
         end;
      end;
    Memo1.Lines.Text := TName.Text;

    FreeAndNil(TName);
    FreeAndNil(TS);
  end;
end;
Вложения
Тип файла: rar FindNames.rar (136.1 Кб, 16 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.01.2009, 23:19   #4
SarahConner
Пользователь
 
Аватар для SarahConner
 
Регистрация: 03.01.2009
Сообщений: 32
По умолчанию

Вообще-то не обязательно с большой. (как-то на автомате написал, извините, ввел в заблуждение)
Но спасибо за ответ. Я утром посмотрю пример подробней.
Сейчас спать.
Я попробовал записать имена в отдельный файл. а вот с упорядовачиванием и с убиранием повторов пока так и не справился (хотя думалбудет легко)
Еще раз спасибо
I'll be back
SarahConner вне форума Ответить с цитированием
Старый 13.01.2009, 00:00   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от SarahConner
а вот с упорядовачиванием и с убиранием повторов пока так и не справился
да это как раз таки самое простое...
повторы надо просто не допускать:
Код:
if TName.IndexOf(sName)< 0 then TName.Add(SName);
а упорядочить по алфавиту можно так:
Код:
 TName.Sort;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.01.2009, 14:53   #6
SarahConner
Пользователь
 
Аватар для SarahConner
 
Регистрация: 03.01.2009
Сообщений: 32
По умолчанию

для goblinyara: спасибо за оперативность.
Но предложенный Вами способ не смог как либо мной реализоваться (слаб видимо умом).
для Serge_Bliznykov:
от Вас я узнал о классе TStringList. О некоторых методах и свойствах. Полазил в поиске и на некоторые вещи открыл глаза.
Теперь я думаю многое в моей задачке упростится. За предложенный вариант отдельное спасибо. Но правильно ли я все понял:

for i:=0 to TS.Count-1 do // до конца файла по кол-ву строк
if Length(Trim(TS.Strings[i]))>0 then begin
// если длина строки без каких-либо пробелов и спец. символов (СС) >0
sName := '';
s := Trim(TS.Strings[i]); //убираем все пробелы и СС
j := 1;
while (j<=Length(s)) and (Pos(s[j],FirstChar)=0) do inc(j);
// пока не конец массива, это условие проверяет строку, начинающуюся с мал. букувы
// inc(j) то же, что и j:=j+1; ???
if (j<=Length(s)) and (Pos(s[j],FirstChar)>0)
{нашли большую букву (т.е. имя!}
then begin
Pos1 := j; //Pos1 := номера строки j (где с бол. буквы) есть с
j:= Pos1; // ???
while (j<=Length(s)) and (s[j]<>' ') do inc(j);
sName := Copy(s,Pos1,j-Pos1);
// в массив sName коптруем строку s с номером позиции Pos1. В sName номер позиции будет j-Pos1
{Вот. КЛЮЧЕВОЙ МОМЕНТ - проверка, было ли имя раньше}
if TName.IndexOf(sName)< 0 then TName.Add(SName);
end;
end;
I'll be back
SarahConner вне форума Ответить с цитированием
Старый 13.01.2009, 16:24   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

в целом - всё правильно поняли/прокомментировали...
Цитата:
// если длина строки без каких-либо пробелов и спец. символов (СС) >0
Trim(s) обрезает пробелы и знаки табуляции ТОЛЬКО в начале и конце строки... внутри не затрагиваются... Но, по логике комментарий верный. - "если строка не пустая (состоящая из одних только пробелов, то ...."

Цитата:
// пока не конец массива, это условие проверяет строку, начинающуюся с мал. букувы
s[j] - это очередной (j-й) символ строки s
мы ищем, если не нашли его в строке Заглавных букв , значит буква строчная (маленькая). пока не нашли и не достигли конец строки, увеличиваем счётчик.
inc(j) выполнеяет увеличение j, т.е. тоже самое что и j:=j+1

дальше..
в Pos1 запоминаем позицию в строке, в которой встретилась Заглавная буква. и ищем первый после этой буквы пробел (или конец строки, что быстрее встретится, цикл while и прервётся...
а в о останется позиция найденного пробела или конца строки (если пробел не встретился)
потом присваиваем SName подстроку из исходной строки, начиная с позиции найденной Заглавной буквы (с Pos1), количество символов в имени определяем как разницу между позицией найденного пробела или конца строки (если пробел не встретился)...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уже не студент, не откажусь от помощи (строки) SarahConner Помощь студентам 4 03.01.2009 17:19
файл Студент-Отличник Mapина Помощь студентам 3 08.07.2007 23:02
Сложность Алгоритма PChEL@ Помощь студентам 3 26.05.2007 07:56
Как прочесть txt файл www.site.ru/info.txt BR17UY Работа с сетью в Delphi 1 16.04.2007 13:01
Как из Memo вывести строки в txt файл в конец там существующих Saili Компоненты Delphi 8 16.12.2006 11:23