Помощь - Поиск - Пользователи - Календарь
Полная версия: Русские и английские слова
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Geophysist
В общем смысл задачи такой. Имеется текст из русских, английских букв, чисел, знаков препинания и пробелов. Русские слова это любые последовательности только из русских букв,английские аналогично. Все русские слова необходимо переместить в один текстовый файл, английские в другой. Числа, знаки препинания и пробелы переносить не надо.

Вот пример как должна работать прога:

Текст 1.
Стекло в 1345 year ьвап' мебель rhtr 53463'' ' hjnроим4пhff4hg65

Текст 2(русский)
Стекловьвапмебель

Текст 2(English)
yearrhtr

Если кому не влом, помогите плиз!
volvo
Разбиваешь строку на слова и проверяешь, состоит ли слово только из символов кириллицы (тогда его в один файл), или только из латиницы (значит, в другой файл)... Если есть что-то еще - то не записывать никуда...
мисс_граффити
не совсем понятно:
ьвап' состоит не только из русских букв, однако мы ту часть, которая есть русские буквы, переносим
а из
hjnроим4пhff4hg65
мы проимп не выделяем.
andriano
Действительно.
Даже если ввести уточнение: не "русские буквы", а "символы, используемые в русском языке", все равно в ответе фгурировать должно "Стекловьвап'мебель", а не "Стекловьвапмебель".
volvo
А если ввести уточнение, что слова разделяются НЕ только пробелами, а еще и другими разделителями (причем разделителей может быть больше одного)? Кто сказал, что ' не может быть разделителем?
andriano
Вопрос в другом - кто сказал, что может?
По условию вообще нет такого понятия как разделитель. Следовательно, словом следует считать ЛЮБУЮ последовательность русских букв, встреченных в тексте. В том числе и из одного символа.
Откуда следует уточненный алгоритм: все русские буквы помещаем в один файл, английские - в другой, а все остальное - игнорируем.
Кто вообще придумал выделять из текста слова? Если в выходные файлы их предполагается помещать без разделителей, то это совершенно излишне.
volvo
Цитата
Кто вообще придумал выделять из текста слова?
Собственно, я придумал. А что, у тебя с этим какие-то проблемы? Ты здесь вообще каким боком решаешь, что автору подойдет, а что - нет? Или ты - его личный адвокат и представитель?

Твои ОБЩИЕ слова в КАЖДОЙ теме порядком поднадоели, знаешь? Я тоже могу ВЕЗДЕ писать "Что сделал сам?" и говорить, что то что предлагают другие - НЕ НУЖНО, не предлагая ничего взамен... И придираться к словам я тоже умею, теперь у тебя будет шанс в этом убедиться dry.gif


P.S.
Цитата
Откуда следует уточненный алгоритм: все русские буквы помещаем в один файл, английские - в другой, а все остальное - игнорируем.
Угу... Как же...

Цитата(Автор)
Текст 1.
Стекло в 1345 year ьвап' мебель rhtr 53463'' ' hjnроим4пhff4hg65

Текст 2(русский)
Стекловьвапмебель
ВСЕ русские буквы присутствуют в Текст 2, правда... Ах, ну да... andriano же так удобнее, естественно надо сделать, как ОН сказал, а не как просит автор...
andriano
Цитата(volvo @ 29.12.2007 22:24) *

Собственно, я придумал. А что, у тебя с этим какие-то проблемы? Ты здесь вообще каким боком решаешь, что автору подойдет, а что - нет? Или ты - его личный адвокат и представитель?
Я не решаю. Я просто умею читать и делюсь своими впечатлениями от прочитанного.
Цитата

Твои ОБЩИЕ слова в КАЖДОЙ теме порядком поднадоели, знаешь? Я тоже могу ВЕЗДЕ писать "Что сделал сам?" и говорить, что то что предлагают другие - НЕ НУЖНО, не предлагая ничего взамен... И придираться к словам я тоже умею, теперь у тебя будет шанс в этом убедиться dry.gif
"Общие слова", говоришь? "Ничего не предлагая?
Цитата

