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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2017, 11:43   #1
broiler747
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 22
По умолчанию Можно ли изменить программу так, чтобы предложение в котором будет замена слова писалось из консоли, а не бралось из текстового файла.

Код:
program Project1;
 
const
  {Множество разделителей.}
  D = ['.', ',', ':', ';', '!', '?', '-', ' ', #9, #10, #13];
  {Наибольшее количество слов для замены.}
  M = 1;
  Fn1 = 'file1.txt'; {Имя файла с исходным текстом.}
  Fn2 = 'file2.txt'; {Имя файла с обработанным текстом.}
var
  F1, F2 : Text;
  S, Sw : String;
  Arr1, Arr2 : array[1..M] of String;
  i, j, Len, LenW, Cnt : Integer;
begin
  repeat
    Writeln('Файл с исходным текстом: ', Fn1);
    Writeln;
    Writeln('Задайте слова, которые надо заменить. Ввод каждого слова завершайте');
    Writeln('нажатием клавиши Enter. Прекратить ввод - пустая строка + Enter.');
    i := 0;
    repeat
      Write('Слово ', i + 1, ': ');
      Readln(S);
      if S <> '' then begin
        Inc(i);
        Arr1[i] := S;
      end;
    until (S = '') or (i = M);
    Cnt := i;
 
    Writeln('Задайте слова, на которые надо заменить. Правила ввода такие же.');
    i := 0;
    repeat
      Write('Слово ', i + 1, ': ');
      Readln(S);
      if S <> '' then begin
        Inc(i);
        Arr2[i] := S;
      end;
    until (S = '') or (i = M);
 
    if i < Cnt then Cnt := i;
    Writeln('Количество пар для замены: ', Cnt);
    if Cnt = 0 then begin
      Writeln('Пары не заданы. Действие отменено.');
      Writeln('Повторить - Enter. Выход - любой символ + Enter.');
      Readln(S);
      Continue;
    end;
 
    Assign(F1, Fn1);
    Assign(F2, Fn2);
    Reset(F1);
    Rewrite(F2);
    while not Eof(F1) do begin
      Readln(F1, S); {Читаем строку из входного файла.}
      Len := Length(S);
      LenW := 0; {Длина очередного выделенного из строки слова.}
      {Перебор символов строки справа - налево.}
      for i := Len downto 1 do
        if not (S[i] in D) then begin {Если текущий символ не является разделителем.}
          Inc(LenW); {Учитываем текущий символ в длине слова.}
          if (i = 1) or (S[i - 1] in D) then begin {Отслеживаем начало слова.}
            Sw := Copy(S, i, LenW); {Выделяем очередное слово.}
            {Определяем индекс заменяемого слова.}
            j := 1;
            while (j <= Cnt) and (Sw <> Arr1[j]) do Inc(j);
            {Если индекс найден, т. е., если слово является заменяемым, то выполняем
            замену. - Прежнее слово удаляем и вставляем на его место новое.}
            if j <= Cnt then begin
              Delete(S, i, LenW); {Удаляем слово.}
              Insert(Arr2[j], S, i); {Вставляем замену.}
            end;
            LenW := 0;
          end;
        end;
      Writeln(F2, S); {Записываем обработанную строку в выходной файл.}
    end;
    {Закрываем файлы.}
    Close(F1);
    Close(F2);
 
    Writeln('Текст обработан. Результат записан в файл: ', Fn2);
    Writeln;
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 11.12.2017 в 10:52.
broiler747 вне форума Ответить с цитированием
Старый 10.12.2017, 12:33   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Да.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 10.12.2017, 13:25   #3
broiler747
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 22
По умолчанию

А что нужно поменять, подскажите.
broiler747 вне форума Ответить с цитированием
Старый 10.12.2017, 13:32   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от broiler747 Посмотреть сообщение
А что нужно поменять, подскажите.
Я таки поражаюсь: Вы осилили файловый ввод/вывод и не знаете, как вводить текст с консоли? В любой книжке по паскалю консоль идёт тем эдак на 10 раньше работы с файлами.

В общем, в том месте, где вы читаете из файла, нужно убрать всё, что связано с этим файлом, и заменить на ReadLn(s), где s - переменная, в которую вводится Ваше предложение.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 10.12.2017, 15:38   #5
broiler747
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 22
По умолчанию

спасибо!
broiler747 вне форума Ответить с цитированием
Старый 10.12.2017, 16:54   #6
broiler747
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 22
По умолчанию

while not Eof(F1) do begin
Не знаю, что здесь заменить. Что нужно поставить вместо Eof т.к. он только для файлов?
broiler747 вне форума Ответить с цитированием
Старый 10.12.2017, 21:35   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от broiler747 Посмотреть сообщение
Не знаю, что здесь заменить.
Вообще убрать всю работу с файлами из программы
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 10.12.2017, 22:44   #8
broiler747
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 22
По умолчанию

Где-то чего-то не хватает. т.к. прога не выдает конечный результат в виде обработанного предложения-_-

Код:
program Project1;

const
  {Множество разделителей.}
  D = ['.', ',', ':', ';', '!', '?', '-', ' ', #9, #10, #13];
  {Наибольшее количество слов для замены.}
  M = 1;

var
  S, Sw: String;
  Arr1, Arr2: array[1..M] of String;
  i, j, Len, LenW, Cnt: Integer;

begin
  repeat
    Writeln('Файл с исходным текстом: ', s);
    Readln(s);
    Writeln;
    Writeln('Задайте слова, которые надо заменить. Ввод каждого слова завершайте');
    Writeln('нажатием клавиши Enter. Прекратить ввод - пустая строка + Enter.');
    i := 0;
    repeat
      Write('Слово ', i + 1, ': ');
      Readln(S);
      if S <> '' then begin
        Inc(i);
        Arr1[i] := S;
      end;
    until (S = '') or (i = M);
    Cnt := i;
    
    Writeln('Задайте слова, на которые надо заменить. Правила ввода такие же.');
    i := 0;
    repeat
      Write('Слово ', i + 1, ': ');
      Readln(S);
      if S <> '' then begin
        Inc(i);
        Arr2[i] := S;
      end;
    until (S = '') or (i = M);
    
    if i < Cnt then Cnt := i;
    Writeln('Количество пар для замены: ', Cnt);
    if Cnt = 0 then begin
      Writeln('Пары не заданы. Действие отменено.');
      Writeln('Повторить - Enter. Выход - любой символ + Enter.');
      Readln(S);
      Continue;
    end;
    
    begin
      Readln(S); {Читаем строку из входного файла.}
      Len := Length(S);
      LenW := 0; {Длина очередного выделенного из строки слова.}
      {Перебор символов строки справа - налево.}
      for i := Len downto 1 do
        if not (S[i] in D) then begin{Если текущий символ не является разделителем.}
          Inc(LenW); {Учитываем текущий символ в длине слова.}
          if (i = 1) or (S[i - 1] in D) then begin{Отслеживаем начало слова.}
            Sw := Copy(S, i, LenW); {Выделяем очередное слово.}
            {Определяем индекс заменяемого слова.}
            j := 1;
            while (j <= Cnt) and (Sw <> Arr1[j]) do Inc(j);
            {Если индекс найден, т. е., если слово является заменяемым, то выполняем
            замену. - Прежнее слово удаляем и вставляем на его место новое.}
            if j <= Cnt then begin
              Delete(S, i, LenW); {Удаляем слово.}
              Insert(Arr2[j], S, i); {Вставляем замену.}
            end;
            LenW := 0;
          end;
        end;
      Writeln(S); {Записываем обработанную строку в выходной файл.}
    end;
    
    
    
    Writeln('Текст обработан. Результат записан в файл: ', s);
    Writeln;
    
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
\\Я наверно вам уже надоел.

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 11.12.2017 в 10:01.
broiler747 вне форума Ответить с цитированием
Старый 10.12.2017, 23:55   #9
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от broiler747 Посмотреть сообщение
\\Я наверно вам уже надоел.
Вы - нет, а вот тот факт, что Вы код не форматируете - да. Читать невозможно же. Используйте теги [CODE] или символ # над полем ввода
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 11.12.2017 в 00:15.
Sciv вне форума Ответить с цитированием
Старый 11.12.2017, 10:23   #10
broiler747
Пользователь
 
Регистрация: 30.11.2017
Сообщений: 22
По умолчанию

извините, я просто тут не давно)
broiler747 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имеется программа, которая заменяет определенное слово в файле, что изменить чтобы вместо файла, писать в консольном режиме предложение в котором будет меняться слово.-Delphi broiler747 Помощь студентам 0 08.12.2017 20:51
можно ли при создании файла в vim сделать так, чтобы в первой строчке этого файла было название этого самого файла tutejshy Софт 0 25.07.2017 12:09
сделать так, чтобы в таблице несколько полей можно было заполнить только тогда, когда одно булевое поле будет истинной? СУБД mysql traktor2017 SQL, базы данных 1 26.03.2017 15:24
Из текстового файла прочитать предложение, первую букву каждого слова сделать большой romaust C# (си шарп) 0 04.05.2016 10:51
изменить программу так, чтобы она выводила на экран таблицу факториалов от 0 до 15 nobo Qt и кроссплатформенное программирование С/С++ 5 09.06.2014 10:20