• XSS.stack #1 – первый литературный журнал от юзеров форума

Нужны опытные програмисты С++

UNDERTacker

CD-диск
Пользователь
Регистрация
17.03.2022
Сообщения
13
Реакции
0
Всем доброго времени суток, я начинающий програмист, знаю только озы, все мы с чего-то начинаем! В общем я рошёл видеокурс по языку с++, и знаю основу, но не имею представления- что мне делать дальше, я выбрал степь, решил писать ПО, драйвера, ОС, имею право мечтать, но я не знаю как это делать( Пожалуйста, помогите мне, какие нужно подключить библиотеки, какие используются функции, как выглядет код драйвера, т.к. во всех форумах либо пустая болтавня, либо готовый код и пару слов. Скатав код я ни чему не научусь, что мне делать?!!!!. По этому прошу ВАС о помощи мне, расскажите мне подробно о том как это делается!
Могу ли я использывать не Visual Studio, а Visual Studio Code?
В крайнем случае хотя б направьте, где копать, искать, как мне искать и что искать! Буду ОООООООООООООООчень благодарен!😟
 
придумай простой проект и напиши его. а дальше идеи сами появятся как и желание или может отпадет
Что Ты имеешь в виду под словом проэкт, я умею писать некий код, но это просто вывод текста, или ввод..., так же могу работать с файлами, и т.д.
 
Что Ты имеешь в виду под словом проэкт, я умею писать некий код, но это просто вывод текста, или ввод..., так же могу работать с файлами, и т.д.
придумай цель, ну к примеру написать тг бота, или еще что. там и сеть есть в задаче и обработка данных и так далее. а пока будешь писать придет и само понимание.
 
придумай цель, ну к примеру написать тг бота, или еще что. там и сеть есть в задаче и обработка данных и так далее. а пока будешь писать придет и само понимание.
Оке, а как писать тг бота к примеру, напрвь, пожалуйст, где инфа, о том как его писать
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Оке, а как писать тг бота к примеру, напрвь, пожалуйст, где инфа, о том как его писать
 
Всем доброго времени суток, кто нибудь из опытных!
В общем если есть свободная минутка дам огня, для обсуждения!
Я написал "программу входа". Цель- мой компьютер, пользователь я, писал для практики.
Не суть, программа выглядет так: Меню приветствия, вызывает функцию выбора действия: 1)Войти, 2)Регистрация, 3)Выход, при регистрации данные сохраняются в отдельный файл, все три функции объеденил в классе, и они возвращают Меню(пока что просто текст-ПРОГРАММА ВХОДА). После меню вызывает выход.
Прошу глянуть на код в файле, и сказать есть ли у меня какие ошибки?
Буду рад стать предметом Ваших обсуждений, ученком!
Буду рад каждому и любому, я начинающий, по тому и не знаю, где можно спросить об этом, и т.к. самоучка, мне хотелось бы помощи от опытных!)Благодарю!
:)
 

Вложения

  • 1.txt
    1.6 КБ · Просмотры: 23
Пожалуйста, обратите внимание, что пользователь заблокирован
Всем доброго времени суток, кто нибудь из опытных!
В общем если есть свободная минутка дам огня, для обсуждения!
Я написал "программу входа". Цель- мой компьютер, пользователь я, писал для практики.
Не суть, программа выглядет так: Меню приветствия, вызывает функцию выбора действия: 1)Войти, 2)Регистрация, 3)Выход, при регистрации данные сохраняются в отдельный файл, все три функции объеденил в классе, и они возвращают Меню(пока что просто текст-ПРОГРАММА ВХОДА). После меню вызывает выход.
Прошу глянуть на код в файле, и сказать есть ли у меня какие ошибки?
Буду рад стать предметом Ваших обсуждений, ученком!
Буду рад каждому и любому, я начинающий, по тому и не знаю, где можно спросить об этом, и т.к. самоучка, мне хотелось бы помощи от опытных!)Благодарю!
:)
1) Рекурсия, у которой не может быть выхода, если постоянно жать 3
2) Куча if (takeNum == ..) вместо switch
3) У логина нет проверки данных?? Допустим, так задумано или не реализовано на данный момент
4) Вы пытаетесь вернуть что-то из функций, которые ничего не возвращают
5) Не очень ясен смысл класса Take. Возможно, не хватает реализации.
Много что надо править, проще заново написать, чем пытаться исправить это.
Ну вот, например, моя попытка реализации вашей идеи
C++:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

class CAuthSystem {
private:
    // Пароль это всё-таки строка, а не число
    struct userdata {
        string m_name, m_mail, m_password;
        static userdata parse(string line) {
            userdata data;
            data.m_name = line.substr(0, line.find(':'));
            line = line.substr(line.find(':') + 1);
            data.m_mail = line.substr(0, line.find(':'));
            line = line.substr(line.find(':') + 1);
            data.m_password = line;
            return data;
        }
    };
    userdata m_udata;
    const string profiles_filename = "Profiles.txt";

