Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 94, средняя оценка - 4.88
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
#1

Тестовое задание на Junior C++ dev - C++

26.07.2013, 18:40. Просмотров 14210. Ответов 60
Метки нет (Все метки)

Доброго времени суток.
Неделю назад ради интереса отправил свое резюме в одну компанию, куда требуются с++ юниоры. Получил от них тестовое задание. Я ожидал, что они мне откажут (опыта то у меня действительно мизер), но хотелось бы узнать у более опытных людей, какое решение задач "ожидает" компания от соискателя для продолжения с ним отношений.
Далее идет 4 задачи и мой вариант решения каждой из них.

1. Распечатать произвольное число в двоичной системе исчисления.

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

Декларация.
voidNumberAsBinary(
char* _result,// строка с результатом
unsignedint _number// произвольное число
)

Ожидаемый результат.
Например, для числа 13 данная функция должна вернуть строку "1101".

Проверка работы.
Решение должно демонстрировать работу функции на примере 10 случайных чисел в диапазоне 0 до 512.
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
#include <iostream>
#include <stdlib.h>
#include <time.h>
using std::cout;
using std::endl;
 
void numberAsBinary(char *_result, unsigned int _number); 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    char *result = new char[11];
    unsigned int number;
    
    srand((unsigned)time(NULL));
    for (int i = 1; i <= 10; i++)
    {
        number = rand() % 513;
        numberAsBinary(result, number);
        cout << "Число " << number << " в двоичной системе счисления равно " << result << endl;
    }
 
    delete [] result;
    system("pause");
    return 0;
}
 
void numberAsBinary(
char *_result,
unsigned int _number
    )
{
    static int i;
    i = 0;
 
    if (_number != 1)
        numberAsBinary(_result, _number / 2);
 
    _result[i] = (_number % 2) + '0';
    i++;
    _result[i] = '\0';
}

2. Сгенерировать неупорядоченный массив целых чисел от 1 до N.

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

Декларация.
void GenerateRandomArray(
int * _result, // возвращаемыймассив
unsignedint _maxValue// максимальное число в последовательности
)

Ожидаемый результат.
Например, 2 последовательных запуска данной функции с параметром 7 могут сгенерировать последовательности вида
{2, 5, 7, 3, 4, 1, 6}
{5, 1, 3, 4, 6, 2, 7}

Проверка работы.
Решение должно демонстрировать работу функции на примере 4 случайных чисел в диапазоне от 5 до 15.
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
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <iomanip>
using std::cout;
using std::endl;
 
void generateRandomArray(int *_result, unsigned int _maxValue);
 
int main()
{
    setlocale(LC_ALL, "Russian");
    unsigned int maxValue;
    
    srand((unsigned)time(NULL));
    for (int i = 1; i <= 4; i++)
    {
        maxValue = 5 + rand() % 11;
        int *result = new int[maxValue];
        generateRandomArray(result, maxValue);
    
        cout << "Неупорядоченные числа от 1 до " 
             << std::setw(2) << maxValue << ": ";
        for (unsigned int i = 0; i < maxValue; i++)
            cout << result[i] << ' ';
        cout << endl;
        delete [] result;
    }
 
    system("pause");
    return 0;
}
 
void generateRandomArray(
int *_result, 
unsigned int _maxValue
    )
{
    int ind1, ind2, tmp;
 
    for (unsigned int i = 0, j = 1; i < _maxValue; i++, j++)
        _result[i] = j;
 
    for (int i = 1; i <= 20; i++)
    {
        ind1 = rand() % _maxValue;
        ind2 = rand() % _maxValue;
        tmp = _result[ind1];
        _result[ind1] = _result[ind2];
        _result[ind2] = tmp;
    }
}

3. Сортировка массива.

Описание.
Написать функцию, принимающую в качестве параметра массив неупорядоченных целых чисел (сгенерированный с помощью функции из задачи 2) и выполняющую его сортировку.

Декларация.
voidSort(
int* _values,// сортируемый массив
unsignedint _count// количество элементов в массиве
)

Ожидаемый результат.
Например, массив вида {2, 5, 7, 3, 4, 1, 6} будет преобразован данной функцией в {1, 2, 3, 4, 5, 6, 7}.

Проверка работы.
Решение должно демонстрировать работу функции на примере результатов, полученных при решении задачи 2 (последовательностей, сгенерированных для 4 случайных чисел в диапазоне от 5 до 15).
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <iomanip>
using std::cout;
using std::endl;
 
