![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 03.01.2009
Сообщений: 32
|
![]()
Всем привет, Вот опять ступор.
может подкинете идейку. Мучую свой *.txt файл. Там строки с именем и действием, типа: Маша спит Аня играет на гитаре поет Вика Ирина спит Вика думает Маша спит поет Аня Маша вяжет свитер Аня спит шалит Ирина Вика спит Аня спит Мне нужен массив [Маша, Аня, Вика, Ирина], т.е. всех имен, но без повторений. Причем есть ключевая строка, когда девчонки спят, но таких строк несколько с одинаковым именем. Я сделал так: в цикле while not EOF(f1) do begin ... ... если строка файла содержит 'спит', то names[i]:= кол-во символов до первого пробела. т.о. получился массив \\начало Маша Ирина Маша спит Аня Вика Аня \\конец Т.е. с повторением и с пустыми строками. Может есть возможность удалить пустые строки, а уж упорядочить ( сократить до бесповторяемости) массив я сумею. Буду рад любой подсказке-идее.
I'll be back
|
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 02.01.2009
Сообщений: 340
|
![]()
хммм... вам нужно завести переменную, которой перед циклом прочтения файла присваиваете 1, далее в каждой строке вы выделяете имя, смотрите в массиве с именами, есть ли такое имя(дальше этой переменно смотреть не имеет смысла), если такого имени нет в массиве, то записываете это имя в массив и прибавляете к этой переменной единицу... в конце будет массив с каждым именем в единственном экземпляре и без пустых строк...
DelphiWorld 6. Скачай, поставь, и будет тебе счастье=) Программирование, как и любовь -- одно слово, за которым скрывается бесконечное множество занятий.
![]() |
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
А имена то с большой буквы начинаются...
от этого и пляшем... решение задачи в архиве. А вот сам код (если кому проект целиком качать лень, или нет необходимости...): Код:
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 03.01.2009
Сообщений: 32
|
![]()
Вообще-то не обязательно с большой. (как-то на автомате написал, извините, ввел в заблуждение)
Но спасибо за ответ. Я утром посмотрю пример подробней. Сейчас спать. Я попробовал записать имена в отдельный файл. а вот с упорядовачиванием и с убиранием повторов пока так и не справился (хотя думалбудет легко) Еще раз спасибо
I'll be back
|
![]() |
![]() |
![]() |
#5 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
повторы надо просто не допускать: Код:
Код:
|
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 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
|
![]() |
![]() |
![]() |
#7 | ||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
в целом - всё правильно поняли/прокомментировали...
Цитата:
Цитата:
мы ищем, если не нашли его в строке Заглавных букв , значит буква строчная (маленькая). пока не нашли и не достигли конец строки, увеличиваем счётчик. inc(j) выполнеяет увеличение j, т.е. тоже самое что и j:=j+1 дальше.. в Pos1 запоминаем позицию в строке, в которой встретилась Заглавная буква. и ищем первый после этой буквы пробел (или конец строки, что быстрее встретится, цикл while и прервётся... а в о останется позиция найденного пробела или конца строки (если пробел не встретился) потом присваиваем SName подстроку из исходной строки, начиная с позиции найденной Заглавной буквы (с Pos1), количество символов в имени определяем как разницу между позицией найденного пробела или конца строки (если пробел не встретился)... |
||
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Уже не студент, не откажусь от помощи (строки) | 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 |