P.S.
Угу... Как же...
Вот этот твой комментарий относится КАК РАЗ к одному из моих КОНКРЕТНЫХ предложений.
Нехорошо в одном и том же сообщении противоречить самому себе.
Цитата

ВСЕ русские буквы присутствуют в Текст 2, правда... Ах, ну да... andriano же так удобнее, естественно надо сделать, как ОН сказал, а не как просит автор...
Да, примеры ПРОТИВОРЕЧАТ опубликованному условию. Что дальше? Будем выяснять отношения между собой или будем выяснять, что автору темы нужно на самом деле?
Geophysist
Да, извините, ьвап' не переносится никуда. А разделитель есть - пробел.
Айра
Можно сделать так:
var s,s1: string;
    f1,f2: text;
    i,j: integer;
    R,E: set of char;
    ru,en,dr: boolean;
begin
  R:=['А'..'я'];
  E:=['A'..'z'];
  writeln('введите строку');
  readln(s);
  assign(f1, 'rus.txt');
  rewrite(f1);
  assign(f2, 'eng.txt');
  rewrite(f2);
  while length(s)<>0 do
    begin
      s1:='';
      dr:=false;     // наличие других символов
      ru:=false;     // наличие русских символов
      en:=false;     // наличие латинских символов
      i:=Pos(' ',s);
      if i>0 then s1:=Copy(s,1,i-1)
      else s1:=s;
      for j:=1 to length(s1) do
      	begin
          if s1[j] in R then ru:=true
          else if s1[j] in E then en:=true
                 else dr:=true;
        end;
      if dr=false then
        begin
          if ru and (not en) then write(f1, s1);
          if (not ru) and en then write(f2, s1);
        end;
      if i>0 then delete(s,1,i)
      else delete(s,1,length(s));
    end;
  close(f1);
  close(f2);
end.

Lapp
Цитата(Айра @ 3.01.2008 23:41) *

Можно сделать так:
Можно и так, только я бы конструкцию:
      while (s[i]<>' ') and (i<=length(s)) do
        begin
          s1:=s1+s[i];
          inc(i);
        end;

- заменил бы на такую:
      i:=Pos(' ',s);
      if i>0 then s1:=Copy(s,1,i-1) else s1:=s;

А выражение типа:
          if s1[j] in R then ru:=true

- на вот такое:
  ru:= ru or (s1 in R);

- хотя последнее спорно..
Но я бы делал проверку иначе, думаю.. smile.gif

