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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2013, 20:30   #1
yuriy1
 
Регистрация: 20.10.2012
Сообщений: 9
По умолчанию delphi немогу исправить ошибки кода

задача:
Разработать программу обработки текста. Определить в тексте наиболее часто встречающиеся символы
код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
const nmax=66;
var
  buf:string;
  co:array[0..nmax] of byte;
  n,i,j: integer;
  s:string;
  c:char;

begin
  ListBox1.clear;
  s:=Memo1.Text;
  buf:='';
if s='' then MessageDlg('Ведите текст',mterror,[mbOk],0) else

begin
for i:=1 to nmax do
  co[i]:=0;
for i:=1 to length(s) do
  if (s[i] in [#32..#255]) and (pos(s[i],buf)=0)
    then
      begin
        buf:=buf+s[i];
        co[pos(s[i],buf)]:=co[pos(s[i],buf)]+1;
        end
    else
      co[pos(s[i],buf)]:=co[pos(s[i],buf)]+1;
for i:=1 to length(buf)-1 do
begin
  for j:=i+1 to length(buf) do
  begin
    if co[i]<co[j] then
      begin
         n:=co[i];
         co[i]:=co[j];
         co[j]:=n;
         c:=buf[i];
         buf[i]:=buf[j];
         buf[j]:=c;
      end;
   end;
end;
for i:=1 to 10 do
  if buf[i] in [#32..#255] then
    Listbox1.Items.Add('Символ "' + buf[i] + '" встречается ' + IntToStr(co[i]) + ' раз(а)');
end;
end;
пока выявил 2 ошибки, и обе не знаю как исправить:
при вводе пары дюжин предложений, программа работает, а если ввести большой текст, то со 100%-ой вероятностью выйдет ошибка "EAccessViolation"
и максимальное значение количества символов - это 255, дальше он считает по новому кругу. прошу помогите, заранее спасибо

Последний раз редактировалось yuriy1; 29.05.2013 в 20:33.
yuriy1 вне форума Ответить с цитированием
Старый 29.05.2013, 21:12   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
type
  p = record
    c: ansichar;
    a: int64;
  end;
var
  co: array [0 .. 255] of p;
  k: p;
  i, j: integer;
  s: rawbytestring;

begin
  ListBox1.clear;
  s := Memo1.Text;
  if s = '' then
    MessageDlg('Ведите текст', mterror, [mbOk], 0)
  else
  begin
    for i := 0 to 255 do
    begin
      co[i].a := 0;
      co[i].c := ansichar(chr(i));
    end;
    for i := 1 to length(s) do
      inc(co[ord(s[i])].a);
    for i := 32 to 254 do ////вместо 32 нужен 0 (см комментарии ниже)
      for j := i + 1 to 255 do
        if co[i].a < co[j].a then
        begin
          k := co[i];
          co[i] := co[j];
          co[j] := k;
        end;
    for i := 32 to 41 do //
    begin                // вместо этих строк
      if co[i].a = 0 then//
        exit;            //
    {for i := 0 to 9 do
      if co[i].c in [#32..#255] then}
      ListBox1.Items.Add('Символ "' + ansichar(co[i].c)
          + '" встречается ' + IntToStr(co[i].a) + ' раз(а)');
    end;                //
  end;
end;
(Тестировалось в Delphi 2010)
Данный код выводит первые 10 самых встречающихся символа, коды которых принадлежат диапазону 32..255, т.е. логика отличается от Вашей.
Если нужно вывести из первых 10 самых встречающихся символов все, которые имеют такие коды, то расширьте сортировку до 0 и сделайте проверку в цикле на принадлежность диапазону. (Удалите строки, помеченные // и раскомментируйте кусочек кода)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 29.05.2013 в 21:20.
BDA вне форума Ответить с цитированием
Старый 30.05.2013, 10:17   #3
yuriy1
 
Регистрация: 20.10.2012
Сообщений: 9
По умолчанию

помогло спасибо

Последний раз редактировалось yuriy1; 30.05.2013 в 10:31.
yuriy1 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исправить ошибки и сделать проект по готовому коду (Delphi) Kelthagor Помощь студентам 2 21.05.2012 00:59
Исправить ошибки кода. Misha305 Общие вопросы C/C++ 1 08.12.2011 14:04
Delphi - нужно исправить ошибки в исходнике. leonbratsk Помощь студентам 1 27.11.2010 10:54
Немогу исправить ошибки с++ Айдар Помощь студентам 1 16.05.2010 23:26
исправить ошибки в программе на Delphi Андрюха из ПХТТ Помощь студентам 1 04.11.2009 14:13