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

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

Форум «Всё о Паскале» _ Алгоритмы _ Строки

Автор: acid_burn 1.11.2008 1:51

Помогите пожалуйста решить такую задачку, что-то никак не соображу!

Код
В пpоизвольном тексте найти и отпечатать все слова, заканчивающиеся буквой r.

Автор: Lapp 1.11.2008 5:05

В подфоруме "Задачи" есть прикрепленная тема, называется типа "Все способы разбиения на слова". Зайди в Задачи - сразу ее увидишь.
После того, как текст разбит на слова, останется только пройтись по ним в цикле оператором типа такого:

if w[Length(w)]='r' then WriteLn(w)

Автор: acid_burn 4.11.2008 16:05

Спасибо большое!!! Не подскажешь как можно заменить паскалевскую функцию "copy" на что-то похоже в с++?

Автор: volvo 4.11.2008 16:17

Цитата
как можно заменить паскалевскую функцию "copy" на что-то похоже в с++?
strcpy, strncpy, std::string.substr, мало ли как... Ты расскажи, что ты подразумеваешь под строкой сначала...

Автор: acid_burn 5.11.2008 0:11

Я имею в виду, как заменить вот этот кусок программы

Код
w[n] := copy(s, back, i-back);
! smile.gif

Автор: volvo 5.11.2008 0:19

А я имею в виду, как у тебя описаны W и S...

(не надо никогда дословно переводить программы с Паскаля на С/С++. Проще будет написать заново, чем заставить это перевод работать правильно. Если у тебя чистый С - то strtok в помощь, в две строчки кода делается разбиение на слова. Если С++ - то есть другие средства).

Автор: acid_burn 5.11.2008 0:38

Вот я и мучуюсь, как описать w. S описана у меня как char s[100]; А как вот массив строк описать я не понимаю. А как уж присовоение написать подавно. Я новичок, си учу 3 недели только. Подскажи пожалуйста елси можешь. smile.gif

(СПС. Учту на будущее. У меня С++.)

Автор: acid_burn 5.11.2008 2:02

Помогите пожалуйста решить задачу написанную в первом посте, но уже на языке С++!

Автор: volvo 5.11.2008 2:26

#include <conio.h> // для getch()
#include <stdio.h>
#include <string.h>

int main() {

char s[] = "this is the test for acid_burn: star, force";

// это - разделители: слова в строке могут разделяться пробелами, двоеточиями,
// точками и запятыми... Можешь добавить еще чего-нибудь, если нужно...
char *delimiters = " :,.";


char *result = NULL; // это - простой указатель на строку, инициализированный NULL-ом

// получаем первое слово строки с помощью библиотечной функции strtok:
// первый параметр = строке, которую разбиваем на слова
result = strtok(s, delimiters);

// следующий цикл будет выполняться до тех, пор, пока в строке еще остались слова,
// то есть, пока result не равен NULL (как только он будет NULL - выходим из цикла)
while(result) {
// здесь в result хранится указатель на очередное слово,
// проверяем последний символ этого слова (не забываем ,что в С символы в строке
// индексируются с 0), и если он == 'r' выводим слово на печать
if(result[strlen(result) - 1] == 'r') printf("%s ", result);

// попытка получить следующее слово в заданной строке.
// Особенность функции strtok - в том, что ей после того, как первое слово уже найдено
// не надо указывать саму строку, нужно первым параметром передавать NULL, тогда
// эта функция будет работать с той же строкой, что и при первом вызове...
result = strtok(NULL, delimiters);
}

// Добавляем ожидание нажатия на кнопку...
getch();

return 0; // и выходим из программы
}
Должно работать и для С++, и для чистого С...

Автор: acid_burn 5.11.2008 2:41

Спасибо огромное smile.gif . Но как сделать чтобы программа задерживалась.(т.е что бы я смог увидеть рез-т)
И ещё, не мог бы ты дать описание программы по каждой строчки, начиная с

Код
  char *result = NULL;
, а то мы ещё такого не проходили.

Автор: volvo 5.11.2008 3:18

Комментарии добавлены, ожидание нажатия с клавиатуры - тоже...

Автор: acid_burn 5.11.2008 3:30

Спасибо за подробное описание. good.gif Теперь разобрался! Ещё раз спасибо! smile.gif

Добавлено через 17 мин.

Код
char *result = NULL;
А для чего его нужно инициализировать нулём?

Автор: volvo 5.11.2008 4:44

Цитата
А для чего его нужно инициализировать нулём?
Чтоб там не хранился указатель на какой-нибудь мусор... Желательно вообще инициализировать все переменные при описании. Ну, кстати, совсем не обязательно нулем... Можно сделать так:
...
char *delimiters = " :,.";
char *result = strtok(s, delimiters); // сразу искать первое слово в S
...


Автор: acid_burn 5.11.2008 4:58

Ну всё, вроде отсальное понятно. СПС.