Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 94, средняя оценка - 4.88
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 18:40     Тестовое задание на Junior C++ dev #1
Доброго времени суток.
Неделю назад ради интереса отправил свое резюме в одну компанию, куда требуются с++ юниоры. Получил от них тестовое задание. Я ожидал, что они мне откажут (опыта то у меня действительно мизер), но хотелось бы узнать у более опытных людей, какое решение задач "ожидает" компания от соискателя для продолжения с ним отношений.
Далее идет 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2013, 18:40     Тестовое задание на Junior C++ dev
Посмотрите здесь:

Задание на массив и задание на матрицу. C++
C++ Dev C++
Небольшое тестовое задание в финской компании. C++
C++ Публичные проекты. Junior C++
ООП. Тестовое задание собеседования. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
26.07.2013, 18:55     Тестовое задание на Junior C++ dev #2
В 4 задаче схитри. Просто посчитай сумму чисел с помощью формулы суммы арифметической прогрессии.
S = ( 2*a1 + (n - 1)*d ) / 2 * n.
где a1 — первый член прогрессии, d — разность прогрессии, n — количество суммируемых членов.
В твоём случае a1 = 1, d = 1, n = _count + 1;
Теперь посчитай сумму элементов в данном массиве. Вычти эту сумму из суммы прогрессии.
Разность будет недостающим числом.
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 18:58  [ТС]     Тестовое задание на Junior C++ dev #3
Цитата Сообщение от SummerRain Посмотреть сообщение
В 4 задаче схитри. Просто посчитай сумму чисел с помощью формулы суммы арифметической прогрессии.
S = ( 2*a1 + (n - 1)*d ) / 2 * n.
где a1 — первый член прогрессии, d — разность прогрессии, n — количество суммируемых членов.
В твоём случае a1 = 1, d = 1, n = _count + 1;
Теперь посчитай сумму элементов в данном массиве. Вычти эту сумму из суммы прогрессии.
Разность будет недостающим числом.
Спасибо, но разве это может повлиять на принятие решения относительно соискателя?
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
26.07.2013, 19:01     Тестовое задание на Junior C++ dev #4
Покажет, что ты умеешь мыслить нестандартно. Находить скрытые более легкие пути.
Это выделит тебя из толпы людей, которые решат её правильно, но обычным путём.
На собеседовании важно не только правильно решить задачу, но и показать свою смекалку и находчивость.
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 19:08  [ТС]     Тестовое задание на Junior C++ dev #5
Цитата Сообщение от SummerRain Посмотреть сообщение
Покажет, что ты умеешь мыслить нестандартно. Находить скрытые более легкие пути.
Это выделит тебя из толпы людей, которые решат её правильно, но обычным путём.
На собеседовании важно не только правильно решить задачу, но и показать свою смекалку и находчивость.
Ну так решение и построено почти по этому же принципу. Сумма всех элементов последовательности минус сумма элементов массива без последнего элемента. Только подсчет суммы последовательности ведется в том же цикле, что и сумма элементов массива.
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
26.07.2013, 19:09     Тестовое задание на Junior C++ dev #6
а сортировка зачем?
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 19:37  [ТС]     Тестовое задание на Junior C++ dev #7
Цитата Сообщение от SummerRain Посмотреть сообщение
а сортировка зачем?
да, там я тупанул немного. нужно было на примере 2-го задания проверить. а я проверил на примере 3-го.

Добавлено через 27 минут
Вариантов больше нет, все идеально?
Вот еще есть правила решения
Правила решения.

Результат решения задач должен представлять из себя компилирующийся и запускающийся проект для MicrosoftVisualStudio (C++), содержащий исходные файлы с решением для каждой задачи.

Решением каждой задачи является функция, написанная на языке С либо С++ и соответствующая всем указанным в задаче требованиям, а также код, позволяющий оценить результаты ее выполнения.
Например, если указано, что решение должно демонстрировать работу функции на примере 10 случайных чисел в диапазоне 0 до 512, тест-код должен генерировать 10 случайных чисел в указанном диапазоне и запускать функцию, передавая каждое из них в качестве параметра.

