Форум: "Прочее";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
ВнизЗадачки по Delphi Найти похожие ветки
← →
XProger © (2006-10-04 19:48) [0]Предлагаю совместными усилиями придумывать наисложнейшие задачки по Delphi. Заметьте, именно по Delphi, а не по математике, алгоритмизации и т.п.
Язык программирования таит в себе кучу вкусностей, о которых никто нигде (даже в хелпе !!!) не пишет.
Итак, я начинаю :)
Задача
Имеется код:(******** ИЗБАВИТЬСЯ ********)
type
TVector = record
X, Y, Z : Single;
end;
TRGB = record
R, G, B : Byte;
end;
TVertex = packed record
Color : TRGB;
Vertex : TVector;
Normal : TVector;
end;
(****************************)
var
v : array [0..2] of TVertex;
i : Integer;
begin
(******** ИЗБАВИТЬСЯ ********)
// Первая вершина всегда красного цвета
v[0].Color.R := 255;
v[0].Color.G := 0;
v[0].Color.B := 0;
// Вторая вершина всегда в позиции (0, 0, 0)
v[1].Vertex.X := 0;
v[1].Vertex.Y := 0;
v[1].Vertex.Z := 0;
// Третья вершина всегда с нормалью (0, 1, 0)
v[2].Normal.X := 0;
v[2].Normal.Y := 1;
v[2].Normal.Z := 0;
(****************************)
// Рисуем треугольник с постоянно меняющимися параметрами вершин
for i := 0 to 2 do
with v[i] do
begin
// Меняем цвет всех вершин, проме первой
if i <> 0 then
begin
Color.R := random(256);
Color.G := random(256);
Color.B := random(256);
end;
// Меняем позицию всех вершин, кроме второй
if i <> 1 then
begin
Vertex.X := random * 10 - 5;
Vertex.Y := random * 10 - 5;
Vertex.Z := random * 10 - 5;
end;
// Меняем нормали всех вершин, кроме третьей
if i <> 2 then
begin
Normal.X := random * 1 - 0.5;
Normal.Y := random * 1 - 0.5;
Normal.Z := random * 1 - 0.5;
end;
// Вызов процедуры передечи вершины в конвейер
SetVertex(@v[i]);
end;
end.
Вопрос
Используя только секцию var, избавиться от помеченных блоков кода. При этом получить тот же результат что даёт текущий код.
Процедура SetVertex принимает указатель типа Pointer.
Все изменения кода допускаются только в секции var (!!!)
Помеченного кода "ИЗБАВИТЬСЯ" в ответах быть не должно!
Удачи!
P.S.
Всех, кому задавал эту задачу ранее - прошу не беспокоиться ;)
← →
Ketmar © (2006-10-04 19:52) [1]угу. в документации не упоминается, ибо предполагают, что с языком, на котором пишешь, знаком. например, знаком с тем, что можно описывать и присваивать без дополнительных блоков. %-)
← →
Palladin © (2006-10-04 19:53) [2]я бы это в начинающиее пернес... задачу не задавал, но любому человеку, моло мальски понимающему, что такое данные и как они распологаются в памяти вышеприведенное интереса не представляет...
школа короче... 10-11 класс...
← →
MeF Dei Corvi © (2006-10-04 20:12) [3]
> что такое данные и как они распологаются в памяти вышеприведенное
> интереса не представляет...
Тут задача не в этом. Тут задача на знания некоторых особенностей синтаксиса языка, т.к. изменения допускаются только в секции var.
← →
Чапаев © (2006-10-04 20:17) [4]Ну и? Ты рекомендуешь сделать var a:array of record record с инициализацией? Руки за такое отбивать без права пришивания.
Твоё счастье, не попался ты моему экс-шефу, он бы и за array [0..2] по ушам надавал...
← →
Ketmar © (2006-10-04 20:20) [5]>[4] Чапаев(c) 4-Oct-2006, 20:17
>Твоё счастье, не попался ты моему экс-шефу, он
>бы и за array [0..2] по ушам надавал...
а тут-то за что? %-)
← →
TUser © (2006-10-04 20:21) [6]> он бы и за array [0..2] по ушам надавал...
А в чем криминал?
← →
Чапаев © (2006-10-04 20:23) [7]А потому что надо
type
TArrayIndex=0..2;
TArray=array [TArrayIndex] of TЕщёКакаяТоФигня
И чтоб потом, не дай бог, не использовался Integer в качестве индекса массива. ;-)
← →
Ketmar © (2006-10-04 20:23) [8]>[6] TUser(c) 4-Oct-2006, 20:21
>А в чем криминал?
телепатор подсказывает, что дядя "повёрнут" на строгой типизации. %-)
← →
Ketmar © (2006-10-04 20:23) [9]во. телепатор сработал верно. %-)
← →
MeF Dei Corvi © (2006-10-04 20:25) [10]
> Ты рекомендуешь сделать var a:array of record record с
> инициализацией? Руки за такое отбивать без права пришивания.
Для решения поставленной задачи - да :) А вообще, конечно, "Руки за такое отбивать без права пришивания."
← →
XProger © (2006-10-04 20:45) [11]Для начала хотелось бы увидеть решение...
Эта задача наипростейшая среди тех, что имеются у меня в запасе ;)
← →
Ketmar © (2006-10-04 20:48) [12]>[11] XProger(c) 4-Oct-2006, 20:45
>Для начала хотелось бы увидеть решение...
а зачем? нецелесообразно. и -- не приведи ангелы, ещё прочтёт кто из начинающих. и станет так же писать...
← →
Чапаев © (2006-10-04 20:49) [13]> Для начала хотелось бы увидеть решение...
Не буду я такую гадость писать. Хотя и мог бы. С такими задачками лучше к недоу{м|ч}кам-сишникам обратиться.
← →
XProger © (2006-10-04 21:13) [14]Чапаев, гордый или ленивый? :)
Не хочешь отвечать - не пиши ничего, чего толку лясо точить?
← →
Чапаев © (2006-10-04 21:17) [15]> Чапаев, гордый или ленивый? :)
брезгливый
← →
Ketmar © (2006-10-04 21:17) [16]>[14] XProger(c) 4-Oct-2006, 21:13
>Чапаев, гордый или ленивый? :)
а ты так и не понял, что в данном случае -- ни то, ни другое?
← →
default © (2006-10-04 21:17) [17]подобные задачи навевают скуку...фи
← →
Чапаев © (2006-10-04 21:21) [18]Кстати, когда учился в десятом классе и Паскаля ещё толком не знал, столкнулся с похожей бякой.
Объявлял что-то вроде
var
A:array [1..10] of Integer;
procedure Proc(var Arr:array [1..10] of Integer);
Отказалось компилироваться, конечно.
← →
Ketmar © (2006-10-04 21:23) [19]>[18] Чапаев(c) 4-Oct-2006, 21:21
>Отказалось компилироваться, конечно.
а tmt pascal, кажись, проглатывает такое. %-)
← →
TUser © (2006-10-04 21:23) [20]Просто поверь - ничего наисложнейшего в твоей задаче нет. Наоборот, есть требование написать тривиальный код, причем втаком стиле, в каком его никто в здравом уцме писать не будет.
Вот поломай голову - как раз на знание языка. Что произойдет в результате следующего кода? Ответить надо, разумеется, не компилируя эту программу
{$apptype console}
procedure P (A: integer); overload;
begin
writeln ("A is integer")
end;
procedure P (A: shortint); overload;
begin
writeln ("A is shortint");
end;
begin
P (10);
end.
Я вот, a priori, ответа не знал.
← →
Чапаев © (2006-10-04 21:24) [21]Ну и дура, раз проглатывает
← →
Чапаев © (2006-10-04 21:26) [22]Integer, полагаю. Щас проверю.
← →
Ketmar © (2006-10-04 21:26) [23]>[21] Чапаев(c) 4-Oct-2006, 21:24
>Ну и дура, раз проглатывает
не факт. иногда удобно. %-)
← →
Ketmar © (2006-10-04 21:26) [24]>[22] Чапаев(c) 4-Oct-2006, 21:26
>Integer, полагаю. Щас проверю.
хихик.
← →
Чапаев © (2006-10-04 21:26) [25]> [24] Ketmar © (04.10.06 21:26)
Ото ж...
← →
Ketmar © (2006-10-04 21:27) [26]>[25] Чапаев(c) 4-Oct-2006, 21:26
>Ото ж...
я тоже проверил. %-)
← →
Чапаев © (2006-10-04 21:28) [27]> [23] Ketmar © (04.10.06 21:26)
Нафиг, нафиг такие удобства... Завтра он окурок мимо урны кинет, послезавтра Родину продаст, а послепослезавтра и вовсе через правое плечо повернётся...
← →
Ketmar © (2006-10-04 21:29) [28]>[27] Чапаев(c) 4-Oct-2006, 21:28
>Нафиг, нафиг такие удобства...
ну, не утрируй. [7] -- тоже несколько маразматично. %-)
← →
default © (2006-10-04 21:32) [29]TUser © (04.10.06 21:23) [20]
это из разряда
"дети, как думаете, где должно находится право, а где лево?"
используется наиболее часто употребительный тип, в Delphi это Integer
← →
Чапаев © (2006-10-04 21:33) [30]> [28] Ketmar © (04.10.06 21:29)
Ничуть. Всяко правильней индексовую переменную объявлять именно того типа, которым является реальный индекс массива. А если у тебя какой-то невнятный 0..2, то и типа именованного нет. Вообще компилятор не обязан при объявлении
var
A:array [0..2] of Integer;
B:array [0..2] of Integer;
считать A и B переменными одного типа.
← →
Чапаев © (2006-10-04 21:33) [31]> [29] default © (04.10.06 21:32)
;-) Вот я тоже так думал... Оказалось -- излишне оптимистичен.
← →
default © (2006-10-04 21:35) [32]Удалено модератором
← →
Ketmar © (2006-10-04 21:42) [33]>[30] Чапаев(c) 4-Oct-2006, 21:33
>Вообще компилятор не обязан при объявлении
>var
> A:array [0..2] of Integer;
> B:array [0..2] of Integer;
>считать A и B переменными одного типа.
более того: если он будет так считать, то это глюкавый компилятор. %-)
← →
Чапаев © (2006-10-04 21:45) [34]> [33] Ketmar © (04.10.06 21:42)
Тогда почему TMT, позволяющий такую мешанину типов, не "нафиг"? ;-)
← →
Ketmar © (2006-10-04 21:49) [35]>[34] Чапаев(c) 4-Oct-2006, 21:45
>Тогда почему TMT, позволяющий такую мешанину
>типов, не "нафиг"? ;-)
а где я сказал, что "не нафиг"? я его не использую. %-)
← →
palva © (2006-10-04 22:05) [36]Изучать тонкости языка непродуктивно. Тем более, что некоторые нюансы меняются от версии к версии. Куда важнее научиться не торопясь и не задумываясь писать стандартные конструкции для реализации стандартных задач. Причем с правильными отступами, с логичным выбором имен переменных, с правильным выбором стандартных функций.
Если и заниматься извращениями, то только для того, чтобы знать, как программировать не надо. Избыток умственной энергии лучше направить на изучение других языков, того же ассемблера.
← →
XProger © (2006-10-04 22:07) [37]Ладно, раз никто ответа не знает, отвечу сам:
var
i : Integer;
v : array [0..2] of packed record
Color : record R, G, B : Byte; end;
Vertex : record X, Y, Z : Single; end;
Normal : record X, Y, Z : Single; end;
end = ((Color: (R: 255; G: 0; B: 0)),
(Vertex: (X: 0; Y: 0; Z: 0)),
(Normal: (X: 0; Y: 1; Z: 0)));
Обидно, что воспринимаете задачи так надменно. Всякое желание продолжать дискуссию отбивает...
А насчёт "проглатывает" смотрите:if (a(.i] > Byte(^a)) or (a[i.) < a[i + 1]) then
(
if (str1 = #13#10) and (str1 > str2) then
str1 := ^(^П^Р^Е^В^Е^Д#32"МИР"^!^)
);
Delphi это успешно пережёвывает ;)
← →
Ketmar © (2006-10-04 22:08) [38]>[37] XProger(c) 4-Oct-2006, 22:07
>Ладно, раз никто ответа не знает
знаем, знаем. %-)
>А насчёт "проглатывает" смотрите:
а с чего бы не "проглатывать"? вполне корректный код.
← →
XProger © (2006-10-04 22:09) [39]Ketmar, что означает ^ в данном коде?
← →
Ketmar © (2006-10-04 22:11) [40]>[39] XProger(c) 4-Oct-2006, 22:09
>Ketmar, что означает ^ в данном коде?
способ задания символа по его коду. не уверен, что это есть в стандарте, но в TP5 уже точно было. %-) например, ^G -- это #7. %-)
Страницы: 1 2 3 вся ветка
Форум: "Прочее";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.219 c