Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > сравнение числа с маской\обработка строки


Автор: overfe1 12.2.2006, 13:40
то есть есть файл с числами ( gen.txt) нужно из него взять построчно и сравнить каждую строку с маской и записать в файл sorted.txt,то есть например в gen.txt все числа от 10 до 99 и маска у меня x9 то в sorted.txt запишутся все числа заканчивающиеся на 9..
вот кусок кода,я как только не пробывал,нормально сортироватся не хочет,то записывает число если есть хоть один символ из маски то ещё что%)
помогите плизз,очень надо
или хотя бы подскажите с помошью чего можно выполнить такую сортировку =)
Цитата

var
fo,fi: textfile;
s,w,x,i: string;
n,m: integer;
begin
x :='x';
w :=edit3.Text;
m :=Length(w);
AssignFile( Fo, 'gen.txt' );
Reset( Fo );
assignfile(fi,'sorted.txt');
rewrite(fi);
n :=0;
while not eof( Fo ) do
begin
Readln(Fo,s);
вот здесь нужна помощь по обработке
writeln(fi,s);
end;
CloseFile(Fo);
CloseFile(Fi);

Автор: remax 12.2.2006, 14:37
Из предположения, что есть только двузначные числа и маска млжет быть одного из трех видов
1) x(число), например x9
2) (число)x, например 9x
3) xx

x-строковая переменная, маска
s-строковая переменная, число

Код

If ((x[1]='x')  and (x[2]=s[2])) or
   ((x[2]='x')  and (x[1]=s[1])) or
    (x='xx')
  then  { Добавляем в sort.txt}
    writeln(fi,s);


При желании, легко эту реализацию распостранить на одно значные, трех значные и пр.

Автор: volvo877 12.2.2006, 15:11
overfe1, попробуй вот так (для простоты я сделал с массивами, но думаю, что переделать под твою задачу не составит труда...):
Код
const
  n = 10;
  arr: array[1 .. n] of string =
    ('11', '12', '13', '14', '15',
     '23', '24', '35', '37', '45');

var
  i, j: integer;
  s, mask: string;
  isOk: boolean;
begin
  mask := 'XX';
  for i := 1 to n do begin

    isOk := true;

    if length(arr[i]) = length(mask) then begin
      s := arr[i];
      for j := 1 to length(mask) do begin
        isOk := isOk and ((mask[j] = 'X') or (mask[j] = s[j]));
      end;

      if isOk then writeln(arr[i]);
    end;

  end;
end.

Автор: overfe1 12.2.2006, 16:44
remax спасибо,кст сначала код был чуть не правильный,я исправил,а тут захожу у тебя тоже исправлен =)) ты меня натолкнул на решение ( я не знал что в условном операторе можно лделать по действия м всё теперь все понятно =))

volvo877 благодарю сейчас буду разбиратся smile

Автор: overfe1 12.2.2006, 17:37
Цитата(remax @ 12.2.2006, 14:37)
Из предположения, что есть только двузначные числа и маска млжет быть одного из трех видов
1) x(число), например x9
2) (число)x, например 9x
3) xx

x-строковая переменная, маска
s-строковая переменная, число

Код

If ((x[1]='x')  and (x[2]=s[2])) or
   ((x[2]='x')  and (x[1]=s[1])) or
    (x='xx')
  then  { Добавляем в sort.txt}
    writeln(fi,s);


При желании, легко эту реализацию распостранить на одно значные, трех значные и пр.

всё прекрасно работает,но если к примеру числа не 2-значные а 3-х получается намного больше вариантов =))
а представь если они 7-ми значные ? варианты растут в огромной прогресси,надо придумать как это все пустить по циклу =)))
позже буду думать smile

Автор: volvo877 12.2.2006, 17:39
overfe1, поэтому я и предложил тебе свой вариант... А ты его даже не попробовал... smile Вот так всегда...

Автор: darkart 12.2.2006, 21:07
Вариант...
Код

program MaskStr;
procedure CreateMaskFile(strSrcFileName,strResFileName,strMask:string);
{Процедура берет слова из файла с именем strSrcFileName, сравнивает каждое слово с маской и если слово удовлетворяет маске то записывает его в файл с именем strResFileName.
Примечание:
если символ маски не входит в константу UsedSymbols, то он считается символом любого символа, также любой символ не входящий в UsedSymbols считается разделителем в файле.
}
const
  UsedSymbols=['0'..'9'];{список нужных символов}
var
  bolResult:boolean;{флаг}
  ch:char;{считываемый символ}
  i,len:integer;{i-счетчик, len-длина строки}
  strTemp:string;{считываемое слово}
  FIn,FOut:textfile;{FIn-входной файл, FOut-выходной}
begin
  AssignFile(FIn,strSrcFileName);{связывание переменной}
  AssignFile(FOut,strResFileName);{связывание переменной}
  reset(FIn);{открытие для чтения}
  rewrite(FOut);{открытие для перезаписи}
  while not eof(FIn) do{пока не конец файла}
  begin
    strTemp:='';{инициализация}
    read(FIn,ch);{чтение символа}
    while not(eof(FIn) or (ch in UsedSymbols)) do {пока символа ch нет в списке нужных}
      read(FIn,ch);{чтение след. символа}
    while not eof(FIn) and (ch in UsedSymbols) do{пока символ нам подходит}
    begin
      strTemp:=strTemp+ch;{добавляем символ}
      read(FIn,ch);{читаем следующий}
    end;
    len:=Length(strTemp);{узнаем длину считанного слова}
    if len=Length(strMask) then{если длина слова совпадает с длиной файла}
    begin
      bolResult:=true;{инициализация}
      i:=1;{инициализация счетчика}
      while (i<=len) and bolResult do{перебираем все символы слова}
      begin
        if strMask[i] in UsedSymbols then{если символ в UsedSymbols, то смотрим символ маски}
          bolResult:=strMask[i]=strTemp[i];
        inc(i);
      end;
    {выход из цикла произошел при i>len либо при bolResult=false}
      if (i>len) and bolResult then writeln(FOut,strTemp);{проверили все символы и не нашли ошибок}
    end;
  end;
  CloseFile(FOut);{закрытие файла}
  CloseFile(FIn);{закрытие файла}
end;
var
  strSrcFileName,strResFileName,strMask:string;
begin
  writeln('Please enter source file name:');
  readln(strSrcFileName);
  writeln('Please enter result file name:');
  readln(strResFileName);
  writeln('Please enter a mask:');
  readln(strMask);
  CreateMaskFile(strSrcFileName,strResFileName,strMask);
  writeln('ok');
  readln;
end.

Автор: overfe1 12.2.2006, 23:08
Цитата(volvo877 @ 12.2.2006, 17:39)
overfe1, поэтому я и предложил тебе свой вариант... А ты его даже не попробовал... smile Вот так всегда...


если чесно я не всё там понял smile я пробывал,просто е получилось его исправить его под мой код (так как я не всё понял) а так ещё раз спасибо,обязательно завтра попробую =))
darkart спасибо завтра попробую%)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)