Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/14: Рейтинг темы: голосов - 14, средняя оценка - 4.93
ELipskij
3 / 3 / 0
Регистрация: 28.06.2009
Сообщений: 81
1

Строки. Удаление слов из массива

05.08.2009, 21:33. Просмотров 2559. Ответов 14
Метки нет (Все метки)

Дан массив слов. Из массива слов удалить слова, в которых нет повторяющихся букв.
Напишите функцию Good (m : string) : boolean, которая возвращает "подходит" ли слово или нет, тип возвращаемого значения - boolean.

Пример ввода:

3
Fg
gh
dhd
Пример вывода:

dhd
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2009, 21:33
Ответы с готовыми решениями:

Строки. Удаление повторяющихся слов
Добрый вечер, всё никак не получается удалить одинаковые слова, помогите...

Удаление слов из строки, выход за пределы массива
Нужно удалить все лова из чисел, примитивным способом не выделяя дополнительной...

Удаление из строки слов, длина которых меньше К символов
Удалить слова из заданного текста, длина которых меньше К символов. ...

Удаление строки из массива
Нужно ввести двумерный массив и удалить из него строку указанную Пользователем.

Текстовый файл. Вывести номер строки в которой больше всего слов и кол-во этих слов
в текстовом файле в нескольких строках записаны слова через запятую, вывести...

14
Puporev
Модератор
55095 / 42346 / 29247
Регистрация: 18.05.2008
Сообщений: 100,064
05.08.2009, 22:18 2
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
uses crt;
function Good(m:string):boolean;
var i,j:byte;
begin
for i:=1 to length(m)-1 do
for j:=i+1 to length(m) do
if m[i]=m[j] then{если есть одинаковые}
 begin
  Good:=false;{не подходит для удаления}
  break;
 end;
end;
var mas:array[1..100] of string;
    n,i,j:byte;
begin
clrscr;
repeat
write('Введите количество слов, не более 50 n=');
readln(n);
until n in [1..50];
writeln('Введите ',n,' слов:');
for i:=1 to n do
readln(mas[i]);
{удаляем из массива ненужные слова}
i:=1;
while i<=n do
 begin
  if Good(mas[i]) then
   begin
    for j:=i to n-1 do
    mas[j]:=mas[j+1];
    n:=n-1;
   end
  else i:=i+1;
  end;
writeln('Слова, содержащие повторяющиеся буквы:');
for i:=1 to n do
writeln(mas[i]);
readln
end.
0
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
06.08.2009, 04:35 3
Puporev, Я вот смотрю Вы каждый раз пишете что-то в духе:
Pascal
1
for i:=1 to length(m)-1 do
А ведь это столько лишних операций, намного проще завести переменую:
Pascal
1
2
var
  l:byte;
и один раз, перед циклами, записать:
Pascal
1
l:=length(m)
Ну и потом соответственно цикл сделать вот таким:
Pascal
1
for i:=1 to l-1 do
P.S. Да такой вариант который я предлагаю не всегда подходит, но Ваш вариант выполняет очень много лишних операций.
0
odip
Эксперт С++
7162 / 3221 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
06.08.2009, 21:02 4
2lexus_ilia: Хороший компилятор ( например компилятор C ) такую замену сам может сделать
А тут это не так важно - это же тестовые задания для начинающих.
Вот если обучать на проф. программиста - тогда другое дело.
0
ELipskij
3 / 3 / 0
Регистрация: 28.06.2009
Сообщений: 81
06.08.2009, 23:05  [ТС] 5
А в моей функции чё не так ?
Pascal
1
2
3
4
5
6
7
8
9
10
11
function Good(m:string):boolean;
 var i,j,p:byte;
 begin
  j:=length(m);
  for i:=1 to j do
  begin
   p:=pos(m[i],m);
   if p=0 then Good:=false;
   break;
  end;
 end;
0
TAVulator
Эксперт Pascal/Delphi
3966 / 1122 / 165
Регистрация: 27.07.2009
Сообщений: 3,494
06.08.2009, 23:18 6
ELipskij, у тебя логика не верная в функции.
ты проходишь всю строку, берешь каждый символ и проверяешь, если текущего символа нет в строке, то Good:=false.
Но на первом же символе ты после проверки выходишь из цикла...
0
ELipskij
3 / 3 / 0
Регистрация: 28.06.2009
Сообщений: 81
06.08.2009, 23:45  [ТС] 7
А.. ну да точно я пропустил
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function Good(m:string):boolean;
var i,j,p:byte;
begin
j:=length(m);
for i:=1 to j do
begin
 p:=pos(m[i],m);
 if p=0 then 
 begin
  Good:=false;
  break;
 end;
end;
end;
А теперь???
0
TAVulator
Эксперт Pascal/Delphi
3966 / 1122 / 165
Регистрация: 27.07.2009
Сообщений: 3,494
07.08.2009, 00:51 8
ELipskij, читаю твой алгоритм по строкам:
Pascal
1
for i:=1 to j do
-перебираем все буквы слова
Pascal
1
p:=pos(m[i],m);
- р - первое вхождение текущего символа... т.е. тут всегда будет р = i (!!!)
Pascal
1
if p=0 then
- если p=0, т.е. символ не нашли... а исходя из предыдущей строки понятно, что символ всегда будет найден и это условие никогда не выполнится.
Pascal
1
2
3
4
begin
  Good:=false;
  break;
 end;
этот кусок никогда не выполнится.