void generateRandomArray(int *_result, unsigned int _maxValue);
void Sort(int *_values, unsigned int _count);
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    unsigned int maxValue;
    
    srand((unsigned)time(NULL));
    for (int i = 1; i <= 4; i++)
    {
        maxValue = 5 + rand() % 11;
        int *result = new int[maxValue];
        generateRandomArray(result, maxValue);
    
        cout << "Неупорядоченные числа от 1 до " 
             << std::setw(2) << maxValue << ": ";
        for (unsigned int i = 0; i < maxValue; i++)
            cout << result[i] << ' ';
        cout << endl;
 
        Sort(result, maxValue - 1);
 
        cout << "Упорядоченные числа от 1 до " 
             << std::setw(2) << maxValue << ":   ";
        for (unsigned int i = 0; i < maxValue; i++)
            cout << result[i] << ' ';
        cout << endl << endl;
 
        delete [] result;
    }
 
    system("pause");
    return 0;
}
 
void generateRandomArray(
int *_result, 
unsigned int _maxValue
    )
{
    int ind1, ind2, tmp;
 
    for (unsigned int i = 0, j = 1; i < _maxValue; i++, j++)
        _result[i] = j;
 
    for (int i = 1; i <= 20; i++)
    {
        ind1 = rand() % _maxValue;
        ind2 = rand() % _maxValue;
        tmp = _result[ind1];
        _result[ind1] = _result[ind2];
        _result[ind2] = tmp;
    }
}
 
void Sort(
int *_values,
unsigned int _count
    )
{
    int i = 0, j = _count; 
    int temp, p;
 
    p = _values[_count >> 1]; 
 
    do
    {
        while (_values[i] < p) i++;
        while (_values[j] > p) j--;
 
        if (i <= j) 
        {
            temp = _values[i];
            _values[i] = _values[j];
            _values[j] = temp;
            i++;
            j--;
        }
 
    } while (i <= j);
 
    if (j > 0) 
        Sort(_values, j);
    if (_count > (unsigned)i)  
        Sort(_values+i, _count-i);
}
4. Определить недостающее число в неупорядоченной последовательности целых чисел.

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

Декларация.
intGetMissingValue(
constint * _values,// неупорядоченный массив целых чисел от 1 до _count
unsignedint _count// количество элементов в массиве
)

Ожидаемый результат.
Например, для последовательности {5, 7, 8,3, 1, 9, 2, 6, 4} данная функция должна вернуть 4.

Проверка работы.
Решение должно демонстрировать работу функций на примере результатов, полученных при решении задачи 2 (последовательностей, сгенерированных для 4 случайных чисел в диапазоне от 5 до 15).
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <iomanip>
using std::cout;
using std::endl;
 
void generateRandomArray(int *_result, unsigned int _maxValue);
void Sort(int *_values, unsigned int _count);
int getMissingValue(const int *_values, unsigned int _count);
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    unsigned int maxValue;
    
    srand((unsigned)time(NULL));
    for (int i = 1; i <= 4; i++)
    {
        maxValue = 5 + rand() % 11;
        int *result = new int[maxValue];
        generateRandomArray(result, maxValue);
    
        cout << "Неупорядоченные числа от 1 до " 
             << std::setw(2) << maxValue << ": ";
        for (unsigned int i = 0; i < maxValue; i++)
            cout << result[i] << ' ';
 
        cout << endl << "Значение последнего элемента:     " 
             << getMissingValue(result, maxValue) << endl;
 
        Sort(result, maxValue - 1);
 
        cout << "Упорядоченные числа от 1 до " 
             << std::setw(2) << maxValue << ":   ";
        for (unsigned int i = 0; i < maxValue; i++)
            cout << result[i] << ' ';
        cout << endl << endl;
 
        delete [] result;
    }
 
    system("pause");
    return 0;
}
 
void generateRandomArray(
int *_result, 
unsigned int _maxValue
    )
{
    int ind1, ind2, tmp;
 
    for (unsigned int i = 0, j = 1; i < _maxValue; i++, j++)
        _result[i] = j;
 
    for (int i = 1; i <= 20; i++)
    {
        ind1 = rand() % _maxValue;
        ind2 = rand() % _maxValue;
        tmp = _result[ind1];
        _result[ind1] = _result[ind2];
        _result[ind2] = tmp;
    }
}
 
