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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2020, 17:52   #1
Dima4565
Новичок
Джуниор
 
Регистрация: 22.09.2020
Сообщений: 1
Восклицание Помогите найти ошибку в программе. Паскаль

Задача: Файл input.dat содержит несколько строк текста. Слова в тексте могут
разделяться пробелами и знаками препинания. Переписать текст в файл
output.dat, удалив из него все слова, начинающиеся и заканчивающиеся
одной и той же буквой.
Сама программа ошибки не выдает, НО не выводит то, что содержиться во втором файле(если поменять условие в function check_word_has_duplicates, то все ок). ПОМОГИТЕ! Преподаватель сказал разбираться самому, сижу 3 день. Думаю ошибка в функции function check_word_has_duplicates. Делал по примеру похожей программы, которую нашел в интернете, немного поменял и ничего не работает.
Код:

const
  letters = ['а','о','у','ы','э','я','ю','ё','и','е',
                   'А','О','У','Ы','Э','Я','Ё','Ю','И','Е',
                   
                   'A','E','I','O','U','Y',
                   'y','e','u','i','o','a', 'й', 'ц', 'к', 'н', 'г', 'ш', 'щ', 'з', 'ф', 'в', 'х',
  'п', 'р', 'л', 'д', 'ж', 'ч', 'с', 'м', 'т', 'б',
  'Й', 'Ц', 'К', 'Н', 'Г', 'Ш', 'Щ', 'З', 'Х', 'Ф', 'В',
  'П', 'Р', 'Л', 'Д', 'Ж', 'Ч', 'С', 'М', 'Т', 'Б',
  
  
  'Q', 'W', 'R', 'T', 'P', 'S', 'D', 'F', 'G', 'H', 'J',
  'K', 'L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M',
  'q', 'w', 'r', 't', 'p', 's', 'd', 'f', 'g', 'h', 'j',
  'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm'];
  punc = ['.', ',', ' ', '-', ';', ':', '?'];
 
 
function check_word_has_duplicates(OneWord: string): boolean;
begin
  check_word_has_duplicates := false;
  for var i := 1 to length(OneWord) - 1 do
  begin
    if (OneWord in letters) and (OneWord[1]<>OneWord[length(OneWord)]) then
    begin
      check_word_has_duplicates := true;
      break
    end
  end;
end;
 
function find_word(s: string; i: integer): string;
var
  OneWord: string;
begin
  OneWord := '';
  while (i <= length(s)) and (not (s[i] in punc)) do
  begin
    OneWord := OneWord + s[i];
    i := i + 1;
  end;
  find_word := OneWord + ' ';
end;
 
var
  f1, f2: text;
  OneWord, CurStr: string;
  i, n: integer;
 
begin
  Assign(f1, 'input.dat');
    Rewrite(f1);
        writeln('Введите количество строк');
   Readln(n); 
   for i:=1 to n do
    begin
    readln(CurStr); 
    writeln(f1,CurStr); 
    end;
    close(f1); 
    Reset(f1); 
    Assign(f2,'output.dat'); 
    Rewrite(f2); 
  
  while not eof(f1) do
  begin
    Readln(f1, CurStr);
    i := 1;
    while (i <= length(CurStr)) do
    begin
      OneWord := find_word(CurStr, i);

      i := i + length(OneWord);
      if check_word_has_duplicates(OneWord)=true then Write(f2, OneWord);
    end
  end;
  
  close(f1); 
  close(f2);
  Writeln;
  Writeln('Второй файл содержит строки:');
  Reset(f2); 
  while not eof(f2) do 
  begin
    Readln(f2, CurStr);
    Writeln(CurStr); 
  end;
end.

Последний раз редактировалось Dima4565; 22.09.2020 в 18:14.
Dima4565 вне форума Ответить с цитированием
Старый 22.09.2020, 20:50   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

1.
Код:
function check_word_has_duplicates(OneWord: string): boolean;
begin
  check_word_has_duplicates := false;
  for var i := 1 to length(OneWord) - 1 do
  begin
    if (OneWord in letters) and (OneWord[1]<>OneWord[length(OneWord)]) then
    begin
      check_word_has_duplicates := true;
      break
    end
  end;
end;
Покажите мне, где в теле цикла используется переменная i?
Цикл здесь не нужен.
Достаточно оператора if ... else ...
2. В условии сказано, что "слова". Нет смысла проверять символ слова на вхождение в множество.
3.
Код:
function find_word(s: string; i: integer): string;
Вы ожидаете, что эта функция вернёт вам i. Не знаю как в вашем Паскале, но в нормальном Паскале это не произойдёт. Параметр задан неверно:
Код:
function find_word(s: string; var i: integer): string;
В нормальном - так.
Попробуйте исправить, для начала, это.

PS: Дальше пока не смотрел.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
посчитать значение по заданной системе уравнений (найти ошибку в программе в Паскаль) Mariya0011 Помощь студентам 2 10.10.2017 14:27
Паскаль. Вычислить сумму ряда. (помогите найти ошибку в программе) Максимилианн Помощь студентам 10 03.05.2014 15:36
паскаль,не могу найти ошибку в программе Ильгизуля Помощь студентам 2 11.05.2013 11:01
Помогите найти ошибку в программе k1r1ch Общие вопросы Delphi 7 04.10.2009 09:36
Паскаль, не могу найти ошибку в программе Julinja Помощь студентам 2 17.11.2008 20:42