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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 5.00
MechanicPaul
2 / 2 / 0
Регистрация: 25.05.2013
Сообщений: 157
#1

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

28.10.2013, 16:07. Просмотров 1831. Ответов 11
Метки нет (Все метки)

Решил попробовать устроиться в компанию и узнать что вообще и как.
Отправил в компанию резюме, дали тестовое задание:
Страуструп. Глава 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2013, 16:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Тестовое задание для трудоустройства (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Shtirliz72
201 / 161 / 38
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 16:13 #2
А оно работало?
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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; - что это значит?
Плюс ко всему я думаю её можно в разы сократить.
0
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 */
то всё работает, видимо программа почему-то не может найти конец коммента.
0
MechanicPaul
2 / 2 / 0
Регистрация: 25.05.2013
Сообщений: 157
28.10.2013, 16:27  [ТС] #5
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
А оно работало?
работало, у меня работает...
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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;
}
С этим примером работает, но не удаляет последний комментарий.
0
Shtirliz72
201 / 161 / 38
Регистрация: 25.10.2013
Сообщений: 527
28.10.2013, 16:31 #7
Цитата Сообщение от Verbillion Посмотреть сообщение
то всё работает, видимо программа почему-то не может найти конец коммента.
Проблема в том что эта программа именно здесь и должна работать.

Добавлено через 52 секунды
Цитата Сообщение от MechanicPaul Посмотреть сообщение
работало, у меня работает...
Внутренности тестового файла - в студию.
0
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


+ запускал файл с кодом программы
0
Shtirliz72
201 / 161 / 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

Ты считаешь это нормальным?
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
28.10.2013, 16:50 #10
Цитата Сообщение от Shtirliz72 Посмотреть сообщение
Ты считаешь это нормальным?
Это нормально.
Цитата Сообщение от MechanicPaul Посмотреть сообщение
Не заботьтесь о внешнем виде вывода.
0
Shtirliz72
201 / 161 / 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;
Это только глазком глянул.
0
ct0r
Игогошка!
1773 / 675 / 42
Регистрация: 19.08.2012
Сообщений: 1,287
Завершенные тесты: 1
28.10.2013, 19:23 #12
Я бы тоже автора этого кода не взял. Потому что:
1) программа не работает
2) с++ плох
3) стиль кодирования плох
4) алгоритм плох.
Любой из этих четырех причин хватило бы для отказа, а тут аж все четыре.
Требовалось всего-навсего реализовать маленький конечный автомат.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2013, 19:23
Привет! Вот еще темы с ответами:

Задание для выполнения - C++
Очень прошу . Добрые люди . Помогите зделать лабу . По етому варианту задания http://khpi-iip.mipk.kharkiv.edu/library/pgm/lab/v04_03.html....

C++ задание для начинающих! - C++
Товарищи, кодеры. Помогите пожалуйста с заданием перваку.

Задание переменных для подпрограмм - C++
Добрый день! Не получается задать переменные для подпрограмм (a, b, N), их надо задать с консоли для всех 3-х подпрограмм. Подскажите...

Задание для обработки массива строк - C++
Сформировать динамический массив, состоящий из динамических строк. Распечатать сформированный массив. Удалить все строки в которых...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.10.2013, 19:23
Ответ Создать тему
Опции темы

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