• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Турбо Паскаль. Файлы, работа с текстом

Светик123

Новые
Регистрация
2 Мар 2014
Сообщения
32
Реакции
0
Баллы
0
Турбо Паскаль. Файлы, работа с текстом

Требуется написать программу, считывающую данные из текстового файла; затем данные записываются в файл прямого доступа (компоненты файла являются целого или вещественного типа (если входные данные символы, то сначала нужно перевести их в коды, а потом записать в файл)); обработать данные (использовать прямой доступ к компонентам файла) и записать результат в текстовый файл
задание: Напечатать в алфавитном порядке все буквы, входящие в текст
 
Свет, а может сами, а? И рад был бы помочь, да только вот этим самым прямым доступом отродясь не пользовался за ненадобностью, а разбираться - лень душит.
 
а можете подсказать алгоритм выполнения задания? (Напечатать в алфавитном порядке все буквы, входящие в текст). не представляю, как это выполнить. как отсортировать?
 
я не совсем осознал задание. т.е. если буква встречается несколько раз, то ее надо столько раз и вывести? или по разу?
хотя в любом случае первое, что пришло в голову. создать массив по количеству букв (33). пробежаться в цикле по строке. и та буква что есть, отметить в массиве.
mass[0..32] of boolean; а если еще и буквы считать, то инкремент.
 
а можете подсказать алгоритм выполнения задания? (Напечатать в алфавитном порядке все буквы, входящие в текст). не представляю, как это выполнить. как отсортировать?
первое, что пришло в голову. создать массив по количеству букв (33). пробежаться в цикле по строке. и та буква что есть, отметить в массиве.
Света, я бы действовал так: создал не только массив, но и множество (Set of) - либо символьное (Char), либо, если сделан переход к кодам букв, байтовое (Byte). Первоначально множество объявляется пустым. Затем, проходя по исходному тексту, проверяем, содержится ли следующий символ (или его код) в нашем множестве, и если нет - то присоединяем его к множеству. Таким образом, в итоге множество будет содержать все буквы, встречающиеся в тексте, причем каждая - в одном экземпляре (правда, помним, что строчные и прописные буквы - разные). Далее проходим весь алфавит либо символами, либо кодами (причем лучше пАрами: буква прописная - та же строчная) и проверяем, есть ли данный символ в множестве, и если да - отправляем этот символ в выходной файл.
 
какой хитрец)))
я то просто думал отметить в массиве совпадение букв. и потом просто пробежаться по нему и вывести те, что отмечены. вот только как уже было ранее сказано не предусмотрел большие маленькие буквы.
 
Прописные и строчные - просто при проверке использовать UpperCase(), дабы сущности не плодить
 
Прописные и строчные - просто при проверке использовать UpperCase(), дабы сущности не плодить
Не, мы эт... по рабоче-крестьянски. Например, так:
Код:
Var
 f1,f3:Text;
 f2:File of Byte;
 i,Cd:Byte;
 Ch:Char;
 Lt:Set of Byte;
 b1,b2:boolean;

Begin
 Assign(f1,'D:\Shakesp.txt');
 ReSet(f1);
 Assign(f2,'D:\Sh_1');
 Rewrite(f2);
 Lt:=[];
 Repeat
  Read(f1,Ch);
  Write(f2,Ord(Ch));
 Until EoF(f1);
 Close(f1);
 Close(f2);
 ReSet(f2);
 i:=0;
 Repeat
  Seek(f2,i);
  Read(f2,Cd);
  If Not(Cd in Lt) then Lt:=Lt+[Cd];
  Inc(i);
 Until EoF(f2);
 Close(f2);
 Assign(f3,'D:\Sh_2');
 Rewrite(f3);
 for i:=1 to 26 do
  begin
   b1:=false;
   b2:=false;
   If (i+96) in Lt then b1:=true;
   If (i+64) in Lt then b2:=true;
   If b1 then write(f3,Chr(i+96),' ') else if b2 then write(f3,'  ');
   If b2 then write(f3,Chr(i+64));
   If b1 or b2 then writeln(f3);
  end;
 Close(f3);
End.
Некоторые пояснения.
1. Программа ориентирована ИСКЛЮЧИТЕЛЬНО на латиницу. С кириллицей у меня напряг - использую DOS-кодировку. Но если нужно, можно легко переделать под кириллицу.
2. Файлы расположены на диске D. Имя исходного - Shakesp.txt, имена двух других - Sh_1 и Sh_2. Естественно, всё это можно изменить в программе.
 

Вложения

  • NC01.webp
    NC01.webp
    20.1 KB · Просмотры: 85
  • NC02.webp
    NC02.webp
    9.7 KB · Просмотры: 77
оу как интересно. ни разу не юзал Lt:Set of Byte;
с ним все намного проще выглядит во всяком случае =)
 
Владимир, ваша программа написана в турбо паскале или в абс?
 
Владимир, ваша программа написана в турбо паскале или в абс?
Вообще-то в DOS FREE, но можно считать, что в TURBO. Что до АВС, то этой дряни у меня, извините, не водится.
А что, попытались запустить в АВС и он, как водится, хрюкнул и сдох? :D
 
нет, я тоже в турбо делаю)
просто интересно стало.
спасибо за помощь))
 
Назад
Сверху