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

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

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

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

Помогите найти ошибку, пожалуйста! Паскаль

  • Автор темы Автор темы Aksinia
  • Дата начала Дата начала

Aksinia

Новые
Регистрация
15 Дек 2013
Сообщения
31
Реакции
1
Баллы
0
Помогите найти ошибку, пожалуйста! Паскаль

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

На входе текстовый файл, состоящий из слов и символов '.,:;!? ';
слово = отрезок строки текста из букв.
На выходе текстовый файл, в который помещены построчно все слова, найденные в порядке появления во входном файле, причем каждое слово сопровождается через пробел некоторой своей инверсией, не перемещающей только 1-й и последний символы слова.
ПРИМЕР --
вася всая
example elmaxpe
PHP:
program coffee;
var S:string;
f1,f2:text;
Type mnog= set of byte;

function Inversion(S:string):string;
var S2,S3,S4,s5:String;
A,B:mnog;
i,c,r:integer;
begin
  A :=[65 .. 90];
  B :=[97 .. 122];
  S2:=S;
  i:=1;
  S3:='';
  S4:='';
  S5:='';
  if length(S2)>0 then
  while i<(length(S2)) do
  begin
    if ((ord(S2[i]) in (A+B)) and (ord(S2[i+1]) in (A+B))) then
    begin
      S4:=S4+S2[i];
      s3:=s3+S2[i];
    end;
    if ((ord(S2[i]) in (A+B)) and not(ord(S2[i+1]) in (A+B))) then
    begin
      s3:=s3+S2[i];
      c:=1;
      while not c=(length(s3)-2) do
      begin
        r:=random(2)-(length(s3)-3);
        if (s5[r]<>chr(0)) then
        begin
          s5[r]:=s3[c];
          c:=c+1;
        end;
      end;
      S4:=S4+' '+S3[1]+s5+s3[length(s3)];
      S3:='';
      s5:='';
    end;
  end;
  Inversion:=s4;
end;

begin
  assign(f1, 'Input.txt');
  reset(f1);
  assign(f2, 'Output.txt');
  rewrite(f2);
  while not eof(f1) do
  begin
    readln(f1,S);
    writeln(f2,inversion(S));
  end;
  close(f1);
  close(f2);
end.
 

Вложения

  • task.txt
    task.txt
    623 байт · Просмотры: 465
А что с программой не так?
Не проходит компеляцию? В какой строке?
Не правильно работает? Тогда нужно увидеть результат.
 
Программа проходит компиляцию. После запуска на экране появляется пустое окно, которое тут же не закрывается, хотя, должно бы. Файл "output" остается пустым.
 
Вот этот файл.
 

Вложения

  • input.txt
    input.txt
    13 байт · Просмотры: 503
Понятно.
Ставьте точку останова на writeIn и смотрите, что у Вас в инвертированной строке.
 
Ничего? Ничего не изменилось. Я правильно поняла, что я должна была поставить точку после writeln(f2,inversion(S));
end;end ?
 
Точка останова - это отладочный маркер, где должен остановиться дебагер при отладке программы.
Как я понял, Вы этим не пользуетесь.
Тогда, между операторами чтения и записи поставьте вывод на экран прочитанной строки и строки после инверсии. Не забудьте поставить оператор паузы.
 
На экран выводится только первая не инвертированная строка.
 
Значит ошибка в функции Inversion.
Метод отладки тот же.
Ставим тормоз, смотрим содержимое строковых переменных.
Удачи!
 
Уважаемая Аксинья!
Во-первых, сразу видно, что есть ошибки. Так, используя случайный выбор, Вы, тем не менее, пропустили инициализацию генератора случайных чисел, т.е. Randomize. Но это полбеды. А вот, скажем, это:
r:=random(2)-(length(s3)-3);
беда большая, потому как Ваше r получится и вовсе отрицательным, а ведь это - индекс строковой переменной! Никуда не годится.
И вообще - что-то Вы там накрутили-навертели в функции, так что, мне, извините, проще оказалось свою программку нарисовать, чем разбираться с Вашими построениями. По-моему, получилось проще, короче и прозрачнее. Единственная оговорка: поскольку реализован случайный механизм перестановок символов, то в коротких словах (четырех- пятибуквенных) порядок может и сохраниться. Если это критично, можно несколько усложнить программу и сделать так, чтобы всегда буквы были переставлены.
Код:
program coffee;

Type
 mnog= set of byte;

Const
 A:mnog=[65 .. 90];
 B:mnog=[97 .. 122];

var
 S:string;
 C:Char;
 f1,f2:text;

function Inversion(Si:string):string;
var
 P:String;
 M:mnog;
 j,q:byte;
begin
 If Length(Si)<4 then Inversion:=Si else
  begin
   M:=[];
   P:=Si[1];
   j:=0;
   repeat
    q:=2+Random(Length(Si)-2);
    if not (q in M) then
     begin
      Inc(j);
      P:=P+Si[q];
      M:=M+[q];
     end;
   until j=Length(Si)-2;
   P:=P+Si[Length(Si)];
   Inversion:=P;
  end;
end;

begin
  assign(f1, 'Input.txt');
  reset(f1);
  assign(f2, 'Output.txt');
  rewrite(f2);
  Randomize;
  While not EoF(f1) do
   begin
    S:='';
    repeat
     read(f1,C);
    until (Ord(C) in (A+B)) or EoF(f1);
    if not EoF(f1) then
     begin
      S:=S+C;
      repeat
       read(f1,C);
       if (Ord(C) in (A+B)) then S:=S+C;
      until not (Ord(C) in (A+B)) or EoF(f1);
      writeln(f2,S,' ',Inversion(S));
     end;
   end;
  close(f1);
  close(f2);
end.
 

Вложения

  • NC02.webp
    NC02.webp
    15.1 KB · Просмотры: 48
  • NC03.webp
    NC03.webp
    17.8 KB · Просмотры: 49
Владимир, что-то Ваши подопечные совсем не владеют методами отладки ПО.
С этим надо что-то делать...
 
Владимир, что-то Ваши подопечные совсем не владеют методами отладки ПО.
С этим надо что-то делать...
Дык... Коля, что уж тут поделаешь... Это ведь дело такое: желание есть - так и сноровка быстро появится. А ежели желания нету, то...
 
Как справедливо отметил выше Владимир, некоторые программы проще переписать заново, чем отладить их кривой код. Как то так. :)
 
Тут дело не в том что проще...
Основная цель - научить человека основным приемам программирования и отладки программ.
 
Основная цель - научить человека основным приемам программирования и отладки программ
Это совсем не формат нашего форума, для учёбы есть специализированные образовательные ресурсы. Здесь же цель немного другая - не учить с нуля, а оказать посильную помощь в ситуациях и задачах, вызвавших трудности. И не более!

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