Тестовые вопросы для программистов

123
A
На сайте с 19.07.2010
Offline
130
#11
vbgm:

В абсолютно всех присланных решениях использовались условные операторы if:
if x = 220
x = 0

else
x = 220

endif

Один чел прислал решение xor 220. И его не взял, т.к. решение он подсмотрел.

xor - это классика ассемблера. :)

Держите еще один вариант, тоже классика:


x = 0 // начальная инициализация


x = 220 - x // сам тригер

.............
Artisan
На сайте с 04.03.2005
Offline
352
#12
Flector:
в условии задачи явно есть слово триггер.
триггеры — это устройства с двумя состояниями.

Сферическая лошадь в вакууме.

Напряжение плавает, потому что движение

электронов при нормальных условиях случайно.

Дребезг контактов, системные прерывания,

преобразование типов данных, многопоточность,

взаимодействие между процессами, бывают даже

глюки транслятора языка программирования.

И могут быть другие причины.

---------- Post added 14-03-2015 at 11:12 ----------

Дополнение о сферических лошадях.

https://ru.wikipedia.org/wiki/Ошибка_Pentium_FDIV

Ошибка Pentium FDIV — это ошибка в модуле операций с плавающей запятой в оригинальных процессорах Pentium, выпускавшихся фирмой Intel в 1994 году. Ошибка выражалась в том, что при проведении деления над числами с плавающей запятой при помощи команды процессора FDIV в некоторых случаях результат мог быть некорректным.

Данная ошибка была впервые обнаружена и опубликована профессором Линчбургского колледжа Томасом Найсли в октябре 1994 года[1].

Согласно заявлению Intel причиной проблемы послужили неточности в таблице поиска, используемой при проведении операции деления[2].

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

Стремление производителя утаить проблему и реакция на ее обнаружение вызвали недовольство потребителей и обширную критику в СМИ, в том числе жесткий репортаж CNN. В результате компания изменила позицию и объявила, что будет свободно обменивать дефектные процессоры всем желающим. Энди Гроув принес публичные извинения. История стоила Intel более половины прибыли за последний квартал 1994 г. — $475 млн[3].

Доверьяй, но проверьяй!

(C) Рональд Рейган

www.leak.info / ДАРОМ линки конкурентов и забытых доменов
Flector
На сайте с 09.09.2006
Offline
186
#13
Artisan:
Сферическая лошадь в вакууме.

в реальной задаче я бы проверял любые значения напряжения.

у меня сейчас ИБП питания показывает входящее 215в.

но в конкретной задаче на строго поставленном ТЗ в виде триггера - никаких проверок на несоответствие 220 и 0 я делать ни в коем случае не буду.

Оптимизайка
На сайте с 11.03.2012
Offline
396
#14

Я обычно беру какие-то вопросы отсюда, когда набираем людей:

https://github.com/akuzemchak/developer-interview-questions

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
Artisan
На сайте с 04.03.2005
Offline
352
#15
vbgm:
1. Источник электропитания - y;
Описать принцип кнопки-триггера,
переключающей напряжение 220В - 0В.
Flector:
в реальной задаче я бы проверял любые значения напряжения.
у меня сейчас ИБП питания показывает входящее 215в.

но в конкретной задаче на строго поставленном
ТЗ в виде триггера - никаких проверок на несоответствие
220 и 0 я делать ни в коем случае не буду.

В этой задаче явно написано,

что переключаем напряжение.

Откуда Вы точно знаете,

какое значение у переменной?

Я выше уже написал, что

может влиять на переменную.

Если у переменной может быть

значение 220, то это уже явно

не один бит, поэтому надо

учитывать все возможности.

220 Вольт есть опасное напряжение,

поэтому если надеяться, что выключено,

когда на самом деле включено,

то могут быть жертвы.

edogs software
На сайте с 15.12.2005
Offline
775
#16
Flector:
это вы выставляете себя самым умным, хотя аргументы у вас тупые.
на хрена?
в условии задачи явно есть слово триггер.
триггеры — это устройства с двумя состояниями.

поэтому и простой вариант с if x=220 и сложный вариант с xor подходят идеально.
я бы лично предпочел простой вариант, но уже вопросы предпочтений.

вы же из тех заказчиков, которые ставят программисту четкое ТЗ, а потом возмущаются тем, что программист не учел их мысли. откуда программисту знать, что триггер в понимании заказчика это вовсе не триггер?

Дилетант делает так, что бы "работало как надо", профи делает так что бы "не работало как не надо".

После таких как Вы появляются дырявые скрипты.

