Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1159716860
RASkov
2006-10-01 19:34
2006.10.29
[Error] D7Paket.dpk(33):


2-1160747147
dera
2006-10-13 17:45
2006.10.29
Вопрос любителям SQL


15-1160488725
Чародей
2006-10-10 17:58
2006.10.29
jpeg


2-1160668745
Ezorcist
2006-10-12 19:59
2006.10.29
Как закрасить форму картинкой в TBitmap?


2-1160502347
EG
2006-10-10 21:45
2006.10.29
Вопрос по ООП





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский