Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Подсчет букв

Страницы: 1
Подсчет букв
Подскажите, как в предложении подсчитать количество неповторяющихся русских букв?
Это несложно.
Код
var
  a: array['а'..'я'] of integer; //массив, состоящий из всех русских букв
  i: integer;
  s, m: string;
begin
 readln (s); //считываем строку, введенную пользователем
 for i:=1 to length(s) do //перебираем все символы строки
  begin
  m:=s[i]; //m - текущий символ из данной строки
  a[m]:=a[m]+1; //подсчитываем, сколько раз буква встретилась в предложении
  end;
 for i:=1 to length(s) do
  begin
  m:=s[i];
  if a[m]=1 then write(m+' '); //если буква встретилась 1 раз - выводим ее, оставив после нее пробел (для читаемости).
  end;
 readln;
end.


Можно, конечно, код упростить. Но это я расписал для понятности.
Изменено: mihail filatov - 25.06.2010 08:17:21
А не напишите упрощенный код?
Ну почему бы и нет.

Код
var mas:array['а'..'я'] of integer;
  i:integer;
begin
 readln (s);
 for i:=1 to length(s) do inc(mas[s[i]]);
 for i:=1 to length(s) do if mas[s[i]]=1 then write(s[i]);
 readln;
end.
Спасибо!
Правильнее думаю будет так
Код
var mas:array['А'..'я'] of integer;
  i:integer;
  s:string;
begin
readln (s);
for i:=1 to length(s) do inc(mas[s[i]]);
for i:=1 to length(s) do if mas[s[i]]=1 then write(s[i]);
readln;
end.


Во-первых все переменные будут объявлены, а во-вторых заглавные буквы тоже нужно считать.
Да, действительно я забыл объявить s.
Но подсчет заглавных букв можно реализовать по-другому:
Код
var mas:array['а'..'я'] of integer;
i:integer; 
s:string; 
begin 
readln (s); 
for i:=1 to length(s) do inc(mas[lowercase(s[i])]); 
for i:=1 to length(s) do if mas[s[i]]=1 then write(s[i]); 
readln; 
end.
А это не тоже самое. В моем коде есть разница между заглавными и прописными буквами, а в Вашем нет.
Хм... Не думаю, что автору вопроса нужно считать заглавные и строчные буквы отдельно. А по второму моему коду будет как раз самое то.
Да, мне действительно не нужно делать различие между "А" и "а"
И все равно мой вариант мне нравится больше хотя бы потому что я могу его скомпилировать в Delphi, а Ваш нет.
Для Delphi мой вариант тоже подходит. Просто нужно не readln(s), а передать функции значение.
Код
function Scht(s:string):string;
var mas:array['а'..'я'] of integer; 
i:integer; 
s:string; 
begin 
for i:=1 to length(s) do inc(mas[lowercase(s[i])]); 
for i:=1 to length(s) do if mas[s[i]]=1 then result:=result+s[i]+' '; 
end.
Проблема не в этом. Если уж так сильно хочется тратить время на лишнии преобразования,да еще и делать это в цикле, то нужно по крайней мере обходится без использования устаревших функций.
По-моему, если функция делает свое дело правильно и четко, то она не устареет. И впервые lowercase я начал использовать именно в Delphi. Я даже не знаю, работает ли она в Pascal. Смысл создавать "новые" аналоги?
Артем, а напишите вы функцию, которая будет считать буквы, невзирая на регистр?
Во-первых, функция lowercase на самом деле считается устаревшей и вместо нее рекомендуется использовать AnsiLowercase, потому что она может принимать многобайтовые строки и различные символы.
Во-вторых, я сейчас специально проверил Ваш код. Что интересно он у меня даже не скомпилировался.
Код
function Scht(s:string):string;
var mas:array['а'..'я'] of integer;
i:integer;
s:string; //Первая ошибка возникла здесь
begin
for i:=1 to length(s) do inc(mas[lowercase(s[i])]); //Вторая ошибка возникла здесь
for i:=1 to length(s) do if mas[s[i]]=1 then result:=result+s[i]+' ';
end.

Вопрос, у Вас точно эта функция работает или Вы её не проверяли?

Цитата
mihail filatov пишет:
Артем, а напишите вы функцию, которая будет считать буквы, невзирая на регистр?

Хорошо, чуть позже.
Артем, когда вы продемонстрируете пример?
Мой доработанный пример вашей функции, со исправленными недочетами
Код
function Scht(s:string):integer;
var mas:array['а'..'я'] of integer;
i:integer;
begin
s:=AnsiLowerCase(s);
for i:=1 to length(s) do mas[s[i]]:=0;
for i:=1 to length(s) do inc(mas[s[i]]);
result:=0;
for i:=1 to length(s) do if mas[s[i]]=1 then inc(result);
end;
Да, точно. Так будет лучше. Но, по-моему, два первых цикла можно смело объединить в один.
Нет, объединять их не стоит, потому что тогда мы правильного результата не получим.
Код
for i:=1 to length(s) do mas[s[i]]:=0; 
for i:=1 to length(s) do inc(mas[s[i]]);


Я думаю, будет тот же эффект. если сделать так:

Код
for i:=1 to length(s) do mas[s[i]]:=1;


Если я что-то не понял, разжуйте, пожалуйста
Код
function Scht(s:string):integer;
var mas:array['а'..'я'] of integer;


i:integer;

begin
 s:=AnsiLowerCase(s);

  for i:=1 to length(s) do mas[s[i]]:=1;
  for i:=1 to length(s) do inc(mas[s[i]]);

   result:=0;
  for i:=1 to length(s) do if mas[s[i]]=1 then inc(result);

end;


Вот так првильнее будет
c:\linux\bin
c:\linux\etc\X11\xorg.conf
d:\home\user
Страшный сон линуксоида.
Цитата
mihail filatov - Можно, конечно, код упростить. Но это я расписал для понятности.
- мне кажется так лучше... все же более понятнее
Страницы: 1
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)