При решении задач допускается использование произвольных функцийC standard libraryи произвольных контейнеровStandard C++ library, за исключением функций, полностью решающих поставленную задачу - например, при решении задачи о сортировке массива недопустимо использование функции qsort.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
26.07.2013, 19:53     Тестовое задание на Junior C++ dev #8
Автор уже отправил свои варианты или ждет пока ему напишут другие решения тут?
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 19:54  [ТС]     Тестовое задание на Junior C++ dev #9
Цитата Сообщение от 0x10 Посмотреть сообщение
Автор уже отправил свои варианты или ждет пока ему напишут другие решения тут?
Я уже отправил эти решения и получил ожидаемый отказ. Вот теперь интересно узнать, как должно выглядеть приближенное к идеалу решения этих задач.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
26.07.2013, 19:58     Тестовое задание на Junior C++ dev #10
Сразу вопрос по первой задаче: с какой целью была использована рекурсия?
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 20:01  [ТС]     Тестовое задание на Junior C++ dev #11
Цитата Сообщение от 0x10 Посмотреть сообщение
Сразу вопрос по первой задаче: с какой целью была использована рекурсия?
Сначала я решил это задание простым циклом. Во временную строку записывал остатки от деления, а потом эту строку переписал в обратном порядке в _result. Получилось громоздко. Рекурсия позволяет сразу записывать результат в строку в правильном порядке.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
26.07.2013, 20:05     Тестовое задание на Junior C++ dev #12
4.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main()
{
    int arr[4] {1, 2, 3, 9991};
    int x = 0;
    for(int i = 0; i < 4; ++i)
        x = x ^ arr[i] ^ (i + 1);
    std::cout << (x ^ 4);
    return 0;
}


нет. что-то я погорячился)
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
26.07.2013, 20:13     Тестовое задание на Junior C++ dev #13
Мимино, думаю, стоит все-таки реализовать итеративное решение, с возможностью пропуска начальных нулей, раз того требует постановка задачи.

Olivеr, если бы и нет - к подобным функциям было бы неплохо еще прикладывать портянку комментариев с пояснениями)

Добавлено через 3 минуты
Мимино, по второй задаче стоит, пожалуй, задуматься над вопросами:
1) а нужны ли там два счетчика в первом цикле, где происходит заполнение массива?
2) а можно ли в цикле со случайными перестановками обойтись одним вызовом rand()?
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 20:14  [ТС]     Тестовое задание на Junior C++ dev #14
Цитата Сообщение от 0x10 Посмотреть сообщение
с возможностью пропуска начальных нулей, раз того требует постановка задачи.
в смысле? тут не понял.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
26.07.2013, 20:15     Тестовое задание на Junior C++ dev #15
Цитата Сообщение от Мимино Посмотреть сообщение
в смысле? тут не понял
Ну в смысле, что требуют, чтобы 13 выводилось как 1101, а не как 00001101.
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 20:16  [ТС]     Тестовое задание на Junior C++ dev #16
Цитата Сообщение от 0x10 Посмотреть сообщение
Ну в смысле, что требуют, чтобы 13 выводилось как 1101, а не как 00001101.
Ну так они так и выводятся
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
26.07.2013, 20:19     Тестовое задание на Junior C++ dev #17
Цитата Сообщение от Мимино Посмотреть сообщение
Ну так они так и выводятся
Ок. Значит, просто рекурсию убрать. И дополнительный буфер в итеративном решении ни к чему, я думаю.
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 20:21  [ТС]     Тестовое задание на Junior C++ dev #18
Цитата Сообщение от 0x10 Посмотреть сообщение
1) а нужны ли там два счетчика в первом цикле, где происходит заполнение массива?
2) а можно ли в цикле со случайными перестановками обойтись одним вызовом rand()?
1) Да, можно так
C++
1
2
for (unsigned int i = 0; i < _maxValue; i++)
        _result[i] = i + 1;
2) можно. Например, переставлять постоянно одну и ту же позицию на рандомное место. На сколько это эффективно не могу сейчас точно сказать.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
26.07.2013, 20:22     Тестовое задание на Junior C++ dev #19
Цитата Сообщение от Мимино Посмотреть сообщение
можно. Например, переставлять постоянно одну и ту же позицию на рандомное место.
Ага, почти.
Алгоритм перемешивания массива много раз на форуме расписывали.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2013, 20:23     Тестовое задание на Junior C++ dev
Еще ссылки по теме:

C++ Определение уровня Junior C++ developer?
C++ Тестовое задание для трудоустройства
C++ dev-c++

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

Или воспользуйтесь поиском по форуму:
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
26.07.2013, 20:23  [ТС]     Тестовое задание на Junior C++ dev #20
Цитата Сообщение от 0x10 Посмотреть сообщение
Ок. Значит, просто рекурсию убрать. И дополнительный буфер в итеративном решении ни к чему, я думаю.
ммм.... а как? если бы было заранее известно количество символов в строке, то да, итеративно без доп.буфера. Ну или если бы функция имела бы тип возвращаемого значения не void, можно было бы возвращать указатель на первый ненулевой элемент строки.
Yandex
Объявления
26.07.2013, 20:23     Тестовое задание на Junior C++ dev
Ответ Создать тему
Опции темы

Текущее время: 03:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru