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

Тестовое задание для трудоустройства - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 5.00
MechanicPaul
2 / 2 / 0
Регистрация: 25.05.2013
Сообщений: 157
28.10.2013, 16:07     Тестовое задание для трудоустройства #1
Решил попробовать устроиться в компанию и узнать что вообще и как.
Отправил в компанию резюме, дали тестовое задание:
Страуструп. Глава 6, Упражнения 6.6., задание 22, страница 184. (издание 2002г.)
Напишите программу, которая удаляет комментарии из программы на C++.

Пусть она читает из текстового файла, удаляет комментарии обоих видов (// и /* */) и записывает результат в новый текстовый файл.
Не заботьтесь о внешнем виде вывода.
Считайте что // /* и */ не будут содержаться в самих комментариях, строках и символьных константах.
Решение должно быть на C++ языке. При решении задачи можно использовать любые сторонние библиотеки и любую среду разработки. Исходные коды решения присылайте в виде zip-архива. Бинарный файл не нужен.

Я вот решил задачу.
В ответ получил:
"Ваше тестовое задание мы получили.
Но, в выполненном Вами тестовом задании было найдено много ошибок, и к сожалению, в настоящий момент мы не готовы сделать Вам предложение о работе. Мы выполняем сложные проекты, и полагаем, что Ваших знаний и опыта будет недостаточно для работы над этими проектами. Ваше резюме мы внесли в наш «банк данных», если произойдут какие-либо изменения, мы Вам перезвоним."

Собственно вот в чём вопрос: Каким образом должно выглядеть решение подобной задачи? Чего не хватает ребятам для компаний? Люди, которые уже проходили подобные тестирования итп, дайте советов)

Вот мой способ реализации этой программы.
Кликните здесь для просмотра всего текста
C++ (Qt)
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
#include <iostream>
#include <string>
#include <fstream>
#include <cstring>
 
using namespace std;
 
void deleteCommentsInFile(ifstream& file){
    string temp_str;
    string rezult_str;
 
    //активность многострочного комментария
    bool multiLineComment = false;
 
    while(!file.eof())
    {
        //строчное считывание
        getline(file, temp_str, '\n');
 
        //поиск однострочных комментариев
        if(temp_str.find("//") != string::npos){
            temp_str.erase(temp_str.find("//"),temp_str.length() - temp_str.find("//"));    
        }
        //поиск многострочных комментариев
        else if(temp_str.find("/*") != string::npos)
        {
            //удаляем всё что после многострочного комментария
            temp_str.erase(temp_str.find("/*"), temp_str.length() - temp_str.find("/*"));
 
            //если что-то было до него, то добавляем это в результат
            if(temp_str.length())
                rezult_str += temp_str;
 
            //пропускаем всё, пока не встретим конец многострочного комментария " */ " 
            multiLineComment = true;
            file >> temp_str;
            while(multiLineComment == true)
            {
                int strInd = 0;
                for(strInd; strInd < temp_str.length(); strInd++)
                {   
                    if(temp_str.at(strInd) == '*' && temp_str.at(strInd + 1) == '/'){
                        multiLineComment = false;
                        strInd += 2;
                    }
                    //добавляем всё, что было после закрывающего тега в строке с ним
                    if(multiLineComment == false){
                        while(strInd < temp_str.length())
                        {
                            rezult_str += temp_str.at(strInd);
                            ++strInd;
                        }
                        rezult_str.append("\n");
                    }
                }
                file >> temp_str;
            }
        }
        rezult_str += temp_str;      
        rezult_str.append("\n");  
    }
 
    //вывод на консоль и запись в файл
    cout << rezult_str << endl;
    ofstream outFile("out.txt");
    outFile << rezult_str;
    outFile.close();
}
 
