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

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

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

Автор: RIDDICK 12.05.2005 3:45

Дана последовательность, содержащая от 2 до 50 слов, в каждом из которых от 1 до 8 строчных латинских букв; между соседними словами – запятая или не менее одного пробела, за последним словом - точка.

Напечатать те слова последовательности, которые отличны от последнего слова и удовлетворяют следующему свойству:
- буквы слова упорядочены по алфавиту;
Напечатать те слова последовательности, которые отличны от последнего слова, предварительно преобразовав каждое из них по следующему правилу:
- перенести последнюю букву в начало слова.

помогите решить... горю... стринги еще не прошли ((

Автор: Altair 12.05.2005 3:54

разбиваем тест на слова.
http://forum.pascal.net.ru/index.php?showtopic=2361&view=findpost&p=28059
затем проходим массив и печатаемнужные элементы.

Автор: RIDDICK 12.05.2005 11:02

это понятно... а как определить, что буквы в слове по алфав. порядку ?

Автор: hiv 12.05.2005 12:23

Попробуй нечто вроде этого:

var i: integer;
s: string;
boy: boolean;

. . . . . .

i:=2;
if length(s)>1 then boy:=(ord(s[i])=(ord(s[i-1])+1))
else boy:=true;
while (i<length(s)) and boy do
begin
inc(i);
boy:=(ord(s[i])=(ord(s[i-1])+1));
end;
if boy then writeln('Буквы в слове расположены по алфавиту! ');

Автор: RIDDICK 12.05.2005 12:56

это нечто дает тру только если слово типа "абв"... но никак не "абг" )

Автор: RIDDICK 12.05.2005 13:12

далее, я не совсем понял про PChar, без которого тут никак имхо .

Автор: hiv 12.05.2005 13:23

Чтобы учесть

Цитата
это нечто дает тру только если слово типа "абв"... но никак не "абг"

Тогда замени это:
if length(s)>1 then boy:=(ord(s[i])=(ord(s[i-1])+1))

на вот это:
if length(s)>1 then boy:=(ord(s[i])>ord(s[i-1]))


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

Автор: volvo 12.05.2005 15:18

Цитата(RIDDICK @ 12.05.05 9:12)
я не совсем понял про PChar, без которого тут никак имхо.

Можно пояснить, с какой стороны тут никак не обойтись без PChar?

Автор: RIDDICK 12.05.2005 19:05

2volvo

вводимая строка иметь будет длину около 400 символов

Автор: volvo 12.05.2005 19:13

Ну и что? Обязятельно прикручивать PChar? А у тебя где-то в условии сказано, что дана СТРОКА содержащая ... ? У тебя речь идет о ПОСЛЕДОВАТЕЛЬНОСТИ, не так ли? Вот и используй

Var
sequence: array[1 .. 400] of char;

И не нужен тебе PChar, если вы еще даже String не проходили, то о чем-то более серьезном вообще разговора нет. Ну, а если речь о том, что символы ВВОДЯТСЯ с клавиатуры, то почему бы не вводить их сразу в массив слов (минуя буферную переменную)?

Автор: RIDDICK 12.05.2005 19:17

как бы объяснить... лектор отстает на пару лекций от учебной практики )

" между соседними словами – запятая или не менее одного пробела, за последним словом - точка." - поэтому надо одной строкой (((

Автор: hiv 13.05.2005 13:39

Цитата
Дана последовательность, содержащая от 2 до 50 слов...

Как собираетесь ее задавать? Читать из файла или с клавиатуры вводить?

Автор: RIDDICK 13.05.2005 18:37

с клавиатуры

Автор: hiv 13.05.2005 19:17

Ввод строки:

uses Crt;

var q :char;
count :integer; {количество вводимых символов}
s :array[1..400] of char; {обходимся без PChar}

begin
count:=0;
repeat
q:=readkey;
if ord(q)<>13 then
begin
inc(count);
ss[count]:=q;
end;
until ord(q)=13;

. . . . . .
end.


Имей в виду, при вводе редактировать нельзя!!!