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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2017, 12:23   #1
Yavorsky
 
Регистрация: 08.05.2017
Сообщений: 4
По умолчанию Работа с файлами

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

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

Код:
program Project1;

type
(*Статистика по отдельному слову.*)
TWord = record
(*Само слово.*)
StrWord : String;
(*Количество вхождений данного слова в анализируемую строку.*)
Count : Integer;
end;
(*Массив, содержащий статистику по словам.*)
TArrWord = array[1..50] of TWord;


(*Эта процедура составляет список (т. е. массив) различающихся слов, найденных в строке aStr.
aAmount - количество слов, добавленных в массив aArr.
Каждый элемент массива aArr содержит само слово и сведения о количестве вхождений
этого слова в строку aStr.*)
procedure GetArrWord(const aStr : String; var aArr : TArrWord; var aAmount : Integer);
const
(*Множество разделителей слов. Char(9) - это символ горизонтальной табуляции.*)
Delims = [' ', '.', ',', ':', ';', '!', '?', '-', Char(9)];
var
StrTmp : String;
i, j, k : Integer;
Pos1, Pos2 : Integer;
IsFound : Boolean;
begin
(*Обнуляем массив слов.*)
for j := 1 to High(aArr) do begin
aArr[j].StrWord := '';
aArr[j].Count := 0;
end;
(*Выделяем из строки слова и помещаем их в массив.*)
Pos2 := 0;
j := 1; (*Т. е. j := Low(aArr);*)
for i := 1 to Length(aStr) do begin
(*Отслеживаем начало слова.*)
if i = 1 then begin
if not ( aStr[i] in Delims ) then begin
Pos1 := i;
end;
end else begin
if ( aStr[i - 1] in Delims ) and ( not ( aStr[i] in Delims ) ) then begin
Pos1 := i;
end;
end;
(*Отслеживаем конец слова.*)
if i = Length(aStr) then begin
if not ( aStr[i] in Delims ) then begin
Pos2 := i;
end;
end else begin
if ( not ( aStr[i] in Delims ) ) and ( aStr[i + 1] in Delims ) then begin
Pos2 := i;
end;
end;

(*Если конец слова обнаружен - обрабатываем это слово.*)
if Pos2 > 0 then begin
(*Найденное слово.*)
StrTmp := Copy(aStr, Pos1, Pos2 - Pos1 + 1);
(*Проверяем есть ли уже такое слово в массиве.
Если есть - тогда увеличиваем счётчик этого слова на единицу.*)
IsFound := False;
for k := 1 to j - 1 do begin
if aArr[k].StrWord = StrTmp then begin
Inc(aArr[k].Count);
IsFound := True;
Break;
end;
end;
(*Если слово не найдено в массиве, то добавляем его и устанавливаем
для этого слова счётчик = 1.*)
if not IsFound then begin
aArr[j].StrWord := StrTmp;
aArr[j].Count := 1; (*Либо: Inc(aArr[j].Count); Т. к. все счётчики вначале проинициализированы нулём.*)
(*Индекс следующего элемента массива.*)
Inc(j);
end;
(*Устанавливаем флаг - "конец слова не найден".*)
Pos2 := 0;
end;
end;
(*Количество слов, добавленных в массив.*)
aAmount := j - 1;
end;

const
(*Анализируемая строка.*)
StrText = '1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 10, 9, 8';
var
(*Массив, содержащий статистику по словам.*)
ArrWord : TArrWord;
(*Сведения об отдельном слове.*)
WordTmp : TWord;
(*Строка для промежуточных вычислений.*)
StrTmp : String;
(*Индекс, применяемый в циклах.*)
i : Integer;
(*Для промежуточных вычислений.*)
IntTmp : Integer;
(*Количество слов в массиве ArrWord.*)
Amount : Integer;
(*Флаг, применяемый в алгоритме сортировки.
IsExchange = True - в текущем проходе была хотябы одна перестановка.
Иначе - перестановок не было.*)
IsExchange : Boolean;
begin
repeat
(*Пользователь может ввести строку для анализа.
Если строка не введена - т. е. пользователь нажал ENTER без
ввода строки - тогда в качестве анализируемой строки берётся строка StrText.*)
Writeln('Gotoviy shablon - Enter. Vvesti noviy shablon - vvod stroki + ENTER.');
Readln(StrTmp);
if StrTmp = '' then begin
StrTmp := StrText;
end;

(*Получаем по заданному тексту статистику употребления слов.*)
GetArrWord(StrTmp, ArrWord, Amount);

(*Сортируем массив ArrWord по убыванию значений в счётчиках слов.
Т. е. - по убыванию значений в ArrWord[i].Count.
Метод сортировки - пузырьковая сортировка.*)
repeat
IsExchange := False;
for i := 1 to Amount - 1 do begin
if ArrWord[i].Count < ArrWord[i + 1].Count then begin
WordTmp := ArrWord[i];
ArrWord[i] := ArrWord[i + 1];
ArrWord[i + 1] := WordTmp;
IsExchange := True;
end;
end;
until not IsExchange;

(*Распечатка 3 наиболее употребительных слов.*)
Writeln('3 naibolee upotrebitelnih slov:');
IntTmp := 3;
if Amount < 3 then begin
IntTmp := Amount;
end;
for i := 1 to IntTmp do begin
Writeln('Slovo: "', ArrWord[i].StrWord, '", Statistika: ', ArrWord[i].Count);
end;


Writeln('Введите текст:');
Readln(StrTmp);
until StrTmp <> '';
end.

Последний раз редактировалось Yavorsky; 08.05.2017 в 12:25.
Yavorsky вне форума Ответить с цитированием
Старый 08.05.2017, 15:51   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

1. Было бы очень хорошо, если бы вы прочитали правила оформления кода.
Это совсем несложно. Ввели код, например, через копирование, выделили этот код и нажали символ # . Он есть в меню окна редактирования.
2. Для работы с текстовым файлом надо
- описать файловую переменную
Код:
var ....
      fh:  text;
- связать эту переменную с файлом:
Код:
assign(fh, 'имя_файла'); {можно указать и абсолютный путь к файлу}
- открыть файл на:
- чтение:
Код:
reset(fh);
- на запись:
Код:
 rewrite(fh);
3. Работа с файлом:
- чтение из файла строки:
Код:
readln(fh, stroca);
- запись в файл строки:
Код:
 writeln(fh, stroca);
Неплохо было бы поискать информацию в сети, прежде чем писать тут. Так понимаю, что это будет быстрее.
Последнее: В разделе "Литература" есть книжка Т.А. Павловская, Программирование на ЯВУ. Паскаль.
Очень рекомендую, поскольку там есть ответы на твои вопросы, как в теоретическом плане, так и в примерах.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лабораторная работа(очень простая) Структуры, работа с файлами yurda Фриланс 2 11.06.2016 08:44
Работа с файлами - C Max00766 Общие вопросы C/C++ 9 24.11.2015 14:33
Работа с файлами: запись, добавление, чтение (найти ошибку в коде) / C для начинающих Надо создать программу для работы с файлами Konlor Общие вопросы C/C++ 2 18.05.2014 12:37
РАБОТА С ФАЙЛАМИ, Си Анннютик Общие вопросы C/C++ 25 10.08.2011 23:47
работа с файлами! vakyla Помощь студентам 10 10.11.2009 07:38