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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 20.07.2007, 10:50   #11
Сильванович Михаил
Студент
Форумчанин
 
Регистрация: 10.11.2006
Сообщений: 196
По умолчанию

#3
Цитата:
Может кто-то знает короче способ?
Код:
const 
 c = '0'..'9';

var
 i: integer;
 str: string;

begin
 write('Instert any string: ');
 readln(str);
 for i:=1 to length(str) do
  if str[i] in c then
   begin
    if str[i]<>'0' then str[i]:=Chr(Ord(str[i])-1) else str[i]:='.';
   end;
  write('полученная строка = ',str);
  readln;
end.
Visita Interiorem Terrae Rectificando Operae Lapidem...
Сильванович Михаил вне форума
Старый 24.07.2007, 08:35   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может так короче :
uses crt;
var c:char;s:string;
begin
repeat
c:=readkey;write(c);
if c in ['0'..'9'] then
if c <> '0' then s:=s+chr(ord(c)-1)
else s:=s+'.' else s:=s+c;
until c=#13;
writeln;writeln(s);
end.
I'm learning to live...
Stilet вне форума
Старый 24.07.2007, 09:19   #13
Net
;-)
Пользователь
 
Регистрация: 18.07.2007
Сообщений: 69
По умолчанию

Использовать асмовский трюк с "Chr(Ord(str[i])-1)". Заменить это на Dec(str[i]). Компилер так и поступает, но здесь будет декремент сразу в памяти, без лишних пересылок туда-сюда по регистрам.
Константу не трогаем, код меньше не станет, потеряем в гибкости.

Код:
const c = ['0'..'9'];
var i: integer;
    str: string;

begin
    write('Instert any string: ');
    readln(str);
    for i:=1 to length(str) do
        if str[i] in c then
        begin
            if str[i] <> '0' then dec(str[i]) 
            else str[i]:='.';
        end;
    write('полученная строка = ',str);
    readln;
end.
Stilet, делать подобные склейки s:=s+c в цикле - убийство производительности. На каждый единственный символ будет вызываться менеджер памяти, и перераспределять память под строку - куча лишнего кода и тормоза. Нет, ну естественно, если этот цикл будет крутиться в приличной программе, с важным назначением. Не считайте за придирки
Net вне форума
Старый 24.07.2007, 09:34   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну вообще то в Паскале строка всего лишь 255 символов, так что распределение памяти не особо будет стараться. Хотя конечно с уже введенной строкой тоже можно работать без особых проблем. Весь вопрос в том что автор имел ввиду под краткостью - короче читабельный код или машинный.
А про DEC я и забыл.
I'm learning to live...
Stilet вне форума
Старый 24.07.2007, 09:43   #15
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

Хочу напомнить задание:
Цитата:
3 - Заменить в группах символов, состоящих только из цифр, все цифры предыдущими по значению цифрами, а '0' заменить на точку.
Например, строка: ‘ 6е-1 75 bа12 123‘ ; результат: ‘ 6е-1 64 bа12 012‘
Под группами понимаются части, разделенные пробелами. Замене подлежат только группы, состоящие из цифр.
Так, что правильный ответ дал Tayfun.
Alex21 вне форума
Старый 24.07.2007, 11:20   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Блин я как всегда задание провтыкал. Вот примерчик на мой взгляд короче

uses crt;
var k,e,s:string;i:integer;c:char;b:boo lean;
begin
b:=true; clrscr;
repeat
c:=readkey;b:=true; write(c);
while (c<>#13)and(c<>' ') do begin k:=k+c;
if (c<'0')or(c>'9') then begin s:='';b:=false;end
else begin dec(c);s:=s+c;end;
c:=readkey;write(c);
end;
if b then
e:=e+s
else
e:=e+k;
e:=e+' ';s:='';k:='';
until c=#13;
writeln;writeln(e);
end.
I'm learning to live...
Stilet вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить задачи по Паскалю! Brizon Паскаль, Turbo Pascal, PascalABC.NET 2 13.06.2008 14:28
Помогите решить задачи по Паскалю Alexsandr08 Паскаль, Turbo Pascal, PascalABC.NET 1 31.05.2008 19:50
Задачи по паскалю Agent[PNZ] Помощь студентам 10 22.11.2007 21:45
Простые задачи по паскалю Kasim Паскаль, Turbo Pascal, PascalABC.NET 4 22.12.2006 08:23