void Sort(
int *_values,
unsigned int _count
    )
{
    int i = 0, j = _count; 
    int temp, p;
 
    p = _values[_count >> 1]; 
 
    do
    {
        while (_values[i] < p) i++;
        while (_values[j] > p) j--;
 
        if (i <= j) 
        {
            temp = _values[i];
            _values[i] = _values[j];
            _values[j] = temp;
            i++;
            j--;
        }
 
    } while (i <= j);
 
    if (j > 0) 
        Sort(_values, j);
    if (_count > (unsigned)i)  
        Sort(_values+i, _count-i);
}
 
int getMissingValue(
const int *_values,
unsigned int _count
    )
{
    unsigned int checkSum = 0, sum = 0;
 
    for (unsigned int i = 0; i < _count - 1; i++)
    {
        checkSum += i + 1;
        sum += _values[i];
    }
 
    return checkSum + _count - sum;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2013, 18:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Тестовое задание на Junior C++ dev (C++):

Тестовое задание - C++
private class Connect (){ public Device dev1 = new Device(); public Device dev2 = new Device(); puclic void Connect (){ for...

ООП. Тестовое задание собеседования. - C++
Это тестовое задание для устройста на работу. Я не совсем понимаю что от меня хотят. Не могли бы вы мне далее составить набросок плана...

Тестовое задание для трудоустройства - C++
Решил попробовать устроиться в компанию и узнать что вообще и как. Отправил в компанию резюме, дали тестовое задание: Страуструп. Глава...

Небольшое тестовое задание в финской компании. - C++
Привествую всех жителей форума. Сразу отмечу, что решения просить не хочу, а просто хочу показать задание, которая давала компания...

Написать ответы на тестовое задание при приёме на работу (исключения, sizeof, mutex) - C++
Добрый день! Ходил недавно на собеседование. Имеется список вопросов, на некоторые ответил правильно на какие-то - нет. Хотелось бы...

Тестовое задание от работадателя. Хотелось бы услышать критику. - C++
Пробую устроиться программистом. Вот одна из компаний выслала мне тестовое задание следующего содержания: Немного поломав голову,...

60
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 20:16  [ТС] #16
Цитата Сообщение от 0x10 Посмотреть сообщение
Ну в смысле, что требуют, чтобы 13 выводилось как 1101, а не как 00001101.
Ну так они так и выводятся
0
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,099
26.07.2013, 20:19 #17
Цитата Сообщение от Мимино Посмотреть сообщение
Ну так они так и выводятся
Ок. Значит, просто рекурсию убрать. И дополнительный буфер в итеративном решении ни к чему, я думаю.
0
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 20:21  [ТС] #18
Цитата Сообщение от 0x10 Посмотреть сообщение
1) а нужны ли там два счетчика в первом цикле, где происходит заполнение массива?
2) а можно ли в цикле со случайными перестановками обойтись одним вызовом rand()?
1) Да, можно так
C++
1
2
for (unsigned int i = 0; i < _maxValue; i++)
        _result[i] = i + 1;
2) можно. Например, переставлять постоянно одну и ту же позицию на рандомное место. На сколько это эффективно не могу сейчас точно сказать.
0
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,099
26.07.2013, 20:22 #19
Цитата Сообщение от Мимино Посмотреть сообщение
можно. Например, переставлять постоянно одну и ту же позицию на рандомное место.
Ага, почти.
Алгоритм перемешивания массива много раз на форуме расписывали.
0
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 20:23  [ТС] #20
Цитата Сообщение от 0x10 Посмотреть сообщение
Ок. Значит, просто рекурсию убрать. И дополнительный буфер в итеративном решении ни к чему, я думаю.
ммм.... а как? если бы было заранее известно количество символов в строке, то да, итеративно без доп.буфера. Ну или если бы функция имела бы тип возвращаемого значения не void, можно было бы возвращать указатель на первый ненулевой элемент строки.
0
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,099
26.07.2013, 20:25 #21
Мимино, можем пройтись по битам целого числа и не начинать запись в строку до тех пор, пока не встретим первую единицу.
0
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 20:29  [ТС] #22
Цитата Сообщение от 0x10 Посмотреть сообщение
Мимино, можем пройтись по битам целого числа и не начинать запись в строку до тех пор, пока не встретим первую единицу.
Вариант, но почему в данном моменте рекурсия хуже?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
26.07.2013, 20:33 #23
C++
1
2
3
4
void NumberAsBinary(
char* _result,// строка с результатом
unsigned int _number// произвольное число
)
Серьезно, не стоит даже пытаться писать резюме в эту компанию. Параметры функции, начинающиеся с подчеркивания - это коротко говоря очень грустно. Все сказанное чистое ИМХО разумеется.
0
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,099
26.07.2013, 20:34 #24
Кастую в тред кого-нибудь умного, кто скажет, что рекурсия всегда хуже, когда возможна итерация)

