Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.25;
Скачать: CL | DM;

Вниз

Тесты на знание Delphi   Найти похожие ветки 

 
Григорьев Антон ©   (2008-11-23 16:48) [0]

Тут народ несколько раз интересовался, есть ли где в интернете тесты, по которым можно оценить своё знание Delphi. Теперь есть :) В честь случившегося недавно 10-летнего юбилея Королевства Delphi открылся раздел "Квинтана", содержащий такие тесты. Кому интересно, заходите.

http://www.delphikingdom.com/quintana/


 
DVM ©   (2008-11-23 17:42) [1]

Надеюсь, там в вопросах нет двусмысленности из-за которой люди даже отлично знающие предмет иногда тесты не проходят.


 
Григорьев Антон ©   (2008-11-23 19:23) [2]


> DVM ©   (23.11.08 17:42) [1]

Мы старались без двусмысенностей. Судя по тому, что пока была только одна жалоба такого рода на один вопрос, да и та спорная, в целом это удалось. По крайней мере, специально подлавливать на неточных формулировках мы не стремились.

Цель этих тестов несколько другая. Там к каждому вопросу прилагается комментарий, который становится виден только после прохождения теста. Если человек ответил неправильно, он сразу поймёт, в чём именно он ошибся, а в такой ситуации это объяснение запоминается гораздо лучше, чем если просто дать человеку прочитать теорию. Так что главная цель этого теста - чтобы если не с первого, то со второго раза человек не только правильно ответил на все вопросы, но и мог обосновать каждый ответ.

Ну, а если где-то найдёте двусмысленность, неточность, ошибку и т.п., пишите, поправим.


 
DVM ©   (2008-11-23 19:35) [3]


> Григорьев Антон ©   (23.11.08 19:23) [2]

там есть вопрос в классах такой, на котором я задумался:

Есть переменная Obj: TSomeClass. Каким условием можно проверить, ссылается ли Obj на какой-то объект или нет?
Варианты ответов:
1) if Obj <> nil then ...
2) if Assigned(Obj) then ...
3) if obj <> Null then ...
4) Это невозможно проверить

Ответ я конечно знал заранее (к тому же 1) и 2) почти одно и тоже, а выбран может быть только один, так что они отпадают оба), но задумался все же, а так ли однозначно можно сказать, что 4) правильный ответ.

Ведь можно определить, что переменная НЕ ссылается на какой либо объект.


 
Сергей М. ©   (2008-11-23 19:42) [4]


> если где-то найдёте двусмысленность, неточность, ошибку
> и т.п.


"Использование DLL"
Вопрос №1

Нет безусловно верного ответа.

Ответы "Ошибок нет" и "В списке импортируемых модулей отсутствует ShareMem" верны (равно как и не верны) лишь условно.


 
asail   (2008-11-23 19:46) [5]


> DVM ©   (23.11.08 19:35) [3]


> Ведь можно определить, что переменная НЕ ссылается на какой
> либо объект.

Можно определить, что переменная ссылается на какое-то место в памяти, п объект-ли это и уж тем более того-же конкретного класса, в общем случае, не возможно...

По сабжу: прошел пока только первый тест - 9 из 13... Расстроился... :-(


 
DVM ©   (2008-11-23 19:51) [6]


> в общем случае, не возможно...

Ну да, именно в общем случае. В частном же возможно.
Наверное так стоит написать:

4) Это в общем случае невозможно проверить.


 
Григорьев Антон ©   (2008-11-23 20:00) [7]


> DVM ©   (23.11.08 19:51) [6]
> Наверное так стоит написать:
>
> 4) Это в общем случае невозможно проверить.

Принято, сейчас исправлю.

> Сергей М. ©   (23.11.08 19:42) [4]
> Ответы "Ошибок нет" и "В списке импортируемых модулей отсутствует
> ShareMem" верны (равно как и не верны) лишь условно.

Что-то не понял, в чём условность. Если в параметрах есть string"и, в uses должен быть ShareMem или его аналог. Вы имели ввиду добавку про аналог? Или то, что string - это может быть ShortString?


 
blackman ©   (2008-11-23 20:08) [8]

Неплохо бы явно указать кодировку страницы UTF-8. Иначе IE при автомате неверно отображает


 
DVM ©   (2008-11-23 20:19) [9]

Хех. На 7 вопросе в разделе классы я попался. Хороший вопрос.

Вопрос №7
Что произойдёт при выполнении следующего кода?

type
 TSomeClass = class
 public
   procedure ShowMsg;
 end;

procedure TSomeClass.ShowMsg;
begin
 ShowMessage("Это метод TSomeClass.ShowMsg");
end;

...
var
 Obj: TSomeClass;
begin
 Obj.ShowMsg;
 ...
end;


 
Григорьев Антон ©   (2008-11-23 20:21) [10]


> blackman ©   (23.11.08 20:08) [8]
> Неплохо бы явно указать кодировку страницы UTF-8. Иначе
> IE при автомате неверно отображает

Странно... Заходил с разных машин, везде IE, и нигде проблем с кодировкой не видел. Правда, IE везде 6-ой, 7-ой я не тестировал. У вас какая версия?


 
DVM ©   (2008-11-23 20:36) [11]


> Григорьев Антон ©  

На мой взгляд спорный верный ответ в 6 вопросе в разделе Потоки.

Вопрос №6
Метод Execute класса TSomeThread, унаследованного от TThread, содержит не имеющий параметров метод DoSomething, а метод Execute у него реализован следующим образом

procedure TSomeThread.Execute;
begin
 while not Terminated do
   Synchronize(DoSomething);
end;

Содержит ли этот код ошибки, и если да, то какие?
Варианты ответов:
1) Код не содержит ошибок
2) Код не содержит формальных ошибок, но смысла не имеет
3) Прототип метода DoSomething не подходит для передачи в Synchronize
4) В методе Execute отсутствует вызов метода Execute предка

Вообще говоря, код ошибок не содержит. А имеет ли он смысл или не имеет - об этом можно сказать, если знать что внутри метода DoSomething. Может там как раз обновление интерфейса? В вопросе же не указано что там! Надо либо привести реализацию DoSomething, либо верный ответ - 1)


 
blackman ©   (2008-11-23 20:39) [12]

Григорьев Антон ©   (23.11.08 20:21) [10]
7. Но думаю, что не в этом дело. Не могу посмотреть код вашей страницы
http://www.delphikingdom.com/quintana/quintana.asp
Есть ли там строка
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Если нет и в IE установлено Кодировка=Автовыбор, отбражаться будет крякозябрами


 
antonn ©   (2008-11-23 20:40) [13]


> DVM ©   (23.11.08 20:19) [9]

тест не читал, но на первый взгляд AV :)


 
antonn ©   (2008-11-23 20:45) [14]


> Но думаю, что не в этом дело. Не могу посмотреть код вашей
> страницы
> http://www.delphikingdom.com/quintana/quintana.asp
> Есть ли там строка
> <meta http-equiv="Content-Type" content="text/html; charset=utf-
> 8">
> Если нет и в IE установлено Кодировка=Автовыбор, отбражаться
> будет крякозябрами
>

ИЕ очень нервничает из-за хедеров - либо их неправильного составления, либо несоответствия кодировки хедера и в тегах. В данном случае в хедерах неверный формат (указан только тип документа, без CP)


 
DVM ©   (2008-11-23 20:47) [15]


> antonn ©   (23.11.08 20:40) [13]


> тест не читал, но на первый взгляд AV :)

Я тоже так решил, не подумав. Потом проверил. Все будет работать. О как.


 
Григорьев Антон ©   (2008-11-23 20:48) [16]


> DVM ©   (23.11.08 20:36) [11]
> Вообще говоря, код ошибок не содержит. А имеет ли он смысл
> или не имеет - об этом можно сказать, если знать что внутри
> метода DoSomething. Может там как раз обновление интерфейса?
>  В вопросе же не указано что там! Надо либо привести реализацию
> DoSomething, либо верный ответ - 1)

По этому поводу категорически не согласен. Такая реализация Execute не имеет смысла независимо от того, что содержится в DoSomething. В комментарии к вопросу я это специально написал:

Таким образом, при данной реализации нить TSomeThread не делает никаких действий, кроме подачи сигналов главной нити и ожидания выполнения ею метода DoSomthing, т.е. никакого распараллеливания не происходит, и всю работу выполняет главная нить. Поэтому приведённый здесь код формально правильный, но смысла не имеет.

Я утверждаю, что такая реализация Execute только нагружает процессор бесполезной работой по переключению нитей и не даёт никакого выигрыша. Если вы с этим не согласны, прошу привести такой пример реализации DoSomething, когда это имеет смысл.


 
DVM ©   (2008-11-23 21:00) [17]


> Григорьев Антон ©   (23.11.08 20:48) [16]

Хотя, вы правы. Такую странную конструкцию никому в голову использовать не придет. Я почему то думая над вопросом, представлял себе что-то вроде такого:

