2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3  След.
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 22:43 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
alcoholist
А какой у вас компилятор? В freepascal и Delphi есть готовая функция StringReplace (в турбопаскале вроде нет такой), может, лучше ее взять?

 Профиль  
                  
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 22:50 
Заслуженный участник
Аватара пользователя


22/01/11
2641
СПб
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 


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

 Профиль  
                  
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 22:57 
Заслуженный участник


11/05/08
32166
Хорошо, уговорили. Типо так.

Используется синтаксис 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 
Заслуженный участник
Аватара пользователя


22/01/11
2641
СПб
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 
Заслуженный участник


11/05/08
32166
alcoholist в сообщении #861491 писал(а):
объясните, почему даже когда зададим длину R руками ничего не получается.

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

 Профиль  
                  
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 23:28 


05/09/12
2587
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 
Заслуженный участник


11/05/08
32166

(Оффтоп)

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

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

 Профиль  
                  
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 23:49 


05/09/12
2587
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 
Заслуженный участник
Аватара пользователя


22/01/11
2641
СПб
_Ivana
Спасибо! Теперь работает:)

 Профиль  
                  
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 23:56 


05/09/12
2587
alcoholist, повторюсь про необходимость разобраться с типами и структурой данных выбранного вами инструмента. Например, в данном случае, попробуйте задать строку длиной больше 255. Может и не прокатить, в зависимости от.

 Профиль  
                  
 
 Re: простой вопрос по Pascal
Сообщение10.05.2014, 23:58 
Заслуженный участник


11/05/08
32166

(Оффтоп)

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

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

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


29/03/12
2427
Нигредо

(Оффтоп)

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

 Профиль  
                  
 
 Re: простой вопрос по Pascal
Сообщение11.05.2014, 00:05 
Заслуженный участник


11/05/08
32166
alcoholist в сообщении #861506 писал(а):
Спасибо! Теперь работает:)

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

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

 Профиль  
                  
 
 Re: простой вопрос по Pascal
Сообщение11.05.2014, 00:08 


05/09/12
2587
Давайте не скрывать тегом оффоп то, что им не является, чтобы лишний раз не раскрывать теги.

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 35 ]  На страницу Пред.  1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group