int main()
{
    //открываем файл
    ifstream file("input.txt");
  
    //если файл не открылся
    if(!file)
    {
        cerr<<"Error when try to open \"input.txt\"."<<endl;
        exit(-1);
    }else{
        deleteCommentsInFile(file);
    }
    file.close();
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Shtirliz72
200 / 160 / 38
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 16:13     Тестовое задание для трудоустройства #2
А оно работало?
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
28.10.2013, 16:18     Тестовое задание для трудоустройства #3
А вы её вообще испытывали? У меня она не работает со следующим файлом, тупо зависает.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
using namespace std;
 
/* entry point */
int main()
{
    //открываем файл
    cout << "Hello!\n";
    return 0;
}

41-я строка: for(strInd; - что это значит?
Плюс ко всему я думаю её можно в разы сократить.
Verbillion
9 / 9 / 0
Регистрация: 22.10.2013
Сообщений: 36
28.10.2013, 16:26     Тестовое задание для трудоустройства #4
Цитата Сообщение от castaway Посмотреть сообщение
А вы её вообще испытывали? У меня она не работает со следующим файлом, тупо зависает.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
using namespace std;
 
/* entry point */
int main()
{
    //открываем файл
    cout << "Hello!\n";
    return 0;
}

41-я строка: for(strInd; - что это значит?
Плюс ко всему я думаю её можно в разы сократить.
Если убрать
C++
1
/* entry point */
то всё работает, видимо программа почему-то не может найти конец коммента.
MechanicPaul
2 / 2 / 0
Регистрация: 25.05.2013
Сообщений: 157
28.10.2013, 16:27  [ТС]     Тестовое задание для трудоустройства #5
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
А оно работало?
работало, у меня работает...
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
28.10.2013, 16:29     Тестовое задание для трудоустройства #6
Я так понял, что она не работает с однострочными коментариями Си-стиля.
Как же ты так её проверял то?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
using namespace std;
 
int main()
{
    //открываем файл
    cout << "Hello!\n";
    return
    /*
    ok
    */ /**/0;
}
С этим примером работает, но не удаляет последний комментарий.
Shtirliz72
200 / 160 / 38
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 16:31     Тестовое задание для трудоустройства #7
Цитата Сообщение от Verbillion Посмотреть сообщение
то всё работает, видимо программа почему-то не может найти конец коммента.
Проблема в том что эта программа именно здесь и должна работать.

Добавлено через 52 секунды
Цитата Сообщение от MechanicPaul Посмотреть сообщение
работало, у меня работает...
Внутренности тестового файла - в студию.
MechanicPaul
2 / 2 / 0
Регистрация: 25.05.2013
Сообщений: 157
28.10.2013, 16:40  [ТС]     Тестовое задание для трудоустройства #8
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Внутренности тестового файла - в студию.
Кликните здесь для просмотра всего текста

I am study at the university of BSUIR
//BSUIR is good university
//my specialty is artificial intelligence
I like programming
/* This
programm
is
not
difficult
*/my name is Paul
I want get job in your company

/* hello
my name is Paul
I want get job in your company
*/This programm is not difficult


+ запускал файл с кодом программы
Shtirliz72
200 / 160 / 38
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 16:49     Тестовое задание для трудоустройства #9
Запустил с твоим кодом.
Мне выдало
I am study at the university of BSUIR


I like programming
my
name
is Paul
I want get job in your company

This
programm
is not difficult


А должно было выдать

I am study at the university of BSUIR
I like programming
my name is Paul
I want get job in your company

This programm is not difficult

Ты считаешь это нормальным?
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
28.10.2013, 16:50     Тестовое задание для трудоустройства #10
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Ты считаешь это нормальным?
Это нормально.
Цитата Сообщение от MechanicPaul Посмотреть сообщение
Не заботьтесь о внешнем виде вывода.
Shtirliz72
200 / 160 / 38
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 17:40     Тестовое задание для трудоустройства #11
Цитата Сообщение от castaway Посмотреть сообщение
Это нормально.
Ну если они прям такое имели в виду, то хбз. Тогда у меня есть лишь риторический вопрос: на скольких текстах тестировалась программа?
Ну и вопросы:
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
#include <iostream>
#include <string>
#include <fstream>
#include <cstring>
 
using namespace std;
 
void deleteCommentsInFile(ifstream& file){
    string temp_str;
    string rezult_str;
 
    //активность многострочного комментария
    bool multiLineComment = false;
 
    while(!file.eof())
    {
        //строчное считывание
        getline(file, temp_str, '\n'); // Зачем если getline(file, temp_str) делает тоже самое?
 
        //поиск однострочных комментариев
        if(temp_str.find("//") != string::npos){ // Почему find("//") не запоминается, а вызывается несколько раз?
            temp_str.erase(temp_str.find("//"),temp_str.length() - temp_str.find("//"));    
        }
        //поиск многострочных комментариев
        else if(temp_str.find("/*") != string::npos) /* в тексте вида "*asdasd*/ sadas; //---" не будет отсекать первый комментарий. Но хбз, может по заданию это и не нужно. Плюс, как и выше - почему find("/*") не запоминается, а вызывается несколько раз? */
        {
            //удаляем всё что после многострочного комментария
            temp_str.erase(temp_str.find("/*"), temp_str.length() - temp_str.find("/*")); //  А если строка вида "something; //                                                                      /* comment */ something2;" ? Или так по условию тоже нельзя? */
 
            //если что-то было до него, то добавляем это в результат
            if(temp_str.length())
                rezult_str += temp_str;
 
            //пропускаем всё, пока не встретим конец многострочного комментария " */ " 
            multiLineComment = true; // зачем вообще нужна данная переменная, если 
                                               // выход из отбраковки строк всё лучше сделать по break через "*/" ? */
            file >> temp_str; // Зачем так, если начал через getline
            while(multiLineComment == true)
            {
                int strInd = 0;
                for(strInd; strInd < temp_str.length(); strInd++) // for(strId - это вообще зачем такое? 
                                                                                  // и чем find("*/") не угодило? */
                {   
                    if(temp_str.at(strInd) == '*' && temp_str.at(strInd + 1) == '/'){
                        multiLineComment = false;
                        strInd += 2;
                    }
                    //добавляем всё, что было после закрывающего тега в строке с ним
                    if(multiLineComment == false){ 
                        while(strInd < temp_str.length())
                        {
                            rezult_str += temp_str.at(strInd);
                            ++strInd;
                        } // вот эти 15 строк кода можно было заменить 3мя командами: size_t p_st = temp_str.find("*/"), temp_str.erase(0, p_st), и rezult_str += temp_str; 
                        rezult_str.append("\n");
                    }
                }
                file >> temp_str;  
            }
        }
        rezult_str += temp_str; // у тебя следующая строка за строкой со "*/" случайно автоматически не запишется?
        rezult_str.append("\n");  
    }
 
    //вывод на консоль и запись в файл
    cout << rezult_str << endl;
    ofstream outFile("out.txt");
    outFile << rezult_str;
    outFile.close();
}
 
int main()
{
    //открываем файл
    ifstream file("input.txt");
  
    //если файл не открылся
    if(!file)
    {
        cerr<<"Error when try to open \"input.txt\"."<<endl;
        exit(-1); // Зачем здесь exit(-1)? Когда можно выйти обычным return 1?
    }else{ // Зачем здесь else?
        deleteCommentsInFile(file);
    }
    file.close();
    return 0;
Это только глазком глянул.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2013, 19:23     Тестовое задание для трудоустройства
Еще ссылки по теме:

Тестовое задание на Junior C++ dev C++
ООП. Тестовое задание собеседования. C++
C++ Задание на записи и структуры / С++ для начинающих

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

Или воспользуйтесь поиском по форуму:
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
28.10.2013, 19:23     Тестовое задание для трудоустройства #12
Я бы тоже автора этого кода не взял. Потому что:
1) программа не работает
2) с++ плох
3) стиль кодирования плох
4) алгоритм плох.
Любой из этих четырех причин хватило бы для отказа, а тут аж все четыре.
Требовалось всего-навсего реализовать маленький конечный автомат.
Yandex
Объявления
28.10.2013, 19:23     Тестовое задание для трудоустройства
Ответ Создать тему
Опции темы

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