При чем Вы не правы даже формально по ТЗ. В задаче сказано что 220 должно быть переключено в 0, а 0 в 220. Вариант с 210 не описан, а значит при 210 ничего не должно происходить (или должен быть эксепшен). Ибо это триггер, 220 он переключает в 0, 0 в 220, а на остальные варианты он срабатывать не должен. Оба же варианта срабатывают при 210, первый делает 220, второй вообще какую-то чушь.

С тем же успехом можно забабахать пхп скрипт который на 220 будет выводить 0, на 0 будет выводить 220, а на 15 будет форматировать диск и потом кричать что "по ТЗ же все работает а 15 там не описано"©

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

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
Flector
На сайте с 09.09.2006
Offline
186
#17

edogs

вы глупы, вы это давно доказали.

vbgm
На сайте с 26.03.2009
Offline
164
#18
Flector:

1. а чем вас if не устроил?
или вы из тех, кому не конечный результат, а красота кода важнее?

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

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

Еще не устроило тем, что if - это слишком тупо. Еще не устроило тем, что знаю более подходящее для сишника решение: x = y - x Вот всё решение. И никаких 5 строк не нужно выдумывать и городить 10 огородов. Одна строка и всё.

edogs:
1. Не предусмотрена ситуация, когда x оказывается 210 (допустим), задумайтесь об этом.

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

Мужественно рукопожимаю! Держите плюсик.

Artisan:
А судьи кто?

if (x > 110)
x = 0; else
x = 220;

Я без словаря в крестах не разбираюсь. Как в Хатч в masm32 организовал макрос, так я и пишу сейчас.

Судья я. Вот мой пример, прошу критики.


LdCoreCfgFile Proc

.CODE
; -------------------------
; Сохраняем номер процедуры
;--------------------------
mov CurrentProcNumber, 00020004h

invoke CreateLog, LOG_CORE_CFG_LOADING
invoke LogOutInFile
; --------------------------------------
; Читаем файл core.cfg с настройками ядра
; --------------------------------------
invoke CreateFile, ADDR nCoreCfgFile,
GENERIC_READ,
NULL,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL

mov hCoreCfgFile, eax
; --------------------------------------
; Проверка
; --------------------------------------
.if eax == 0
invoke CreateLog, LOG_CORE_CFG_ERROR
invoke LogOutInFile
mov ebx, 1
ret
.elseif
invoke CreateLog, LOG_CORE_CFG_OPEN
invoke LogOutInFile
.endif
; --------------------------------------
invoke GetFileSize, hCoreCfgFile, NULL
mov sCoreCfgFile, eax
; --------------------------------------
; Выделяем память для сообщений
; --------------------------------------
invoke HeapAlloc, hHeap, NULL, sCoreCfgFile
mov pCoreCfg, eax
; --------------------------------------
; Проверка
; --------------------------------------
.if eax == 0
invoke CreateLog, LOG_HEAPALLOC_ERROR
invoke LogOutInFile
mov ebx, 1
ret
.elseif
invoke CreateLog, LOG_HEAPALLOC_OK
invoke LogOutInFile
.endif
; --------------------------------------
invoke ReadFile, hCoreCfgFile,\
pCoreCfg,\
sCoreCfgFile,\
ADDR FileReadWrite,\
NULL
; --------------------------------------
; Проверка
; --------------------------------------
.if eax == 0
invoke CreateLog, LOG_CORE_CFG_READ_ERROR
invoke LogOutInFile
mov ebx, 0
ret
.elseif
invoke CreateLog, LOG_CORE_CFG_READ
invoke AddNumberInLog, FileReadWrite
invoke AddLog, LOG_BYTES_STORED
; --------------------------------
invoke LogOutInFile
.endif
; --------------------------------------
invoke CloseHandle, hCoreCfgFile
; --------------------------------------
; Вычисляем количество строк
; --------------------------------------
mov esi, pCoreCfg ; Указатель на загруженные данные
xor ebx, ebx ; Обнуляем счетчик строк
mov ecx, sCoreCfgFile ; Размер загруженных данных
push ecx
cld

LdCoreCfgFileLoop01:
lodsb
cmp al, 0Ah ; Проверяем на перевод строки
je LdCoreCfgFilePlus01 ; Истинно - идем плюсовать счетчик
loop LdCoreCfgFileLoop01 ; Ложно - идем дальше
jmp LdCoreCfgFileComplete01

LdCoreCfgFilePlus01:
inc ebx ; Увеличиваем счетчик на 1
loop LdCoreCfgFileLoop01 ; Данные не кончились - продолжаем

LdCoreCfgFileComplete01:
mov nCoreCfg, ebx ; В EBX количество строк