И еще замечание: русские буквы не во всех кодировках представляют связное множество..
volvo
Цитата
русские буквы не во всех кодировках представляют связное множество
С латинскими, заданными в такой форме, тоже возможны баги, кстати (между прописными и строчными буквами есть еще "посторонние" 6 символов):
s := 'start finish begin` 98989898 end';
и begin` тоже запишется в файл, хотя и не должно... Лучше все-же латиницу разбить на 2 интервала...
Айра
У меня, когда в FPC работаю русские буквы вообще вот так выглядят: ЇаЁўҐв (привет) sad.gif

Цитата
русские буквы не во всех кодировках представляют связное множество..
Лучше все-же латиницу разбить на 2 интервала...

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

to Lapp: первую конструкцию заменила (+ процедура удаления тоже несколько изменилась)..
compiler
Цитата(Айра @ 4.01.2008 16:37) *
и как в ней располагаются эти буквы?
самый простой способ, ИМХО, распечатать все символы в цикле с изменяющимся кодом...
        for i:=0 to 255 do
                writeln(i:3, '=', chr(i));
а затем сравнить с таблицами...(особый случай , когда есть проблемы с неизвестностю кодировки терминала...)
ну, или посмотреть дукументацию...
мисс_граффити
Айра, сделай, например, так:
var i: integer;

begin
for i:=32 to 255 do
  begin
  if (i-32) mod 10=0 then //чтобы было по 10 символов в строке
    writeln;
  write(char(i), ' ');
  end;
readln;
end.

ну и сами коды (i) выводи.... если именно они нужны, а не только порядок.
Айра
Гы)) В двух компиляторах разные таблицы:
Нажмите для просмотра прикрепленного файла
Предположение: может как раз таки из-за того, что у АЗС (прикольно)) у FPC и Windows разные таблицы мне первый всегда какие-то каракули в файлы записывает?

to compiler:
Цитата
а затем сравнить с таблицами
: ссылочку не дашь? smile.gif
compiler
Цитата(Айра @ 4.01.2008 20:22) *
to compiler:
: ссылочку не дашь? smile.gif
на википедию? smile.gif у меня в локалке отучают ходить на википедию через инет(=>ссылку на конкретную страницу дать тяжко). зайди на нее и введи в поиске win 1251, а затем CP866 и сравни со своими таблицами...

зы
насколько я знаю, кодировка задается не компилятором а средой разработки(IDE)
volvo
Цитата
В двух компиляторах разные таблицы:
Естественно... TPW выдает тебе таблицу для Windows-1251, а FPC - для Кодовой страницы 866
Айра
Пасибо)) теперь хоть знаю как их звать))

О!! нашла метод борьбы с каракулями: открываю файл в commander'e кнопкой F3 и выбираю ASCII (кодировка DOS) Ура!!! yahoo!.gif но все равно не очень удобно((...
compiler
Цитата(Айра @ 4.01.2008 21:03) *
но все равно не очень удобно((...
ИМХО, проще использовать одну среду и не "морочити собi цим голову ", как сказал Ющенко...smile.gif
Айра
Дык подходящая для минэ среда - це АЗС.. блин FPC, а он вредничает sad.gif
compiler
Цитата(Айра @ 4.01.2008 21:15) *
Дык подходящая для минэ среда - це АЗС.. блин FPC, а он вредничает sad.gif
тогда, можна написать программу, которая будет перехватывать функци и заниматься перекодированием... только я в этом не помошникsmile.gif

оффтоп
>>це АЗС.. блин
недавно возле меня открыли заправку FP:)
andriano
Цитата(Айра @ 4.01.2008 22:15) *

Дык подходящая для минэ среда - це АЗС.. блин FPC, а он вредничает sad.gif

FPC - компилятор. Его можно использовать с различными средами разработки. Если предпорлагается консольная программа - использовать консольную же среду, если программа GUI, то GUI-среду. В первом случае, впрочем, возможно использование GUI-среды с установленным шрифтом TERMINAL и драйвером клавиатуры, поддерживающим 866 страницу.
Иногда полезно и программное решение типа того, что приведено ниже:
unit recode;
interface

const
  DOScode = 0;
  WinCode = 1;
  DestSet : longint = DOScode; {0-DOS,1-Win}

function NumSet(s:string) : longint; {0-DOS,1-Win,4-Unknkwn}
procedure RecodeString(var s:string; Sou,Dest : longint);
procedure RecodeString2current(var s:string);

implementation
const CharSetByte : array[0..1,0..255]of byte = {DOS->Win; Win->DOS}
((  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
   64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
   80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
   96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
  208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
  224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
  128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
  144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
  160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
  240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
  176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191),
 (  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
   64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
   80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
   96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
  112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
  176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
  192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
  208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
  240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
  128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
  144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
  160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
  224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239));
  OldSet : longint = 4;
var
  CharSet : array[0..1,0..255]of char absolute CharSetByte;

function NumSet(s:string) : longint; {0-DOS,1-Win,4-Unknkwn}
var
  i,n0,n1,n2,n3,n4 : longint;
begin
  n0 := 0;    n1 := 0;    n2 := 0;    n3 := 0;    n4 := 0;
  if length(s) > 0 then
    for i := 1 to Length(s) do begin
      if byte(s[i]) in [128..175] then inc(n0);
      if byte(s[i]) in [176,177,192..223,242..251] then inc(n1);
      if byte(s[i]) in [224..241] then inc(n4);
    end;
  if (n0 = n1) then
    NumSet := OldSet
  else
    if n0 > n1 then begin
      if n0 > (n1*2) then OldSet := DOScode;
      NumSet := DOScode;
    end else begin
      if n1 > (n0*2) then OldSet := WinCode;
      NumSet := WinCode;
    end;
end;

procedure RecodeString(var s:string; Sou,Dest : longint);
var i : longint;
begin
  if (Sou <> Dest) and (length(s) > 0) then begin
    if (Sou = DOScode) and (Dest = WinCode) then
      for i := 1 to length(s) do
        s[i] := CharSet[DOScode,byte(s[i])]
    else
      for i := 1 to length(s) do
        s[i] := CharSet[WinCode,byte(s[i])];
  end;
end;

procedure RecodeString2current(var s:string);
begin
  RecodeString(s, NumSet(s), DestSet);
end;

begin
{$ifdef __GUI__}
  DestSet := WinCode; {0-DOS,1-Win}
{$else}
  DestSet := DOScode; {0-DOS,1-Win}
{$endif}
end.
Айра
Цитата
Иногда полезно и программное решение типа того

..оно, если я правильно поняла, будет "перекодировать" информацию.. А как мне его правильно использовать?
Я поместила его в папку, где лежат мои "творения", а в программе добавила uses recode; компилятор не ругается, но и результата нет.. я, наверно, что-то не так делаю..
andriano
Ну, примерно так:
вместо
writeln(MyString);
пишешь:
writeln(RecodeString2current(MyString));
Неудобно, конечно, но может оказаться полезным, когда создаешь модуль, который планируется в дальнейшем интенсивно использовать, пичем как в GUI, так и в консоли.
Айра
Цитата
вместо
writeln(MyString);
пишешь:
writeln(RecodeString2current(MyString));

Это в коде самой программы? И так каждый раз? мдя.. неудобно..

+ сейчас проверила: не проходит компиляцию, пишет на MyString "Can't read or write variables of this type".. значит нужны еще какие-то доработки\переделки?..
мисс_граффити
ну естественно...
RecodeString2current - это _процедура_, а не _функция_.
Результата, ассоциированного с именем, нет => чего вы хотите от writeln?
Можно так попробовать:
RecodeString2current(MyString)
writeln(MyString);
Айра
компилируется, но в файл все равно пишется ерунда: "­Ґа Ў®в Ґв"
..опять что-то не работает.. или я не правильно делаю.. andriano?
andriano
Честно говоря, я не телепат.
Обращаю внимание, что в блоке инициализации присутствуют директивы условной компиляции, благодаря которым определяется, какую кодировку следует считать текущей. Для ТМТ будет работать именно этот вариант. В других компиляторах, вероятно, используются другие предопределенные константы, поэтому ту часть желательно подкорректировать под имеющийся компилятор. Если это по каким-либо причинам затруднительно, можно принудительно установить DestSet в нужное значение, не полагаясь на автоопределение.
И еще: модуль, вообще говоря, предназначен для выдачи на экран. Т.е. туда, где точно известна кодировка. В случае файла же ты увидишь в нем то, что тебе покажет вьюер текстовых файлов. А показывать он будет одинаково вне зависимости от того, создан он консольной прогой или GUI-шной. Т.е. в твоем случае настраивать DestSet надо не под тип твоей проги, а под особенности используемого текстововго вьюера. А в этом варианте никакого автоопределения быть не может, а DestSet следует установить только явно из программы.
Айра
Цитата
модуль, вообще говоря, предназначен для выдачи на экран

..у меня проблемы были именно с записью в txt-файл (я об этом говорила).. на экране все нормально..
Цитата
А показывать он будет одинаково вне зависимости от того

т.е. независимо от исходной кодировки.. файлы, созданные TPW выглядят нормально.. стоп.. я уже совсем запуталась и ничего не понимаю((((
..наверно, буду пользоваться недавно открытым способом - да здравствует TC7.0 и F3 smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.