Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Паскаль
Регистрация

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 05.02.2015, 00:19   #1
СанекКенас
Пользователь
 
Регистрация: 27.12.2014
Сообщений: 15
Репутация: 10
По умолчанию считывать каждую первую букву в слове и записывать ее в множество

нужно считывать каждую первую букву в слове и записывать ее в множество
Код:
program ghrklhw1;
type c=set of char;
var 
ch:c;
s:string;
i,j,k:integer;
begin
write('введите строку: ');
read(s);
ch:= [s[1] ];
begin
for i:= 2 to length(s) do
if s[i]=' ' then
while not(s[i+1] in ['.',' ', ',',';',':','?', '/', '!', '@']) do
ch:=ch+[s[i+1]];
end;
write(ch);
end.

Последний раз редактировалось Stilet; 05.02.2015 в 09:01.
СанекКенас вне форума   Ответить с цитированием
Старый 05.02.2015, 00:50   #2
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 413
Репутация: 302
По умолчанию

Я приведу пример фрагмент выделения слов
Код:
CONST
  {Список всех ограничителей слов в строке}
  Delimiters : TCharSet = [ ' ', '.', ',', '!', '?', '-', ':',
                           ';', '(', ')', '[', ']', '{', '}'
                         ];
...........................................................
  {i-текущая позиция в анализируемой строке}
  {ищем первую букву слова}
  while (i<=Length(Src)) do
    if (Src[i] in Delimiters)
      then Inc(i)
      else Break;
  StartPos:=i;{StartPos указывает на первую букву в слове или на "следующий за последним символом в строке"=Length(Src)+1}
  {теперь просматриваем слово пока не закончится строка или
   не начнутся ограничители слов}
  while (i<=Length(Src)) do
    if NOT(Src[i] in Delimiters)
      then Inc(i)
      else Break;
  GetLengthNextWord:=i-StartPos;{i - указывает на следующий за словом индекс (т.е. на очередной пробел)}
Идея почти как у тебя - сначала пропускаем разделители (результат StartPos - индекс первого символа очередного слова. А потом пропускаем буквы слова (результат i - индекс первого за словом символа-разделителя).
Заключив этот код в цикл while i<=length(str) можно выделить все слова.
А после выделения очередного слова выполнять поставленную задачу
Код:
if StartPos<=length(str) then
  include(ch, str[StartPos]);
Это идея.
-----------
Кстати, распечатка множества иная
Код:
var
  cc: char
.........
  for cc:=#0 to #255 do
    if cc in ch then
      write(cc);

Последний раз редактировалось FPaul; 05.02.2015 в 01:12.
FPaul на форуме   Ответить с цитированием
Старый 05.02.2015, 09:02   #3
СанекКенас
Пользователь
 
Регистрация: 27.12.2014
Сообщений: 15
Репутация: 10
По умолчанию пишет,что индекс вне массива

program ghrklhw1;
CONST
{Список всех ограничителей слов в строке}
Delimiters = [ ' ', '.', ',', '!', '?', '-', ':',
';', '(', ')', '[', ']', '{', '}'
];
type c=set of char;

var
ch:c;


s:string;
i,j,k:integer;
begin
write('введите строку: ');
read(s);
ch:= [ ];
begin
while (i<=Length(S)) do
if (s[i] in Delimiters)
then Inc(i)
else Break;
j:=i;

while (i<=Length(s)) do
if NOT(S[i] in Delimiters)
then Inc(i)
else break;
k:=i-j;
begin
if j<=length(s) then
ch:=ch+[s[j]];
end;
end;
write(ch);
end.
СанекКенас вне форума   Ответить с цитированием
Старый 05.02.2015, 10:21   #4
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 413
Репутация: 302
По умолчанию

При компиляции FPC выдал мне
tak_011_2.pas(20,9) Warning: Variable "i" does not seem to be initialized
tak_011_2.pas(36,10) Error: Can't read or write variables of this type
Так в предупреждении - твой индекс вне границ.
В ошибке - ранее я привел код как распечатать множество.

Номера строк и позиций символа в строке могут не совпадать с теми, что на твоём компе - т.к. у тебя, наверняка, текст форматирован.

Если не сложно - заключай код в теги (псевдо-кнопка # на форме ответа).

Последний раз редактировалось FPaul; 05.02.2015 в 10:26.
FPaul на форуме   Ответить с цитированием
Старый 05.02.2015, 10:57   #5
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,913
Репутация: 2242
По умолчанию

Код:
const 
  letters: c =['A'..'Z','a'..'z','А'..'Я','а'..'я'];

if s[1] in Letters then Include(ch,s[1]);  //ch:=ch+[s[1]];
for j:=2 to length(s) do begin
  if (s[j-1] not in Letters)  // разделитель это все что не буква
 and (s[j] in Letters) // и первая буква это стоящая сразу за разделителем
  then Include(ch, s[j]);
end;
__________________
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума   Ответить с цитированием
Старый 05.02.2015, 11:12   #6
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 413
Репутация: 302
По умолчанию

Прости, но зачем упрощать разбиение на слова, если ТС уже освоил более корректный алгоритм? Тем более, что в условии задачи в интерпретации ТС отсутствуют гарантии на содержимое первого элемента строки.
Добавлю, что в кодовой странице cp866 (той, что используетя в консоли) символы кириллицы расположены не по алфавиту (пруф).
FPaul на форуме   Ответить с цитированием
Старый 05.02.2015, 11:34   #7
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 413
Репутация: 302
По умолчанию

Слегка изменённый для удобства тестирования вариант - вариант ТС с внесёнными коррекциями.
Код:
program ghrklhw1;

const
  {Список всех ограничителей слов в строке}
  Delimiters = [' ', '.', ',', '!', '?', '-', ':', ';', '(', ')', '[', ']', '{', '}'];
type
  c = set of char;

var
  ch: c;
  cc: char;
  s:  string;
  i, j: integer;
begin
  Write('введите строку: ');
  //  Readln(s);
  s := 'one two, three! four - five';
  writeln(s);
  ch := [];
  i  := 1;
  while i <= length(s) do
  begin
    while (i <= length(s)) do
      if (s[i] in Delimiters) then
        Inc(i)
      else
        Break;
    j := i;
    while (i <= Length(s)) do
      if not (s[i] in Delimiters) then
        Inc(i)
      else
        break;
    if i <= length(s) then
      writeln(copy(s, j, i - j));
    if j <= length(s) then
      ch := ch + [s[j]];
  end;
  for cc := #0 to #255 do
    if cc in ch then
      Write(cc);
  writeln;
end.
FPaul на форуме   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Записать в массив каждую букву слова Faton 11 Общие вопросы C/C++ 6 10.01.2014 17:04
Автоматически изменять первую букву в слове на заглавную для Microsoft Office Excel. agregator Microsoft Office Excel 17 24.02.2012 10:56
Нужно переделать, чтобы программа могла считывать данные с файла и записывать в него результат. Kroleg Помощь студентам 2 13.11.2011 19:15
Как записывать и считывать Ini File с набором строк (#10#13) в одном параметре?) SkAndrew Общие вопросы Delphi 4 15.11.2008 01:02


22:47.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru