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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2011, 15:04   #1
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию Отсуствие видимых причин

Смысл программы: чтение из файла текста в массив строк, редактирование каждой отдельной строки.
Для удобства разбита на три процедуры и функцию. В отдельности всё работает кроме процедуры изменения, т.е я проверил функцию и процедуры ввода/вывода. Никак не могу найти ошибку, насколько я понимаю она не изменяет этот самый массив строк. Как-будто бы так, потому что программа выполняется, и записывает в файл тоже самое.

Код:
Program kyrsovoy;

 Const
  n=15;

 Type
  stroki = array [1..n] of string;
  
  //чтение из текстового файла в массив строк

 Procedure reading(F:text; var x:stroki);
  var i:integer;
  begin
   assign(F,'text.txt');
   Reset(F);
   For i:=1 to n do
     readln(F,x[i]); 
   close(F);
  end;
  
   //процедура изменения цифр на словесный аналог
   
  Function zamena(m:integer):string;
   var a,b,c:integer;
       s:string;
   begin
    a:=m div 100;
    b:=(m div 10)mod 10;
    c:=m mod 10;
    If a>0 then 
     case a of 
     1: s:=s+'сто ';
     2: s:=s+'двести ';
     3: s:=s+'триста ';
     4: s:=s+'четыреста ';
     5: s:=s+'пятьсот ';
     6: s:=s+'шестьсот ';
     7: s:=s+'семьсот ';
     8: s:=s+'восемьсот ';
     9: s:=s+'девятьсот ';
     end;
    If b=1 then 
     case c of
     1: s:=s+'одиннадцать';
     2: s:=s+'двенадцать';
     3: s:=s+'тринадцать';
     4: s:=s+'четырнадцать';
     5: s:=s+'пятнадцать';
     6: s:=s+'шестнадцать';
     7: s:=s+'семнадцать';
     8: s:=s+'восемнадцать';
     9: s:=s+'девятнадцать';
     end
           else 
     case b of
     2: s:=s+'двадцать';
     3: s:=s+'тридцать';
     4: s:=s+'сорок';
     5: s:=s+'пятьдесят';
     6: s:=s+'шестьдесят';
     7: s:=s+'семьдесят';
     8: s:=s+'восемьдесят';
     9: s:=s+'девяносто';
     end;
    If (b<>1) and (c>0) then
     case c of
     1: s:=s+'один';
     2: s:=s+'два';
     3: s:=s+'три';
     4: s:=s+'четыре';
     5: s:=s+'пять';
     6: s:=s+'шесть';
     7: s:=s+'семь';
     8: s:=s+'восемь';
     9: s:=s+'девять';
     end;
    zamena:=s;
   end;
       
 //процедура замены в массиве строк цифр на слова
  
 Procedure changing(var x:stroki; r,k:string);
  var i,j,err,m,n,flag,del:integer;
      s,t,p:string;
  begin
   For i:=1 to n do
    begin
     s:=x[i];
     For j:=5 to (length(s)-4) do
      begin
       If (((s[j]=r[1]) and (s[j+1]=r[2])) and ((s[j+2]=r[3]) and (s[j+3]=r[4]))) or (((s[j]=k[1]) and (s[j+1]=k[2])) and ((s[j+2]=k[3]) and (s[j+3]=k[4]))) then flag:=1;
       If flag<>0 then 
        begin
         t:=copy(s,j-4,3);
         val(t,m,err);
         del:=3;
         While err<>0 do
          begin
           delete(t,1,1);
           val(t,m,err);
           del:=del-1;
          end; 
         p:=zamena(m);       //та самая функция замены на словесный аналог
         delete(s,j-del-1,del);
         insert(p,s,j-del-1);
        end;
       flag:=0;
      end;
     writeln(s);
     x[i]:=s;
    end;
  end;
  
  //запись массива строк в файл
  
 Procedure writing(F:text; var x:stroki);
  var i:integer;
  begin
   Rewrite(F);
   For i:=1 to n do
     writeln(F,x[i]);
   close(F);
  end;
 
  
 Var
  F:text;
  x:stroki;
  ch:char;
  r,k:string;
  
 Begin  
  Write('Какую запись вы используете? Если используете полную "рубли" и "копейки" нажмите 1, а если сокращённую "руб." и "коп." нажмите 2. ');
  readln(ch);
  If ch='1' then 
   begin
    r:='рубл';
    k:='копе';
   end
          else
   begin
    r:='руб.';
    k:='коп.';
   end;
  reading(F,x);
  changing(x,r,k);
  writing(F,x); 
 End.

Последний раз редактировалось Form_13; 13.10.2011 в 15:22.
Form_13 вне форума Ответить с цитированием
Старый 13.10.2011, 15:52   #2
Dush
Форумчанин
 
Регистрация: 29.09.2011
Сообщений: 116
По умолчанию

приведите пожалуйста пример входных данных
Dush вне форума Ответить с цитированием
Старый 13.10.2011, 15:57   #3
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию

В файле text.txt например записано:

"У меня есть 3 рубля 80 копеек.
А у тебя есть 107 рублей 34 копейки."

После выполнения программы соответственно должно быть:

