Прошу помочь в написании программы для задачи:
"В заданном предложении в каждом слове удалить все последующие вхождения первой буквы предложения. Новый текст вывести на печать".
Альтруисты, откликнитесь!
эгоисты молчат..
Какие мысли по поводу задачи?
Мыслей много всяких. Одна из них - понять смысл задачи
Тебе нужно взять первую букву, а потом идти по строке и удалять остальные такие. Интересное уточнение "в каждом слове" - будто буквы могут быть не в слове)
> а потом идти по строке и удалять остальные такие
Неправильно.
Правильно так:
> а потом идти по строке-источнику и писать в строку-приёмник всё, кроме остальных таких.
А то, что ты сказал, будет работать за O(n^2). Хотя хоть как-то работать будет.
Разве? По-моему, в первом варианте будет меньше действий, и тоже один проход по строке..
Удаление элемента из строки - за сколько, по-твоему, работает?
Оно, между прочим, весь хвост сдвигает.
> А добавление в строку - создает новую.
Реаллокации весьма редки, у дельфей менеджер памяти хороший, можно наращивать по единице, и не париться.
> Тогда уж на первом проходе посчитать удаляемые символы, создать строку нужного размера и только потом копировать в нее символы.
Ну вообще да, лучше заранее создать буфер нужной длины.
Спасибо всем кто откликнулся на мою мольбу. Попробую написать программу, хотя очень сомневаюсь что мне - первокурснице, это по зубам! (Слишком бестолковый у нас преподаватель по программированию языка высокого уровня). А надо бы к среде.
Покажи, что написала, а мы подскажем что не так.
а почему нельзя просто:
k:=0;
осуществлять проход по строке и при встрече нужного символа увеличивать значение k на 1,
а иначе а[i-k]:=a[i];
Обрезать строку.
> а почему нельзя просто:
Ну на самом деле это в глубине души и есть добавление в новую строку только того, что надо, просто новая строка собирается прямо на месте старой. Это правильный алгоритм, вообще я уже предлагал запостить его в 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.
Ты выделяешь в предложении слова и удаляешь из каждого слова повторы первой буквы этого слова, а надо первой буквы предложения. Вообще, для решения задачи выделять слова не нужно. Достаточно, как сказали выше, взять первую букву предложения и удалить её из всей оставшейся части строки. Одного цикла достаточно.
PS Добавь тег [code] вокруг текста программы, а то его сложно читать.
Уважаемый Archon! Позвольте задать вам глупый вопрос: Что означает "Добавь тег [code] вокруг текста программы"?
Видимо я должна была писать программу на Pascal в среде Delphi. Если так, то к сожалению у меня установлен только Turbo Pascal.
Нет, Б**! Надо написать вот так:
А программу подредактировать поможешь?
Такое впечатление, что это программа не твоя, а товарища с похожим заданием.
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.
Мужики, вы чего? Оборзели слегка? Или забыли как сами начинали? А может, это новый способ заигрывать девочкой?.. Вы как будете первачку 1+2 объяснять - с помощью Додекиндовых сечений или все же на яблоках??
Да, уважаемые Действительные Члены Младшей Группы Детского Сада (ДЧМГДС), вас нельзя и на несколько часов оставить без внимания..
2 TarasBer: буду понижать репу за всякие O(n) не по делу - флуд! Даже хуже - пудришь мозги начинающим..
Провинциалка, вот вся твоя задача:
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);
> for i:=Length(s) downto 1 do if UpCase(s[i])=UpCase(s[1]) then Delete(s,i,1);
Ну ей может, такое и покатит. А вот Unconnectedу уже так писать неприлично.
> Даже хуже - пудришь мозги начинающим..
А вот Unconnected уже не начинающий, а всё ещё думает, что Delete работает мгновенно.
Надо всех учить.
Так что надо давно пора в FAQ добавить алгоритм удаления из массива элемента по признаку. Или он там уже есть?
Извините, я тут немного припозднилась - то лекции, то проблемы. Мне понравилось всё, что тут обсуждалось. И вариант:
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.
меня даже больше чем устраивает!!! Огромнейшее спасибо всем, кто принимал участие в этом нелёгком общении.
(Такое впечатление что на форуме настоящие АКУЛЫ своего дела. Честь и хвала профессионалам!)