Добавлено через 47 секунд

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Параметры функции, начинающиеся с подчеркивания - это коротко говоря очень грустно
Оставим на совести компании...

0
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 20:34  [ТС] #25
Цитата Сообщение от 0x10 Посмотреть сообщение
Ага, почти.
Алгоритм перемешивания массива много раз на форуме расписывали.
Нашел тему Перемешивание массива. Чем плох мой вариант? Я не использовал STL? Да, это большой минус, но... в требованиях к кандидату говорится, что знание STL это только дополнительное преимущество, а не требование.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
26.07.2013, 20:34 #26
0x10, Зависит от требований эффективности, логичности все же. qsort например итеративно писать несколько сложнее, чем рекурсивно. Или обход дерева.
0
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 20:45  [ТС] #27
И все же, как по вашему, в чем же у меня такой минус, что даже на собеседование не позвали? Сильно заметно по коду, что я зеленый-зеленый? Или есть какие то недопустимые ошибки в решении задач?
0
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,099
26.07.2013, 21:12 #28
Цитата Сообщение от ForEveR Посмотреть сообщение
Зависит от требований эффективности, логичности все же.
Да. Но в общем случае, полагаю, о рекурсии стоит задумываться в последнюю очередь.

Цитата Сообщение от Мимино Посмотреть сообщение
Вариант, но почему в данном моменте рекурсия хуже?
Хотя бы тем, что тут она не нужна) слишком жирно тратиться на вызов функции для такой простой задачи. Плюс, битовые операции в помощь.
Сейчас просто набросал эту функцию - получилось 23 строки, из которых 12 - фигурные скобки и пустые строки. Не думаю, что это слишком громоздко.

Цитата Сообщение от Мимино Посмотреть сообщение
Чем плох мой вариант? Я не использовал STL? Да, это большой минус, но...
Не в stl дело, а в самом алгоритме)
Я допускаю, что возможно несколько реализаций, но лично мне ближе рассматривать такую функцию как предельный случай выборки без повторений, когда размер выборки равен размеру массива.
Ну и два рандома для одной операции - это в принципе не очень хорошо, поскольку числа все-таки он генерирует псевдослучайные.

Добавлено через 7 минут
Мимино, про перемешивание... Это, конечно, крайний и не особо возможный случай, но представьте, что генератор тупит и всегда выдает константу. Тогда по завершению цикла массив вообще не перемешается.

Добавлено через 7 минут
Хотя с последним уже меня заносит - такие случаи вообще не имеет смысла рассматривать.
1
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 21:14  [ТС] #29
Цитата Сообщение от 0x10 Посмотреть сообщение
Хотя бы тем, что тут она не нужна) слишком жирно тратиться на вызов функции для такой простой задачи.
Но требований то никаких не ставилось Вот в других компаниях требования четко стоят: сделать рекурсивно или сделать итеративно... или просят реализовать алгоритм определенной сложности... А тут делай как хочешь, а мы потом посмотрим Вот поэтому у меня и возник вопрос: посмотрев на это действительно можно понять, что я не гожусь даже в подмастерье? И если да, то по каким критериям. Критерии мы обсудили, но вопрос в том, достаточно ли их для принятия решения об отказе? У кого опыт в этом деле есть?
0
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
26.07.2013, 21:15 #30
а что стандартную библиотеку нельзя было использовать?
там некоторые задания на 5 строчек кода.
0
26.07.2013, 21:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2013, 21:15
Привет! Вот еще темы с ответами:

Тестовое задание к собеседованию Junior ASP.NET MVC - C# MVC
Всем привет! Буду рад любой помощи и совету. Ситуация такая: компания дала тестовое задние перед собеседование на Junior ASP.NET MVC...

Тестовое задание - Java
Возникла необходимость сделать вот такое задание. Create a configurable two-level cache (for caching Objects). Level 1 is memory,...

Тестовое задание - PHP
Ребят, подскажите пожалуйста, кто с опытом, есть компания, хорошие условия работы и т.п. Я сразу понимаю что не волоку, но хочу подтянуть...

тестовое задание - Java SE
Здравствуйте! тестовое задание : Задача создать GUI приложение для конвертации файлов данных разных форматов. Данными в...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru