Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Прописные буквы в строке

Автор: Вася 30.05.2007 20:52

Как посчитать в строке количество каждой латинской и русской прописной (или строчной) буквы?

Автор: volvo 30.05.2007 21:23

В поиске посмотреть... Надоело уже на ОДНО и ТО ЖЕ отвечать в трехтысячный раз!!! Если тебе лень набрать в поиске 3 слова, то почему другим не должно быть лень набивать несколько строк, ты не подумал? Подумай.

Автор: Вася 31.05.2007 0:11

Извини меня пожалуйста, я совсем не подумал над этим, но теперь я постараюсь исправится. Короче у меня теперь есть один вариант:

Код

// для русских букв
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 31.05.2007 0:15

сделай массив из русских и латинских букв и сравнивай с его элементами, а почему множества не годятся ?

Автор: volvo 31.05.2007 0:20

Цитата
Ты не мог ли мне сказать как обойтись без множеств?
Вот так, например...

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

Автор: Вася 31.05.2007 11:25

Я понял как это сделать для каждой прописной латинской, но что мне делать с русскими?

Код

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


Добавлено через 2 мин.
Я и сам был не против множеств, но всё дело в преподе.

Автор: Ozzя 31.05.2007 11:28

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;

Автор: Вася 31.05.2007 11:40

Я так пробовал с русскими так помоему нельзя. С ними надо как-то по другому. Вопрос: как?

Автор: Ozzя 31.05.2007 11:50

Заглавные русские буквы в альтернативной кодировке ASCII лежат единым блоком. А вот строчные, действительно с разрывом.
Ты пробовал уже? Что именно не получается?

Автор: Вася 31.05.2007 12:10

Ну если в ASCII русские прописные лежат единым блоком, то я надеюсь, что препод ко мне не придерётся. Знаете ли у него всегда один убийственный аргумент, что программ должна работать при любой кодировке (даже не существующей), но к латинским в отличии от русских у него таких претензий нет. Итак если там всё нормально я сейчас доделаю программу и пойду её сдавать. И всё же скажите мне, с русскими никак по другому не получится? Заранее всем спасибо.

Автор: Ozzя 31.05.2007 12:16

Тогда нужно забить все русские буквы в константный массив, типа
ruschars:array [1..33] of char=('А','Б', и т.д.,'Я');

Автор: volvo 31.05.2007 12:28

Вот объясни мне, почему ты все время разбиваешь русские и латинские символы? Это что, так теперь учат? Чтобы циклов больше было, что-ли? Или чтобы свалить тебя было легче?

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 31.05.2007 12:37

Цитата(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я 31.05.2007 12:43

klem4
norespect.gif мне

Автор: Вася 31.05.2007 12:47

Ты прав сейчас действительно учат так. Препод говорит, что случаи с латинскими и русскими мы должны рассматривать отдельно. Интересно, что он мне скажет на твоё предложение. Лично мне оно нравится (всё гениальное просто).

Автор: Вася 31.05.2007 13:08

Так, если делать твоим простым способом, то всё прекрасно до тех пор пока не возникает один вопрос: как вывести теперь мне кол-во букв в порядке частоты появления? И ещё я не понимаю почему вот здесь 0, а не 1?

Код

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



Автор: volvo 31.05.2007 13:28

Ноль там - потому, что если pos НЕ найдет букву в строке, то вернется 0... В нулевой ячейке будет храниться общее количество символов, НЕ присутствующих в строке alpha

Цитата
всё прекрасно до тех пор пока не возникает один вопрос: как вывести теперь мне кол-во букв в порядке частоты появления
Индексная сортировка массива Count тебе поможет...

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