Вверх ↑
Этот топик читают: Гость
Ответов: 1528
Рейтинг: 57
#121: 2013-04-08 06:43:37 ЛС | профиль | цитата
R2D2, ну засунь это дело в IC и всё
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#122: 2013-04-08 08:26:27 ЛС | профиль | цитата
R2D2 писал(а):
Массив A - это массив строк. Мой недочет.
А фантомный массив Z ?
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 8888
Рейтинг: 823
#123: 2013-04-08 09:53:28 ЛС | профиль | цитата
Tad, от соревнования отказываюсь, но полагаю, что с MTStrTbl внешних компонентов и совсем не надо
[flood]Только что увидел: оказывается в названии этой таблицы нет большой русской буквы Ы, а есть латынские b и l [/flood]
карма: 19

0
Ответов: 80
Рейтинг: 4
#124: 2013-04-08 12:02:49 ЛС | профиль | цитата
Tad писал(а):
А фантомный массив Z ?

строки с названиями, получаются с парсера xml.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#125: 2013-04-08 19:49:35 ЛС | профиль | цитата

#pas
for ring:=1 to rings do
begin
// ПЕРЕНЁС
// т.к. значение k зависит только от FOR и считать его в цикле m - абсурд
k:=3*ring*ring-3*ring; //сумма последовательности.
m:=1;
while m/(6*ring)<=0.25 do
// k:=3*ring*ring-3*ring; //сумма последовательности.
begin
if m<=(1/(ring+1)) then
// Условие не выполнимо т.к.
// m никогда не будет ни МЕНЬШЕ ни РАВНО (минимальное m=1, а 1/ring+1 никогда не будет 1-цей)
begin
...........
...........
m:=m+1;
и т.д.

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 80
Рейтинг: 4
#126: 2013-04-08 20:36:32 ЛС | профиль | цитата
Черт! Куда я смотрел. k я перенес. заместо m - m/(6*rings)
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#127: 2013-04-08 20:40:49 ЛС | профиль | цитата
R2D2 писал(а):
заместо m - m/(6*rings)
Не понял
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 80
Рейтинг: 4
#128: 2013-04-08 21:00:36 ЛС | профиль | цитата
Последняя (на текущий момент) версия кода:
#pas

#pas
var

x,y: array of integer;
a,z: array of string;
m,ring,k,rings:integer;

begin

read(rings);//бб‡аИб‚б‹аВаАаЕаМ аКаОаЛбŒб†аА

for ring:=1 to rings do
begin;m:=1;k:=3*ring*ring-3*ring;
while m<=2*ring+1 do
begin;
if m<=ring+1 then
begin;
a[k+m]:=z[k+m]; //бб‡аИб‚б‹аВаАаЕаМ аНаАаЗаВаАаНаИаЕ.
y[k+m]:=-15-24*ring;
x[k+m]:=14+14*(ring-m);
y[k+3*ring+m]:=-y[k+m];
x[k+3*ring+m]:=-x[k+m];
a[k+3*ring+m]:=z[k+3*ring+m];
end
else;
begin;
a[k+m]:=z[k+m];
y[k+m]:=-15-24*(2*ring-m+1);
x[k+m]:=14+14*(ring-m);
y[k+3*ring+m]:=-y[k+m];
x[k+3*ring+m]:=-x[k+m];
a[k+3*ring+m]:=z[k+3*ring+m];
y[k+3*ring-m]:=-y[k+m];
x[k+3*ring-m]:=x[k+m];
a[k+3*ring-m]:=z[k+3*ring-m];
y[k+6*ring-m]:=y[k+m];
x[k+6*ring-m]:=-x[k+m];
a[k+6*ring-m]:=z[k+6*ring-m];
end;
m:=m+1;
end;
end;
//аЗаДаЕббŒ аВб‹аВаЕбб‚аИ аМаАббаИаВб‹
end.
обновил
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#129: 2013-04-08 21:03:29 ЛС | профиль | цитата
R2D2 писал(а):
Последняя (на текущий момент) версия кода:
code_30790.txt
Неправда, всё то же.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 80
Рейтинг: 4
#130: 2013-04-08 21:16:12 ЛС | профиль | цитата
Tad писал(а):
Неправда, всё то же.

ок
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#131: 2013-04-08 21:37:32 ЛС | профиль | цитата

for ring:=1 to rings do
k:=3*ring*ring-3*ring;
R2D2, ты хоть понимаешь, что здесь FOR у тебя и закончился, или нет ?
и будет k всё время

k:=3*rings*rings-3*rings;



карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 80
Рейтинг: 4
#132: 2013-04-08 22:30:31 ЛС | профиль | цитата
исправил
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#133: 2013-04-08 22:36:21 ЛС | профиль | цитата
Вот примерно так :

#pas
var
x,y: array of integer;
a,z: array of string;
m,ring,k,rings:integer;

begin
read(rings);
FOR ring:=1 to rings do
BEGIN // начало цикла FOR
k:=3*ring*ring-3*ring;
m:=1;
while (m/(6*ring))<=0.25 do
begin // начало цикла WHILE
a[k+m]:=z[k+m]; // Вот тут НЕ ВЕРЮ. Начало с a[2], а массив начинается с 0
x[k+m]:=14+14*(ring-m); // поэтому не верю и в твою математику
y[k+3*ring+m]:=-y[k+m];
x[k+3*ring+m]:=-x[k+m];
a[k+3*ring+m]:=z[k+3*ring+m];
if (m/(6*ring))<=(1/(ring+1)) then
y[k+m]:=-15-24*ring
else
begin // начало IF false
y[k+m]:=-15-24*(2*ring-m+1);
y[k+3*ring-m]:=-y[k+m];
x[k+3*ring-m]:=x[k+m];
a[k+3*ring-m]:=z[k+3*ring-m];
y[k+6*ring-m]:=y[k+m];
x[k+6*ring-m]:=-x[k+m];
a[k+6*ring-m]:=z[k+6*ring-m];
end; // конец IF false
inc(m);
end; // конец цикла WHILE
END; // конец цикла FOR

