Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Язык Паскаль

Автор: Провинциалка 31.10.2010 18:57

Прошу помочь в написании программы для задачи:
"В заданном предложении в каждом слове удалить все последующие вхождения первой буквы предложения. Новый текст вывести на печать".
Альтруисты, откликнитесь! wub.gif

Автор: Unconnected 31.10.2010 19:12

lol.gif эгоисты молчат..

Какие мысли по поводу задачи?smile.gif

Автор: Провинциалка 31.10.2010 22:53

Мыслей много всяких. Одна из них - понять смысл задачи

Автор: Unconnected 1.11.2010 3:32

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

Автор: TarasBer 1.11.2010 15:15

> а потом идти по строке и удалять остальные такие

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

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

А то, что ты сказал, будет работать за O(n^2). Хотя хоть как-то работать будет.

Автор: Unconnected 1.11.2010 16:59

Разве? По-моему, в первом варианте будет меньше действий, и тоже один проход по строке..

Автор: TarasBer 1.11.2010 18:39

Удаление элемента из строки - за сколько, по-твоему, работает?
Оно, между прочим, весь хвост сдвигает.

Автор: Archon 1.11.2010 23:14

Цитата
Удаление элемента из строки - за сколько, по-твоему, работает?
Оно, между прочим, весь хвост сдвигает.

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

Но новичка оптимизации только запутают.

Автор: TarasBer 1.11.2010 23:40

> А добавление в строку - создает новую.

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

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

Ну вообще да, лучше заранее создать буфер нужной длины.

Автор: Гость 2.11.2010 0:42

Спасибо всем кто откликнулся на мою мольбу. Попробую написать программу, хотя очень сомневаюсь что мне - первокурснице, это по зубам! (Слишком бестолковый у нас преподаватель по программированию языка высокого уровня). А надо бы к среде.

Автор: Archon 2.11.2010 0:55

Покажи, что написала, а мы подскажем что не так.

Автор: sheka 2.11.2010 1:37

а почему нельзя просто:
k:=0;
осуществлять проход по строке и при встрече нужного символа увеличивать значение k на 1,
а иначе а[i-k]:=a[i];
Обрезать строку.

Автор: TarasBer 2.11.2010 1:53

> а почему нельзя просто:

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

Автор: Провинциалка 2.11.2010 2:43

Вроде так, но программа не работает! (Или это ахинея?)

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 2.11.2010 3:30

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

PS Добавь тег [code] вокруг текста программы, а то его сложно читать.

Автор: Провинциалка 2.11.2010 3:40

Уважаемый Archon! Позвольте задать вам глупый вопрос: Что означает "Добавь тег [code] вокруг текста программы"?

Автор: Lapp 2.11.2010 4:04

Цитата(Провинциалка @ 1.11.2010 23:40) *
Что означает "Добавь тег [code] вокруг текста программы"?

1. пометь программный код блоком;
2. кликни меню CODE над формой ввода;
3. выбери нужный пункт (Pascal/Delphi);
4. увидишь, что вставились теги перед и после кода;
5. то же самое можно делать "вручную" (просто набрать с клавы);
6. читай Правила! Там все есть.

Автор: Провинциалка 2.11.2010 4:29

Видимо я должна была писать программу на Pascal в среде Delphi. Если так, то к сожалению у меня установлен только Turbo Pascal.

Автор: sheka 2.11.2010 4:45

Нет, Б**! Надо написать вот так:

Цитата
[.code=pas]вот здесь твой код[./code]
Только БЕЗ точек! БЕЗ! Похфиг на чем ты писала! это на форуме, когда вводишь сообщение написать надо. А в данный момент нажми "изменить" свое уже написаное сообщение, и вставь туда теги [code]

Добавлено через 10 мин.
Хотя Lapp это уже сделал smile.gif , поэтому, если хочешь, посмотри, пожалуйста, как, нажав на "изменить сообщение". НО ничего менять не надо!

Автор: Провинциалка 2.11.2010 5:04

А программу подредактировать поможешь?

Автор: Archon 2.11.2010 8:50

Такое впечатление, что это программа не твоя, а товарища с похожим заданием. 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 2.11.2010 10:15

Мужики, вы чего? 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 2.11.2010 14:15

> for i:=Length(s) downto 1 do if UpCase(s[i])=UpCase(s[1]) then Delete(s,i,1);

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

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

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

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

Спойлер (Показать/Скрыть)

Автор: Lapp 2.11.2010 14:33

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

Все, джентльмены, кончаем флуд.
Помогаем даме.
smile.gif

Автор: Гость 3.11.2010 23:39

Извините, я тут немного припозднилась - то лекции, то проблемы. Мне понравилось всё, что тут обсуждалось. И вариант:
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.
меня даже больше чем устраивает!!! Огромнейшее спасибо всем, кто принимал участие в этом нелёгком общении.
(Такое впечатление что на форуме настоящие АКУЛЫ своего дела. Честь и хвала профессионалам!)