inc ebx
shl ebx, 3 ; Умножаем на 8 байт (2 по 4)
invoke HeapAlloc, hHeap, NULL, ebx
mov tCoreCfg, eax
; --------------------------------------
; Проверка
; --------------------------------------
.if eax == 0
invoke CreateLog, LOG_HEAPALLOC_ERROR
invoke LogOutInFile
mov ebx, 1
ret
.elseif
invoke CreateLog, LOG_HEAPALLOC_OK
invoke LogOutInFile
.endif
; --------------------------------------
; Индексируем сообщения
; --------------------------------------
pop ecx ; В ECX количество символов
mov esi, pCoreCfg ; Указатель на загруженные данные
mov edx, tCoreCfg ; Указатель на таблицу адресов строк
cld

LdCoreCfgFileLoop021:
mov ebx, esi ; Для вычисления длины строки
mov [edx], esi ; Сохраняем адрес
add edx, 4

LdCoreCfgFileLoop022:
lodsb
cmp al, 0Ah
je LdCoreCfgFilePlus02 ; Истинно - идем плюсовать счетчик
loop LdCoreCfgFileLoop022 ; Ложно - идем дальше
jmp LdCoreCfgFileComplete02

LdCoreCfgFilePlus02:
mov eax, esi ;
sub eax, ebx ; Разница = длина пройденной строки
mov [edx], eax ; Сохраняем длину строки
add edx, 4 ; Прибавляем для следующего захода

loop LdCoreCfgFileLoop021
jmp LdCoreCfgFileExit

LdCoreCfgFileComplete02:
mov eax, esi ;
sub eax, ebx ; Разница = длина пройденной строки
mov [edx], eax
; --------------------------------------
; Индексировано успешно
; --------------------------------------
LdCoreCfgFileExit:
invoke CreateLog, LOG_CORE_CFG_INDEXED
invoke LogOutInFile
; --------------------------------------
xor ebx, ebx ; Выходной код процедуры "Нет ошибки"
ret

LdCoreCfgFile EndP
admak:
xor - это классика ассемблера. :)

Держите еще один вариант, тоже классика:

x = 0 // начальная инициализация


x = 220 - x // сам тригер

:D :D :D Спасибо за мою же собственную цитату самому же мне. :D

Именно об этом случае я и рассказываю.

Памятники из мрамора и гранита (http://pamyat59.ru) Охота на медведя на овсах (http://ohota59.ru)
Artisan
На сайте с 04.03.2005
Offline
352
#19
vbgm:
Я без словаря в крестах не разбираюсь.
Как в Хатч в masm32 организовал макрос, так я и пишу сейчас.
Судья я. Вот мой пример, прошу критики.

Я писал без крестов,

K&R, вот это наше все.

ASM в Вашем образце, культура

кодирования отвратительная.

В самом начале процедуры должно

быть описание, вход, выход, действия.

Комментарии описывают простые действия,

без пояснения зачем нужны эти действия.

Все числовые константы надо

define со смыслом предварительно.

#define ProcedureIndexFile 00020004h

#define LineFeed 0Ah

Константы для условий надо

define именовать обязательно.

#define FileFail 0

#define HeapFail 0

.if eax == FileFail

Зачем вообще ассемблер для этой задачи?

Страдают читаемость и переносимость.

Файловые действия сожрут столько

времени, что вся скорость теряется.

Не обязательно строка файла

заканчивается LF знаком, последняя

строка может быть без LF знака,

Вы такую строку не считаете.

loop LdCoreCfgFileLoop01

inc ebx ; надо считать последнюю строку без LF знака

jmp LdCoreCfgFileComplete01

Выходной код лучше отдавать

в обычном eax регистре.

Можно еще подумать,

но есть другие дела.

vbgm
На сайте с 26.03.2009
Offline
164
#20

Спасибо!

Artisan:

1. Я писал без крестов, K&R, вот это наше все.

2. ASM в Вашем образце, культура кодирования отвратительная. В самом начале процедуры должно быть описание, вход, выход, действия. Зачем вообще ассемблер для этой задачи? Страдают читаемость и переносимость.

3. Не обязательно строка файла заканчивается LF знаком, последняя строка может быть без LF знака, Вы такую строку не считаете.

4. Выходной код лучше отдавать в обычном eax регистре.

1. Что есть K&R?

2. Это не инлайн процедура в сикоде. Это одна из асм-процедур в асм-программе. Весь движок будет на асме.

Там пока 30Кб кода и еще 12Кб в inc-файле всяческих прототипов, макросов, констант, структур и т.д.

3. У меня все предусмотрено. В читаемых файлах последняя строка неудаляемая.

4. Нельзя. В eax содержится код ошибки последней выполненной функции для выходного лога. GetLastError - не вариант.

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий