Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Игра в С++ |
Автор: FiMa1 28.8.2007, 15:19 | ||
Доброго здравия, друзья! Очередная, небольшая задачка, заданная в г. N госпоже N на собеседовании: Что делает приведенная ниже функция, для чего можно ее использовать? С какими значениями параметров целесообразно вызывать функцию, для чего предназначен каждый из параметров? Т.к. ответа не было предоставлено, пришлось ограничиться собственным предположением, коим поделюсь позже.. Интересно было бы взглянуть на ваши догадки.
|
Автор: Dray 28.8.2007, 15:44 |
За такие функции надо руки отрывать |
Автор: Lazin 28.8.2007, 15:52 |
ф-я ищет в массиве a из b элементов значение c и возвращает его индекс, иначе -1 |
Автор: Freak_FB 28.8.2007, 16:05 |
Код проанализирован, и вот что получается: Функция определяет второе вхождение значения, заданного параметром c, в массив, заданный параметром a. Параметром b целесообразно обозначить размер этого массива минус 1. |
Автор: Solomon 28.8.2007, 16:08 | ||
всмысле -1.. что задать размер отриц числом??? |
Автор: FiMa1 28.8.2007, 16:10 | ||||||
Результат: not found... Добавлено через 2 минуты и 44 секунды
Freak_FB, садитесь - 5! И +1 в репу! |
Автор: Lazin 28.8.2007, 16:13 | ||
b - просто размер массива, так как в выражении --i + b > 0 сначала выполнится декримент, а потом сложение и сравнение, про второй элемент согласен. |
Автор: FiMa1 28.8.2007, 16:19 | ||
Будьте внимательны: оторвав руки по самую жопу слушателю на собеседовании, вы можете не получить желаемой работы ![]() |
Автор: JackYF 28.8.2007, 16:54 | ||
имхо, для начала следует заявить, что функция не выдерживает критики по параметру понятности и т.д. А потом поинтересоваться - "мне точно сейчас разбирать эту лабуду?" |
Автор: Rockie 28.8.2007, 17:11 | ||||
Желаемая работа, как я понимаю - это программы делать, а не http://en.wikipedia.org/wiki/Brainfuck разгадывать ![]()
А работодатель с юморком ![]() |
Автор: Любитель 29.8.2007, 22:46 |
Скажем НЕТ извращенцам!!! |
Автор: Fazil6 29.8.2007, 22:51 |
читал... много думал... Так и не решл где тут очепятка... |
Автор: Любитель 29.8.2007, 23:21 |
Теперь пойдёт? ![]() |
Автор: zkv 29.8.2007, 23:41 |
FiMa1, интересно, а сколько времени давали? согласен, при практическом применении. Но рискну утверждать, что для собеседования задание может считаться вполне приемлимым. В конце-концов, возможно, это задание шло на правах "повышенной сложности", и было не обязательным для решения. |
Автор: Любитель 29.8.2007, 23:54 | ||
А я так не считаю. Для вопроса в универе как раз нормально - многие преподя любят спрашивать подобную чушь, а вот при собеседование при приёме на работу - ни в коем случае. |
Автор: zkv 30.8.2007, 00:19 |
Любитель, я думаю хороший тест должен быть составлен так, чтобы никто не мог выбить максимальный балл. Должны быть простые вопросы, сложные, и почти нерешаемые. Ты ведь не станешь жаловаться на то, что в тестах на IQ некоторые вопросы слишком сложные? Если присутствовать только простые вопросы будут, то по какому принципу отсеивать кандидатов? Конкретно этот решенный вопрос будет свидетельствовать о способности кандидата разбирать чужой код, если справится с этим чудовищем, то со всем остальным и подавно. Мой итог: вопрос имеет право на жизнь, при правильной оценки работодателем решения кандидата. |
Автор: FiMa1 30.8.2007, 08:47 | ||||
То, что за такие функции в практике надо руки отрывать - неоспоримый факт, но, в рамках собеседования, задача, имхо, имеет право на существование. 1. Проверка первой реакции человека на предложенную задачу - первое что хочется сделать, это действительно оторвать руки собеседника и отойти в сторону, но с какой стороны это охарактеризует вас для работодателя? 2. Проверка способностей к разбору чужого кода + знание побитовых операций, префиксного, постфиксного декрементов в целом... На вопрос сколько было дано времени на решение - думаю около 15 минут, вряд ли больше... В любом, случае, мое мнение таково - хватать ручку, бумагу, задавать входные значения и анализировать, анализировать (Freak_FB, насколько я понимаю, анализировал под дебагерром). Лучше анализировать вслух, тогда, если не хватит времени, будет видно, что все усилия были приложены. В конце концов, я думаю, zkv был прав насчет того, что задание было не обязательным для решения. Вообще, забавно, что вы заговорили о самом собеседовании.. Вот вам еще задачка, заданная там же: Есть некий класс A, где-то в программе создан указатель на этот класс и объект типа данного класса. Как реализован класс, что будет ошибка компиляции, в строке обозначенной в коде ниже. Что это за ошибка? Каково тело класса? Подсказка: вопрос связан с областью видимости переменных. Старайтесь провести анализ без использования компилятора для моделирования реальных условий ![]()
|
Автор: zkv 30.8.2007, 08:59 | ||
у меня не связано ![]()
|
Автор: Shaggie 30.8.2007, 09:00 |
есть конструктор с параметрами и нет конструктора без параметров. |
Автор: FiMa1 30.8.2007, 09:03 | ||||||
Это первое что я сказал, но ВОПРОС СВЯЗАН С ОБЛАСТЬЮ ВИДИМОСТИ ПЕРЕМЕННЫХ, ответили мне ![]() Добавлено @ 09:06
Что имел в виду? |
Автор: zkv 30.8.2007, 09:12 | ||
что такой код выдаст именно такую ошибку, что и требовалось ![]()
|
Автор: FiMa1 30.8.2007, 09:17 | ||
Ладно не будем тянуть кота за х..., zkv - пять баллов, ты прав и успешно принят на работу ![]() |
Автор: zkv 30.8.2007, 09:22 |
дык у меня решение не связано с областью видимости. все просто, по умолчанию все члены класса закрытые, можно было явно написать private: или protected: перед конструктором, только не так интересно будет ![]() ну а дальше ясно - указатель он и в африке указатель, он и на абстрактный тип может быть, для него конструктор не нужен а вот для объекта вызывается конструктор умолчания, а он закрыт, вот компилятор и сообщает: "ты определись давай!" |
Автор: FiMa1 30.8.2007, 09:28 | ||
![]() |
Автор: zkv 30.8.2007, 09:34 | ||
FiMa1, я под областью видимости привык понимать следующее:
а то о чем шла речь выше - это модификаторы доступа. Может где-нибудь принято называть по другому. |
Автор: UnrealMan 30.8.2007, 10:08 | ||
Это каким надо быть извращенцем, чтобы accessibility перевести на русский как область видимости. В топку таких работодателей. Лучше не иметь с ними никаких дел. |
Автор: FiMa1 30.8.2007, 10:21 | ||
О переводе речь не ведется, cannot access private member declared in class 'A' - копипаст трактования ошибки студией.. Насколько я понял, само то, что закрытые классом конструктор/деструктор невидимы (а по моему, лучше недоступны) на данном участке программы (Керниган: область видимости - участок программы, где это имя известно), подгоняли под понятие области видимости. Пробежался по стандарту - в разделе Declarative regions and scopes ничего про данный взгляд на область видимости не нашел... |
Автор: UnrealMan 30.8.2007, 10:43 | ||||||||
Видимость и доступность – совсем разные вещи. Давай посмотрим на такой пример:
При разрешении перегрузки метод void f(int) видим, но для вызова он не доступен. Поэтому в первом случае, когда разрешение перегрузки оказывается в пользу вызова открытой функции, проблем не возникает, когда же оно оказывается в пользу вызова закрытой функции, возникает ошибка.
Вот scope – это и есть область видимости. |
Автор: FiMa1 30.8.2007, 10:50 | ||||||
По-моему из моей фразы:
Спасибо ![]() |
Автор: UnrealMan 30.8.2007, 11:58 |
А что ты тогда искал в пункте 3.3? Про accessibility там, естественно, ничего нет; вопросы доступности рассматриваются в главе 11 Member access control. |
Автор: Mayk 30.8.2007, 19:02 | ||||||||||
Как знание префиксных/постфиксных она отдалена от реальности. Разбор
vs
принесёт гораздо больше полезной информации.
вот ешё один изуверский способ завалить в A obj. Правда выходим за рамки тела класса. Но совсем чуть чуть.
|
Автор: jurgal 31.8.2007, 10:20 | ||
какую функцию выполняют ^ и тильда перед i ? |
Автор: UnrealMan 31.8.2007, 10:21 | ||
Кстати, могу подкинуть одну простенькую задачку. Есть код
Что нужно вставить вместо /* ... */, чтобы вывелось "ellipsis"? Макросы и комментарии использовать запрещается. Вводить новую перегруженную функцию f тоже. |
Автор: FiMa1 31.8.2007, 10:53 | ||
|
Автор: UnrealMan 31.8.2007, 11:02 |
Я немного усложнил требование: вводить новую перегруженную f нельзя. |
Автор: FiMa1 31.8.2007, 11:05 | ||
А x обязательно в качестве аргумента передавать, его ведь можно и убрать f(); ![]() А, ну да, ведь нужно добавить некий кусочек, ну тогда как вариант... |
Автор: UnrealMan 31.8.2007, 11:06 |
Обязательно. Иначе смысл задачи теряется. Добавлено @ 11:08 Можно лишь заменять /* ... */ на какой-то код. Править существующий код или добавлять код куда-то ещё не допускается. |
Автор: FiMa1 31.8.2007, 11:27 | ||
|
Автор: UnrealMan 31.8.2007, 11:43 |
Ссылка на функцию будет передана шаблонной функции, которая выведет "template" ![]() |
Автор: FiMa1 31.8.2007, 11:45 | ||
Компилировал? |
Автор: bsa 31.8.2007, 11:57 | ||||
gcc 4.1.2 выдает "template" |
Автор: FiMa1 31.8.2007, 12:04 | ||
|
Автор: bsa 31.8.2007, 12:06 | ||
FiMa1 ты хоть проверяешь? Вот еще вариант, но немного "читерский" ![]()
|
Автор: FiMa1 31.8.2007, 12:06 | ||||||||
![]()
|
Автор: UnrealMan 31.8.2007, 12:08 |
x будет передана как ссылка на функцию |
Автор: FiMa1 31.8.2007, 12:09 | ||
По поводу? Так не правильно дописать что ли void x(){} ? |
Автор: UnrealMan 31.8.2007, 12:17 |
Я, кстати, не видел в стандарте разрешения использовать указатели и ссылки на функции-эллипсисы. |
Автор: Fazil6 31.8.2007, 12:20 |
ну и запрета там походу тоже нет FiMa1, специально проверил твой последний вариант. Microsoft Visual Studio 2005 Version 8.0.50727.762 (SP.050727-7600) Microsoft .NET Framework Version 2.0.50727 шаблон в обоих случаях вызвался |
Автор: UnrealMan 31.8.2007, 12:22 |
Что не разрешено, то запрещено. |
Автор: FiMa1 31.8.2007, 12:23 | ||||
Ну а тот вариант где сам x - функция?
|
Автор: UnrealMan 31.8.2007, 12:26 |
x будет передана ссылкой на функцию в шаблонную функцию |
Автор: FiMa1 31.8.2007, 12:27 | ||
![]() Но здравая логика, говорит, что компилятор возможно не прав.. |
Автор: UnrealMan 31.8.2007, 12:32 |
Если стандарт никак не огововаривает поведение ссылок на функции с эллипсисами, то тут не о чем говорить. Результат может быть любой. |
Автор: bns 31.8.2007, 12:38 | ||
у меня в VS2005
выдает ellipsis |
Автор: UnrealMan 31.8.2007, 13:33 |
Задачка элементарная, и у неё есть вполне стандартное решение. Вставить надо всего одну простую строчку кода. Даже короче, чем void x(){} ![]() |
Автор: bsa 31.8.2007, 14:08 | ||
|
Автор: FiMa1 31.8.2007, 14:11 | ||||
у меня "template" выводит ![]() |
Автор: UnrealMan 31.8.2007, 14:14 |
Ну наконец-то ![]() Так что такие варианты enum {x}; enum {} x; class {} x; всегда будут идти мимо шаблонов Добавлено через 1 минуту и 7 секунд Компилятор смени. Стандарт запрещает вывод анонимных типов. |
Автор: FiMa1 31.8.2007, 14:22 | ||
Мда уж.. Так же стандарту не соответствует Borland C++ Builder Enterprise Suite Version 6.0 (Build 10.157). Вариант с классом прогонял уже давно, вот ведь гады ![]() Аналогичная ситуация и для dev-cpp v 4.9.8.0 ![]() |
Автор: bsa 31.8.2007, 15:22 |
Вообще-то речь идет про анонимные типы. Т.е. enum X { x = 10; }; - это не анонимный тип |
Автор: UnrealMan 1.9.2007, 10:14 | ||||
Помнится, у борланда вообще какие-то странности с enum-ами были. Попробуй в нём скомпилировать такой код
Что вывелось на экран? |
Автор: Любитель 1.9.2007, 15:30 |
![]() Зачем? |
Автор: UnrealMan 1.9.2007, 17:13 |
Для std::endl ![]() |
Автор: bsa 1.9.2007, 20:00 |
iostream сам подключает ostream и istream. |
Автор: Mayk 1.9.2007, 21:40 |
Формально говоря, если это и следует из текущего стандарта, то очень уж не явно. |
Автор: bsa 1.9.2007, 21:45 |
а разве std::cout, std::cerr и std::cin не экземпляры потомков соответствующих классов? |
Автор: UnrealMan 1.9.2007, 22:13 |
Это естественная, но необязательная реализация ![]() |
Автор: Mayk 1.9.2007, 22:21 | ||||||||||
вот что говорит стандарт.
Вполне себе собирается. Это во-первых. Во-вторых. endl не является членом [io]stream'а. Поэтому даже если в iostream определяется ostream, это вовсе не факт что endl в нём объявлен.
Правда, в стандарте есть пример в разделе 27.6.1.3
из которого можно сделать вывод о том что endl в iostream'е таки подразумевается. [что любопытно, в примере из раздела 14.6 используется cout << ... << '\n'] |
Автор: UnrealMan 2.9.2007, 10:04 |
Ну, в стандарте много незаконченных примеров ![]() |
Автор: The Thing 3.9.2007, 14:01 | ||
скажите, а что в коде означает символ тильда "~i"?
|
Автор: Lazin 3.9.2007, 14:38 |
The Thing, ~ - отрицание, так-как i - отрицательное число, то ~i = abs(i) - 1 ~(-1) = 0 ~(-2) = 1 итд а xor там для сравнения |