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

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

28.10.2013, 16:07. Показов 7548. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил попробовать устроиться в компанию и узнать что вообще и как.
Отправил в компанию резюме, дали тестовое задание:
Страуструп. Глава 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;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.10.2013, 16:07
Ответы с готовыми решениями:

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

Тестовое задание
Помогите пройти тест. Очень надо :) Введите пропущенный оператор в функцию вставки нового элемента в существующий список. 1. ...

Тестовое задание на Junior C++ dev
Доброго времени суток. Неделю назад ради интереса отправил свое резюме в одну компанию, куда требуются с++ юниоры. Получил от них...

14
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 16:13
А оно работало?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
28.10.2013, 16:18
А вы её вообще испытывали? У меня она не работает со следующим файлом, тупо зависает.
Кликните здесь для просмотра всего текста
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; - что это значит?
Плюс ко всему я думаю её можно в разы сократить.
0
9 / 9 / 6
Регистрация: 22.10.2013
Сообщений: 36
28.10.2013, 16:26
Цитата Сообщение от 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 */
то всё работает, видимо программа почему-то не может найти конец коммента.
0
2 / 2 / 4
Регистрация: 25.05.2013
Сообщений: 157
28.10.2013, 16:27  [ТС]
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
А оно работало?
работало, у меня работает...
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
28.10.2013, 16:29
Я так понял, что она не работает с однострочными коментариями Си-стиля.
Как же ты так её проверял то?
Кликните здесь для просмотра всего текста
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;
}
С этим примером работает, но не удаляет последний комментарий.
0
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 16:31
Цитата Сообщение от Verbillion Посмотреть сообщение
то всё работает, видимо программа почему-то не может найти конец коммента.
Проблема в том что эта программа именно здесь и должна работать.

Добавлено через 52 секунды
Цитата Сообщение от MechanicPaul Посмотреть сообщение
работало, у меня работает...
Внутренности тестового файла - в студию.
0
2 / 2 / 4
Регистрация: 25.05.2013
Сообщений: 157
28.10.2013, 16:40  [ТС]
Цитата Сообщение от 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


+ запускал файл с кодом программы
0
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 16:49
Запустил с твоим кодом.
Мне выдало
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

Ты считаешь это нормальным?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
28.10.2013, 16:50
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Ты считаешь это нормальным?
Это нормально.
Цитата Сообщение от MechanicPaul Посмотреть сообщение
Не заботьтесь о внешнем виде вывода.
0
205 / 165 / 41
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 17:40
Цитата Сообщение от 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;
Это только глазком глянул.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
28.10.2013, 19:23
Я бы тоже автора этого кода не взял. Потому что:
1) программа не работает
2) с++ плох
3) стиль кодирования плох
4) алгоритм плох.
Любой из этих четырех причин хватило бы для отказа, а тут аж все четыре.
Требовалось всего-навсего реализовать маленький конечный автомат.
1
0 / 0 / 0
Регистрация: 09.06.2017
Сообщений: 9
08.12.2017, 15:02
Мне точно такое же задание дали.
Вот кусок кода
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
void CRemoveCommentDlg::OnBnClickedButton1()
{
    // TODO: Add your control notification handler code here
    char szFilter[] = "cpp Files (*.cpp)|*.cpp|";
 
    CFileDialog fileDlg(FALSE, NULL, "*.cpp", NULL, szFilter, NULL);
    //fileDlg.m_ofn.lpstrTitle = (LPCTSTR)strTitle;
    fileDlg.m_ofn.Flags |= OFN_HIDEREADONLY;
 
    if (fileDlg.DoModal() == IDOK)
    {
        CString fsFile = (LPCSTR)fileDlg.GetPathName();
        CString fName = fileDlg.GetFileTitle();
        
        FILE* fpFile = fopen(fsFile, "rb");
        char* pBuf = new char[20000];
        if (fpFile)
        {
            DWORD fSize;
            fseek(fpFile, 0, SEEK_END);
            fSize = ftell(fpFile);
            fseek(fpFile, 0, SEEK_SET);
            fread(pBuf, 1, fSize, fpFile);
            fclose(fpFile); 
            ProcFile(pBuf, fSize, fName);
 
        }
 
    }
}
 
void CRemoveCommentDlg::ProcFile(char* ipBuf, int iSize, CString fName)
{
 
    //void* memchr (void * ptr, int value, size_t num);
    int fCurPtr = 0;
    bool fRet = false;
    while (!fRet)
    {
        char* fPtr1 = strstr(ipBuf, "/*");
        if (fPtr1)
        {
            char* fPtr2 = strstr(fPtr1, "*/");
            if (fPtr2)
            {
                strcpy(fPtr1, fPtr2 + 2);
                iSize -= fPtr2 - fPtr1 + 2;
 
            }
        }
        else
            fRet = true;
    }
    fRet = false;
    while (!fRet)
    {
        char* fPtr1 = strstr(ipBuf, "//");
        if (fPtr1)
        {
            char* fPtr2 = strstr(fPtr1, "\r\n");
            if (fPtr2)
            {
                strcpy(fPtr1, fPtr2);
                iSize -= fPtr2 - fPtr1;
            }
        }
        else
            fRet = true;
    }
    fName += "_RemoveComment.cpp";
    FILE* fpFile = fopen(fName, "wb");
        
    fwrite(ipBuf, 1, iSize, fpFile);
    fclose(fpFile);
 
    AfxMessageBox("Выполнено");
 
}
Дали ответ по заданию:
1. Программа не работает.
2. Не выполнены условия ТЗ, много ненужных вспомогательных файлов, которые затрудняют оценку ТЗ.
3. Код написан неоптимально, выглядит как первый учебный пример.
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
19.01.2019, 16:43
Интересно, устроило бы такое решение?:
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
#include "stdafx.h"
#include <fstream>
#include <string>
#include <assert.h>
 
 
void CommentsRemover(const char* inputFile, const char* outputFile) {
 
    std::ifstream infile(inputFile);
    assert(("File read error.", infile.is_open()));
 
    std::ofstream outfile(outputFile);
    assert(("File write error.", outfile.is_open()));
 
    std::string line;
    bool lfe = false;   ///looking for multi-line comment end
 
 
    while (getline(infile, line))
    {
        size_t found;
 
        if (lfe) {
            found = line.find("*/");
            if (found != std::string::npos) {
                line = line.substr(found + 2, line.size());
                lfe = false;
            }
            else {
                continue;
            }
        }
 
 
        found = line.find("//");
        if (found != std::string::npos) {
            line = line.substr(0, found);
        }
 
        do {
            found = line.find("/*");
            if (found != std::string::npos) {
                size_t holdpos = found;
 
                found = line.find("*/");
                if (found != std::string::npos) {
                    line = line.substr(0, holdpos) + line.substr(found + 2, line.size());
                    continue;
                }
                else {
                    line = line.substr(0, holdpos);
                    lfe = true;
                }
            }
        } while (found != std::string::npos);
 
        outfile << line << "\n";
    }
 
    outfile.close();
}
 
 
 
int main()
{
    CommentsRemover("inpfile.txt", "outpfile.txt");
 
 
    return 0;
}
 
 
 
//      inpfile.txt example.
//
//      This is the simple test. // and /**/ comments remover.
//      So..     //todo: add joke here
//      It should find pattern /* like this */ and delete /* maybe not?*/ all commented stuff
//      from the file with name : /* from several lines
//      too /? */ "FILENAME".
//
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
19.01.2019, 17:27
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include<fstream>
#include<regex>
#include<string>
 
int main()
{
    std::ifstream inStream("in.txt");
    std::string inText;
    std::getline(inStream,inText,'\0');
    std::regex regex("/\\*[\\s\\S]*?\\*/|//[^\\n]*");
    std::ofstream("out.txt")<<std::regex_replace(inText,regex,"");
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.01.2019, 17:27
Помогаю со студенческими работами здесь

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

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

Тестовое задание надолжность Junior C++ gamedev
Всем доброго времени суток. Месяц назад получил от потенциального работодателя тестовое задание на должность юниора в небольшой фирме...

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

Нужен совет по дальнейшему обучению для трудоустройства
Привет. Мне 28, есть высшее- радиоинженер, английский уверенный базовый (разговариваю на основах, работал в Европе и Юж Америке 7мес),...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru