Изменение программы создания учетной записи - PullRequest
0 голосов
/ 09 июля 2020

Я студент, изучающий C ++, и мне нужна помощь. В настоящее время я работаю над учебным упражнением из книги Murach's C ++ Programming. Я работаю над упражнением 7-2 (второе упражнение в главе 7). Инструкции для программы находятся здесь: Инструкции из упражнения 7-2 Мне удалось разобраться в большей части этого, но в настоящее время я застрял на шаге 9. Я знаю, как вызывать функции, но когда я запустить программу, она позволяет мне ввести только свое полное имя. После того, как я это сделаю, программа завершится, и я не смогу ввести свой пароль или адрес электронной почты. И да, я добавил возвращаемое значение к своим переменным по мере необходимости. Как сделать так, чтобы программа позволяла мне вводить мое полное имя, пароль и адрес электронной почты, как положено? Ничего из того, что я пробовал, похоже, не работает. Я попытался вернуть значение 0, я попытался создать локальную переменную, а затем добавить возвращаемое значение к указанной переменной, но ничего из этого не сработало. Пожалуйста, помогите мне понять, что я должен делать, поскольку я все еще новичок в C ++ и мне нужно многому научиться. Между прочим, я использую Microsoft Visual Stud ios в качестве своей IDE.

Вот код, который у меня есть для основного. cpp файла:

#include <iostream>
#include <string>
#include "validation.h"

using namespace std;

int main()
{
cout << "Create Account\n\n";

// get full name and parse first name
string full_name;
string first_name;
bool valid_name = false;
while (!valid_name) {
    cout << "Enter full name: ";
    getline(cin, full_name);

    // strip whitespace from front
    int i = full_name.find_first_not_of(" \n\t");
    if (i > -1) {
        full_name = full_name.substr(i);
    }

    // get first name
    int space_index = full_name.find(' ');
    if (space_index == -1) {
        cout << "You must enter your full name. Please try again.\n";
    }
    else {
        first_name = full_name.substr(0, space_index);
        valid_name = true;
    }
}
cout << endl;

bool validation::is_valid_password(string password);

bool validation::is_valid_email(string email);

// make sure first name uses initial cap
char letter = first_name[0];
first_name[0] = toupper(letter);
for (int i = 1; i < first_name.length(); ++i) {
    letter = first_name[i];
    first_name[i] = tolower(letter);
}

// display welcome message
cout << "Hi " << first_name << ",\n"
    << "Thanks for creating an account!\n\n";
}

И код, который у меня есть с проверкой. cpp файл реализации:

#include "validation.h"
#include <string>
#include <iostream>
using namespace std;
using namespace validation;

bool validation::is_valid_password(string password) {
bool valid_password = false;
while (!valid_password) {

    valid_password = true;

    cout << "Enter password: ";
    getline(cin, password);

    if (password.length() < 8) {
        cout << "Password must be at least 8 characters.\n";
        valid_password = false;
    }

    int index = password.find_first_of("0123456789");
    if (index == -1) {
        cout << "Password must include a number.\n";
        valid_password = false;
    }

    bool special_character = false;
    for (char c : password) {
        if (ispunct(c)) {
            special_character = true;
            break;
        }
    }
    if (!special_character) {
        cout << "Password must include a special character.\n";
        valid_password = false;
    }

    if (!valid_password) {
        cout << "Please try again.\n";
    }
    else {
        password = password.substr(0, index);
        valid_password = true;
    }
}
cout << endl;
return false;
}

bool validation::is_valid_email(string email) {
bool valid_email = false;
while (!valid_email) {

    valid_email = true;

    cout << "Enter email: ";
    getline(cin, email);

    int at_index = email.find('@');
    if (at_index == -1) {
        cout << "The email must include an at character (@).\n";
        valid_email = false;
    }

    int dot_index = email.rfind('.');
    if (dot_index == -1) {
        cout << "The email must include a dot operator (.).\n";
        valid_email = false;
    }

    bool valid_chars = true;
    for (char c : email) {
        if (c != '@' && c != '.' && c != '_' && c != '-') {
            if (!isalnum(c)) {
                valid_chars = false;
                break;
            }
        }
    }

    if (at_index == 0) {
        cout << "The local part of the email must include at least one character.\n";
        valid_email = false;
    }

    if (dot_index - at_index == 1) {
        cout << "The server name of the email must include at least one character.\n";
        valid_email = false;
    }

    if (email.length() - dot_index - 1 != 3 && email.length() - dot_index - 1 != 2) {
        cout << "The domain name of the email must have two or three characters.\n";
        valid_email = false;
    }
    if (!valid_email) {
        cout << "Please try again.\n";
    }
    else {
        email = email.substr(0, at_index);
        email = email.substr(0, dot_index);
        valid_email = true;
    }

}
cout << endl;
return false;
}

И код, который у меня есть для файла заголовка проверки:

#ifndef T_FRYE_VALIDATION_H
#define T_FRYE_VALIDATION_H
#endif // !T_FRYE_VALIDATION_H
#include <string>
using namespace std;

namespace validation {
  bool is_valid_password(string password);
  bool is_valid_email(string email);
}

Я знаю, что это много читать, и мне очень жаль, но я не знаю, что делать дальше. Если кто-нибудь может мне помочь, я буду очень признателен.

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Вызовы ваших функций проверки имеют неправильный формат. Вы пытаетесь вызвать код

validation::isvalid_password(); из основного, но вместо этого вы предоставляете:

bool validation::is_valid_password(string password);

bool validation::is_valid_email(string email);

, которые декларации. Вам действительно нужно набрать нужный код.

string password;
string email;
validation::isvalid_password(password);
validation::is_valid_email(email);
0 голосов
/ 09 июля 2020

Как вы думаете, что эти две строки делают внутри функции main()?

int main()
{
// ...
bool validation::is_valid_password(string password);
bool validation::is_valid_email(string email);
// ...
}

Это не вызов функции, это просто объявление функции. У вас должно получиться что-то вроде:

int main()
{
    // ...
    std::string password;
    while (!validation::is_valid_password(password));
    std::string email;
    while (!validation::is_valid_email(email));
    // ...
}

В любом случае есть много других проблем в вашем коде ... Например, если вы читаете что-то внутри функции is_valid_xxx (что само по себе является плохим дизайном, потому что is_ -тип функций не должен делать ничего, кроме проверки значений), вы должны передать строку по ссылке:

bool validation::is_valid_password(string &password);

Даже если вы не планируете получать новое значение, передавая что-то по значению - плохая идея для этого типа функций. Передайте значение по ссылке в const:

bool validation::is_valid_password(const string &password);
...