C++언어 공부/개념 공부

2024.02.06 C++ 최종 실습 [다시 꼭 볼 필요가 있다. (벡터 사용)]

코딩입문시작 2024. 2. 12. 15:13
#include <iostream>
#include <string>
#include <vector>

using namespace std;

// 회원가입할 때에 필수 정보들 (Model)
class User {
private:
  string id;
  string pw;
  string name;
  int age;

public:
  // 기본 생성자
  User() { ; }

  // 초기 생성자
  User(string id, string pw, string name, int age) : id(id), pw(pw), name(name), age(age) {
    ;
  }

  // getter (반환)
  string getId() {
    return id;
  }

  string getPw() {
    return pw;
  }

  // setter (수정)
  void setPw(string pw) {
    this->pw = pw;
  }

  string getName() {
    return name;
  }

  void setName(string name) {
    this->name = name;
  }

  int getAge() {
    return age;
  }

  void setAge(int age) {
    this->age = age;
  }

  // 객체 정보 확인용 메소드
  void printData() {
    cout << "아이디   : " << id << endl;
    cout << "비밀번호 : " << pw << endl;
    cout << "이름   : " << id << endl;
    cout << "나이     : " << age << endl;
  }
};

// 회원가입할 때 모든 내용 함수들을 여기다 때려박기 (Controler)
class UserField {
public:
  // 회원들의 정보를 저장할 DB
  vector<User>users;

  // 아이디 중복검사
  bool checkId(string id) {
    for (int i = 0; i < users.size(); i++) {
      if (users[i].getId() == id) { // 중복이 된다.
        return false; // 중복되는 아이디가 있다면 false 리턴
      }
    }
    return true; // 중복되는 아이디가 없다!
  }

  // 회원가입
  void join(const User& user) {
    users.push_back(user);
  }
};

// 보여주는 곳 (View, MVC)
int main() {
  // User u1("Minsoo", "0405", "김민수", 26);
  // u1.printData();

  UserField uf;

  // 만드는 도중에 사용할 테스트용.
  uf.users.push_back(User("hogeun", "1234", "류호근", 22));

  string mainMsg = "김민수 페이지에 오신 걸 환영합니다. \n메뉴를 선택해주세요.";
  string menuMsg = "1.회원가입 \n2.로그인 \n3.프로그램 종료";
  string myPageMsg = "1.내 정보 보기 \n2.로그아웃";
  string idMsg = "아이디를 입력: ";
  string pwMsg = "비밀번호를 입력: ";
  string nameMsg = "이름을 입력: ";
  string ageMsg = "나이를 입력: ";
  string idErrorMsg = "존재하는 아이디가 있습니다.";
  string choiceErrorMsg = "다시 입력해주세요.";
  string loginErrorMsg = "아이디와 비밀번호를 확인해주세요.";

  int choice, age;
  string id, pw, name;
 
  bool check;

  while (true) {
    cout << mainMsg << endl;
    cout << menuMsg << endl;
    cin >> choice;

    if (choice == 3) {
      break;
    }

    switch (choice) {
    case 1: // 회원가입
      do {
        cout << idMsg;
        cin >> id;
        check = uf.checkId(id);

        if (!check) {
          cout << idErrorMsg << endl;
        }
      } while (!check);

      cout << pwMsg;
      cin >> pw;
      cout << nameMsg;
      cin >> name;
      cout << ageMsg;
      cin >> age;

      uf.join(User(id, pw, name, age));
      cout << "회원가입에 성공하였습니다. \n" << endl;
      break;
    case 2: // 로그인
      break;
    default:
      break;
    } // 메인메뉴 switch 닫는 중괄호
  } // 큰 while문 닫는 중괄호

  return 0;
}

 

 

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

using namespace std;

// 회원가입할 때에 필수 정보들 (Model)
class User {
private:
  string id;
  string pw;
  string name;
  int age;

public:
  // 기본 생성자
  User() { ; }

  // 초기 생성자
  User(string id, string pw, string name, int age) : id(id), pw(pw), name(name), age(age) {
    ;
  }

  // getter (반환)
  string getId() {
    return id;
  }

  string getPw() {
    return pw;
  }

  // setter (수정)
  void setPw(string pw) {
    this->pw = pw;
  }