"У меня три рубля восемьдесят копеек.
А у тебя есть сто семь рублей тридцать четыре копейки."
Form_13 вне форума Ответить с цитированием
Старый 13.10.2011, 15:58   #4
Dush
Форумчанин
 
Регистрация: 29.09.2011
Сообщений: 116
По умолчанию

уберите из
Код:
Procedure changing(var x:stroki; r,k:string);
  var i,j,err,m,n,flag,del:integer;
переменную n - она у вас объявлена и как константа и как переменная
Dush вне форума Ответить с цитированием
Старый 13.10.2011, 16:02   #5
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию

Сделал, теперь программа просто подвисает при выполнении и её можно только остановить.
Form_13 вне форума Ответить с цитированием
Старый 13.10.2011, 16:12   #6
Dush
Форумчанин
 
Регистрация: 29.09.2011
Сообщений: 116
По умолчанию

программа подвисает потому что после вставки буквенного значения позиция j не меняется и программа опять находит "рубл" или "руб.". получается вечный цикл.
после замены цифры на символы попробуйте увеличить j на 4. только тогда лучше использовать while или repeat с предварительной инициализацией j до цикла и увеличением внутри цикла на 1.
Dush вне форума Ответить с цитированием
Старый 13.10.2011, 16:21   #7
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию

Код:
Procedure changing(var x:stroki; r,k:string);
  var i,j,err,m,flag,del:integer;
      s,t,p:string;
  begin
   For i:=1 to n do
    begin
     s:=x[i];
     j:=5;
     Repeat
     //For j:=5 to (length(s)-4) do
      //begin
       If (((s[j]=r[1]) and (s[j+1]=r[2])) and ((s[j+2]=r[3]) and (s[j+3]=r[4]))) or (((s[j]=k[1]) and (s[j+1]=k[2])) and ((s[j+2]=k[3]) and (s[j+3]=k[4]))) then flag:=1;
       If flag=0 then
        begin
         t:=copy(s,j-4,3);
         val(t,m,err);
         del:=3;
         While err<>0 do
          begin
           delete(t,1,1);
           val(t,m,err);
           del:=del-1;
          end;
         p:=zamena(m);
         delete(s,j-del-1,del);
         insert(p,s,j-del-1);
         j:=j+4;
        end;
       flag:=0;
       j:=j+1;
       until j>=(length(s)-3);
      //end;
     x[i]:=s;
    end;
  end;
сделал вот так, только всё равно она повисает. может её выбрасывает вообще за границу строки и она виснет, не пойму.
Form_13 вне форума Ответить с цитированием
Старый 13.10.2011, 16:34   #8
Dush
Форумчанин
 
Регистрация: 29.09.2011
Сообщений: 116
По умолчанию

1. заменил тип переменной flag на boolean
2. вместо
Код:
j:=j+4;
сделал
Код:
j:=j+length(p);
вроде работает
полный текст:
Код:
 Procedure changing(var x:stroki; r,k:string);
  var i,j,err,m,del:integer;
      s,t,p:string;
      flag:boolean;
 begin
   For i:=1 to n do
   begin
      s:=x[i];
      j:=5;
      flag:=false;
      Repeat
       If (((s[j]=r[1]) and (s[j+1]=r[2])) and ((s[j+2]=r[3]) and (s[j+3]=r[4]))) or (((s[j]=k[1]) and (s[j+1]=k[2])) and ((s[j+2]=k[3]) and (s[j+3]=k[4]))) then flag:=true;
       If flag then
        begin
         t:=copy(s,j-4,3);
         val(t,m,err);
         del:=3;
         While err<>0 do
          begin
           delete(t,1,1);
           val(t,m,err);
           del:=del-1;
          end;
         p:=zamena(m);
         delete(s,j-del-1,del);
         insert(p,s,j-del-1);
         j:=j+length(p);
         flag:=false;
        end;
       j:=j+1;
       until j>=(length(s)-3);
     x[i]:=s;
    end;
  end;

Последний раз редактировалось Dush; 13.10.2011 в 16:35. Причина: перенес flag:=false;
Dush вне форума Ответить с цитированием
Старый 13.10.2011, 16:37   #9
Dush
Форумчанин
 
Регистрация: 29.09.2011
Сообщений: 116
По умолчанию

у меня еще ругалось на объявление процедур чтения и записи:
у вас
Procedure reading(F:text; var x:stroki);
у меня
Procedure reading(var F:text; var x:stroki);

ну и запись соответственно

и еще там надо разобраться с пробелами. вот что у меня получилось:

У меня естьтри рублявосемьдесят копеек
а у тебя есть сто семь рублейтридцатьчетыре копейки
Dush вне форума Ответить с цитированием
Старый 13.10.2011, 16:42   #10
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию

Уже гораздо лучше, но если например будет пустая строка, т.е:

"Дай мне 65 рублей.

У меня всего 35 копеек!"

Она затирает Всё что ниже пустой строчки.
Form_13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчет видимых строк при фильтрации getikalex Microsoft Office Excel 4 15.09.2011 00:29
Access Violation и I/O error 103 без видимых причин whatever Помощь студентам 2 10.12.2010 08:50
Загрузка памяти увеличивается без видимых причин Парсифаль Операционные системы общие вопросы 20 28.06.2009 01:00
Копирование видимых ячеек mephist Microsoft Office Excel 4 18.05.2009 11:18