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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2013, 13:43   #1
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию Одинаковое количество символов в строке

Доброго времени суток.
Возникла проблема с выполнением одной задачи. Ее суть в том, что бы вывести в табличном виде количество одинаковых символов в строке, и преобразовать все под один регистр.
Например я ввожу:
____________
АаааББбкFRRRr
result:
A:4
Б:3
К:1
F:1
R:4

________
Что сделал я, я перевел все в один регистр, я нашел все как хотел, но только с английскими буквами.
Как мне работать с русскими буквами?

Код который использовал:

Код:
бла бла бла...
var
ArrCount: array[0..255] of Integer;
vvod:STRING;
     stroka:String;

function LowerCaseRus(const S: string): string;
var
Ch: Char;
L: Integer;
Source, Dest: PChar;
begin
L := Length(S);
SetLength(Result, L);
Source := Pointer(S);
Dest := Pointer(Result);
while L <> 0 do
begin
Ch := Source^;
if (Ch >= 'A') and (Ch <= 'Z') then Inc(Ch, 32);
if (Ch >= 'А') and (Ch <= 'Я') then Inc(Ch, 32);
Dest^ := Ch;
Inc(Source);
Inc(Dest);
Dec(L);
end;
end;





procedure TForm1.Button1Click(Sender: TObject);
var
str:string;
 i:integer;
begin

 stroka:=Edit1.Text;
vvod:=(LowerCaseRus(stroka));
for i := 1 to Length(vvod) do
inc(ArrCount[Ord(vvod[i])]);
    for i := 0 to 255 do
    begin
      if ArrCount[i]>0 then Memo1.Lines.Add(Chr(i)+':'+IntToStr(ArrCount[i]));
    end;
end;
//это один из попыток
viks1 вне форума Ответить с цитированием
Старый 31.03.2013, 13:57   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А чем не устраивают функции AnsiUpperCase, AnsiLowerCase, UpperCase, LowerCase?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.03.2013, 14:00   #3
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А чем не устраивают функции AnsiUpperCase, AnsiLowerCase, UpperCase, LowerCase?
По сути устраивают, я применял и их... (Как написал это один из своих вариантов)

Вся проблема в том, что Английские буквы -( количество повторений)- считает, а вот с Русскими не работает...
Преобразовать преобразовывает а вот посчитать количество не хочет.
viks1 вне форума Ответить с цитированием
Старый 31.03.2013, 14:15   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var str: string;
    i: integer;
begin
  for i:=0 to 255 do ArrCount[i]:=0;
  str:=AnsiUpperCase(Edit1.Text);
  for i:=1 to Length(str) do
    Inc(ArrCount[Ord(str[i])]);
  for i:=0 to 255 do
    if ArrCount[i]>0 then Memo1.Lines.Add(Chr(i)+':'+IntToStr(ArrCount[i]));
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.03.2013, 14:21   #5
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
procedure TForm1.Button1Click(Sender: TObject);
var str: string;
    i: integer;
begin
  for i:=0 to 255 do ArrCount[i]:=0;
  str:=AnsiUpperCase(Edit1.Text);
  for i:=1 to Length(str) do
    Inc(ArrCount[Ord(str[i])]);
  for i:=0 to 255 do
    if ArrCount[i]>0 then Memo1.Lines.Add(Chr(i)+':'+IntToStr(ArrCount[i]));
end;
Именно так. Да, AnsiUpperCase совершенно подходит под преобразование русских букв, но как я понял
Код:
Inc(ArrCount[Ord(str[i])]);
не считает русские символы...
Английские считает, русские нет!

Последний раз редактировалось viks1; 31.03.2013 в 14:23.
viks1 вне форума Ответить с цитированием
Старый 31.03.2013, 14:24   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Я на Д-7 проверил. Если более продвинутые так не пойдет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.03.2013, 14:27   #7
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Я на Д-7 проверил. Если более продвинутые так не пойдет
т.е на xe3 не будет работать?
в чем прикол?
viks1 вне форума Ответить с цитированием
Старый 31.03.2013, 14:32   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Прикол в том, что символы в String не однобайтные
Код:
procedure TForm1.Button1Click(Sender: TObject);
var str: string;
    i,k,j,n: integer;
    ss: array of String;
    cc: array of Integer;
begin
  k:=0;
  str:=AnsiUpperCase(Edit1.Text);
  for i:=1 to Length(str) do begin
    j:=-1;
    for n:=0 to k-1 do
      if ss[n]=str[i] then begin j:=n; Break; end;
    if j=-1 then begin
      j:=k;
      Inc(k);
      SetLength(ss,k);
      SetLength(cc,k);
      ss[j]:=str[i];
      cc[j]:=0;
    end;
    Inc(cc[j]);
  end;
  for i:=0 to k-1 do Memo1.Lines.Add(ss[i]+':'+IntToStr(cc[i]));
end;
AnsiUpperCase ??? не уверен, возможно UpperCase
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 31.03.2013 в 14:34.
Аватар вне форума Ответить с цитированием
Старый 31.03.2013, 14:40   #9
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Прикол в том, что символы в String не однобайтные
Код:
procedure TForm1.Button1Click(Sender: TObject);
var str: string;
    i,k,j,n: integer;
    ss: array of String;
    cc: array of Integer;
begin
  k:=0;
  str:=AnsiUpperCase(Edit1.Text);
  for i:=1 to Length(str) do begin
    j:=-1;
    for n:=0 to k-1 do
      if ss[n]=str[i] then begin j:=n; Break; end;
    if j=-1 then begin
      j:=k;
      Inc(k);
      SetLength(ss,k);
      SetLength(cc,k);
      ss[j]:=str[i];
      cc[j]:=0;
    end;
    Inc(cc[j]);
  end;
  for i:=0 to k-1 do Memo1.Lines.Add(ss[i]+':'+IntToStr(cc[i]));
end;
AnsiUpperCase ??? не уверен, возможно UpperCase
Спасибо огромное !
и с AnsiUpperCase тоже работает.

Маленькая просьба, не смогли бы объяснить какой алгоритм работы этого кода?
Я частично понял что за чем, но есть непонятные моменты.
Их много , приводить не буду)
viks1 вне форума Ответить с цитированием
Старый 31.03.2013, 14:42   #10
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от viks1 Посмотреть сообщение
Код:
Inc(ArrCount[Ord(str[i])]);
не считает русские символы...
Английские считает, русские нет!
Русские тоже считает.
Только Вам нужно брать не
Код:
ArrCount: array[0..255] of Integer;
а
Код:
ArrCount: array[0..65535] of Integer;
Ну и где выводите цикл нужно подправить.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Количество символов в строке экрана Решетова Алена Паскаль, Turbo Pascal, PascalABC.NET 10 18.02.2013 13:38
Количество различных символов в строке Pasha_Sh Паскаль, Turbo Pascal, PascalABC.NET 2 25.10.2012 21:15
Количество символов в строке! kalosha-stepa Паскаль, Turbo Pascal, PascalABC.NET 7 24.09.2012 08:09
Количество символов в строке Ivan357 Паскаль, Turbo Pascal, PascalABC.NET 0 09.12.2008 17:06