Автор Тема: FreePascal и русский язык.  (Прочитано 7643 раз)

Оффлайн KI

  • Завсегдатай
  • *
  • Сообщений: 113
FreePascal и русский язык.
« : 21.04.2011 20:52:43 »
Имеется следующая задача:
Строка, содержит произвольный русский текст. Написать какие буквы и сколько раз встречаются в тексте.
В PascalABC программа может выглядеть например так:
Program s290n28;
 Var
  s:string;
  c:array['а'..'я'] of integer;
  a:char;
  p:integer;
Begin
 Write('s='); Readln(s);
  For p:=1 to length(s) do
   begin
     c[s[p]]:=c[s[p]]+1;
   end;
 For a:='а' to 'я' do
   begin
     if c[a]<>0 then writeln (a,'-',c[a]);
   end;
End.
Можно ли и как сделать подобное во FreePascal?
« Последнее редактирование: 24.04.2011 15:38:29 от Skull »

Оффлайн Const

  • Глобальный модератор
  • *****
  • Сообщений: 2 653
  • Даже у плохого модератора есть свои плюсы…
Re: FreePascal и русский язык.
« Ответ #1 : 21.04.2011 21:04:57 »
А попробовать не?

Оффлайн Карлсон

  • Завсегдатай
  • *
  • Сообщений: 1 699
Re: FreePascal и русский язык.
« Ответ #2 : 21.04.2011 21:08:34 »
 c:array['а'..'я'] of integer;

Питонизмы какие-то! Индекс массива в виде сhar :)

Однако, http://www.freepascal.org/docs-html/ref/refsu15.html в самом конце есть такой пример с латинскими буквами. А сработает ли с русским надо проверять.

Вдогонку:
http://bugs.freepascal.org/bug_view_page.php?bug_id=7122&history=1
Так что на успех я бы не надеялся.
« Последнее редактирование: 21.04.2011 21:28:16 от Карлсон »

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 253
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: FreePascal и русский язык.
« Ответ #3 : 21.04.2011 21:52:51 »
Там просто русские буквы не вводятся. Т.е. он их воспринимает, как двухбуквенное сочетание. Можно попробовать использовать какой-нибудь другой  (не встроенный) редактор.
« Последнее редактирование: 21.04.2011 21:54:44 от ruslandh »

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 253
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: FreePascal и русский язык.
« Ответ #4 : 21.04.2011 22:05:23 »
Проверил - не поможет - он не умеет работать с кириллицей вообще

Оффлайн Карлсон

  • Завсегдатай
  • *
  • Сообщений: 1 699
Re: FreePascal и русский язык.
« Ответ #5 : 21.04.2011 22:59:13 »
Проверил - не поможет - он не умеет работать с кириллицей вообще

Хм...

[karlson@roof tmp]$ cat ./tst_rus.pas
program char_index;

var     m: array ['а'..'я'] of byte;
var     s: string;
var     i: integer;
var     c: char;


begin
    for c:='а' to 'я' do
    begin
        m[c]:= 0;
    end;                 

    writeln('Enter string: ');
    readln(s);
    for i:=1 to length(s) do
    begin
        m[s[i]]:=m[s[i]] + 1;
    end;
    for c:='а' to 'я' do
    begin
        writeln(c, ' ', m[c]);
    end;                 
end.

[karlson@roof tmp]$ fpc ./tst_rus.pas
Free Pascal Compiler version 2.5.1 [2011/02/21] for i386
Copyright (c) 1993-2010 by Florian Klaempfl
Target OS: Linux for i386
Compiling ./tst_rus.pas
Linking tst_rus
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
25 lines compiled, 0.1 sec

[karlson@roof tmp]$ ./tst_rus
Enter string:
Хелло ворлд!
а 0
б 0
в 1
г 0
д 1
е 1
ж 0
з 0
и 0
й 0
к 0
л 3
м 0
н 0
о 2
п 0
р 1
с 0
т 0
у 0
ф 0
х 0
ц 0
ч 0
ш 0
щ 0
ъ 0
ы 0
ь 0
э 0
ю 0
я 0


Правда, локаль 1251.

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 253
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: FreePascal и русский язык.
« Ответ #6 : 21.04.2011 23:07:45 »
Вы про fpc, а я про fp. Хотя в таких случаях лучше оказаться неправым

