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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2013, 04:53   #1
ruslan55x55
Новичок
Джуниор
 
Регистрация: 08.05.2013
Сообщений: 2
По умолчанию Непонятный участок кода

Не могу разобраться с участком кода, а именно:
1. Как к элементу массива Ray прибавляют число 1000, ведь тип элементов массива Ray это байты, а байт может иметь максимальное значение 255?

2. Переменная jj в цикле инкрементируется от 0 до 255, как же тогда присваивается значение переменной sj:=lin[s11[jj],jjj]? Переменной sj присваивается значение байта из массива lin, адрес этого байта - это строка s11[jj], и столбец jjj, Нестыковка именно со значением строки, значение строки это jj-й элемент массива s11, но в массиве s11 всего 4 элемента(байта), а переменная jj инкрементируется до 255.

Код:
type
	 position=array [1..9] of byte;

var
 Kl : position;
 Ray: position;
 s00,s11,s44: array [0..3] of byte;
 s0,s1,s4,ssj,ii,j,jj,jjj,sj: byte;

const
  lin : array[1..8,1..3] of byte =
		((1,2,3),(4,5,6),(7,8,9),
		 (1,4,7),(2,5,8),(3,6,9),
		 (1,5,9),(3,5,7));
			  
			  begin
			  s00[s0]:=ssj;
			  inc(s0);
			  for jj:=0 to s4-1 do
				for jjj:=1 to 3 do begin
				  sj:=lin[ssj,jjj];
				  if sj<>ii then Ray[sj]:=Ray[sj]+1000
				end
			  for jj:=0 to s1-1 do begin
				for jjj:=1 to 3 do begin
				  sj:=lin[ssj,jjj];
				  Ray[sj]:=Ray[sj]+10;
				end
				for jjj:=1 to 3 do begin
				  sj:=lin[s11[jj],jjj];
				  if (sj<>ii)and(Kl[sj]=0) then
					  Ray[sj]:=Ray[sj]+10
				end
			  end
			 end;
ruslan55x55 вне форума Ответить с цитированием
Старый 08.05.2013, 07:58   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Мне кажется, Вы подходите не с того конца.
Первое, что нужно делать при анализе кода, - понять, для чего он нужен. Какую работу он должен выполнять, какую задачу решать. Без этого ковыряться в коде - дохлый номер.

Вас что интересует:
- как работает данный код?
- как он должен работать?

По поводу конкретных моментов:
- если числу присваивается величина, превосходящая максимально допустимое значение, число усекается (отбрасываются старшие разряды). Фактически работа программы в этом случае зависит от настроек компилятора. В частности, программа может выдавать ошибку.
- если происходит выход за пределы массива, то используются ячейки памяти, расположенные за этим массивом. Например, другой массив. Работа в этом режиме также зависит как от конкретного компилятора, так и от его настроек. В частности, программа может выдавать ошибку.
s-andriano вне форума Ответить с цитированием
Старый 08.05.2013, 19:51   #3
ruslan55x55
Новичок
Джуниор
 
Регистрация: 08.05.2013
Сообщений: 2
По умолчанию

Участок кода я взял на сайте http://www.beluch.ru/progr/algkres.htm , там представлен алгоритм игры крестики нолики, вот я и пытаюсь понять как этот алгоритм работает, кстати там к элементу массива Ray прибавляют не только число 1000, но и 10000 и 100000.
Элементам массива Ray после расчета присваиваются рейтинги клеток поля в виде значений 0, 1, 10, 100, 1000, 10000, 100000, 1000000.
Согласитесь, не логично к байтовой переменной прибавлять число 1000000, так что скорее всего прибавляются двоичные числа, то есть 0, 1, 2, 4, 8, 16, 32, 64, 128.

Правильно ли я понимаю что переменная jj инкрементируется от 0 до 255?
Если это так, каким образом происходит присваивание sj:=lin[s11[jj],jjj], ведь массив s11 состоит только из 4 элементов...

Посмотрим на данный участок кода, получается что выделенная синим цветом конструкция выполняется 256 раз?
Код:
for jj:=0 to s4-1 do
for jjj:=1 to 3 do begin
sj:=lin[ssj,jjj];
 if sj<>ii then Ray[sj]:=Ray[sj]+1000
end
Объясните мне как все это должно работать? А то я в паскале разбираюсь поверхностно
ruslan55x55 вне форума Ответить с цитированием
Старый 08.05.2013, 19:57   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от ruslan55x55 Посмотреть сообщение
Элементам массива Ray после расчета присваиваются рейтинги клеток поля в виде значений 0, 1, 10, 100, 1000, 10000, 100000, 1000000.
Вы уверены, что это десятичное число, а не двоичное?
А можете ли поручиться, что автор сего опуса не был уверен в том, что вводит в текст программы двоичные числа?
Цитата:
Объясните мне как все это должно работать?
А зачем?
Пусть это автор объясняет, что именно он имел в виду.
Цитата:
А то я в паскале разбираюсь поверхностно
Если будете пытаться разобраться по таким исходникам - так будет всегда.
Лучше сами попытайтесь что-нибудь написать. Хотя бы те же крестики-нолики.
s-andriano вне форума Ответить с цитированием
Старый 08.05.2013, 20:32   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Хотя бы те же крестики-нолики.
я за калькулятор
eval вне форума Ответить с цитированием
Старый 08.05.2013, 21:58   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
я за калькулятор
В калькулятор играть неинтересно.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемный участок кода 3StYleR Общие вопросы C/C++ 1 06.10.2012 21:45
Не выполняется участок кода NiKiToZZ- Общие вопросы Delphi 10 25.02.2012 00:29
участок кода с оператором for tema1234321 Помощь студентам 3 27.12.2011 00:14