![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Grief |
![]() ![]()
Сообщение
#1
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 14 Пол: Мужской Репутация: ![]() ![]() ![]() |
Заменить первые 3 символа слов, имеющих выбранную длину, на символ * .
Длинна слов 6-8 Количество слов 10 По найденным урокам не особо смог ориентироваться, нужен наглядный пример ![]() Буду признателен за помощь... Спасибо заранее. |
Lapp |
![]()
Сообщение
#2
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
нужен наглядный пример Сделать такую замену в слове w можно примерно так: Delete(w,3,1);
Insert('*',w,1)
Если у тебя массив из 10 слов - пройдись по нему в цикле for. Если слова в тексте - нужна функция для их поиска. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Grief |
![]()
Сообщение
#3
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 14 Пол: Мужской Репутация: ![]() ![]() ![]() |
У меня вот такое получилось, но это не правильно и слишком замудренно, может кто-то по другому, более проще что ли представить может?
uses crt;
const razd:set of char=[' ','.',',',':',';','!'];
var st,buf:string;
l:integer;
begin
clrscr;
write('Длина -> ');
readln(l);
write('Строка -> ');
readln(st);
repeat
if (st[1] in razd) or (length(st)=0) then while st[1] in razd do delete(st,1,1)
else
begin
while (not (st[1] in razd)) and (length(st)>0) do
begin
buf:=buf+st[1];
delete(st,1,1);
end;
if length(buf)=l then
begin
buf[1]:='*';
buf[2]:='*';
buf[3]:='*';
write(buf,' ');
end;
buf:='';
end;
until (length(st)=0) and (length(buf)=0);
readln;
end.
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Ну, твой код должен вылетать с ошибкой, если я не ошибаюсь. По крайней мере на компиляторе, который проверяет вылет за конец строки. Смотри (сразу говорю, набираю прямо здесь, так что тестируй и еще раз тестируй, но основная идея вот такая):
const razd: set of char=[' ','.',',',':',';','!'];
var
st, buf:string;
L: integer;
begin
write('длина -> '); readln(L);
write('строка -> '); readln(st);
repeat
{ для начала проверяем, первый символ - разделитель или нет? }
if (length(st)=0) or (st[1] in razd) then { СНАЧАЛА проверяем длину, только потом - st[1] !!! }
while (length(st) > 0) and (st[1] in razd) do
begin
write(st[1]); delete(st,1,1); { не теряем символы - разделители, выводим из перед удалением }
end
else begin
{ нет, не разделитель, составляем слово: }
while (length(st)>0) and (not (st[1] in razd)) do { Еще раз - СНАЧАЛА длина, потом первый символ }
begin
buf:=buf+st[1]; delete(st,1,1);
end;
if length(buf) = L then
begin
delete(buf, 1, 3); insert('*', buf, 1); { <--- Удалили три символа, вставили один }
end;
write(buf); { слово печатается в любом случае, не только при каком-то условии }
buf:='';
end; { else закончился }
until (length(st)=0) and (length(buf)=0);
readln;
end.
Теперь - зачем все это делается: а затем, что если ты ввел строку, и тебя попросили заменить в ней первые символы четырех(например)-буквенных слов на звездочку, это не значит, что тебе надо вывести измененные огрызки этих самых четырехбуквенных слов. Тебе надо получить строку, полную, в которой части слов нужной длины заменены звездочками, а все остальное - сохранено (другие слова, разделители, это не должно пострадать).Кстати, я бы еще добавил условие, проверяющее, а больше ли введенная пользователем "длина", чем 3. Потому что удалять из двухбуквенного слова три первых символа - это по меньшей мере странно. Какая-то защита от дурака должна быть... Основа у тебя есть. Дорабатывай... P.S. Объяснение, почему я поменял порядок следования условий, и какое вообще это имеет значение - будет, если тебе это интересно. Будут еще какие вопросы по коду - задавай. |
Lapp |
![]()
Сообщение
#5
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Будут еще какие вопросы по коду - задавай. Мало надежды, что автор темы будет задавать вопросы. Скорее всего, он проигнорирует твой мессадж, volvo, как он проигнорировал мой.Терпеть не могу спрашивающих, не обращающих внимания на ответы. Ничего не может быть хуже ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Grief |
![]()
Сообщение
#6
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 14 Пол: Мужской Репутация: ![]() ![]() ![]() |
Мало надежды, что автор темы будет задавать вопросы. Скорее всего, он проигнорирует твой мессадж, volvo, как он проигнорировал мой. Терпеть не могу спрашивающих, не обращающих внимания на ответы. Ничего не может быть хуже ![]() Извиняюсь, что не уделил должного внимания вашему сообщению, просто я не совсем понял, как такое можно реализовать, мне это тема со строками и заменой к сожалению крайне не понятна, по-этому как-то так. Добавлено через 17 мин. Ну, твой код должен вылетать с ошибкой, если я не ошибаюсь. По крайней мере на компиляторе, который проверяет вылет за конец строки. Смотри (сразу говорю, набираю прямо здесь, так что тестируй и еще раз тестируй, но основная идея вот такая): const razd: set of char=[' ','.',',',':',';','!'];
var
st, buf:string;
L: integer;
begin
write('длина -> '); readln(L);
write('строка -> '); readln(st);
repeat
{ для начала проверяем, первый символ - разделитель или нет? }
if (length(st)=0) or (st[1] in razd) then { СНАЧАЛА проверяем длину, только потом - st[1] !!! }
while (length(st) > 0) and (st[1] in razd) do
begin
write(st[1]); delete(st,1,1); { не теряем символы - разделители, выводим из перед удалением }
end
else begin
{ нет, не разделитель, составляем слово: }
while (length(st)>0) and (not (st[1] in razd)) do { Еще раз - СНАЧАЛА длина, потом первый символ }
begin
buf:=buf+st[1]; delete(st,1,1);
end;
if length(buf) = L then
begin
delete(buf, 1, 3); insert('*', buf, 1); { <--- Удалили три символа, вставили один }
end;
write(buf); { слово печатается в любом случае, не только при каком-то условии }
buf:='';
end; { else закончился }
until (length(st)=0) and (length(buf)=0);
readln;
end.
Теперь - зачем все это делается: а затем, что если ты ввел строку, и тебя попросили заменить в ней первые символы четырех(например)-буквенных слов на звездочку, это не значит, что тебе надо вывести измененные огрызки этих самых четырехбуквенных слов. Тебе надо получить строку, полную, в которой части слов нужной длины заменены звездочками, а все остальное - сохранено (другие слова, разделители, это не должно пострадать).Кстати, я бы еще добавил условие, проверяющее, а больше ли введенная пользователем "длина", чем 3. Потому что удалять из двухбуквенного слова три первых символа - это по меньшей мере странно. Какая-то защита от дурака должна быть... Основа у тебя есть. Дорабатывай... P.S. Объяснение, почему я поменял порядок следования условий, и какое вообще это имеет значение - будет, если тебе это интересно. Будут еще какие вопросы по коду - задавай. Спасибо большое, что помогаете) Только не пойму с чем связано, выдает две ошибки:
Первая я так понимаю что-то с циклом, только ошибки не вижу... А вот вторая вообще без понятия, что такое с компилятором О.о Мне в общем эту программу нужно на лабораторной сдать, я пробовал уже именно в таком виде сдать, точнее попросил для начала, чтобы проверили, препод похвалил за оригинальность программы, но сказал сделать лучше так, как было дано в примере. А в примерах у нас черте что, pdf файл на 10 страниц по одной лабе, и там вода какая-то не по теме, конкретно моего примера нет, как делать, но там она пишется каким-то другим образом, без перечисления символов как у меня и т.д., и вообще она порядком меньше если я не ошибаюсь. Я постараюсь сегодня скачать его и выложить сдесь пример того, как она решают эту программу там, если не сложно будет, объясните мне, буду очень благодарен) |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата Только не пойму с чем связано, выдает две ошибки: Это может быть только в случае, если ты в 15 строке поставил перед Else (а точнее - после End) точку с запятой. Обрати внимание, у меня в посте этой точки с запятой нет...Больше не вижу способов получить такую ошибку. Цитата А вот вторая вообще без понятия, что такое с компилятором О.о А ты сначала первую исправь, вторая сама собой уйдет. Просто компилятор предупреждает, что свою работу выполнить не смог, и выдает еще одно сообщение, "Компиляция прервана". |
Grief |
![]()
Сообщение
#8
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 14 Пол: Мужской Репутация: ![]() ![]() ![]() |
Это может быть только в случае, если ты в 15 строке поставил перед Else (а точнее - после End) точку с запятой. Обрати внимание, у меня в посте этой точки с запятой нет... Больше не вижу способов получить такую ошибку. А ты сначала первую исправь, вторая сама собой уйдет. Просто компилятор предупреждает, что свою работу выполнить не смог, и выдает еще одно сообщение, "Компиляция прервана". Угу, точно) Поправил, все работает. И теперь не совсем понятно как данная программа работает. Я ввожу длину, например 5. Ввожу строку, например 7 строка. Дальше он мне выдает номер строки и все. Я же должен указать 10 слов, входящих по символам в указанный промежуток, а такого что-то не наблюдаю О.о |
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Никто ничего не должен указывать. Ты вводишь желаемую длину слова и саму строку. Все... Больше ничего делать не надо. Разбиение введенной строки на слова и "отсечение лишнего" - это забота программы:
Running "f:\programs\pascal\test.exe" Что не так? |
Grief |
![]()
Сообщение
#10
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 14 Пол: Мужской Репутация: ![]() ![]() ![]() |
Никто ничего не должен указывать. Ты вводишь желаемую длину слова и саму строку. Все... Больше ничего делать не надо. Разбиение введенной строки на слова и "отсечение лишнего" - это забота программы: Running "f:\programs\pascal\test.exe" Что не так? Точно, извиняюсь) Все идеально работает) Осталось ещё подучить теорию получше, а то к каждой переменной и символу придираются, что-то забудешь, уже не сам делал типа) Надо будет теперь хороший мануал поискать) Спасибо за помощь, очень благодарен) Надеюсь на дальнейшее сотрудничество ![]() |
![]() ![]() |
![]() |
Текстовая версия | 24.07.2025 2:19 |