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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2010, 19:44   #1
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
Радость Проблемка с функцией pos() строки

Смысл задачки:
Найти количество слов в строке, первый и последний символ в которых совпадают.
Программка пока пишется для правильного текста, то есть без лишних пробелов, знаков и тп.

Тут я нахожу первый пробел, запоминаю всё от начала строки до пробела как слово, проверяю его, обрезаю исходную строку на его длину, и так пока вся строка не кончится.

Код:
var st, word: string;
    i, k, sum: integer;
begin
sum := 0;
read(st);
repeat
  k := pos(' ', st)-1;
  for i := 1 to k do
    word[i] := st[i];
  if word[1] = word[k+1] then inc(sum);
  delete(st, 1, k+1);
until pos(' ', st) = 0;
writeln('Number of words in which the first and last character of identical:', sum);
readln;
end.
А теперь суть проблемы:
программа умирает на строке
Код:
  k := pos(' ', st)-1;
Выдаёт много английский букаф на счет адресов каких-то и закрывается)

Ниче не пойму, в теории всё работает хорошо... ^_^"

Последний раз редактировалось Риндера; 02.11.2010 в 19:52.
Риндера вне форума Ответить с цитированием
Старый 02.11.2010, 19:58   #2
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Код:
var st, word: string;
                 k, sum: integer;
begin
sum := 0;
read(st);
repeat
st:=st+' ';
k := pos(' ', st);
word:=copy(st,1,k-1);
if word[1]=word[length(word)] then sum:=sum+1;
delete(st,1, k);
st:=trim(st);
until pos(' ', st) = 0;
writeln('Number of words in which the first and last character of identical:', sum);
readln;
end.
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"

Последний раз редактировалось Mad_Cat; 02.11.2010 в 20:01.
Mad_Cat вне форума Ответить с цитированием
Старый 02.11.2010, 20:09   #3
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

Спасибо. Он оказывается просто ругался на русские буквы. С английскими ЭТОТ код работает, а с русскими такая же ошибка =)

А что вот это значит?
Код:
  st:=trim(st);

П.С. оказывается не от букв зависит, а от того, есть ли пробелы в изначальной строке... Если ввожу одно слово - ошибка %)
Риндера вне форума Ответить с цитированием
Старый 02.11.2010, 20:12   #4
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Удаляет начальные и конечные пробелы в строке
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 02.11.2010, 20:15   #5
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

Ясно, спасибо большое =)
Риндера вне форума Ответить с цитированием
Старый 02.11.2010, 20:43   #6
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

А смотри теперь какая пррблемка возникла:
1. Если использовать цикл с постусловием, то нельзя вводить одно слово.
2. Если цикл с предусловием, то он не выполняется для последнего слова.

Как из этого можно выйти?) Проверять, последнее ли слово, и если да, то добавлять пробел в конец?


Upd. Извиняюсь за свою тугодумность, проблема оказалась совсем не проблемой)

Последний раз редактировалось Риндера; 02.11.2010 в 20:47.
Риндера вне форума Ответить с цитированием
Старый 02.11.2010, 20:48   #7
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
А смотри
Цитата:
Если использовать цикл с постусловием, то нельзя вводить одно слово.
можно -все работает проверено
Цитата:
Если цикл с предусловием, то он не выполняется для последнего слова.
а так??
Код:
var st, word: string;
                 k, sum: integer;
begin
sum := 0;
readln(st);
st:=st+' ';
while st <>'' do begin
st:=st+' ';
k := pos(' ',st);
word:=copy(st,1,k-1);
if word[1]=word[length(word)] then sum:=sum+1;
delete(st,1, k);
st:=Trim(st);
end;
writeln('Number of words in which the first and last character of identical:', sum);
readln;
end.
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"

Последний раз редактировалось Mad_Cat; 02.11.2010 в 20:54.
Mad_Cat вне форума Ответить с цитированием
Старый 02.11.2010, 20:58   #8
pray_driver
Форумчанин
 
Аватар для pray_driver
 
Регистрация: 18.08.2010
Сообщений: 140
По умолчанию

Риндера, а нельзя вот так вот:

Идем по строке, натыкаемся на непробельный символ. Оба-на, значит это начало слова, отмечаем это каким-нибудь логическим идентификатором. идем дальше, до тех пор, пока не будет пробел (или конец строки). Если наткнулись на пробел - смотрим поледний непробельный символ. Если он совпал с первым - увеличиваем счётчик на 1, если нет - ну и бог с ним, идентификатору слова ставим false, и ищем следующее слово либо конец строки

Интересный рассказ получился Но помоему всё просто
Люди бывают десяти типов: те, кто знают двоичную систему, и те, кто нет
pray_driver вне форума Ответить с цитированием
Старый 02.11.2010, 21:05   #9
Риндера
Delphi, учу С
Форумчанин
 
Аватар для Риндера
 
Регистрация: 20.10.2010
Сообщений: 178
По умолчанию

pray_driver, это тоже вариант, но разбивать на слова реально проще.
Mad_Cat, спасибо за уделенное время)
Но я в начала цикла с постусловием просто добавила
Код:
if pos(' ', st) = 0 then st := st + ' ';
Цитата:
Сообщение от Mad_Cat Посмотреть сообщение
можно -все работает проверено
У меня все-таки с ошибкой вылетает... Может из-за того что пишу в делфи,а не турбопаскале...
Риндера вне форума Ответить с цитированием
Старый 03.11.2010, 06:45   #10
pray_driver
Форумчанин
 
Аватар для pray_driver
 
Регистрация: 18.08.2010
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Риндера Посмотреть сообщение
pray_driver, это тоже вариант, но разбивать на слова реально проще.
Код:
Function count_words(st : String) : Integer;
Var
    k : Integer; //счетчик слов с нужным свойством
    i : Integer; // бегунок
    sn : String[1]; //cимвол начала слова
begin
    k:=0;
    sn := '';
    st := st + ' ';  // прибавим к строке последний символ чтобы был пробел
    for i := 1 to length(st) do
    begin
        if (st[i] <> ' ') and (sn = '') then sn := st[i] // запоминаем символ, если не пробел и начало слова
        else if (st[i] = ' ') and (sn <> '') then
        begin
            if sn = st[i-1] then inc(k);     // сравниваем с последним символом в слове,если совпадает: +1
            sn := ''
        end
    end;
    count_words := k;
end;
-да ладно! Вот без лишних функций прошлись и всё посчитали
Люди бывают десяти типов: те, кто знают двоичную систему, и те, кто нет
pray_driver вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция Pos в Delphi Fantom Помощь студентам 8 04.05.2012 18:56
Ошибка в POS KREGI Общие вопросы Delphi 31 08.12.2009 00:28
Проблемка с функцией tetra91 Общие вопросы C/C++ 4 10.11.2009 16:04
pos и copy zotox Помощь студентам 1 23.10.2008 21:13