procedure TSomeThread.Execute;
begin
while not Terminated do
  begin
    ....
    Synchronize(DoSomething);
    ....
  end;
end;


 
DVM ©   (2008-11-23 21:05) [18]


> Григорьев Антон ©   (23.11.08 20:48) [16]

Но все же вот такая конструкция работоспособна и смысл иметь может:

unit Unit2;

interface

uses
 Windows, Classes, SysUtils;

type
 TSomeThread = class(TThread)
 private
   { Private declarations }
 protected
   procedure Execute; override;
   procedure DoSomething;
   procedure Synchronize(Method: TThreadMethod); overload;
 end;

implementation

uses
  Unit1;

//------------------------------------------------------------------------------

procedure TSomeThread.Synchronize(Method: TThreadMethod);
begin
 sleep(10);
 // тут что-то делаем
 inherited Synchronize(Method);
end;

//------------------------------------------------------------------------------

procedure TSomeThread.DoSomething;
begin
 Form1.Label1.Caption := inttostr(GetCurrentThreadID)//TimeToStr(Now);
end;

//------------------------------------------------------------------------------

procedure TSomeThread.Execute;
begin
while not Terminated do
  begin
    Synchronize(DoSomething);
  end;
end;

//------------------------------------------------------------------------------

end.


 
Григорьев Антон ©   (2008-11-23 21:07) [19]


> DVM ©   (23.11.08 21:00) [17]
> Такую странную конструкцию никому в голову
> использовать не придет.

Тут вы, к сожалению, опять не правы. Придёт в голову не только использовать, но и другим советовать. В книге Архангельского "Программирование в Delphi 6" такой совет приводится. Вот, Игорь Шевченко об этой книге писал здесь: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1082

Так что этот код не с потолка взят, он реально в вопросах на форумах встречается.


 
antonn ©   (2008-11-23 21:10) [20]

потому что Архангельский забыл точечки (aka дополнительный код) поставить? :)


 
Григорьев Антон ©   (2008-11-23 21:19) [21]


> antonn ©   (23.11.08 21:10) [20]
> потому что Архангельский забыл точечки (aka дополнительный
> код) поставить? :)

Забыл или не забыл - это уже не суть важно. Главное, что по этой схеме уже не один человек пытался нити реализовывать, и надо что-то делать, чтобы таких людей было меньше :) К тому же, если я правильно понял Игоря, там речь идёт именно о готовых примерах программ, в которых написан точно такой код без всяких добавлений.


 
antonn ©   (2008-11-23 21:21) [22]

хотел много чего написать по поводу примеров Архангельского и "статьи" Игоря, но не буду, уже высказывался, да и оффтопик :)


 
Дмитрий С   (2008-11-23 22:05) [23]

Хорошие тесты
+1 в карму :)


 
TUser ©   (2008-11-23 22:45) [24]

Тесты хорошие, правда код из вопросов первой части (другие не смотрел) из серии нарочно не придумаешь. Так не только никто не будет писать, так писать прямо противопоказано для клеток головного мозга. Хотя для проверки знаний основ языка оно может и норально.


 
Loginov Dmitry ©   (2008-11-23 23:14) [25]

Спасибо за тест! Хоть нашелся повод размяться под конец выходный :)

Оказалось, 13 из 13 не так-то просто набрать. В связи с этим замечания )))

- по 4-му вопросу (базовые св-ва Delphi):

Если необходимо передать несколько флагов, как это можно сделать?

можно 2-мя способами. А разрешается выбрать только один.

- по 6-му вопросу.


-Динамические массивы не могут быть параметрами-переменными
-Здесь A – не динамический массив, а открытый, поэтому использовать SetLength нельзя


из-за очивидности ответа на этот вопрос, может показаться, что оба варианта правильны. На мой взгляд, формулировку можно бы как-то и упростить, иначе, все поголовно тут из-за подобной формулировки начнут спотыкаться :)

- по 9-му вопросу. Пришлось открыть справку, чтобы убедиться, что {$WRITEABLECONST ON} является синонимом {$J+}. Может стоит все-таки заменить на {$J+}, либо в коментарии указать оба варианта?


 
Loginov Dmitry ©   (2008-11-23 23:36) [26]

Вопросы в разделе "Классы" попроще. Мне кажется, в п. 4 перед строкой Obj.IntProp := ... не помешал бы намек в виде Edit1.Text := 1.5; (при этом придется правильный ответ также скорректировать)))


 
Anatoly Podgoretsky ©   (2008-11-23 23:47) [27]

> Loginov Dmitry  (23.11.2008 23:14:25)  [25]

> можно 2-мя способами. А разрешается выбрать только один.

Приведи второй.


 
Дмитрий С   (2008-11-24 00:05) [28]


> Anatoly Podgoretsky ©   (23.11.08 23:47) [27]

Можно ORами, можно +ами.


> -Динамические массивы не могут быть параметрами-переменными
> -Здесь A – не динамический массив, а открытый, поэтому использовать
> SetLength нельзя
>
>
> из-за очивидности ответа на этот вопрос, может показаться,
>  что оба варианта правильны. На мой взгляд, формулировку
> можно бы как-то и упростить, иначе, все поголовно тут из-
> за подобной формулировки начнут спотыкаться :)
>

Так динамический массив можно определить в качестве var параметра, поэтому "-Динамические массивы не могут быть параметрами-переменными" уже неверно


 
Anatoly Podgoretsky ©   (2008-11-24 00:12) [29]

> Дмитрий С  (24.11.2008 0:05:28)  [28]

Ошибаешься, видимо из-за нечеткого понимания двоичных операций, это не одно и тоже, результаты могут как отличаться, так и совпадать. Просто пример, пусть есть две константы A=1 и B=3

A or B = 3
A + B = 4

Второй вариант неверный, для битовых операций.


 
Loginov Dmitry ©   (2008-11-24 00:13) [30]

По разделу VCL. Обратил внимание на следующее описания (не стану говорить, почему оно привлекло внимание:)


В некоторых случаях всё не так очевидно. Если бы мы попытались аналогичным образом присвоить значение свойству Label1.Caption, программа запустилась бы, хотя присвоенное в конструкторе значение было бы проигнорировано. Это происходит потому, что в некоторых случаях код VCL проверяет Self на равенство nil, и если ссылка оказывается нулевой, просто ничего не делает.


на самом деле, многое чего делает, а проверка "Self <> nil" происходит после множества вызовов функций, и в данном случае принимается решение о возможности вызова WindowProc(Message).
Что-то не туда понесло на ночь глядя ))))


 
Loginov Dmitry ©   (2008-11-24 00:15) [31]

>
> это не одно и тоже, результаты могут как отличаться, так
> и совпадать


Там конкретный случай дан с MessageBox(). Вроде каких-либо проблем с "+" замечено не было ))


 
Дмитрий С   (2008-11-24 00:17) [32]


> Anatoly Podgoretsky ©   (24.11.08 00:12) [29]

Да понимаю я:) В некоторых случаях "+"ы  дадут нужный эффект, например, когда все константы - степени двойки и повторов нет.


 
Loginov Dmitry ©   (2008-11-24 00:33) [33]

Раздел "Использование DLL".

Все внимание уделяется модулю ShareMem (SimpleShareMem), хотя есть прекрасная и взаимоисключающая альтернатива - галочка "build with runtime packages", которая пока еще вполне доступна при сборке DLL :)


 
тимохов   (2008-11-24 00:52) [34]

прошел первый тест.
в последнем ошибся - не использовался за последние 12 лет ни разу вещественные числа - терпеть их не могу :) использую свой любимый Decimal, vartype 14.

тест хорош, честно.
на мой взгляд без двусмысленностей.

молодцы!


 
Loginov Dmitry ©   (2008-11-24 01:10) [35]

Раздел "Нити (threads)"

Как работает метод TThread.Synchronize?
 > Решает проблемы с синхронизацией неизвестным науке способом

Супер! =)

По вопросу 5, касающегося использование TTimer в дополнительном потоке.

В описании сказано, что Сказанное выше не означает, что TTimer нельзя использовать в неглавной нити.

Скажу по секрету: TTimer нельзя использовать в неглавной нити!!!!

Это опасно!

Если мы заглянет в TTimer.Create, то увидем вызов
FWindowHandle := Classes.AllocateHWnd(WndProc);

В функции Classes.AllocateHWnd последней строкой мы видим вызов:

 if Assigned(Method) then
   SetWindowLong(Result, GWL_WNDPROC, Longint(MakeObjectInstance(Method)));


Теперь посмотрим на реализацию функции MakeObjectInstance(). В ней используются глобальные объекты, которые никакой синхронизацией не защищены. Что получится, если теже TTimer одновременно будут созданы в 2х потоках? Убъем всю VCL! На 1-ядерных процессорах это очень большая редкость, зато на многоядерных - запросто. Кстати, библиотека IBx, идущая по умолчанию с Delphi 7, обладала той же болезнью. Ее просто опасно (!) было эксплуатировать в многопоточных приложениях. Возможно, что для кого-то это новость.


 
тимохов   (2008-11-24 01:20) [36]

