-1

I've been using global variables up until now. I just remembered that it's not a good practice. So, is there any way I can change this? Should I pass the variables as value or reference?

This is the code https://pastebin.com/JZaaR2Qd

using namespace std;

string user_name;
string str_age;
unsigned short int user_age;
char yes_no_prompt;

void user_biodata_input()
{
    cin.clear();
    cout << "Name : ";  getline(cin >> ws, user_name);
    cout << "Age : "; getline(cin, str_age); //taking age as a string
    stringstream(str_age) >> user_age ; //extract int from a string

    //Check if user input is not numeric, if so, repeat
    while (cin.fail()) {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Input invalid! Please re-enter your age in numeric..." << endl;
        cin >> user_age;
    }
}

int main()
{
    //Speed up cin and cout
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    //Start
    cout << "Hi User, my name is Sirius. I'm your Digital Guidance (DG), nice to meet you..." << endl;
    cout << "Please provide your data..." << endl;
    user_biodata_input();

    show_user_biodata();

    while (yes_no_prompt == 'N' || yes_no_prompt == 'n')
    {
        cout << "Please re-enter your biodata..." << endl;
        user_biodata_input();
        show_user_biodata();
    }
cpplearner
  • 13,776
  • 2
  • 47
  • 72
AJ Tech
  • 13
  • 5

1 Answers1

0

Well, if you are going to use C++ you'd better try to leverage language capabilities, hence it's will much cleaner to present User class to encapsulate internal representation of user data you'd like to collect. For example:

class User {

    public:
        User(string name, unsigned short int age):_name(name),_age(age) {}

        bool confirm() {
            cin.clear();
            char yes_no_prompt;
            cout << "Thank you for providing your data...";
            cout << "\nPlease confirm your data...(Y/N)\n" << endl;

            //printing border
            cout << setfill('-') << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << endl;
            //printing student record
            cout << setfill(' ') << setw(1) << "|" << setw(15) << left << "Name" << setw(1) << "|" << setw(15) << left << "Age" << setw(1) << "|" << endl;
            //printing border
            cout << setfill('-') << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << endl;
            //printing student record
            cout << setfill(' ') << setw(1) << "|" << setw(15) << left << this->_name << setw(1) << "|" << setw(15) << left << this->_age << setw(1) << "|" << endl;
            //printing border
            cout << setfill('-') << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << endl;
            //printing student record

            cin >> yes_no_prompt;

            if (yes_no_prompt == 'Y' || yes_no_prompt == 'y')
            {
                cout << "\nThank you for giving cooperation...\nWe will now proceed to the academy..." << endl;
                return true;
            }
            return false;
        }
    private:
        string _name;
        unsigned short int _age;
};

Now you can implement function to collect user info:

User createUser()
{
    cin.clear();
    string user_name;
    string str_age;
    unsigned short int age;
    cout << "Name : ";  getline(cin >> ws, user_name);
    cout << "Age : "; getline(cin, str_age); //taking age as a string
    stringstream(str_age) >> age ; //extract int from a string

    //Check if user input is not numeric, if so, repeat
    while (cin.fail()) {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Input invalid! Please re-enter your age in numeric..." << endl;
        cin >> age;
    }
    return User(user_name, age);
}

Finally main will look something like this:

int main()
{
    //Speed up cin and cout
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    //Start
    cout << "Hi User, my name is Sirius. I'm your Digital Guidance (DG), nice to meet you..." << endl;
    cout << "Please provide your data..." << endl;

    User user = createUser();

    while (!user.confirm()) {
        user = createUser();

    }

    return 0;

}

Of course this is only a draft and suggestion, an alternative will be to make both of your function to receive parameters and being able to return values. While OOP approach IMO much cleaner.

Artem Barger
  • 40,769
  • 9
  • 59
  • 81