    bool is_user_exists() {
        ifstream reader(profiles_filename);
        if (reader.fail())
            return false;

        while (!reader.eof()) {
            userdata data;
            string line;
            getline(reader, line);
            data = userdata::parse(line);
            if (m_udata.m_name == data.m_name && m_udata.m_mail == data.m_mail && m_udata.m_password == data.m_password)
            {
                reader.close();
                return true;
            }
        }

        reader.close();
        return false;
    }

public:
    CAuthSystem(const string& name, const string& password, const string& mail) {
        m_udata.m_name = name;
        m_udata.m_password = password;
        m_udata.m_mail = mail;
    }

    bool register_user() {
        // Конечно, в идеале возвращать еще какой-то error code, то есть перевести bool register_user() в int register_user()
        // Так как ошибки могут быть разные. Начиная от того, что такой юзер уже есть, заканчивая тем, что просто не удалось открыть файл
        // Но это я оставлю тебе :)
        bool is_registered = is_user_exists();
        if (is_registered)
            return false;
        ofstream writer(profiles_filename, ios_base::app); // append
        if (writer.fail())
            return false;
        writer << m_udata.m_name << ':' << m_udata.m_mail << ':' << m_udata.m_password << endl;
        writer.close();
        return true;
    }

    bool login() {
        return is_user_exists();
    }
};

int main() {
    int takeNum = -1;
    while (takeNum != 3) {
        cout << "Take: 1) Log In / 2) Registred / 3) Back" << endl;
        cin >> takeNum;

        switch (takeNum) {
        case 1:
        {
            // login
            string name, mail, pass;
            cout << "Name: ";
            cin >> name;
            cout << "Mail: ";
            cin >> mail;
            cout << "Password: ";
            cin >> pass;

            CAuthSystem auth(name, pass, mail);
            bool succ = auth.login();
            cout << (succ ? "Good" : "Error") << endl;

            break;
        }
        case 2:
        {
            // register
            string name, mail, pass;
            cout << "Name: ";
            cin >> name;
            cout << "Mail: ";
            cin >> mail;
            cout << "Password: ";
            cin >> pass;

            // Я решил разделять данные через :
            // Поэтому видеть это в каком-то из полей не хотелось бы

            if (pass.find(':') != string::npos || name.find(':') != string::npos || mail.find(':') != string::npos) {
                cout << "Error! Data contains \':\'";
                break;
            }

            CAuthSystem auth(name, pass, mail);
            bool succ = auth.register_user();

            cout << (succ ? "Good" : "Error") << endl;

            break;
        }
        case 3: break;
        default:
            cout << "Error, repeat! " << endl;
            break;
        }
    }

    system("cls");
    cout << "Goodbye" << endl;
    system("pause");

    return 0;
}
Ну и сам Profiles.txt сохраняется так:

Код:
Victor:v@mail.ru:12345
Gena:g@mail.ru:12345
 
Последнее редактирование:
1) Рекурсия, у которой не может быть выхода, если постоянно жать 3
2) Куча if (takeNum == ..) вместо switch
3) У логина нет проверки данных?? Допустим, так задумано или не реализовано на данный момент
4) Вы пытаетесь вернуть что-то из функций, которые ничего не возвращают
5) Не очень ясен смысл класса Take. Возможно, не хватает реализации.
Много что надо править, проще заново написать, чем пытаться исправить это.
Ну вот, например, моя попытка реализации вашей идеи
C++:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

class CAuthSystem {
private:
    // Пароль это всё-таки строка, а не число
    struct userdata {
        string m_name, m_mail, m_password;
        static userdata parse(string line) {
            userdata data;
            data.m_name = line.substr(0, line.find(':'));
            line = line.substr(line.find(':') + 1);
            data.m_mail = line.substr(0, line.find(':'));
            line = line.substr(line.find(':') + 1);
            data.m_password = line;
            return data;
        }
    };
    userdata m_udata;
    const string profiles_filename = "Profiles.txt";

    bool is_user_exists() {
        ifstream reader(profiles_filename);
        if (reader.fail())
            return false;

        while (!reader.eof()) {
            userdata data;
            string line;
            getline(reader, line);
            data = userdata::parse(line);
            if (m_udata.m_name == data.m_name && m_udata.m_mail == data.m_mail && m_udata.m_password == data.m_password)
            {
                reader.close();
                return true;
            }
        }

        reader.close();
        return false;
    }

public:
    CAuthSystem(const string& name, const string& password, const string& mail) {
        m_udata.m_name = name;
        m_udata.m_password = password;
        m_udata.m_mail = mail;
    }

