IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> И снова строки, Удаление повторяющихся символов
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Женский
Реальное имя: Марина

Репутация: -  0  +


И снова проблема, и снова не могу никак решить, уже над этой задачи вторую неделю сижу и не могу закончить.

ЗАДАНИЕ: Дана последовательность, содержащая от 2 до 30 слов, в каждом из которых от 2 до 10 латинских букв; между соседними словами – не менее одного пробела, за последним словом – точка. Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по следующему правилу:
Оставить в слове только первые вхождения каждой буквы.

С первым условием справились с горем пополам, использовав FAQ по строкам made by вами.
А вот второе.. НУ НИКАК! не удалеяет симоволы вот. Может это уже проблема многочасовго сидения за данной проблемой.


Код

program strochki;
uses crt;
type wmas=array[1..100] of string;
{mumumu - исходная строка
myp - последние слово
yry - строка из слов не совпадающих с последним словом не одним символом
xex - массив исходных слов
lol - массив слов не совпадающих с последним словом не одним символом
f - флажок для проверки первого совпадения символов
kyky - переменная для нахождения номера символа, с которого начинается найденная подстрока в строке.
i,j,k,l,q,c - различные счетчики, задействованные и нет.
y,z - вспомогательные строки}


{Процедура для вставки слов из строки в массив}
procedure GetWords(mumumu:string; var xex:wmas);
var i,j:shortint;
    mm:string;
begin
while pos('  ',mumumu)<>0 do delete(mumumu,pos('  ',mumumu),1);
if mumumu[1]=' ' then delete(mumumu,1,1);
if mumumu[length(mumumu)]=' ' then delete(mumumu,length(mumumu),1); {г¤ «Ґ­ЁҐ «Ёи­Ёе Їа®ЎҐ«®ў}
i:=1;
for j:=1 to length(mumumu) do
if mumumu[j]<>' ' then xex[i]:=xex[i]+mumumu[j] else if i<>high(xex) then inc(i); {§ Ї®«­пҐв ¬ ббЁў б«®ў ¬Ё Ё§ ба®ЄЁ}
end;

var mumumu,yry,myp,byrara,y,z:string;
    xex,lol:wmas;
    kyky,c:integer;
    i,k,q,j,l:shortint;
    f:boolean;

label bu;

    begin
clrscr;
writeln('Введите строку, разделяя слова пробелами, в конце поставьте точку.');
readln(mumumu);
byrara:=mumumu;

GetWords(byrara,xex);
k:=(length(mumumu)-1);
while mumumu[k]<>' ' do begin inc(i); dec(k); end;
myp:=copy(mumumu,k+1,i);
writeln('Последние слово: ', myp);

for k:=1 to high(xex) do begin

    f:=false;

 for l:=1 to length(myp) do begin
     kyky:=1;
     kyky:=pos(myp[l],xex[k]);
     if kyky=0 then f:=true;
     end;

    if f=true then yry:=yry + xex[k]+ ' ';

end;

writeln('Исключительные словав: ',yry);

{--------------------------------------------------}
GetWords(yry,lol);
for i:=1 to high(lol) do begin
    y:=lol[i];
    for k:=1 to length(y) do begin
 kyky:=pos(y[k],y);
 q:=length(y);
 z:=copy(y,kyky,q);
 kyky:=pos(y[k],z);
 if kyky<>0 then delete(y,kyky,1)
 end;
    end;
for j:=1 to high(lol) do
write(lol[j],' ');
readkey;
end.


НЕ РАБОТАЕТ: удаление повторяющихся символов в словах не совпадающих с последним словом, не одним символом. {последняя часть программы}

помогите... пожалуйста!!

Сообщение отредактировано: mapblwka -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






mapblwka, blink.gif у меня от таких имен переменных вот что началось: wacko.gif

Все предельно просто:
program strochki;
uses crt;

type
TWords = array[1 .. 100] of string;

Function GetWords(s: string; var arr: TWords): integer;
var
i, p: shortint;
begin
while pos(' ', s) <> 0 do
delete(s, pos(' ', s), 1);

if s[1] = ' ' then delete(s, 1, 1);
if s[length(s)] = ' ' then delete(s, length(s), 1);

i := 1;
repeat
p := Pos(' ', s); inc(i);
if p > 0 then begin
arr[i] := copy(s, 1, pred(p)); delete(s, 1, p)
end
else arr[i] := s
until p = 0;
GetWords := i;
end;


Function Convert(s: string): string;
var i: integer;
begin
i := 1;
while i <= length(s) do begin
if pos(s[i], copy(s, 1, pred(i))) > 0 then
delete(s, i, 1)
else inc(i);
end;
convert := s;
end;

var
s: string;
words: TWords;
i, count: integer;

begin
clrscr;
write('s = '); readln(s);
count := GetWords(s, words);

for i := 1 to pred(count) do begin
if words[i] <> words[count] then
writeln(Convert(words[i]));
end
end.


Согласна?

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Женский
Реальное имя: Марина

Репутация: -  0  +


To: volvo
с переменными согласна, у меня уже после 3 часа глюк пошел, я взяла все переименовала, чтобы как то веселей было.

Не работает, так как надо... Те же проблемы что и у меня.

Что нам надо:
1) дана строка:
aaabbbccc defv llllooookkkk ve.

2) первое преобразование, удаляем слова с повторяющиимеся символами с последним словом, остается:

aaabbbccc llllooookkkk

3) (для меня самое сложное) удалить повторяющееся символы в слове, то есть мы должны получить вот такую строчку (или массив уже всеровно, лишь бы выдал)

abc lok

все.


ЗЫ: при введение в твою программу строки aaabbbcccc aaabbbccc выдает abcc
вот так mega_chok.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Женский
Реальное имя: Марина

Репутация: -  0  +


еще: я сделала все пункты кроме 3). не получается и все тут.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






mapblwka,
а если ВНИМАТЕЛЬНО прочитать задание?

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

Перевожу на русский: пройти по массиву слов. Если текущее слово совпадает с последним - не печатать его. Если НЕ совпадает - преобразовать (согласно заданному алгоритму) и напечатать.

Цитата
при введение в твою программу строки aaabbbcccc aaabbbccc выдает abcc
Так что ДОЛЖНО выводить? Проверяем: последнее слово = "aaabbbccc"... Возражения есть? Нету... Идем по остальным словам:
1) aaabbbcccc - совпадает с последним? Нет... Преобразуем: получим "abc"
Вопросы?

P.S. В программе был пропущен знак "="... Исправлено...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Женский
Реальное имя: Марина

Репутация: -  0  +


мой мозг отказался воспиринять твой алгоритм, можешь кратко объяснить че где делается... после удаление пробелов, я ничего не понимаю... хотя все исправно работает.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Прогрессор
****

Группа: Пользователи
Сообщений: 602
Пол: Мужской
Реальное имя: Михаил

Репутация: -  9  +


У нас остаются только одиночные пробелы. Ищем первый пробел(он показывает, где конец первого в данный момент слова в строке), удаляем это первое слово, скопировав его перед этим в массив слов. Повторяем это для строки, пока она не будет состоять из одного лишь последнего слова, тогда копируем строку в массив. При этом счётчиком i считаем количество слов.

[offtop] To: volvo, к слову, а почему pred(p) вместо простого р-1 smile.gif Вообще, это будет как-то различаться по быстродействию?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Как-то обсуждали уже,
Цитата
To: volvo, к слову, а почему pred(p) вместо простого р-1 smile.gif Вообще, это будет как-то различаться по быстродействию?

no1.gif не будет ...


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 16.05.2024 14:21
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name