10 проектов на C++ для портфолио, которые впечатлят работодателя

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему C++ до сих пор в топе, и как портфолио решает всё

Вы наверняка слышали: «C++ — это сложно», «C++ умирает» и прочие страшилки. Реальность же такова: C++ по-прежнему правит балом в геймдеве, высоконагруженных системах, финансах и embedded-разработке. Без него не обходятся ни Unreal Engine, ни Chromium, ни базы данных уровня MySQL.

Но есть одна проблема: выучить синтаксис — это полдела. Работодатель хочет видеть не диплом, а проекты на C++ для портфолио, где видна архитектура, работа с памятью и умение решать реальные задачи. Именно поэтому мы собрали 10 идей — от простых до продвинутых. Каждая идея сопровождается примером кода и пояснением, какой навык она прокачивает.

Готовы собрать портфолио, от которого у HR пойдут мурашки? Поехали.

1. Текстовый редактор в консоли (nano-like)

Сложность: Начинающий
Навыки: Работа с файлами, строки, управление терминалом

Классика, которая никогда не устаревает. Вы создаёте простой редактор с открытием, редактированием и сохранением файлов. Научитесь работать с fstream, обрабатывать нажатия клавиш и управлять буфером.

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

class TextEditor {
private:
    std::vector<std::string> lines;
    std::string filename;
public:
    void open(const std::string& file) {
        filename = file;
        std::ifstream in(file);
        std::string line;
        while (std::getline(in, line)) {
            lines.push_back(line);
        }
    }
    void save() {
        std::ofstream out(filename);
        for (const auto& line : lines) {
            out << line << '\n';
        }
    }
    void run() {
        // Здесь будет цикл обработки ввода
    }
};

2. Простой HTTP-сервер (однопоточный)

Сложность: Средний
Навыки: Сокеты, сетевые протоколы, обработка запросов

Напишите сервер, который принимает HTTP GET-запросы и отдаёт статические файлы. Это золотой стандарт для понимания того, как работает интернет. Используйте sys/socket.h на Linux или winsock2.h на Windows.

#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

int main() {
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    sockaddr_in address;
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    bind(server_fd, (struct sockaddr*)&address, sizeof(address));
    listen(server_fd, 3);

    std::cout << "Server started on port 8080\n";
    // Цикл accept и чтение запросов
    return 0;
}

Такой проект в портфолио на C++ сразу показывает, что вы понимаете OSI-модель и умеете работать с низкоуровневыми сетевыми интерфейсами.

3. Менеджер задач (To-Do List) с графическим интерфейсом

Сложность: Средний
Навыки: Qt или SFML, MVC-паттерн, работа с БД (SQLite)

Создайте приложение с добавлением, удалением и сортировкой задач. Используйте библиотеку Qt — это даст вам понимание сигналов и слотов, а также навыки работы с GUI. Добавьте хранение в SQLite через sqlite3.h.

#include <QApplication>
#include <QMainWindow>
#include <QListWidget>
#include <QPushButton>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QMainWindow window;
    window.setWindowTitle("Task Manager");
    
    QListWidget* list = new QListWidget(&window);
    QPushButton* addBtn = new QPushButton("Add Task", &window);
    
    // layout и подключение сигналов
    window.show();
    return app.exec();
}

4. Эмулятор файловой системы (в оперативной памяти)

Сложность: Продвинутый
Навыки: Деревья, указатели, RAII, умные указатели

Реализуйте виртуальную файловую систему с каталогами, файлами, правами доступа и командами ls, mkdir, rm. Это отличное упражнение на работу с деревьями и управление памятью без утечек.

#include <memory>
#include <map>
#include <string>

class FileNode {
public:
    std::string name;
    bool isDirectory;
    std::map<std::string, std::shared_ptr<FileNode>> children;
    
    FileNode(const std::string& n, bool dir) 
        : name(n), isDirectory(dir) {}
};

5. Сетевой чат (клиент-сервер)

Сложность: Продвинутый
Навыки: Многопоточность, сокеты, протоколы

Создайте чат, где несколько клиентов могут общаться через сервер. Используйте std::thread для обработки каждого клиента. Это покажет, что вы умеете работать с конкурентностью и синхронизацией.

void handle_client(int client_socket) {
    char buffer[1024] = {0};
    while (true) {
        int valread = read(client_socket, buffer, 1024);
        if (valread <= 0) break;
        // broadcast всем клиентам
        memset(buffer, 0, sizeof(buffer));
    }
}

6. Симулятор планировщика задач ОС

Сложность: Продвинутый
Навыки: Алгоритмы, очереди с приоритетом, симуляция

Реализуйте Round Robin, SJF, Priority Scheduling. Выводите статистику: среднее время ожидания, turnaround time. Отличный способ показать понимание операционных систем.

struct Process {
    int id, burst_time, priority;
};

void round_robin(std::vector<Process>& processes, int quantum) {
    std::queue<Process> ready;
    // алгоритм с временными квантами
}

7. Генератор лабиринтов и поиск пути

Сложность: Средний
Навыки: Графы, DFS/BFS, A*, визуализация

Сгенерируйте лабиринт алгоритмом Прима или Краскала, затем найдите кратчайший путь с помощью A*. Визуализируйте через ASCII-графику или SFML.

<                

Блоги

Рекомендаций по книгам