    bool register_user() {
        // Конечно, в идеале возвращать еще какой-то error code, то есть перевести bool register_user() в int register_user()
        // Так как ошибки могут быть разные. Начиная от того, что такой юзер уже есть, заканчивая тем, что просто не удалось открыть файл
        // Но это я оставлю тебе :)
        bool is_registered = is_user_exists();
        if (is_registered)
            return false;
        ofstream writer(profiles_filename, ios_base::app); // append
        if (writer.fail())
            return false;
        writer << m_udata.m_name << ':' << m_udata.m_mail << ':' << m_udata.m_password << endl;
        writer.close();
        return true;
    }

    bool login() {
        return is_user_exists();
    }
};

int main() {
    int takeNum = -1;
    while (takeNum != 3) {
        cout << "Take: 1) Log In / 2) Registred / 3) Back" << endl;
        cin >> takeNum;

        switch (takeNum) {
        case 1:
        {
            // login
            string name, mail, pass;
            cout << "Name: ";
            cin >> name;
            cout << "Mail: ";
            cin >> mail;
            cout << "Password: ";
            cin >> pass;

            CAuthSystem auth(name, pass, mail);
            bool succ = auth.login();
            cout << (succ ? "Good" : "Error") << endl;

            break;
        }
        case 2:
        {
            // register
            string name, mail, pass;
            cout << "Name: ";
            cin >> name;
            cout << "Mail: ";
            cin >> mail;
            cout << "Password: ";
            cin >> pass;

            // Я решил разделять данные через :
            // Поэтому видеть это в каком-то из полей не хотелось бы

            if (pass.find(':') != string::npos || name.find(':') != string::npos || mail.find(':') != string::npos) {
                cout << "Error! Data contains \':\'";
                break;
            }

            CAuthSystem auth(name, pass, mail);
            bool succ = auth.register_user();

            cout << (succ ? "Good" : "Error") << endl;

            break;
        }
        case 3: break;
        default:
            cout << "Error, repeat! " << endl;
            break;
        }
    }

    system("cls");
    cout << "Goodbye" << endl;
    system("pause");

    return 0;
}
Ну и сам Profiles.txt сохраняется так:

Код:
Victor:v@mail.ru:12345
Gena:g@mail.ru:12345
Спасибо за отзыв, буду исправлять. По поводу проверки пароля- да пароль не проверяется еще, я над этим ещё не работал.
4) Вы пытаетесь вернуть что-то из функций, которые ничего не возвращают, теперь по оводу этого я так до конца и не понял, мне обязательно нужно вернуть какое-то значение? Я вызвал функцию, а возвращать что нужно? Разве без этого нельзя, или как?
5) Не очень ясен смысл класса Take. Возможно, не хватает реализации., класс Take это выбор действия, в нем есть 3 функции, 2 из них вызывают меню, а 1 вызывает другую фуекцию. Они относятся к выбору действия, по этому и поместил их в клас, это не правильно? Надеюсь на Ваш ответ, спасибо заранее.:smile10:
 
Пожалуйста, обратите внимание, что пользователь заблокирован
4) Вы пытаетесь вернуть что-то из функций, которые ничего не возвращают, теперь по оводу этого я так до конца и не понял, мне обязательно нужно вернуть какое-то значение? Я вызвал функцию, а возвращать что нужно? Разве без этого нельзя, или как?
Ваши функции типа void. Они ничего не возвращают. Если вам нужно выйти из функции где-то в середине достаточно написать return;
Ваши конструкции такого типа:
C++:
void f1(){}
void f2(){ return f1(); }
неверны. Никакая из функций не возвращает значение. То есть по сути Вы просто вызываете функции и засоряете стек.
Если достаточно кол-во раз вводить 3 в вашем коде, то можно просто крашнуть программу, так как стек переполнится.
5) Не очень ясен смысл класса Take. Возможно, не хватает реализации., класс Take это выбор действия, в нем есть 3 функции, 2 из них вызывают меню, а 1 вызывает другую фуекцию. Они относятся к выбору действия, по этому и поместил их в клас, это не правильно? Надеюсь на Ваш ответ, спасибо заранее.:smile10:
ООП это конечно не та тема, которую можно объяснить за десяток предложений, конечно, если не писать в стиле Толстого, но попробую объяснить явные вещи.
Класс должен отвечать за какую-то конкретную задачу. Если посмотреть на мой код, то можно увидеть ошибку в том, что я произвожу работу с файлом профилей в классе, который отвечает за регистрацию/вход.
В идеале работа с БД должны быть вынесена в отдельный класс.
Вы же запрашиваете данные и также производите запись из одного файла.
Еще не думаю, что вызов самописной функции из класса хорошее решение.

Короче говоря из классов должно было быть так:
1) Класс для работы с бд
2) Класс для авторизаций/регистраций. Возможно, этот класс даже можно было бы унаследовать от класса для работы с бд.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх