Помощь - Поиск - Пользователи - Календарь
Полная версия: Язык Паскаль
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Провинциалка
Прошу помочь в написании программы для задачи:
"В заданном предложении в каждом слове удалить все последующие вхождения первой буквы предложения. Новый текст вывести на печать".
Альтруисты, откликнитесь! wub.gif
Unconnected
lol.gif эгоисты молчат..

Какие мысли по поводу задачи?smile.gif
Провинциалка
Мыслей много всяких. Одна из них - понять смысл задачи
Unconnected
Тебе нужно взять первую букву, а потом идти по строке и удалять остальные такие. Интересное уточнение "в каждом слове" - будто буквы могут быть не в слове)
TarasBer
> а потом идти по строке и удалять остальные такие

Неправильно.
Правильно так:

> а потом идти по строке-источнику и писать в строку-приёмник всё, кроме остальных таких.

А то, что ты сказал, будет работать за O(n^2). Хотя хоть как-то работать будет.
Unconnected
Разве? По-моему, в первом варианте будет меньше действий, и тоже один проход по строке..
TarasBer
Удаление элемента из строки - за сколько, по-твоему, работает?
Оно, между прочим, весь хвост сдвигает.
Archon
Цитата
Удаление элемента из строки - за сколько, по-твоему, работает?
Оно, между прочим, весь хвост сдвигает.

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

Но новичка оптимизации только запутают.
TarasBer
> А добавление в строку - создает новую.

Реаллокации весьма редки, у дельфей менеджер памяти хороший, можно наращивать по единице, и не париться.

> Тогда уж на первом проходе посчитать удаляемые символы, создать строку нужного размера и только потом копировать в нее символы.

Ну вообще да, лучше заранее создать буфер нужной длины.
Гость
Спасибо всем кто откликнулся на мою мольбу. Попробую написать программу, хотя очень сомневаюсь что мне - первокурснице, это по зубам! (Слишком бестолковый у нас преподаватель по программированию языка высокого уровня). А надо бы к среде.
Archon
Покажи, что написала, а мы подскажем что не так.
sheka
а почему нельзя просто:
k:=0;
осуществлять проход по строке и при встрече нужного символа увеличивать значение k на 1,
а иначе а[i-k]:=a[i];
Обрезать строку.
TarasBer
> а почему нельзя просто:

Ну на самом деле это в глубине души и есть добавление в новую строку только того, что надо, просто новая строка собирается прямо на месте старой. Это правильный алгоритм, вообще я уже предлагал запостить его в FAQ в виде удаления из массива нескольких элементов по некоторому признаку без использования допмассивов.
Провинциалка
Вроде так, но программа не работает! (Или это ахинея?)

Program stroka1;
uses crt;
var s,s1,s2,s3:string;
i,j,k:byte;
c:char;
begin
clrscr;
writeln('Введите 1 предложение:');
readln(s);
s:=' '+s;
i:=1;
s2:='';
while i<=length(s) do
if (s[i]<>' ')and(s[i-1]=' ') then
begin
j:=i;
s1:='';
while(j<=length(s))and(s[j]<>' ') do
begin
s1:=s1+s[j];
j:=j+1;
end;
c:=s1[1];
s3:=copy(s1,2,length(s1)-1);
for k:=length(s3)downto 1 do
if s3[k]=c then delete(s3,k,1);
s2:=s2+s1[1]+s3;
i:=i+length(s1);
end
else
begin
s2:=s2+s[i];
i:=i+1;
end;
delete(s2,1,1);
write(s2);
readln
end.

wacko.gif
Archon
Ты выделяешь в предложении слова и удаляешь из каждого слова повторы первой буквы этого слова, а надо первой буквы предложения. Вообще, для решения задачи выделять слова не нужно. Достаточно, как сказали выше, взять первую букву предложения и удалить её из всей оставшейся части строки. Одного цикла достаточно.

PS Добавь тег [code] вокруг текста программы, а то его сложно читать.
Провинциалка
Уважаемый Archon! Позвольте задать вам глупый вопрос: Что означает "Добавь тег [code] вокруг текста программы"?
Lapp
Цитата(Провинциалка @ 1.11.2010 23:40) *
Что означает "Добавь тег [code] вокруг текста программы"?

1. пометь программный код блоком;
2. кликни меню CODE над формой ввода;
3. выбери нужный пункт (Pascal/Delphi);
4. увидишь, что вставились теги перед и после кода;
5. то же самое можно делать "вручную" (просто набрать с клавы);
6. читай Правила! Там все есть.
Провинциалка
Видимо я должна была писать программу на Pascal в среде Delphi. Если так, то к сожалению у меня установлен только Turbo Pascal.
sheka
Нет, Б**! Надо написать вот так:
Цитата
[.code=pas]вот здесь твой код[./code]
Только БЕЗ точек! БЕЗ! Похфиг на чем ты писала! это на форуме, когда вводишь сообщение написать надо. А в данный момент нажми "изменить" свое уже написаное сообщение, и вставь туда теги [code]