end.
И не стесняйся писать комментарии - хоть не запутаешься.
И не забывай, что нумерация динамических массивов начинается с 0.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 80
Рейтинг: 4
#134: 2013-04-09 02:15:20 ЛС | профиль | цитата
Хм. Вот ошибку нашел. Сейчас исправлю и напишу вам.
------------ Дoбавленo в 01.10:
Tad писал(а):
Вот тут НЕ ВЕРЮ

а зря) что смущает? конкретно в этой программе значения массивов начинаются с 1.
Комментарии это конечно хорошо для кого-то, но я в своем коде все прекрасно понимаю, поэтому и не пишу лишний раз "конец цикла WHILE".
Если же комментарии нужны для того, чтобы объяснить, как работает программа, то это легко.
Tad писал(а):
FOR ring:=1 to rings do

Цикл колец. Проходит все кольца.

Tad писал(а):
k:=3*ring*ring-3*ring;

количество систем обсчитанных ДО кольца. нужны для полного списка систем и индекса каждой системы (координаты).

Tad писал(а):
while (m/(6*ring))<=0.25 do
- здесь была ошибка.
тут я заметил интересную закономерность. что бы у меня совпадало с таблицей, системы отсчитываются от правого верхнего края. по сути дела, что бы узнать координаты всех систем необходим только верхний треугольник и левый. количество систем в треугольники, на уровне кольца равно ring+1, а в левом треугольнике - просто число кольца. в этом легко убедиться. затем.

стоп, вы что то не то писать начали... правильно:
if m<=ring+1
определяется принадлежность к треугольникам.


begin;
a[k+m]:=z[k+m]; //присваивает имя из списка строк элементу массива. может и не нужно, но пока пусть будет.
y[k+m]:=-15-24*ring; //расчет y координаты для элемента верхнего треугольника. в индексе глобальный номер относительно всех систем вообще. формула - чистая геометрия. y координата - высота, прорисовка начинается сверху, значит ставим (-), а значения подбираются исходя из высоты элемента + расстояния между хексами + закономерностей. игрек одна на весь треугольник.
x[k+m]:=14+14*(ring-m); //расчет x координаты точно так же. но она уже изменяется для каждого конкретного элемента, поэтому существует привязка к номеру системы.

RETROGRADE! Я же говорил, что остальные параметры не нужны... Строим симметрично (не забывая об индексах) нижний треугольник.
y[k+3*ring+m]:=-y[k+m];
x[k+3*ring+m]:=-x[k+m];
a[k+3*ring+m]:=z[k+3*ring+m];


else;
Теперь что и как будем строить, если элемент принадлежит 2 треугольнику...

a[k+m]:=z[k+m];
y[k+m]:=-15-24*(2*ring-m+1);
x[k+m]:=14+14*(ring-m);

опять волшебные формулы. стоит обратить внимание на игрек. там приходится высчитывать псевдо-номер. делается, опять же, нехитрым путем M-номера верхнего треугольника... затем идет прибавка псевдо-номера, помноженного на постоянную.


y[k+3*ring+m]:=-y[k+m];
x[k+3*ring+m]:=-x[k+m];
a[k+3*ring+m]:=z[k+3*ring+m];

находим симметричный треугольник (сим-трия относительно точки О);

y[k+3*ring-m]:=-y[k+m];
x[k+3*ring-m]:=x[k+m];
a[k+3*ring-m]:=z[k+3*ring-m];

треугольник, расположенный ниже. не забываем про индексы.



y[k+6*ring-m]:=y[k+m];
x[k+6*ring-m]:=-x[k+m];
a[k+6*ring-m]:=z[k+6*ring-m];

И наконец, координаты последнего треугольника.

Tad писал(а):
inc(m)
я её не люблю

Все. Теперь нужно вывести эти массивы или значения, без разницы: главное собрать работающую схему.

Критикуйте) Мог допустить ошибку.
------------ Дoбавленo в 01.13:
Вот как то так...
------------ Дoбавленo в 01.16:
Да, и еще. Все координаты строятся относительно центра. Центр вычисляется теми самыми X,Y max, которые были в другом коде.
------------ Дoбавленo в 02.15:
Вот, сам же ошибку и нашел. X неправильно определяет. Там две формулы будет. Для четного и нечетного кольца.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#135: 2013-04-09 11:01:47 ЛС | профиль | цитата
R2D2 писал(а):
стоп, вы что то не то писать начали... правильно:
if m<=ring+1
R2D2, это мне уже нравится. Я здесь ничего писать не начинал - только копипастил твоё творчество.
R2D2 писал(а):
конкретно в этой программе значения массивов начинаются с 1.
Конкретно Delphi писал(а):
Все динамические массивы начинаются с индекса = 0.

Парядок работ (алгоритм):
1. Получаем число колец.
2. Расчитываем и объявляем размеры массивов.
3. Расчитываем данные и заполняем массивы.
4. Выводим данные
5. Уничтожаем массивы и освобождаем память.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)