  string getName() {
    return name;
  }

  void setName(string name) {
    this->name = name;
  }

  int getAge() {
    return age;
  }

  void setAge(int age) {
    this->age = age;
  }

  // 객체 정보 확인용 메소드
  void printData() {
    cout << "아이디   : " << id << endl;
    cout << "비밀번호 : " << pw << endl;
    cout << "이름   : " << id << endl;
    cout << "나이     : " << age << endl;
  }
};

// 회원가입할 때 모든 내용 함수들을 여기다 때려박기 (Controler)
class UserField {
public:
  // 회원들의 정보를 저장할 DB
  vector<User>users;

  // 아이디 중복검사
  int checkId(string id) {
    for (int i = 0; i < users.size(); i++) {
      if (users[i].getId() == id) { // 중복이 된다.
        return i; // 중복되는 아이디가 있다면 해당 인덱스 번호를 리턴
      }
    }
    return -1; // 중복되는 아이디가 없다!
  }

  // 회원가입
  void join(const User& user) {
    users.push_back(user);
  }

  // 로그인
  int login(string id, string pw) {
    int idx = checkId(id);
    if (idx == -1) {
      return idx;
    }
    User user = users[idx];
    if (user.getPw() == pw) {
      return idx;
    }
    else {
      return -1;
    }
    // 비밀번호 틀렸을 때를 잡지 않음.
    // return idx;
  }

  void changeName(string name, int idx) {
    users[idx].setName(name);
  }
};

// 보여주는 곳 (View, MVC)
int main() {
  // User u1("Minsoo", "0405", "김민수", 26);
  // u1.printData();

  UserField uf;

  // 만드는 도중에 사용할 테스트용.
  uf.users.push_back(User("hogeun", "1234", "류호근", 22));

  string mainMsg = "김민수 페이지에 오신 걸 환영합니다. \n메뉴를 선택해주세요.";
  string menuMsg = "1.회원가입 \n2.로그인 \n3.프로그램 종료";
  string myPageMsg = "1.내 정보 보기 \n 2.이름변경 \n3.로그아웃";
  string idMsg = "아이디를 입력: ";
  string pwMsg = "비밀번호를 입력: ";
  string nameMsg = "이름을 입력: ";
  string ageMsg = "나이를 입력: ";
  string idErrorMsg = "존재하는 아이디가 있습니다.";
  string choiceErrorMsg = "다시 입력해주세요.";
  string loginErrorMsg = "아이디와 비밀번호를 확인해주세요.";

  int choice, age, loginUserIdx;
  string id, pw, name;

  bool check;

  while (true) {
    cout << mainMsg << endl;
    cout << menuMsg << endl;
    cin >> choice;

    if (choice == 3) {
      break;
    }

    switch (choice) {
    case 1: // 회원가입
      do {
        cout << idMsg;
        cin >> id;
        check = uf.checkId(id) == -1;
        if (!check) {
          cout << idErrorMsg << endl;
        }
      } while (!check);

      cout << pwMsg;
      cin >> pw;
      cout << nameMsg;
      cin >> name;
      cout << ageMsg;
      cin >> age;

      uf.join(User(id, pw, name, age));
      cout << "회원가입에 성공하였습니다. \n" << endl;
      break;
    case 2: // 로그인
      cout << idMsg;
      cin >> id;
      cout << pwMsg;
      cin >> pw;

      loginUserIdx = uf.login(id, pw);
      if (loginUserIdx == -1) {
        cout << loginErrorMsg << endl;
        continue;
      }
      cout << "\n" << uf.users[loginUserIdx].getName()
        << "님 환영합니다. \n" << endl;

      while (true) {
        cout << myPageMsg << endl;
        cin >> choice;

        if (choice == 3) {
          break;
        }
        if (choice == 1) {
          uf.users[loginUserIdx].printData();
        }
        else if (choice == 2) {
          cout << "새 " << nameMsg;
          cin >> name;

          uf.changeName(name, loginUserIdx);
          cout << "변경 완료" << endl;
        }
      } // 마이 페이지 while
      break;
    default:
      cout << choiceErrorMsg << endl;
      break;
    } // 메인메뉴 switch 닫는 중괄호
  } // 큰 while문 닫는 중괄호

  return 0;
}