Добавлено через 2 минуты 33 секунды
ELipskij, чем тебе вариант, предложенный Puporev, не нравится?
Pascal
1
2
3
4
5
6
7
8
9
10
11
function Good(m:string):boolean;
var i,j:byte;
begin
for i:=1 to length(m)-1 do
for j:=i+1 to length(m) do
if m[i]=m[j] then{если есть одинаковые}
 begin
  Good:=false;{не подходит для удаления}
  break;
 end;
end;
очень разумное решение данной функции.
0
odip
Эксперт С++
7162 / 3221 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
07.08.2009, 00:54 9
очень разумное решение данной функции.
O(n*n) однако.
Можно сделать О(n)
0
TAVulator
Эксперт Pascal/Delphi
3966 / 1122 / 165
Регистрация: 27.07.2009
Сообщений: 3,494
07.08.2009, 00:59 10
Цитата Сообщение от odip Посмотреть сообщение
O(n*n) однако.
Можно сделать О(n)
не понял... это ты о чем?
0
Puporev
Модератор
55095 / 42346 / 29247
Регистрация: 18.05.2008
Сообщений: 100,064
07.08.2009, 07:22 11
O(n*n) однако.
Можно сделать О(n)
Конечно можно, просто написал как проще для понимания новичку.
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
uses crt;
function Good(m:string):boolean;
var i:byte;
begin
for i:=1 to length(m)-1 do
if pos(m[i],copy(m,i+1,255))>0 then
 begin
  Good:=false;{не подходит для удаления}
  break;
 end;
end;
var mas:array[1..100] of string;
    n,i,j:byte;
begin
clrscr;
repeat
write('Введите количество слов, не более 50 n=');
readln(n);
until n in [1..50];
writeln('Введите ',n,' слов:');
for i:=1 to n do
readln(mas[i]);
{удаляем из массива ненужные слова}
i:=1;
while i<=n do
 begin
  if Good(mas[i]) then
   begin
    for j:=i to n-1 do
    mas[j]:=mas[j+1];
    n:=n-1;
   end
  else i:=i+1;
  end;
writeln('Слова, содержащие повторяющиеся буквы:');
for i:=1 to n do
writeln(mas[i]);
readln
end.
Puporev, Я вот смотрю Вы каждый раз пишете что-то в духе:

Код Pascal1
for i:=1 to length(m)-1 do
А ведь это столько лишних операций, намного проще завести переменую:

Код Pascal1
2
var
l:byte;
Если я ничего не путаю, то длина строки содержится в нулевой ячейке строкового массива и оттуда вызывается. Поэтому не понимаю о каких лишних операциях речь и зачем создавать еще одну переменную для хранения этой величины, если уже есть s[0]. Зато если длина строки в программе динамически меняется при вставке или удалении элементов, то с дополнительной переменной точно пролетите.
0
odip
Эксперт С++
7162 / 3221 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
07.08.2009, 19:48 12
не понял... это ты о чем?
http://ru.wikipedia.org/wiki/«O»_большое_и_«o»_малое
O(N*N) значит что при размере массива в N элементов нужно выполнить действий <= const*N*N.
O(N) значит что при размере массива в N элементов нужно выполнить действий <= const*N.

Понятно что при больших числах N алгоритм имеющий сложность O(N) намного лучше алгоритма O(N*N).
Но как правильно заметил Puporev в задачах для новичков есть своя специфика.
А именно - большая эффективность не нужна, новичкам главное, чтобы они поняли хотя бы простой алгоритм

Добавлено через 2 минуты 5 секунд
длина строки содержится в нулевой ячейке строкового массива
Для коротких строк Паскаля ( от 0 до 255 символов ) это верно.
0
modjo
1 / 1 / 0
Регистрация: 23.05.2009
Сообщений: 43
08.08.2009, 10:45 13
Вот это не показывает длину строки:

Pascal
1
2
3
4
5
6
var s : string;
begin
  write('enter text: ');
  readLn(s);
  write(s[0]);
end.
0
schdub
Эксперт С++
3039 / 1381 / 421
Регистрация: 19.01.2009
Сообщений: 3,693
Завершенные тесты: 1
08.08.2009, 11:16 14
Конечно не покажет, потому что нужно так:
Pascal
1
2
3
4
5
6
7
var s : string;
begin
  write('enter text: ');
  readLn(s);
  write(Ord(s[0]));
  ReadLn;
end.
Если я ничего не путаю, то длина строки содержится в нулевой ячейке строкового массива и оттуда вызывается. Поэтому не понимаю о каких лишних операциях речь и зачем создавать еще одну переменную для хранения этой величины, если уже есть s[0].
Абсолютно поддерживаю Puporev'a, в данном случае. Раньше, я думал как и Илья. Но после некоторых изысканий, выянилось, что компилятор TP заменяет вызов функции
Pascal
1
b := length(str1);
на
Assembler
1
2
mov     al, byte ptr str1
mov     b, al
Всего две операции!!! Тут не идет речи о вызове функции или о цикле - всего две операции.
0
odip
Эксперт С++
7162 / 3221 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
09.08.2009, 10:19 15
всего две операции
Если положить в регистр - то одна
0
09.08.2009, 10:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2009, 10:19

Перестановка и удаление слов.
Дано предложение.Если количество слов четное то поменять местами первое и...

Удаление слов из текста
Безуспешно пытаюсь решить эту задачу, гугл не помогает: Составьте программу...

Удаление слов в строке
Здравствуйте,нужна ваша помощь. У меня не получается выполнить заданое...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru