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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

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

Код:
Program курсовая;

{$APPTYPE CONSOLE}

{$R *.res}

 Uses
  System.SysUtils;

//односвязный список
 Type
  p=^elem;
  elem = record
         data:string;
         sled:p;
         end;

 Var ykaz:p;
     flag:boolean;
     h:string;
     a:integer;

 //процедура чтения файла в динамический список
 Procedure read;
  var next:p;
      F:textfile;
      flag1:boolean;
  begin
   Assign(F,'text.txt');
   Reset(F);
   next:=ykaz;                           //делаем временный указатель, для прохождения по списку
   while not EoF(F)  do                 //пока, не конец файла
    begin
     readln(F,next^.data);              //читаем строку в поле data
     if not (next^.data='') then flag1:=true;      //если файл не пустой, то запоминаем это
     if (next^.data='') and (not (flag1)) then              //если файл пустой, то...
      begin
       flag:=true;                      //...запоминает это, и..
       exit;                            //...выходим из подпрограммы.
      end;
     new(next^.sled);                   //если всё хорошо, выделяем память под следущий элемент списка
     next:=next^.sled;                  //переходим на него (присваиваем его основному указателю)
    end;
   close(F);                            //прекращаем работу с файлом
  end;

 //процедура записи в файл из динамического массива
 Procedure write;
  var F:textfile;
      yk,l:p;
  begin
   if flag then exit;                    //если мы выяснили при чтении, что файл пустой, выходим из подпрограммы
   Assign(F,'text.txt');
   Rewrite(F);
   yk:=ykaz;
   while (yk<>nil) do   //если текущий указатель имеет непустое значение, то..
    begin
     Writeln(F,yk^.data);     //записываем в файл строку, и ..
     l:=yk^.sled;
     dispose(yk);       //уничтожаем текущий элемент списка
     yk:=l;            //переходим на следущий указатель
    end;
   close(F);                  //закрываем файл.
  end;

 //процедура удаления лишних знаков
 Procedure prob (var s:string);
  var i:integer;
  begin
   i:=1;
   while i<length(s) do
   begin
     if (s[i]=' ') or (s[i]='.') or (s[i]='?') or (s[i]='!') or (s[i]=',') then
      begin
       case s[i+1] of
       ' ', '?', '.', '!':
        begin
         Delete(s,i,1);
         {if not (s[i+2]=' ') then
                              begin
                              insert(' ',s,i+2);
                              dec(i);
                              end;   }
        end;  //удаляем пробел перед перчисленными знаками
       else inc(i); // передвигаемся если не было удаления (единственный пробел)
       end;
      end
     else inc(i); //или вообще не пробел
   end;
  end;

 //замена числа на словесный строковый эквивалент
 Procedure zamena (m:integer; var l:string);
  const a:array [1..4,1..10] of string = (('', 'один ', 'два ', 'три ', 'четыре ', 'пять ', 'шесть ', 'семь ', 'восемь ', 'девять '),
                                         ('', 'одиннадцать ', 'двенадцать ', 'тринадцать ', 'четырнадцать ', 'пятнадцать ', 'шестнадцать ', 'семнадцать ', 'восемнадцать ', 'девятнадцать '),
                                         ('', 'десять ', 'двадцать ', 'тридцать ', 'сорок ', 'пятьдесят ', 'шестьдесят ', 'семьдесят ', 'восемьдесят ', 'девяносто '),
                                         ('', 'сто ', 'двести ', 'триста ', 'четыреста ', 'пятьсот ', 'шестьсот ', 'семьсот ', 'восемьсот ', 'девятьсот '));
  var b,c,d:integer;
  begin
   l:=l+a[4][m div 100+1];
   If ((m div 10) mod 10=1)then l:=l+a[2][(m div 10) mod 10+1] else
                              begin
                               l:=l+a[3][(m div 10) mod 10+1];
                               l:=l+a[1][m mod 10+1];
                              end;
  end;
Form_13 вне форума Ответить с цитированием
Старый 20.12.2011, 18:51   #2
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию

Код:
 //процедура поиска и замены слов
 Procedure change (var s:string);
  var flag:boolean;
      i,m,err,del:integer;
      r,k,t:string;
      c:char;
  begin
   flag:=false;
   i:=1;
   Writeln('Если заменяем "руб." то нажмите 1, если "рублей", то нажмите 2'); readln(c);
   if (c='1') then r:='руб.'
              else r:='рубл';
   Writeln('Если заменяем "коп." нажмите 1, если "копеек" нажмите два '); readln(c);
   if (c='1') then r:='коп.'
              else r:='копе';
   Repeat
    If (((s[i]=r[1]) and (s[i+1]=r[2])) and ((s[i+2]=r[3]) and (s[i+3]=r[4]))) or (((s[i]=k[1]) and (s[i+1]=k[2])) and ((s[i+2]=k[3]) and (s[i+3]=k[4]))) then flag:=true;
    if flag then
     begin
      if i=3 then t:=copy(s,1,1)
             else if i=4 then t:=copy(s,1,2)
                         else t:=copy(s,i-4,3);
      val(t,m,err);
      del:=3;
      While err<>0 do
       begin
        delete(t,1,1);
        if t='' then break;
        val(t,m,err);
        del:=del-1;
       end;
      if t='' then break;
      zamena(m,t);
      delete(s,i-del-1,del);
      insert(t,s,i-del);
      i:=i+length(t);
     end;
    flag:=false;
    i:=i+1;
   Until i>=(length(s)-3);
  end;

 Procedure main;
  var yk:p;
      s:string;
  begin
   yk:=ykaz;
   while (yk<>nil) do
    begin
     prob(yk^.data);
     change(yk^.data);
     yk:=yk^.sled;
    end;
  end;

begin
 new(ykaz);
 read;
 main;
 write;
end.
Form_13 вне форума Ответить с цитированием
Старый 20.12.2011, 18:52   #3
Form_13
Форумчанин
 
Регистрация: 25.04.2011
Сообщений: 107
По умолчанию

Программа находит вхождения "руб." или "рубл" аналогично с копейками, и цифры перед вхождениями заменяет на цифры. Не понимаю, почему не работает процедура change. Остальные отдельно тестированы и они работают. Какая-то ошибка с памятью.
Form_13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск замена значений из одной таблицы в другую Sofd Microsoft Office Excel 10 06.07.2011 11:36
дан одномерный массив числовых значений, насчитывающий N элементов. ytugello Фриланс 4 29.12.2010 09:37
Условие для диапазона ячеек, при вводе числовых значений. segail Microsoft Office Excel 3 20.06.2010 00:14
Подсчет количества числовых значений Amelie_L Microsoft Office Excel 2 28.01.2010 08:26
Фильтрация числовых значений в DBgrid girz БД в Delphi 14 12.05.2009 16:52