Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
12 / 12 / 8
Регистрация: 03.11.2009
Сообщений: 35
1

Напечатать слова, отличные от последнего слова, которые симметричны

29.01.2010, 10:22. Показов 982. Ответов 9
Метки нет (Все метки)

народ помогите пожалуйста решить задачу....
нужно срочно, а для того чтобы разобратся самому катострафически не хватает времени.
Дана строка символов S, состоящая из латинских букв. Группы символов, разделенные пробелами и не содержащие пробелов внутри себя, будем называть словами. Преобразовать исходную строку в строки S1 и S2 в соответствии с пунктами 1 и 2 задания. Если какая-либо из итоговых строк окажется пустой, выводить соответствующее сообщение.
п.1. - Напечатать слова, отличные от последнего слова, которые симметричны.
п.2. - Напечатать все слова, отличные от последнего слова, заменив первое вхождение х на ks, если такое есть.
Вложения
Тип файла: doc задание.doc (27.0 Кб, 41 просмотров)
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2010, 10:22
Ответы с готовыми решениями:

Напечатать все слова, отличные от последнего слова, предварительно удалив из каждого слова последнюю букву
1) Программа. Дан текстиз строчных русских букв, закоторым следует точка. Напечатать этот текст...

Из последовательности слов напечатать все слова, отличные от последнего слова
Надо написать программу, а я в программирование не силен. Дана непустая последовательность слов,...

Напечатать слова, отличные от последнего слова, в которых наибольшее количество упорядоченных букв
№ 19 п.1. - Напечатать те слова, отличные от последнего слова, в которых наибольшее количество...

Напечатать все слова, отличные от последнего слова предварительно преобразовав каждое из них
Дан текст. Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое...

9
141 / 135 / 69
Регистрация: 15.12.2009
Сообщений: 343
29.01.2010, 10:59 2
второе услови
Pascal
1
2
3
4
5
6
7
8
9
10
var s:string;
i:integer;
begin
readln(s);
for i:=1 to length(s) do
if s[i]='x' then  begin s[i]:='k';
s[i+1]:='s';  end;
write(S);
readln;
end.
отличные от последнего слова, т.е последние слово не должно выводить?
0
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
29.01.2010, 11:12 3
А что это за программа? Под какое условие?
И зачем вы написали ее здесь?
0
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
29.01.2010, 11:24 4
Цитата Сообщение от andrei63 Посмотреть сообщение
второе услови
Pascal
1
2
3
4
var s:string;
i:integer;
...
end.
отличные от последнего слова, т.е последние слово не должно выводить?
-----------
Это тоже в 3 часа ночи написано?
0
Почетный модератор
64089 / 47498 / 32734
Регистрация: 18.05.2008
Сообщений: 115,182
29.01.2010, 11:24 5
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

andrei63, Чтобы заменить один символ двумя, так делать нельзя, Вы меняете символ стоящий после х, а это не правильно. Правильно так.
Pascal
1
2
3
4
5
6
for i:=length(s) downto 1 do
if s[i]='x' then
 begin
  s[i]:='k';
  insert('s',s,i+1);
 end;
0
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
29.01.2010, 11:27 6
Вообще-то andrei63 написал что-то для своего, известного только ему, условия!
Соответственно, может быть там так можно... ))))
0
12 / 12 / 8
Регистрация: 03.11.2009
Сообщений: 35
29.01.2010, 14:13  [ТС] 7
или подскажите где можно что-нить подобное глянуть!
0
3306 / 1368 / 110
Регистрация: 28.04.2009
Сообщений: 4,822
29.01.2010, 18:58 8
Цитата Сообщение от elmestre Посмотреть сообщение
или подскажите где можно что-нить подобное глянуть!

Не по теме:

наверно на форуме, в поиске поискать

0
13077 / 5862 / 1706
Регистрация: 19.09.2009
Сообщений: 8,807
30.01.2010, 01:46 9
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Предлагаю такой код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
program Project1;
 
const
  (*Исходная строка.*)
  StrData = 'This is test. Asd asdsa asa xsdxsd xx x sdf sdfds asa.';
  (*Множество разделителей слов. Char(9) - это символ табуляции.*)
  Delims = [' ', '.', ',', ':', ';', '!', '?', Char(9)];