Добавлено через 10 мин.
Хотя Lapp это уже сделал smile.gif , поэтому, если хочешь, посмотри, пожалуйста, как, нажав на "изменить сообщение". НО ничего менять не надо!
Провинциалка
А программу подредактировать поможешь?
Archon
Такое впечатление, что это программа не твоя, а товарища с похожим заданием. norespect.gif
Цитата
А программу подредактировать поможешь?
Подредактировать? Легко. Добавь в неё две фигурные скобки:
Program stroka1;
uses crt;
var s,s1,s2,s3:string;
i,j,k:byte;
c:char;
begin
clrscr;
writeln('Введите 1 предложение:');
readln(s);
s:=' '+s;
i:=1;
s2:='';
while i<=length(s) do
if (s[i]<>' ')and(s[i-1]=' ') then
begin
j:=i;
s1:='';
while(j<=length(s)){and(s[j]<>' ')} do
begin
s1:=s1+s[j];
j:=j+1;
end;
c:=s1[1];
s3:=copy(s1,2,length(s1)-1);
for k:=length(s3)downto 1 do
if s3[k]=c then delete(s3,k,1);
s2:=s2+s1[1]+s3;
i:=i+length(s1);
end
else
begin
s2:=s2+s[i];
i:=i+1;
end;
delete(s2,1,1);
write(s2);
readln
end.

Lapp
Мужики, вы чего? shok.gif Оборзели слегка? Или забыли как сами начинали? А может, это новый способ заигрывать девочкой?.. Вы как будете первачку 1+2 объяснять - с помощью Додекиндовых сечений или все же на яблоках?? blink.gif
Да, уважаемые Действительные Члены Младшей Группы Детского Сада (ДЧМГДС), вас нельзя и на несколько часов оставить без внимания..

2 TarasBer: буду понижать репу за всякие O(n) не по делу - флуд! Даже хуже - пудришь мозги начинающим.. !nono.gif

Провинциалка, вот вся твоя задача:
var
s: string;
i: integer;

begin
Write('Введите строку: ');
ReadLn(s);
for i:=Length(s) downto 1 do if s[i]=s[1] then Delete(s,i,1);
WriteLn(s);
ReadLn
end.

Если нужно удалять независимо от регистра (большая/маленькая буква), то главный цикл замени на такой:
  for i:=Length(s) downto 1 do if UpCase(s[i])=UpCase(s[1]) then Delete(s,i,1); 

Задавай вопросы, если что-то неясно.

Если возможна ситуация, что первый символ - не буква (например: "Эй!"- крикнул он. Первый символ - кавычка), и надо ее обрабатывать, то нужно добавить поиск первой буквы. Мне почему-то кажется, что это тебе пока не надо (спроси препа). Если окажется, что надо - скажи, обсудим.

Пиши на том, что есть, никто тебя не перетягивает на Delphi. Pascal/Delphi - это просто название опции в выпадающем меню, которую тебе надо выбрать. Поскольку подсветка синтаксиса языкозависима, то и несколько опций на выбор. Опция Pascal/Delphi означает, что ты хочешь использовать вариант подсветки для языка Pascal или Delphi. То есть числа, строки, комментарии и т.п. будут выделены другим цветом (приглядись к программке в этом посте). Понятно? И прочти же, наконец, правила! И всего форума, и этого раздела (вверху этой страницы, п.2)

Успехов тебе.
TarasBer
> for i:=Length(s) downto 1 do if UpCase(s[i])=UpCase(s[1]) then Delete(s,i,1);

Ну ей может, такое и покатит. А вот Unconnectedу уже так писать неприлично.

> Даже хуже - пудришь мозги начинающим..

А вот Unconnected уже не начинающий, а всё ещё думает, что Delete работает мгновенно.
Надо всех учить.

Так что надо давно пора в FAQ добавить алгоритм удаления из массива элемента по признаку. Или он там уже есть?

Спойлер (Показать/Скрыть)
Lapp
Цитата(TarasBer @ 2.11.2010 10:15) *
Считаешь нужным - жми минус, делов то.
Дык - немного не хватало! Вот теперь все в порядке )). А Unconnected тут совершенно ни при чем.

Все, джентльмены, кончаем флуд.
Помогаем даме.
smile.gif
Гость
Извините, я тут немного припозднилась - то лекции, то проблемы. Мне понравилось всё, что тут обсуждалось. И вариант:
var
s: string;
i: integer;

begin
Write('Введите строку: ');
ReadLn(s);
for i:=Length(s) downto 1 do if s[i]=s[1] then Delete(s,i,1);
WriteLn(s);
ReadLn
end.
меня даже больше чем устраивает!!! Огромнейшее спасибо всем, кто принимал участие в этом нелёгком общении.
(Такое впечатление что на форуме настоящие АКУЛЫ своего дела. Честь и хвала профессионалам!)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.