Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/34: Рейтинг темы: голосов - 34, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 16.10.2015
Сообщений: 27

Проверить и прокомментировать вариант решения тестового задания при приёме на работу

16.10.2015, 21:07. Показов 7427. Ответов 87
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!
Сделал тестовое задание, которое попросил сделать один работодатель, на что получил отказ и комментарий о том, что "оно сделано неидеально". Как вы думаете, что могло там не понравиться, чтобы знать на будущее? Это работодатель такой капризный или я такой кривой программер, что там действительно сделано так нехорошо? Несколько шероховатостей я вижу, но могли ли они быть основанием для отказа?

Ниже привожу свои варианты решения задач.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.10.2015, 21:07
Ответы с готовыми решениями:

Проверить и прокомментировать вариант решения тестового экзаменационного задания по теории C++ и Си
Уважаемые профессионалы,на днях мне предстоит сдавать экзамен по программированию, если не затруднит - посмотрите вопросы, которые я...

Тесты, вопросы и задания при приеме на работу
Давайте делится - если кто в недавнем времени устраивался и проходил собеседования....

Какого уровня тестовые задания при приеме на работу ребят без опыта
Всем привет. Краткая предыстория: высшее образование у меня гуманитарное, но чёрт дернул меня идти в программисты (всегда хотел в IT,...

87
1 / 1 / 0
Регистрация: 16.10.2015
Сообщений: 27
17.10.2015, 19:23  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Renji Посмотреть сообщение
В схеме ТС с дословной реализацией автомата, никаких indirect call нету. Есть явно объявленная переменная состояния, определяющая какая ветка алгоритма будет выполнена и подменяющая собой штатный механизм call. И самопальный std::stack, подменяющий собой штатный механизм возврата. Я так понял, вы ратовали именно за это чудо-юдо. И да, вы в курсе что indirect call будет тормознутее call, из-за все того же предсказания переходов?

Сортировка вставкой в отсортированный список, все равно остается сортировкой. Ну а вызывают ее потроха шаблона.

Ну да, подумаешь, спекулятивное выполнение инструкций отвалилось, так как процессор не знает чего там спекулятивно считать надо. Главное что кеш на месте.
Самопальный std::stack не нужен, равно как и переменная состояния - это я сглупил, но как сделать вместо сортировки просто вставку в упорядоченный список - пока не вкуриваю, товарищи... туплю...хотя да, просто std::set?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.10.2015, 19:34
Цитата Сообщение от Renji Посмотреть сообщение
В схеме ТС с дословной реализацией автомата, никаких indirect call нету. Есть явно объявленная переменная состояния, определяющая какая ветка алгоритма будет выполнена и подменяющая собой штатный механизм call. И самопальный std::stack, подменяющий собой штатный механизм возврата. Я так понял, вы ратовали именно за это чудо-юдо. И да, вы в курсе что indirect call будет тормознутее call, из-за все того же предсказания переходов?
Если один indirect call заменяет при этом кучу ифов то не будет
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.10.2015, 19:40
Цитата Сообщение от a_shy Посмотреть сообщение
Самопальный std::stack не нужен, равно как и переменная состояния - это я сглупил, но как сделать вместо сортировки просто вставку в упорядоченный список - пока не вкуриваю, товарищи... туплю...хотя да, просто std::set?
Вообще говоря, никак эту вставку делать не нужно. Если уж сортировка вставкой так крута, ее, наверно, и так запихали в стандартный std::sort. Так что ничего не потеряете просто прочитав не отсортированную кучу значений и натравив на них потом стандартную функцию сортировки.
Но если очень надо самому сделать, но std::set наверняка работает на сбалансированных деревьях.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Если один indirect call заменяет при этом кучу ифов то не будет
Куча ифов, это не call по константному адрессу.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.10.2015, 20:14
Речь идет о примерно такой реализации автомате (Даже не набросок а заготовка наброска)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
__fastcall int TStringSorter::OpenBarcet(char *c){
           FMode=0;
           return true;
};
__fastcall int TStringSorter::CloseBarcet(char *c){
           FMode=1;
           return true;
};
__fastcall int TStringSorter::Operator(char *c){
           FMode=1;
           return true;
};
__fastcall int TStringSorter::Identifier(char *c){
           FMode=0
           return true;
};
__fastcall int TStringSorter::EndOfString(char *c){
           return 0;
};
__fastcall int TStringSorter::IllegalChar(char *c){
           throw new Exception (AnsiString ("Illegal character:")+*c);
};
__fastcall int TStringSorter::Space(char *c){
           return 1;
};
__fastcall int TStringSorter::Unexpected(char *c){
           throw new Exception (AnsiString ("Unexpected character:")+*c);
};
 
__fastcall TStringSorter::StringSorter(){
           ParseTable={ { // At Start and After ( or +
        Identifier, Unexpected, OpenBarcet, Unexpected, IllegalCharacter,
        EndOfStrng, }, { // after Identifier or )
        Unexpected, Operator, Unexpected, CloseBarcet, IllegalCharacter,
        EndOfStrng, };
};
__fastcall AnsiString TStringSorter::Sort(AnsiString Str){
           Reset();
           char *StrPtr=Str.c_str();
           while (ParseTable[Mode][AlphaBetta[*StrPtr]](StrPtr++));
};
__fastcall ~TStringSorter::StringSorter(){
};
Добавлено через 31 минуту
Цитата Сообщение от a_shy Посмотреть сообщение
но как сделать вместо сортировки просто вставку в упорядоченный список - пока не вкуриваю
Тут вся хохма что сортировка не списка древовидной иерархии списков. Смысл простой - по открывающейся скобке создаешь новый список и держищь его по добавлении упорядоченным, по закрытии возвращаешся на уровень выше, добавляя текущий в вышестоящий субнодом. Списки между собой сравниваются по имени первого идентификатора. Вопрос тут как бы все это без ветвлений и динамического распределения вырулить.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.10.2015, 20:17
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Речь идет о примерно такой реализации автомате (Даже не набросок а заготовка наброска)
А, то есть, о том, чтобы навелосипедить switch по AlphaBetta[*StrPtr]. Знаете, с таким подходом лучше пишите на ассемблере. В конце концов, штатные средства плюсов вы все равно использовать не хотите.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.10.2015, 20:25
Цитата Сообщение от Renji Посмотреть сообщение
но std::set наверняка работает на сбалансированных деревьях.
по доке в std::set они несортированные, просто есть или нема. Да и вообще, если это касается SQL сервера, то нагрузочка будет нехилой. А этот говнокод под названием std:: настолько динамическую память постоянно перераспределяет что для надежной работы под нагрузкой абсолютно непригоден, хотя бы потому что быстро влетит в фрагментацию кучи. Тут другой подход нужен - выделил буфера при инициализации парсера и реюзай на каждый запрос, а не распределяй/удаляй на каждый символ.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.10.2015, 20:28
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
по доке в std::set они несортированные, просто есть или нема.
Это вам Рабинович по телефону напел? "Internally, the elements in a set are always sorted following a specific strict weak ordering criterion indicated by its internal comparison object (of type Compare)."
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.10.2015, 20:47
Цитата Сообщение от Renji Посмотреть сообщение
В конце концов, штатные средства плюсов вы все равно использовать не хотите.
А то что я исполъзую и есть штатные средства плюсов. Просто не надо забывать что кроме std:: есть еще и С++. И еще кучу нештатных использую. Вернее в нормальных компиляторах они уже 20 лет как штатные, но только в нормальных. Это АСУТП а не сборник говнокода. Здесь высеры типа stl:: unsafe.

Добавлено через 3 минуты
Цитата Сообщение от Renji Посмотреть сообщение
Знаете, с таким подходом лучше пишите на ассемблере.
Оператор asm{} кстати штатное средство С++

Добавлено через 1 минуту
Цитата Сообщение от Renji Посмотреть сообщение
А, то есть, о том, чтобы навелосипедить switch по AlphaBetta[*StrPtr].
Только табличка алфавита легко заменяема данными в отличии от swich
0
0 / 0 / 0
Регистрация: 16.10.2015
Сообщений: 157
17.10.2015, 20:59
почитал. Рэнжи прав.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.10.2015, 21:23
Цитата Сообщение от bad_santa Посмотреть сообщение
почитал. Рэнжи прав.
Все зависит от уровня задач. З/П посчитать или там избирателей посортировать и STL хватит. А для суръезных дел ее приткнуть некуда.
0
1 / 1 / 0
Регистрация: 16.10.2015
Сообщений: 27
23.10.2015, 09:28  [ТС]
По первым двум заданиям пришли отказы. Попытка номер 3.
Задание.
Необходимо реализовать класс(ы) для генерирования идентификаторов.
Идентификаторы должны быть последовательными целыми числами (например, 3, 4, 5 и т.п.). Другие свойства генератора вам нужно придумать самому на основе того, что по вашему мнению может понадобится пользователям вашего генератора. Код должен быть написан на C++ используя любой официальный стандарт. Из библиотек можно использовать libc, stl и boost.
Решение приложено (и уже отправлено работодателю - я же честный мальчик).
Что скажете?
Вложения
Тип файла: zip IdGenerator.zip (2.1 Кб, 20 просмотров)
0
27 / 26 / 6
Регистрация: 02.02.2014
Сообщений: 96
23.10.2015, 10:52
Из N+1 генераторов при их сохранении/загрузке N превратятся в тыкву. Лежащий рядом скрипт idGenerator при сохранении превратится в тыкву. Опять шаблоны на ровном месте, но по сравнению с первыми двумя проблемными моментами это уже не важно.
0
1 / 1 / 0
Регистрация: 16.10.2015
Сообщений: 27
23.10.2015, 12:11  [ТС]
Цитата Сообщение от warhast Посмотреть сообщение
Из N+1 генераторов при их сохранении/загрузке N превратятся в тыкву. Лежащий рядом скрипт idGenerator при сохранении превратится в тыкву. Опять шаблоны на ровном месте, но по сравнению с первыми двумя проблемными моментами это уже не важно.
Насчет затирания файла - да, я это, конечно, заметил, но лень было что-то с этим делать (пришлось бы городить какой-то огород, к которому я был не готов).
Насчет сохранения загрузки - еще утром у меня был другой вариант вообще без классов (нафиг они тут нужны?) а просто со статическим классом-инициализатором генератора + самой функцией-генератором. Он работал нормально. Но перед отправкой я еще разок перечитал задание, а там написано, что надо сделать класс(ы). Тут я подумал, что лажанулся и все переписал с помощью класса и уже не обратил внимание на эту проблему. Потом решил опять для крутости добавить темплейт... вот дебил я...
0
27 / 26 / 6
Регистрация: 02.02.2014
Сообщений: 96
23.10.2015, 12:50
Тут можно было вообще отписаться, что есть на свете std::atomic... - готовые классы, которых вполне достаточно для указанной задачи и выставить основным решением что-то вроде "using Generator = std::atomic<int>".
0
1 / 1 / 0
Регистрация: 16.10.2015
Сообщений: 27
12.11.2015, 15:50  [ТС]
Попытка номер 5.
Задание.
1. Написать класс, реализующий примитив синхронизации «много читателей/один писатель», для доступа к разделяемым данным.
2. Написать программу, демонстрирующую возможности данного класса.

Условия работы:
- Писатель может захватить примитив, если он не захвачен ни писателем, ни читателем. Если захват невозможен, писатель должен ждать;
- Читатель может захватить примитив, если он не захвачен писателем. Если захват невозможен, читатель должен ждать;
- Приоритет при захвате примитива всегда отдаётся писателю, т.е. если читатель и писатель должны ждать одновременно, то первым доступ получает писатель.

Все под Windows.
Решение приложено.
Вложения
Тип файла: zip RWLock.zip (6.6 Кб, 14 просмотров)
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
12.11.2015, 17:30
Цитата Сообщение от a_shy Посмотреть сообщение
Попытка номер 5.
1. Не обращая внимания на корректность реализации, сразу же бросается в глаза порнография:
— throw new
— Не-explict конструкторы с одним параметром.
— Непонятно зачем используемые битовые поля.
— Операторы приведения сомнительной полезности с конструкциями вида return *(LONG*)this;
2. Если посмотреть на реализацию, то она тоже какая-то странная. Состояния не прикрыты мьютексами. Создается их копия и дальше закрываем глаза на то, что состояние может измениться в другом потоке. Какие-то непонятные вложенные бесконечные циклы, внезапные Sleep(0)… Изменение состояния выполняется по принципу «пробуем записать пока не успеем». Посмотрите в сети варианты решения этой задачи — там все сильно проще. Либо я чего-то не понимаю.
2
27 / 26 / 6
Регистрация: 02.02.2014
Сообщений: 96
12.11.2015, 17:59
В условиях нет ни слова про запрет пользоваться C++11, а ведь с 11 стандартом код вышел бы намного проще - весь класс свелся бы к обертке над mutex-ом и conditional_variable, которая (обертка) бы уже меняла как надо остальное состояние. Опять же код заметно сложнее, чем необходимо для решения задачи.
P.S. у SemaphoreWrapper никуда не делись оба оператора присваивания = утечка хендлов если что.
P.P.S. да и ядреные семафоры тащить туда, где хватило бы critical section - явный перебор.
1
1 / 1 / 0
Регистрация: 16.10.2015
Сообщений: 27
12.11.2015, 21:56  [ТС]
В варианте с critical section performance хуже.
SemaphoreWrapper - да, утечка хэндлов, спасибо!
shared_mutex есть в С++14 - он бы помог, наверное, но у меня нет даже такого компайлера проверить.

Добавлено через 4 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
1. Не обращая внимания на корректность реализации, сразу же бросается в глаза порнография:
— throw new
— Не-explict конструкторы с одним параметром.
— Непонятно зачем используемые битовые поля.
— Операторы приведения сомнительной полезности с конструкциями вида return *(LONG*)this;
2. Если посмотреть на реализацию, то она тоже какая-то странная. Состояния не прикрыты мьютексами. Создается их копия и дальше закрываем глаза на то, что состояние может измениться в другом потоке. Какие-то непонятные вложенные бесконечные циклы, внезапные Sleep(0)… Изменение состояния выполняется по принципу «пробуем записать пока не успеем». Посмотрите в сети варианты решения этой задачи — там все сильно проще. Либо я чего-то не понимаю.
Да, throw new - согласен
не-explicit - конструкторы тоже согласен
Битовые поля совершенно понятно зачем - performance, иначе бы пришлось ставить залочки какие-то на развесистые структуры. А так - InterlockedCompareExhange, и все.
Состояния не прикрыты мьютексами - это намеренно, для увеличения производительности. Все абсолютно корректно, там даже подробные комменты есть, что зачем и почему.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
13.11.2015, 06:40
Цитата Сообщение от a_shy Посмотреть сообщение
Состояния не прикрыты мьютексами - это намеренно
Ок, на свежую голову я понял, что там происходит. И осознал, почему не понял сразу.
Делается две копии состояния. Одна для изменений, вторая для сравнения с оригиналом. И вот я ожидал бы, что вторая будет явно объявлена константой.
1
1 / 1 / 0
Регистрация: 16.10.2015
Сообщений: 27
13.11.2015, 09:31  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Ок, на свежую голову я понял, что там происходит. И осознал, почему не понял сразу.
Делается две копии состояния. Одна для изменений, вторая для сравнения с оригиналом. И вот я ожидал бы, что вторая будет явно объявлена константой.
Да! Надо было сделать константой! Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.11.2015, 09:31
Помогаю со студенческими работами здесь

Не взяли на работу из-за неправильно выполненного тестового задания, посмотрите?
Привет. Устраиваюсь в одну контору на Junior Python 40 тыс.р до вычета. Сегодня ответили: “Бла бла бла…На данный момент не готовы...

Задание при приёме на работу
Всем привет! Мне дали на собеседовании задание по access. Я его до этого не изучал, а сейчас сижу и усиленно читаю мануалы для...

Тесты при приёме на работу
Какие примерно тестовые задания могут дать по ООП и по самому синтаксису языка PHP?

Задание при приеме на работу
Здравствуйте, уважаемые форумчане! При устройстве на работу получила перечень заданий, с большинством из которых уже справилась. Осталось...

Задача при приеме на работу
Офигенская задача, я ее давно услышал. Сейчас Вам повествую о ней Пришел один человек для приема на работу. Ему задают 4...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru