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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2013, 16:18   #1
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию статистика букв в одном слове

столкнулся с проблемой устранить другие повтор. символы:

Код:
program ololo;
var
a,b:string;   d:array[1..24] of integer;  {массив для количевство соответ. символов.}
i,j:integer;
begin
readln(b);

for i:=1 to  length(b) do begin
for j:=1 to length(b) do begin
if b[i]=b[j] then d[i]:=d[i]+1; if d[i]>1 then begin delete(b,j,1);      end;
end;
end;
for i:=1 to length(b) do begin
writeln(b[i],' -количевство =',d[i]);
say:=0;
end;

end.
работает но не всегда не могу понять почему.например иногда при удаления символа.цикл не реагирует на то что символов стало меньше.а иногда вроде реагирует зависит от слов не понимаю что не так.или с этим алгоритмом не как но мне говорят просто я не могу написать.спасибо заранее.

_____________
Код, по правилам форума, нужно форматировать тегами [CODE] .. [ /CODE]
(это кнопка с # на панели форматирования сообщения)

Модератор

Последний раз редактировалось Serge_Bliznykov; 03.03.2013 в 17:24. Причина: чтобы легко понять
Тамерлан Абилов вне форума Ответить с цитированием
Старый 03.03.2013, 17:15   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

1. Второй цикл нужно делать от текущего символа, а не с начала строки.
2. При удалении символов нужно делать не прямой, а обратный цикл.
3. Массив лучше задавать в диапазоне символов, а не номеров - тогда задача упрощается


Код:
program ololo;
var
b:string; 
d:array['a'..'z'] of integer; {массив для количевство соответ. символов.}
i:integer;
c: char;

begin
  readln(b);

  for c:='a' to 'z' do begin
    d[c]:=0;
    for i:=1 to length(b) do
      if b[i]=c then inc(d[c]);
  end;

  for c:='a' to 'z' do writeln(c,' -количевство =',d[c]);

end.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 03.03.2013, 17:27   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

нельзя удалять символы в прямом цикле FOR - вы же в цикле указываете Length(b) - а длина ИЗМЕНЯЕТСЯ после удаления символов!

Расскажите, как формулируется задание? Зачем Вам вообще удалять символы из строки? Возможно, задача может быть решена по другому?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.03.2013, 17:38   #4
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Код:
for i:=1 to length(b) do
      if b[i] in ['a'..'z'] then inc(d[b[i]]);
for c:='a' to 'z' do writeln(c,' -количевство =',d[c]);
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 03.03.2013, 17:42   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Как уже было написано выше, прямым циклом for очень проблематично удалять что-либо из строки. А почему? - Верно! Т.к. цикл for один единственный раз вычислит до какого значения должна бежать переменная i.
Тоесть лучше воспользоваться циклом while, где значение вычисляется каждый раз..
А еще лучше идти с конца строки циклом for. Тоесть for i := Length(s) downto 1 do begin

Кстати, конечно не зная задания говорить на эту тему очень сложно, НО всё-таки : наверно, было бы лучше писать UpCase (b[i])

Последний раз редактировалось Poma][a; 03.03.2013 в 17:47.
Poma][a вне форума Ответить с цитированием
Старый 03.03.2013, 18:24   #6
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию

по пробую просмотреть все ошибки спс)задача в том что надо cделать статистику букв в одном слове а чтобы сделать это в цикле)каждый повторно встречающийся символ надо удалять чтобы при цикловой печати статистики не видит один и тот же символ)сори за руский)

Последний раз редактировалось Тамерлан Абилов; 03.03.2013 в 18:27.
Тамерлан Абилов вне форума Ответить с цитированием
Старый 03.03.2013, 19:01   #7
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию

все понятно спс за отзывы оставалось сделать так

Код:
 for c:='a' to 'z' do  if d[c]>0 then writeln(c,' -количество =',d[c]);
Тамерлан Абилов вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск буквы (или нескольких букв) в слове Byurrer Общие вопросы C/C++ 9 09.04.2011 00:10
подсчет букв С в последнем слове Obey177 Помощь студентам 7 10.09.2010 16:06
в каждом слове обратить порядок букв Maksik Паскаль, Turbo Pascal, PascalABC.NET 7 20.10.2009 20:24
Перебор заглавных букв в слове =LeonZone= Общие вопросы Delphi 8 02.11.2007 14:59