Помощь - Поиск - Пользователи - Календарь
Полная версия: Прописные буквы в строке
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Вася
Как посчитать в строке количество каждой латинской и русской прописной (или строчной) буквы?
volvo
В поиске посмотреть... Надоело уже на ОДНО и ТО ЖЕ отвечать в трехтысячный раз!!! Если тебе лень набрать в поиске 3 слова, то почему другим не должно быть лень набивать несколько строк, ты не подумал? Подумай.
Вася
Извини меня пожалуйста, я совсем не подумал над этим, но теперь я постараюсь исправится. Короче у меня теперь есть один вариант:
Код

// для русских букв
for i:=1 to length(s) do
if s[i] in ['А'..'Я','Ё'] then inc(j);
// для латинских букв
for i:=1 to length(s) do
if s[i] in ['A'..'Z'] then inc(j);

Но мне он не совсем подходит. Ты не мог ли мне сказать как обойтись без множеств?
Tan
сделай массив из русских и латинских букв и сравнивай с его элементами, а почему множества не годятся ?
volvo
Цитата
Ты не мог ли мне сказать как обойтись без множеств?
Вот так, например...

Var
count: array[char] of integer;
...
for i := 1 to length(s) do inc(count[s[i]]);
(тебе же надо КАЖДОЙ, а ты считаешь ВСЕХ вместе... Вот с массивом - будет действительно каждой)
Вася
Я понял как это сделать для каждой прописной латинской, но что мне делать с русскими?
Код

var
  count1: array ['A'..'Z'] of integer;
...
for i := 1 to length(s) do
   count1[s[i]]:=inc(count1[s[i]]);
...


Добавлено через 2 мин.
Я и сам был не против множеств, но всё дело в преподе.
Ozzя
var
count2: array ['А'..'Я'] of integer;
count1: array ['A'..'Z'] of integer;
...
for i := 1 to length(s) do
begin
count1[s[i]]:=inc(count1[s[i]]);
count2[s[i]]:=inc(count2[s[i]]);
end;
Вася
Я так пробовал с русскими так помоему нельзя. С ними надо как-то по другому. Вопрос: как?
Ozzя
Заглавные русские буквы в альтернативной кодировке ASCII лежат единым блоком. А вот строчные, действительно с разрывом.
Ты пробовал уже? Что именно не получается?
Вася
Ну если в ASCII русские прописные лежат единым блоком, то я надеюсь, что препод ко мне не придерётся. Знаете ли у него всегда один убийственный аргумент, что программ должна работать при любой кодировке (даже не существующей), но к латинским в отличии от русских у него таких претензий нет. Итак если там всё нормально я сейчас доделаю программу и пойду её сдавать. И всё же скажите мне, с русскими никак по другому не получится? Заранее всем спасибо.
Ozzя
Тогда нужно забить все русские буквы в константный массив, типа
ruschars:array [1..33] of char=('А','Б', и т.д.,'Я');
volvo
Вот объясни мне, почему ты все время разбиваешь русские и латинские символы? Это что, так теперь учат? Чтобы циклов больше было, что-ли? Или чтобы свалить тебя было легче?

const
len = 33 + 26;
alpha = 'АБВГДЕ...ЮЯABCDEF ... YZ'; { всего 33 + 26 символов }

var
count: array[0 .. len] of integer;
...
for i := 1 to length(s) do begin
inc(count[pos(s[i], alpha)]);
end;
...

klem4
Цитата(Ozzя)
var
count2: array ['А'..'Я'] of integer;
count1: array ['A'..'Z'] of integer;
...
for i := 1 to length(s) do
begin
count1[s[i]]:=inc(count1[s[i]]);
count2[s[i]]:=inc(count2[s[i]]);
end;


blink.gif

а при таком раскладе ужасный range checking error мы разьве не получим ?! Да это ведь вообще компилироваться не будет!
Ozzя
klem4
norespect.gif мне
Вася
Ты прав сейчас действительно учат так. Препод говорит, что случаи с латинскими и русскими мы должны рассматривать отдельно. Интересно, что он мне скажет на твоё предложение. Лично мне оно нравится (всё гениальное просто).
Вася
Так, если делать твоим простым способом, то всё прекрасно до тех пор пока не возникает один вопрос: как вывести теперь мне кол-во букв в порядке частоты появления? И ещё я не понимаю почему вот здесь 0, а не 1?

Код

...
var
  count: array[0 .. len] of integer;
...
  


volvo
Ноль там - потому, что если pos НЕ найдет букву в строке, то вернется 0... В нулевой ячейке будет храниться общее количество символов, НЕ присутствующих в строке alpha
Цитата
всё прекрасно до тех пор пока не возникает один вопрос: как вывести теперь мне кол-во букв в порядке частоты появления
Индексная сортировка массива Count тебе поможет...

Кстати, вот это надо было в задании указывать СРАЗУ, а не теперь... И этому тоже учат? Сначала создать себе сложности, а потом их успешно преодолевать? В общем, пока не будет точного задания, чтобы потом ни на миллиметр (!!!) от него не надо было отступать - я на вопросы в этой теме больше не отвечаю... "Сделай то, не знаю что" - это на форум телепатов...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.