Оффлайн yaleks

  • Мастер
  • ***
  • Сообщений: 6 235
Re: FreePascal и русский язык.
« Ответ #7 : 22.04.2011 00:17:10 »
если нужен русский, то без Geany никак.

Оффлайн KI

  • Завсегдатай
  • *
  • Сообщений: 113
Re: FreePascal и русский язык.
« Ответ #8 : 22.04.2011 06:41:57 »
Набирали имеено в Geany. После того, как не получилось. Проверили в связке WINE+PascalABC, все работает. Интерес имеено к такому решению связан с подготовкой к ЕГЭ.

Оффлайн lucefer

  • Завсегдатай
  • *
  • Сообщений: 348
    • Email
Re: FreePascal и русский язык.
« Ответ #9 : 22.04.2011 07:13:35 »
Может лучше использовать Turbo Pascal?
http://www.rpdn.ru/forum/3/33/
Каждый линуксоид в начале своего пути не понимает, зачем так много дистрибутивов, а в конце пути - создает свой.

Оффлайн xdsl

  • Давно тут
  • **
  • Сообщений: 255
Re: FreePascal и русский язык.
« Ответ #10 : 22.04.2011 07:28:06 »
Проблема только в кодировке. От типа компилятора работоспособность этой программы никак не зависит. Если кодировка русских букв однобайтовая (cp1251, cp866 и т.п.), то все будет работать. Если многобайтовая (utf8), то программа даже не скомпилируется, так как уже в строке var m: array ['а'..'я'] of byte; возникнет ошибка. Компилятор требует в качестве индекса массива порядковый тип, а получает [string..string] вместо ожидаемого [char..char].

Оффлайн KI

  • Завсегдатай
  • *
  • Сообщений: 113
Re: FreePascal и русский язык.
« Ответ #11 : 22.04.2011 08:06:30 »
И все же, как быть? Класс подобных задач достаточно большой, обойти их вниманием нельзя. Городить огород с WINE не очень хочется, да и не массовое это решение.

Оффлайн xdsl

  • Давно тут
  • **
  • Сообщений: 255
Re: FreePascal и русский язык.
« Ответ #12 : 22.04.2011 08:49:23 »
И все же, как быть? Класс подобных задач достаточно большой, обойти их вниманием нельзя. Городить огород с WINE не очень хочется, да и не массовое это решение.
Ну, например, так:
{(C)reated by xdsl, см. также https://shgpi.edu.ru/forum/viewtopic.php?p=4378#p4378 }
{$mode objfpc}

function getUTF8char(const s:string; var index:integer):string;
 var utf8char:array[1..6]of char=(#128,#224,#240,#248,#252,#254);
 var c,cid:char; i:byte;
begin
 result:='';
 if index>length(s) then exit;
 cid:=s[index];
 for i:=1 to 6 do begin
  c:=s[index]; inc(index); result:=result+c;
  if cid<utf8char[i] then exit;
 end;
end;

const rus='абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';

var ruscnt:array[1..66]of integer;
    s:string; i:integer;
    index:integer=1;
    symbol:string;
begin
 fillchar(ruscnt,sizeof(ruscnt),#0);
 write('введите строку: '); readln(s);
 while true do begin
  symbol:=getUTF8char(s,index);
  if symbol='' then break;
  if length(symbol)<>2 then continue;
  for i:=1 to 66 do if symbol=copy(rus,i*2-1,2) then inc(ruscnt[i]);
 end;
 for i:=1 to 66 do
  if ruscnt[i]=0 then continue
  else writeln (copy(rus,i*2-1,2),' - ',ruscnt[i]);
end.

должно работать на любом паскале при условии UTF8-кодировки текста программы и вводимой строки.
« Последнее редактирование: 22.04.2011 13:21:57 от xdsl »

Оффлайн xdsl

  • Давно тут
  • **
  • Сообщений: 255
Re: FreePascal и русский язык.
« Ответ #13 : 22.04.2011 09:06:27 »
Упс, только-что заметил - в ТП компилироваться не будет, внутри функции getUTF8char скажет "нет переменной result".
Ну это некритично, имхо, исправляется достаточно просто.

Оффлайн yaleks

  • Мастер
  • ***
  • Сообщений: 6 235
Re: FreePascal и русский язык.
« Ответ #14 : 22.04.2011 12:29:58 »
Набирали имеено в Geany.
кодировка какая была у текста программы?