Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2015, 22:35   #1
isst
Пользователь
 
Регистрация: 02.01.2015
Сообщений: 85
Сообщение Форматирование строки

Всем доброго времени суток. Есть такая задача:

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

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

Ввод
Hello , world .

Вывод
Hello, world.

Вот мой код:
Код:
var s:StRing;
    index:IntegeR;

begin
  readln(s);
  while (s[1] = ' ') do Delete(s, 1, 1);
  while (s[Length(s)] = ' ') do Delete(s, Length(s), 1);
  while (Pos('  ', s) > 0) do Delete(s, Pos('  ', s), 1);
  index:= 2;
  while (index <= Length(s)) do
  begin
    if (not(UpCase(s[index]) in ['A'..'Z', ' '])) and (s[index - 1] = ' ') then Delete(s, index - 1, 1)
    else inc(index);
  end;
  writeln(s);
end.
Работает на 3 из 6. Кому интересно, это №111323 на informatics.mccme.ru
isst вне форума Ответить с цитированием
Старый 08.02.2015, 22:40   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

isst, а самостоятельно хоть одну решил? Толку с таких задач, если каждую не сам решаешь
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.02.2015, 22:47   #3
isst
Пользователь
 
Регистрация: 02.01.2015
Сообщений: 85
Восклицание

Цитата:
Сообщение от Аватар Посмотреть сообщение
isst, а самостоятельно хоть одну решил? Толку с таких задач, если каждую не сам решаешь
Самостоятельно я решил почти весь раздел (там задач 50) кроме 3-4, вот тех, которые я щас у вас спрашиваю, да и их-то я "мучил" недели три, но так и не догадался до них. У них там бывают тесты какие-нибудь "отмороженные", вот они-то у меня, зачастую, и не проходят.
Это учитывая то, что по нашей программе решаю задачи из раздела на класс выше.
isst вне форума Ответить с цитированием
Старый 08.02.2015, 22:52   #4
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Ты не вставляешь пробелы..
asbd,asda
Poma][a вне форума Ответить с цитированием
Старый 08.02.2015, 23:33   #5
isst
Пользователь
 
Регистрация: 02.01.2015
Сообщений: 85
Хорошо

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Ты не вставляешь пробелы..
asbd,asda
Спасибо за подсказку, вот так я реализовал это (прошло 100%):
Код:
var s, s1, s2:StRing;
    index:IntegeR;

begin
  readln(s);
  while (s[1] = ' ') do Delete(s, 1, 1);
  while (s[Length(s)] = ' ') do Delete(s, Length(s), 1);
  while (Pos('  ', s) > 0) do Delete(s, Pos('  ', s), 1);
  index:= 2;
  while (index <= Length(s)) do
  begin
    if (not(UpCase(s[index]) in ['A'..'Z', ' '])) and (s[index - 1] = ' ') then Delete(s, index - 1, 1)
    else inc(index);
  end;
  index:= 1;
  while (index < Length(s)) do
  begin
    if (not(UpCase(s[index]) in ['A'..'Z', ' '])) and (s[index + 1] <> ' ') then
    begin
      s1:= Copy(s, 1, index);
      s2:= Copy(s, index + 1, Length(s) - index);
      s:= s1 + ' ' + s2;
    end;
    inc(index);
  end;
  writeln(s);
end.
isst вне форума Ответить с цитированием
Старый 09.02.2015, 02:57   #6
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 821
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
isst, а самостоятельно хоть одну решил? Толку с таких задач, если каждую не сам решаешь
Толк то есть.
Одна самостоятельно решённая задача по эффективности равна примерно 7 решённым задачам с посторонней помощью или 15 задачам полностью решёнными посторонними (естественно, если решения разобраны и поняты).
^-.-^ My GitHub
Fenex вне форума Ответить с цитированием
Старый 09.02.2015, 03:07   #7
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Если действительно было решено самостоятельно 47 задач из 50, это хороший результат. Не вижу причин нападать на человека за то, что оставшиеся задачи он просит нас решить для того, чтобы освоить материал 100%. Вот если бы он со всеми 50 задачами сюда пришёл, тогда это был бы другой разговор. Глянул решение мельком, если оно собственное, то определённо прогресс в обучении присутствует.
WinCoder вне форума Ответить с цитированием
Старый 09.02.2015, 07:31   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
вот так я реализовал это
Многовато циклов... ИМХО программу можно переписать только на одном цикле.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.02.2015, 08:49   #9
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Могу ошибаться, но в связи с внутренним динамическим представлением строки String в Delphi и клонов Delphi, копирование из входного потока в строку-результат по одному символу очень накладная процедура (выделение нового объема памяти, копирование, освобождение старой памяти). По крайней мере мне так приснилось...
FPaul вне форума Ответить с цитированием
Старый 09.02.2015, 12:49   #10
Iron Monk
Форумчанин
 
Аватар для Iron Monk
 
Регистрация: 05.10.2007
Сообщений: 478
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Многовато циклов... ИМХО программу можно переписать только на одном цикле.
C кучей условий)))
Код:
var
i: integer;
s: string;
begin
i:= 1;
Readln(s);
  while i <> Length(s)+1 do
    begin
     if (s[i-1] = s[i]) and (s[i] = ' ')
     or (s[i-1] = ' ')  and (s[i] = ',')
     or (s[i-1] = ' ')  and (s[i] = '.') then
       begin
       Delete(s,i-1,1);
       Dec(i);
       end else
       if (s[i-1] = ',') and (s[i] <> ' ')
       or (s[i-1] = '.') and (s[i] <> ' ') then
       Insert(' ', s, i);
     Inc(i);
    end;
    Writeln(Trim(s));
    Readln;
end.
Iron Monk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать условное форматирование строки по нескольким условиям в выбранном диапазоне ? oleg4224 Microsoft Office Excel 2 08.04.2014 01:11
Задача на строки. Даны две строки. Определить можно ли из символов первой строки получить вторую строку.( написать подпрограммой и ANTON1994 Паскаль, Turbo Pascal, PascalABC.NET 5 09.02.2013 14:07
Форматирование Helennna Microsoft Office Word 5 21.09.2011 17:44
условное форматирование строки Bezdar Microsoft Office Excel 3 01.09.2010 15:56
Форматирование uranmaximum Microsoft Office Excel 9 03.07.2010 01:41