2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3  След.
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 22:43 
alcoholist
А какой у вас компилятор? В freepascal и Delphi есть готовая функция StringReplace (в турбопаскале вроде нет такой), может, лучше ее взять?

 
 
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 22:50 
Аватара пользователя
ewert

Даже если я руками ввожу
Код:
var R: string[4]
(в примере с a1a1b1a1), он поступает так же глупо -- выдает все R[k], а writeln(R) пишет пустой

-- Сб май 10, 2014 22:52:29 --

rockclimber в сообщении #861486 писал(а):
В freepascal и Delphi есть готовая функция

замена -- это только часть программы, дальше много вычислений. Осваивать неизвестный мне программизм я не готов

 
 
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 22:52 
alcoholist в сообщении #861441 писал(а):
И нифига он не выдает R и еще пишет, что Length(R)=0. Хотя любой элемент R[i] по отдельности выдает.
Мне смутно припоминается, что когда-то (а может и по сей день) паскалевские строки представляли собой массивы, в нулевом элементе которого лежит длина строки, а далее с первого - символы. Если вы начинаете пихать символы с первой позиции и далее, а в нулевой позиции у вас ноль - то все описанное поведение программы мне более чем понятно.

 
 
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 22:57 
Хорошо, уговорили. Типо так.

Используется синтаксис Pascal
const  num = 8;
       c1: array[1..num] of string[2]  =  ('a1', 'b1', 'a2', 'b2', 'A1', 'B1', 'A2', 'B2');
       c2: array[1..num] of string[1]  =  ('x',  'y',  'z',  't',  'a',  'b',  'c',  'd');
. . . . . . . . . . . . . . . . . . . .
begin
. . . . . . . . . . . . . . . . . . . .
  R:='';
  for i:=1 to length(W) div 2 do
    for k:=1 to num do
      if Copy(W, 2*i-1, 2) = c1[k] then
        begin    R:=R + c2[k];    break;    end;
. . . . . . . . . . . . . . . . . . . .

 
 
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 22:59 
Аватара пользователя
ewert, спасибо, я сейчас попробую разобраться.

Но объясните, почему даже когда зададим длину R руками ничего не получается.

Вот вставим в такой код слово W=a1a1b1a1
Код:
Program omega2;
var W: string;
var R: string[4]
var i,n,m: integer;



begin
readln(W);
n:=length(W);

m:=n div 2; {конечно, m=4}


for i:=1 to m do
begin
   if W[2*i-1]+W[2*i]='a1' then R[i]:='x';
if W[2*i-1]+W[2*i]='b1' then R[i]:='y';
  end;

writeln(R[1]);
writeln(R);
end.

 
 
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 23:04 
alcoholist в сообщении #861491 писал(а):
объясните, почему даже когда зададим длину R руками ничего не получается.

Очень просто. Потому что Вы таким образом вовсе не начальную длину строки задаёте, а всего лишь резервируете под эту переменную 5 байт памяти (4 под собственно строку и 1 под её длину).

 
 
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 23:28 
alcoholist, простите, я не знаю из каких соображений вы игнорируете озвученные мной "смутные припоминания", но я скачал и поставил ABC-Паскаль, ввел в него ваш код, добавил одну строчку и все очевидно заработало:
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
Program omega2;
var W: string;
var R: string[4];
var i,n,m: integer;



begin
readln(W);
n:=length(W);

m:=n div 2; {êîíå÷íî, m=4}


for i:=1 to m do
begin
   if W[2*i-1]+W[2*i]='a1' then R[i]:='x';
if W[2*i-1]+W[2*i]='b1' then R[i]:='y';
  end;

R[0] := char (m);
writeln(R[1]);
writeln(R);
end.


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

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

 
 
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 23:41 

(Оффтоп)

_Ivana в сообщении #861497 писал(а):
с конкатенацией или еще чем,

Можно подумать, что у Вас там она не она. Только она неуместно приложена: раз уж Вы всё равно сравниваете побайтно, и всего лишь пару символов, то разумнее в лоб именно символы и сравнивать через AND.

 
 
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 23:49 
ewert, если вы про
Используется синтаксис Pascal
if W[2*i-1]+W[2*i]='a1'
то да, именно она, и все ваши соображения справедливы, только направьте их автору кода - я взял код как есть и вставил только одну строчку - для наглядной демонстрации автору. А насчет вашей платформонезависимой конкатенации я имел в виду, что вы вместо заполнения стрингов по индексу применяете красивое
Используется синтаксис Pascal
R='';
......
then R:=R+'x'
        else R:=R+'y';
, и длина строки в первом байте инкрименируется сама собой компилятором, или вообще в другом формате им же запоминается.

 
 
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 23:53 
Аватара пользователя
_Ivana
Спасибо! Теперь работает:)

 
 
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 23:56 
alcoholist, повторюсь про необходимость разобраться с типами и структурой данных выбранного вами инструмента. Например, в данном случае, попробуйте задать строку длиной больше 255. Может и не прокатить, в зависимости от.

 
 
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 23:58 

(Оффтоп)

_Ivana в сообщении #861505 писал(а):
применяете красивое

С сожалением вынужден отклонить комплимент. Оно не красивое, оно шаблонное. Что (шаблонность) может быть иногда и неэффективно; вот в Матлабе -- аналогичный приём довольно сильно неэффективен. Однако в Паскале такой проблемы нет (именно в силу фиксированности стандартного типа) -- это во-первых; а во-вторых, её нет и вообще везде, независимо от языка, если говорить о специфике именно этой задачи. Т.е. формально она, возможно, и есть, но с практической точки зрения это абсолютно несущественно.

 
 
 
 Re: простой вопрос по Pascal
Сообщение11.05.2014, 00:03 
Аватара пользователя

(Оффтоп)

_Ivana, это Вы сделали строковый счётчик?:-)

 
 
 
 Re: простой вопрос по Pascal
Сообщение11.05.2014, 00:05 
alcoholist в сообщении #861506 писал(а):
Спасибо! Теперь работает:)

Ну а почему работает-то?... Какая конкретно добавленная строчка заставила его работать?... (она там всего лишь одна)

Всё-таки в этом нужно чётко отдавать себе отчёт.

 
 
 
 Re: простой вопрос по Pascal
Сообщение11.05.2014, 00:08 
Давайте не скрывать тегом оффоп то, что им не является, чтобы лишний раз не раскрывать теги.

Это я сделал минимальную заплатку на программу автора, чтобы она заработала :-) Шаблонный вариант ewert в данном случае универсальнее и не требует счетчика символов (явного), но это потребовало бы переписать авторский код. А это вопрос философский - что лучше при сопровождении чужого кода - ставить заплатки или переписать заново :-)

 
 
 [ Сообщений: 35 ]  На страницу Пред.  1, 2, 3  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group