а вот про нитки не согласен.

вопрос 9. createthread пользовался, пользуюсь и буду пользоваться. думаю, что нужно "правильно" заменить на "наименее трудозатратно". или вообще перефразировать - чем createthread хуже beginthread? ну и там, варианты ответов.

вопрос 8. облажался с waitfor - забыл, что он гад умный...

вопрос 4. Очень не согласен с тем, что terminatethread является некорректным способом закрытия потока. он является опасным и крайней мерой, но это способ, закрывающий поток. опять же - найдите мне способ прервать ADO запрос в доп. потоке? возможно, что когда я искал этот способ 3 года назад я был слаб, чтобы его найти, но ничего кроме закрытия потока я не нашел. я так и не воспользовался terminatethread для решения данной задачи (пусть висит запрос в фоне, фиг с ним), но иного способа я не вижу.

Опять же утвержение "данная нить не может быть остановлена корректно". А если в DoSomthing есть возможность возбудить исключение, тогда что? Исключения перестали быть корректными?

В общем хватит критики. Совет. Перепишите вопрос таким образом, чтобы не было двусмысленностей. Например, "Какие из перечисленных способов закрывают поток и какие из них являются предпочтительными в *большинстве* случаев":
1. waitfor
2. terminate
3. waitfor и terminatethread.
4. terminatethread как крайняя мера.
5. terminatethread как общепринятый способ завершения потоков.
6. никак.

я не автор вопросов, потому может не сильно правильно говорю, но вопрос 4 двусмысленный. это плохо.


 
Германн ©   (2008-11-24 01:25) [37]

Даже без очков прекрасно видно откуда у этой Квинтаны растут ноги :)
Очевидно ЮЗ решил, что несправедливо будет если "тесты Юрия Зотова" будут доступны только Riply. (Кстати, а фотку-то она ЮЗ выслала, как обещала? :).
Ну а то что в этом благородном проекте возможно приняли участие и некоторые другие уважаемые рыцари и маги королевства, так и им спасибо огромное!


 
Loginov Dmitry ©   (2008-11-24 01:25) [38]

> чем createthread хуже beginthread? ну и там, варианты ответов.


IsMultiThread? :)


 
Loginov Dmitry ©   (2008-11-24 01:29) [39]

> Очень не согласен с тем, что terminatethread является некорректным
> способом закрытия потока. он является опасным и крайней
> мерой, но это способ, закрывающий поток


Некорректный, поскольку варварски прерывает выполнение потока, после этого в отдельных случаях возможны любые глюки в программе. Кроме того, при использовании terminatethread стэк потока остается, а это целый мегабайт утекшей памяти (а то и больше, если были какие-либо динамические массивы или строки)!


 
Skyle ©   (2008-11-24 07:36) [40]

Вроде посмотрел ветку, об этом вопросе не нашёл. Итак.

VCL, вопрос №1

На некоторой неглавной форме Form2 встречается такой код:

procedure TForm2.Button1Click(Sender: TObject);
begin
 Form2.Label1.Caption := "Кнопка нажата";
end;


Всё ли правильно в этом коде (при условии что компонент Label1: TLabel действительно существует на форме)? Если нет, то что именно?

Первым делом хочется ответить, что переменная Form2, автоматом объявленная средой, может и не использоваться, поэтому такой вызов неверен. Но именно такого ответа я не нахожу. Далее читаю вопрос ещё раз, и вижу, что в вопросе есть указание на Form2. То есть не какой-нибудь TForm2, а именно Form2. После этого успокаиваюсь, решив, что переменная Form2 и есть та самая форма. Отвечаю "Все правильно" и получаю по шапке.

Где справедливость? :)



Страницы: 1 2 3 4 вся ветка

Текущий архив: 2009.01.25;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.016 c
1-1207561428
Yuri Btr
2008-04-07 13:43
2009.01.25
Отключить автопрокрутку в окне редактора Delphi


2-1229339493
smartleds
2008-12-15 14:11
2009.01.25
Подскажите плз как массив TrackBar-ов поместить в ScrollBox?


2-1228812833
Khim
2008-12-09 11:53
2009.01.25
Откуда окно?


15-1227847536
Slider007
2008-11-28 07:45
2009.01.25
С днем рождения ! 28 ноября 2008 пятница


2-1228833468
grav
2008-12-09 17:37
2009.01.25
Как считать содержимое DBEdit?