var
  (*Индекс очередной буквы.*)
  i, j : Integer;
  (*Позиции первой и последней буквы в слове.*)
  Pos1, Pos2 : Integer;
  (*Последнее слово в строке.*)
  StrTmpl : String;
  (*Очередное обрабатываемое слово.*)
  StrWord : String;
  (*Флаг, применяемый при проверке условий.*)
  Check : Boolean;
  (*Строки результата: StrRes1 - по заданию №1, StrRes2 - по заданию №2.*)
  StrRes1, StrRes2 : String;
begin
 
  StrRes1 := '';
  StrRes2 := '';
 
  (*Исходная строка*)
  Writeln('StrData = "' + StrData + '"');
 
  (*Выделяем последнее слово в строке. Движемся справа-налево.*)
  (*Кроме того, что переменная Pos1 предназначена для хранения индекса первой буквы
  слова, но используется так же как флаг. Если Pos1 = -1 - значит первая буква
  слова пока не найдена.*)
  Pos1 := -1;
  for i := Length(StrData) downto 1 do begin
    (*Конец слова.*)
    if i = Length(StrData) then begin
      if not (StrData[i] in Delims) then begin
        Pos2 := i;
      end;
    end else begin
      if ( StrData[i + 1] in Delims ) and ( not (StrData[i] in Delims) ) then begin
        Pos2 := i;
      end;
    end;
    (*Начало слова.*)
    if i = 1 then begin
      if not (StrData[i] in Delims) then begin
        Pos1 := i;
      end;
    end else begin
      if ( StrData[i - 1] in Delims ) and ( not (StrData[i] in Delims) ) then begin
        Pos1 := i;
      end;
    end;
 
    (*Если слово найдено, то запоминаем его и выходим из цикла.*)
    if Pos1 <> -1 then begin
      StrTmpl := Copy(StrData, Pos1, Pos2 - Pos1 + 1);
      Break;
    end;
  end;
 
  (*Если не обнаружено ни одного слова - выходим.*)
  if Pos1 = -1 then begin
    Writeln('V ishodnoy stroke net slov. Deistvie otmeneno.');
    Readln;
    Exit;
  end;
 
  (*Выделяем слова и анализирем их. Движемся слева-направо.*)
  (*Переменная Pos2 предназначена для хранения индекса последней буквы слова.
  Кроме этого Pos2 используется как флаг: если Pos2 = -1 - значит последняя
  буква слова пока не найдена.*)
  Pos2 := -1;
  for i := 1 to Length(StrData) do begin
    (*Начало слова.*)
    if i = 1 then begin
      if not (StrData[i] in Delims) then begin
        Pos1 := i;
      end;
    end else begin
      if ( StrData[i - 1] in Delims ) and ( not (StrData[i] in Delims) ) then begin
        Pos1 := i;
      end;
    end;
    (*Конец слова.*)
    if i = Length(StrData) then begin
      if not (StrData[i] in Delims) then begin
        Pos2 := i;
      end;
    end else begin
      if ( not (StrData[i] in Delims) ) and ( StrData[i + 1] in Delims ) then begin
        Pos2 := i;
      end;
    end;
 
    (*Если очередная буква не является последней буквой слова, то "перепрыгиваем"
    блок анализа слова.*)
    if Pos2 = -1 then Continue;
 
    (*Очередная буква является концом слова. Это означает, что в данный момент
    переменная Pos1 содержит индекс первой буквы слова, а переменная Pos2 содержит
    индекс последней буквы слова.*)
 
    (*Анализируем слово.*)
 
    StrWord := Copy(StrData, Pos1, Pos2 - Pos1 + 1);
 
    (*Сверка с шаблоном.*)
    if StrTmpl = StrWord then begin
      Pos2 := -1;
      Continue;
    end;
 
    (*Проверка на симметричность.*)
    Check := True;
    for j := 0 to (Pos2 - Pos1 + 1) div 2 - 1 do begin
      if StrData[Pos1 + j] <> StrData[Pos2 - j] then begin
        Check := False;
        Break;
      end;
    end;
 
    (*Если слово симметричное, то добавляем его в строку StrRes1.*)
    if Check then begin
      if StrRes1 <> '' then StrRes1 := StrRes1 + ', ';
      StrRes1 := StrRes1 + StrWord;
    end;
 
    if StrRes2 <> '' then StrRes2 := StrRes2 + ', ';
 
    (*Производим замену первого вхождения 'x' на 'ks'.*)
 
    (*Ищем позицию первого символа 'x'.*)
    Check := False;
    for j := Pos1 to Pos2 do begin
      if StrData[j] = 'x' then begin
        Check := True;
        Break;
      end;
    end;
 
    (*Если требуется, изменяем слово и добавляем его в строку StrRes2.*)
    if Check then begin
      if j > Pos1 then begin
        StrRes2 := StrRes2 + Copy(StrData, Pos1, (j - 1) - Pos1 + 1);
      end;
      StrRes2 := StrRes2 + 'ks';
      if j < Pos2 then begin
        StrRes2 := StrRes2 + Copy(StrData, j + 1, Pos2 - (j + 1) + 1);
      end;
    end else begin
      StrRes2 := StrRes2 + Copy(StrData, Pos1, Pos2 - Pos1 + 1);
    end;
 
    (*Устанавливаем флаг.*)
    Pos2 := -1;
  end;
 
  (*Распечатка результатов.*)
  Writeln('StrRes1 = "' + StrRes1 + '"');
  Writeln('StrRes2 = "' + StrRes2 + '"');
 
  Readln;
 
end.
Делал в Delphi. Но должно работать и в Pascal. Логические выражения проектировал так, чтобы код был совместим с Pascal. (Т. к. в Delphi лог. выражения вычисляются слева-направо, а в Pascal - толи справа-налево, толи в зависимости от решения оптимизатора).
0
Retired
7724 / 2556 / 671
Регистрация: 17.10.2009
Сообщений: 5,100
30.01.2010, 05:32 10
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
uses
  Crt;
const
  Dividers=[' ',',','.',';',':','-','=','+'];
procedure Re(var s:string);
begin
  if Pos('x',s)<>0 then
  begin
    Insert('ks',s,Pos('x',s));
    Delete(s,Pos('x',s),1)
  end
end;
function FindLW(s:string):string;
var
  i,j:byte;
begin
  i:=Length(s);
  while (s[i] in Dividers) and (i>=1) do
    Dec(i);
  j:=i;
  while not (s[j] in Dividers) and (j>=1) do
    Dec(j);
  FindLW:=Copy(s,j+1,i-j)
end;
function Pall(s:string):boolean;
var
  i:byte;
begin
  for i:=1 to Length(s) div 2 do
    if s[i] <> s[Length(s)-i+1] then
    begin
      Pall:=false;
      exit
    end;
  Pall:=true
end;
var
  s,s1,s2,temp,lw: string;
  i: byte;
begin
  ClrScr;
  S:='This is test. Asd asdsa asa xsdxsd xx x sdf sdfds asa.';
  temp:='';
  s1:='';
  s2:='';
  lw:=FindLW(s);
  for i:=1 to Length(s)-Length(lw) do
  begin
    if not (s[i] in Dividers) then
      temp:=temp+s[i];
    if ((s[i] in Dividers) or (i=Length(s))) and (temp<>'') then
    begin
      if temp <> lw then
      begin
        if Pall(temp) then
          s1:=s1+temp+' ';
        Re(temp);
        s2:=s2+temp+' '
      end;
      temp:=''
    end
  end;
  if s1<>'' then
    WriteLn(s1)
  else
    WriteLn('Ïî ï.1 ñëîâ íå íàéäåííî!');
  if pos('x',Copy(s,1,Length(s)-Length(lw)))<>0 then
    WriteLn(s2)
  else
    WriteLn('Â ïðåäëîæåíèè íåò ñëîâ äëÿ âûïîëíåíèÿ ï.2!');
  ReadLn
end.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.01.2010, 05:32

Напечатать все слова, отличные от последнего слова, предварительно преобразовав их по заданному правилу
Добрый день помогите пожалуйста ! Само условие я сделал . Не могу понять как задать от 2 до 30...

Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них
не понимаю код программы const word_count = 100; type type_string_array = array of string;...

Строка: Напечатать все слова, отличные от последнего слова
Строковый тип! Дана последовательность, содержащая от 2 до 30 слов, в каждом из которых от 2 до...

Напечатать все слова, отличные от последнего слова
№ 19 п.2. - Напечатать все слова, отличные от последнего слова. Если слово четной длины, заменить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru