input.txt
ВОЛГО-БАЛТ 210 – Генгруз; НЕФТЕРУДВОЗ-55М – Нефтенаволочное; ОМСКИЙ-107 – Генгруз; НЕФТЕТРУДОВОЗ-11М – Нефтерудовоз; МОРCКОЙ-5 – Генгруз; МАРШАЛ ГРЕЧЕНКО – Нефтенаволочное;…
output.txt
Генгруз: ВОЛГО-БАЛТ 210, ОМСКИЙ-107, МОРCКОЙ – 5
Нефтенаволочное: НЕФТЕРУДВОЗ-55М, МАРШАЛ ГРЕЧЕНКО
Нефтерудовоз: НЕФТЕТРУДОВОЗ-11М
Как можно отсортировать файл input.txt(нужна просто логика сортировки)? Я уже пару часов голову ломаю – ничё не придумывается =(((( хотел через массив, но как задать, что член массива a[1] равен тексту до ';' а следующий от первой ';' до второй ';'
помогите кто-нить ….
30 ноября 2008 в 9:05
> Дмитрий mr.shara Бондаренко
RusFAQ.ru Вам в помощь! Там толпа народу обитает и ответить могут в любое время.
29 ноября 2008 в 8:05
спс огромное =)
29 ноября 2008 в 4:01
в массиве mas появляется список строк типа
mas[0]=ВОЛГО-БАЛТ 210 – Генгруз;
mas[1]=НЕФТЕРУДВОЗ-55М – Нефтенаволочное;
потом сортируеш их по словам например такой функцией:
function strtok(var s:string;delims:string):string;
{Функция разбивает строку s на слова, разделенные символами-разделителями,
указанными в строке delims. Функция возвращает первое найденное слово, при
этом из строки s удаляется начальная часть до следующего слова}
var res:string; state:byte; i:integer;
begin
state:=1;
res:='';
if s='' then
begin
result:='';
exit;
end;
while pos(s[state],delims)<>0 do
begin
inc(state);
if state>length(s) then
begin
s:='';
result:='';
exit;
end;
end;
while pos(s[state],delims)=0 do
begin
res:=res+s[state];
inc(state);
if state>length(s) then
begin
s:='';
result:=res;
exit;
end;
end;
while pos(s[state],delims)<>0 do
begin
inc(state);
if state>length(s) then
begin
s:='';
result:=res;
exit;
end;
end;
delete(s,1,state-1);
result:=res;
end;
{
Пример применения:
s:=' 123 a,aa !!! bbb !';
delims:=' ,!';
strtok(s,delims); //возвращает '123', s='a,aa !!! bbb !'
strtok(s,delims); //возвращает 'a', s='aa !!! bbb !'
strtok(s,delims); //возвращает 'aa', s='bbb !'
strtok(s,delims); //возвращает 'bbb', s=''
strtok(s,delims); //возвращает '', s=''
}
29 ноября 2008 в 4:01
сраниваеш слово из этой процедуры, например с "Нефтенаволочное"
если совпадает, отправляеш то что до него в какой нибуть массив.
29 ноября 2008 в 4:00
переделываеш предведуший код вот так:
29 ноября 2008 в 4:00
program sentences;
uses crt;
var
f : text;
c : char;
i: integer;
w,s : string;
mas: array[0..100] of string;
begin
clrscr;
assign(f,'1.txt');
reset(f);
i:=0;
while not eof(f) do begin
s := '';
repeat
read(f,c);
until not (c in [' ',#13,#10]) or eof(f);
s := s + c;
while not (c in [';']) and not eof(f) do begin
read(f,c);
if (c<>#10) and (c<>#13) then s := s + c;
end;
mas[i]:=s;
i:=i+1;
end;
close(f);
readkey;
end.
29 ноября 2008 в 3:03
не дано мне его переделать =(
ладно, встану с утра по-раньше – поглядим, если кто нить сможет переделать код выше под мою задачку – буду очень рад =)
29 ноября 2008 в 3:02
Дмитрий Rilian Сухомлинов
а что такое регулярки, и как это в 3 строчки сделать? я чёт уже ничего вообще недогоняю =((((
29 ноября 2008 в 3:01
функцию я понял, недогоняю как её применить, что-нить попытаюсь сейчас сделать…
29 ноября 2008 в 3:01
ты скомпиль эту прогу, посмотри. Она выводит на экран предложение между текушего положения и точки. потом текущее положение заменяется на положение точки. только тебе надо не на экран выводить, а в массив сохранять. Потом запишеш этот массив в текстовый файл.
29 ноября 2008 в 3:01
регулярками все делается в 3 строки
29 ноября 2008 в 3:01
Дмитрий Rilian Сухомлинов, ну так сделай, помоги человеку.
Если б я был трезвый, и сейчас бы было не 3 часа ночи, и если б я знал паскаль, я б уже че-нибуть написал.
29 ноября 2008 в 3:00
чтоб зря себе моск не грузить я взял первый попавшийся в гугле пример.
сам переделаеш, или тебе написать?
29 ноября 2008 в 3:00
Задача. Выделение предложений из текстового файла
Написать программу, которая считывает текст из файла и выводит на экран только предложения, не содержащие символа “,”. Предложения содержат не более 256 символов.
I. Исходные данные и результат
Исходные данные: текстовый файл неизвестного размера, состоящий из неизвестного количества предложений. Поскольку предложение может занимать несколько строк то чтение файла необходимо организовать посимвольно. Для хранения одного предложения можно использовать одну переменную строкового типа.
Результатом являются отдельные предложения, не содержащие запятых.
II. Алгоритм решения задачи
Открыть файл
Анализируя посимвольно содержимое исходного файла выделять предложения, сохраняя их в определенной строковой переменной. Если предложение не содержит запятых, выводить его на экран.
Закрыть файл
Разберем более подробно последний пункт алгоритма. Предложением будем считать последовательность произвольных символов, заканчивающихся точкой, восклицательным или вопросительным знаком. Выделение предложения начинается с поиска первого непустого символа – начала предложения. Затем все считанные символы добавляются к строковой переменной, до тех пор, пока не будет встречен один из символов, завершающих предложение. Далее операция выделения повторяется. При этом важно помнить, что в конце каждой строки текстового файла присутствуют управляющие символы с номерами 10 и 13, которые при посимвольном методе чтения также будут считаны. И поскольку они не являются частью предложения, их нужно исключать.
III. Программа
Ниже приводится текст программы.
program sentences;
uses crt;
var
f : text;
c : char;
w,s : string;
function IsComma( s : string ) : boolean;
var i : integer;
begin
IsComma := FALSE;
for i:=1 to Length(s) do
if s[i]=',' then IsComma := TRUE;
end;
begin
clrscr;
assign(f,'text.txt');
reset(f);
while not eof(f) do begin
s := '';
repeat
read(f,c);
until not (c in [' ',#13,#10]) or eof(f);
s := s + c;
while not (c in ['.','?','!']) and not eof(f) do begin
read(f,c);
if (c<>#10) and (c<>#13) then s := s + c;
end;
if not IsComma(s) then writeln(s);
end;
close(f);
readkey;
end.
После открытия файла (процедура reset) организуется внешний цикл, завершающийся при достижении конца файла. В этот цикл вложены два других цикла в ходе выполнения которых происходит выделение одного предложения и запись его в переменную s. Первый вложенный цикл (repeat) выполняется до тех пор, пока не будет встречен символ, отличный от пустого или управляющих символов, – это начало предложения или не будет достигнут конец файла. Этот символ добавляется к строке s. Далее второй вложенный цикл (while) считывает все символы и добавляет их к строке s, если только это не управляющие символы. Цикл завершается, если будет считан один из символов, завершающих предложение или достигнут конец файла. Для выяснения наличия в выделенном предложении запятой используется описанная выше функция IsComma, которая возвращает логическое значение true, если предложение содержит символ запятой, и значение false в противном случае. Предложения, не содержащие запятых, выводятся на экран. Процесс выделения предложений продолжается пока не будет достигнут конец файла.
29 ноября 2008 в 2:05
буду очень признателен =)
29 ноября 2008 в 2:04
у меня есть рациональное предложение. найдите кого-нибудь, кто вам эту задачку просто напишет от начала до конца. ее писать, скажем так, совсем недолго.
вот то, что написано выше смысла имеет не много, мягко скажем.
29 ноября 2008 в 2:04
кого можно найти в 3 часа ночи? да мне её полностью и не надо, только сортировку….
спс
29 ноября 2008 в 2:04
ну если очень надо, то щас что-нибуть попробуем.
29 ноября 2008 в 2:03
ё-мое.
а с фига ли это должно работать-то? оно что, дословно так выглядит?
29 ноября 2008 в 2:03
да
29 ноября 2008 в 2:03
я попробовал так:
a[1]:=' – ';
while slovo < a[1] do ….
паскальзацикливает =(
можно как-нить указать на текст до a[1] при помощи оператора\переменной?
29 ноября 2008 в 2:02
мне предложили такой вариант, только что-то он не пахает =(
read(input,stroka);
for i:=1 to length(stroka) dо
start:=1; {для первго слова, потом будет старарт если символ=букве, а предыдещй = ;}
if stroka[i]=';' then
konec:=i;
slovo:=copy(stroka,start,konec-start);
29 ноября 2008 в 2:01
так, как описано выше. находите первое вхождение "-", то, что перед ним (название?) – записываете в 1 строчку 1 элемента массива. удаляете вместе с "-". находите ";" записываете во 2 строчку 1 элемента, удаляете из исходного. повторяете процесс.
29 ноября 2008 в 2:00
а если у вас в инпуте не три строки а пять? или еще сколько-то?
делаем один двумерный стринговый, от 1 до 2, от 1 до победы. раскидываем – название компании в первую строчку, название того, что заглавными буквами – во вторую. раскидывать – по "-". все это делается за один проход, удаляя исходную строку. потом сортируется по названию компании, выдается результат.
29 ноября 2008 в 2:00
а каким оператором можно раскидывать по какому-либо признаку?
29 ноября 2008 в 1:05
#7
а так мы получим просто общее количество записей в инпуте. (если одномерный целочисленный массив, как я поняла. или имелось в виду не это?) оно нам надо? оно нам не надо.
29 ноября 2008 в 1:05
я вообще думал так – можно сделать это через массив строк, допустим s, забивая его так: каждая строка- все что находится между ";". Делаем три строки на выходе, допустим s1,s2,s3. потом просматриваем s[i], смотрим какое слово на конце строки, и добавляем соответственно к s1,s2,s3, предварительно удалив слово стоящее на конце и ещё " – " до этого слова, ну и ещё "," к строке после добавления приписать. Только, что-то с реалицацией не получается, тему эту плохо знаю =(
29 ноября 2008 в 1:04
А я бы реализовал так: читал посимвольно файл в массив пока не встреил ":" а потом у массива параметтр [i] увеличил на единицу…
А потом отсортировал массив, и записал заново в файл input.txt
Бли написал бы полностью текст, но я после праздника, туго соображается…
29 ноября 2008 в 1:04
а как реализовать чтение файла в массив?
29 ноября 2008 в 1:03
ой. черт, сорри. не углядела слово.
про функцию pos расскажут мануалы.
29 ноября 2008 в 1:02
спс, а как функцию pos реализовать?
29 ноября 2008 в 1:01
если проблема только раскидать по массивам – можно вырезать отработанные куски. находите первое вхождение ;, проверяете, что перед ним есть значимый текст (на всякий пожарный), запоминаете нужное количество символов в очередной элемент массива, удаляете вместе с ;. и так до тех пор пока файл не кончится.
29 ноября 2008 в 1:01
Можно попробовать через ф-ию pos. Она возвращает порядковый номер символа в строке ( илипорядковый номер первого символа подстроки в строке). Так у тебя будет порядковый номер знака ';' в строке. потом с помощью ф-ии copy копируешь текст до ';' в нужный элемент массива. Потом с помощью Delete удаляешь текст до ';' включая. Дальше повторяешь по той же схеме.
Возможно не оптимально, но первое, что пришло в голову…
29 ноября 2008 в 1:01
P.S: когда люди научаться писать слово pascal…