singlepost

Turbo Pasсal задача на работу с текстовыми файлами(помогите плиз, сёдня утром сдать надо =((( ) << На главную или назад  

input.txt
ВОЛГО-БАЛТ 210 – Генгруз; НЕФТЕРУДВОЗ-55М – Нефтенаволочное; ОМСКИЙ-107 – Генгруз; НЕФТЕТРУДОВОЗ-11М – Нефтерудовоз; МОРCКОЙ-5 – Генгруз; МАРШАЛ ГРЕЧЕНКО – Нефтенаволочное;…

output.txt
Генгруз: ВОЛГО-БАЛТ 210, ОМСКИЙ-107, МОРCКОЙ – 5
Нефтенаволочное: НЕФТЕРУДВОЗ-55М, МАРШАЛ ГРЕЧЕНКО
Нефтерудовоз: НЕФТЕТРУДОВОЗ-11М

Как можно отсортировать файл input.txt(нужна просто логика сортировки)? Я уже пару часов голову ломаю – ничё не придумывается =(((( хотел через массив, но как задать, что член массива a[1] равен тексту до ';' а следующий от первой ';' до второй ';'
помогите кто-нить ….

43 ответов в теме “Turbo Pasсal задача на работу с текстовыми файлами(помогите плиз, сёдня утром сдать надо =((( )”

  1. 34
    Дмитрий Смелянец ответил:

    > Дмитрий mr.shara Бондаренко
    RusFAQ.ru Вам в помощь! Там толпа народу обитает и ответить могут в любое время.

  2. 33
    Дмитрий Бондаренко ответил:

    спс огромное =)

  3. 32
    Андрей Кадацкий ответил:

    в массиве 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=''
    }

  4. 31
    Андрей Кадацкий ответил:

    сраниваеш слово из этой процедуры, например с "Нефтенаволочное"
    если совпадает, отправляеш то что до него в какой нибуть массив.

  5. 30
    Андрей Кадацкий ответил:

    переделываеш предведуший код вот так:

  6. 29
    Андрей Кадацкий ответил:

    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.

  7. 28
    Дмитрий Бондаренко ответил:

    не дано мне его переделать =(
    ладно, встану с утра по-раньше – поглядим, если кто нить сможет переделать код выше под мою задачку – буду очень рад =)

  8. 27
    Дмитрий Бондаренко ответил:

    Дмитрий Rilian Сухомлинов
    а что такое регулярки, и как это в 3 строчки сделать? я чёт уже ничего вообще недогоняю =((((

  9. 26
    Дмитрий Бондаренко ответил:

    функцию я понял, недогоняю как её применить, что-нить попытаюсь сейчас сделать…

  10. 25
    Андрей Кадацкий ответил:

    ты скомпиль эту прогу, посмотри. Она выводит на экран предложение между текушего положения и точки. потом текущее положение заменяется на положение точки. только тебе надо не на экран выводить, а в массив сохранять. Потом запишеш этот массив в текстовый файл.

  11. 24
    Имя Фамилия ответил:

    регулярками все делается в 3 строки

  12. 23
    Андрей Кадацкий ответил:

    Дмитрий Rilian Сухомлинов, ну так сделай, помоги человеку.
    Если б я был трезвый, и сейчас бы было не 3 часа ночи, и если б я знал паскаль, я б уже че-нибуть написал.

  13. 22
    Андрей Кадацкий ответил:

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

  14. 21
    Андрей Кадацкий ответил:

    Задача. Выделение предложений из текстового файла

    Написать программу, которая считывает текст из файла и выводит на экран только предложения, не содержащие символа “,”. Предложения содержат не более 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 в противном случае. Предложения, не содержащие запятых, выводятся на экран. Процесс выделения предложений продолжается пока не будет достигнут конец файла.

  15. 20
    Дмитрий Бондаренко ответил:

    буду очень признателен =)

  16. 19
    Ирина Рожнева ответил:

    у меня есть рациональное предложение. найдите кого-нибудь, кто вам эту задачку просто напишет от начала до конца. ее писать, скажем так, совсем недолго.
    вот то, что написано выше смысла имеет не много, мягко скажем.

  17. 18
    Дмитрий Бондаренко ответил:

    кого можно найти в 3 часа ночи? да мне её полностью и не надо, только сортировку….
    спс

  18. 17
    Андрей Кадацкий ответил:

    ну если очень надо, то щас что-нибуть попробуем.

  19. 16
    Ирина Рожнева ответил:

    ё-мое.
    а с фига ли это должно работать-то? оно что, дословно так выглядит?

  20. 15
    Дмитрий Бондаренко ответил:

    да

  21. 14
    Дмитрий Бондаренко ответил:

    я попробовал так:
    a[1]:=' – ';
    while slovo < a[1] do ….
    паскальзацикливает =(
    можно как-нить указать на текст до a[1] при помощи оператора\переменной?

  22. 13
    Дмитрий Бондаренко ответил:

    мне предложили такой вариант, только что-то он не пахает =(
    read(input,stroka);
    for i:=1 to length(stroka) dо
    start:=1; {для первго слова, потом будет старарт если символ=букве, а предыдещй = ;}
    if stroka[i]=';' then
    konec:=i;
    slovo:=copy(stroka,start,konec-start);

  23. 12
    Ирина Рожнева ответил:

    так, как описано выше. находите первое вхождение "-", то, что перед ним (название?) – записываете в 1 строчку 1 элемента массива. удаляете вместе с "-". находите ";" записываете во 2 строчку 1 элемента, удаляете из исходного. повторяете процесс.

  24. 11
    Ирина Рожнева ответил:

    а если у вас в инпуте не три строки а пять? или еще сколько-то?
    делаем один двумерный стринговый, от 1 до 2, от 1 до победы. раскидываем – название компании в первую строчку, название того, что заглавными буквами – во вторую. раскидывать – по "-". все это делается за один проход, удаляя исходную строку. потом сортируется по названию компании, выдается результат.

  25. 10
    Дмитрий Бондаренко ответил:

    а каким оператором можно раскидывать по какому-либо признаку?

  26. 9
    Ирина Рожнева ответил:

    #7
    а так мы получим просто общее количество записей в инпуте. (если одномерный целочисленный массив, как я поняла. или имелось в виду не это?) оно нам надо? оно нам не надо.

  27. 8
    Дмитрий Бондаренко ответил:

    я вообще думал так – можно сделать это через массив строк, допустим s, забивая его так: каждая строка- все что находится между ";". Делаем три строки на выходе, допустим s1,s2,s3. потом просматриваем s[i], смотрим какое слово на конце строки, и добавляем соответственно к s1,s2,s3, предварительно удалив слово стоящее на конце и ещё " – " до этого слова, ну и ещё "," к строке после добавления приписать. Только, что-то с реалицацией не получается, тему эту плохо знаю =(

  28. 7
    Никита Миклушов ответил:

    А я бы реализовал так: читал посимвольно файл в массив пока не встреил ":" а потом у массива параметтр [i] увеличил на единицу…
    А потом отсортировал массив, и записал заново в файл input.txt
    Бли написал бы полностью текст, но я после праздника, туго соображается…

  29. 6
    Дмитрий Бондаренко ответил:

    а как реализовать чтение файла в массив?

  30. 5
    Ирина Рожнева ответил:

    ой. черт, сорри. не углядела слово.
    про функцию pos расскажут мануалы.

  31. 4
    Дмитрий Бондаренко ответил:

    спс, а как функцию pos реализовать?

  32. 3
    Ирина Рожнева ответил:

    если проблема только раскидать по массивам – можно вырезать отработанные куски. находите первое вхождение ;, проверяете, что перед ним есть значимый текст (на всякий пожарный), запоминаете нужное количество символов в очередной элемент массива, удаляете вместе с ;. и так до тех пор пока файл не кончится.

  33. 2
    Вадим Хоптынец ответил:

    Можно попробовать через ф-ию pos. Она возвращает порядковый номер символа в строке ( илипорядковый номер первого символа подстроки в строке). Так у тебя будет порядковый номер знака ';' в строке. потом с помощью ф-ии copy копируешь текст до ';' в нужный элемент массива. Потом с помощью Delete удаляешь текст до ';' включая. Дальше повторяешь по той же схеме.

    Возможно не оптимально, но первое, что пришло в голову…

  34. 1
    Вадим Хоптынец ответил:

    P.S: когда люди научаться писать слово pascal…

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.