입력한 값에 맞게 출력한다.
단 그외의 값을 출력할시 예외 처리할것.
1. 로그인 (id, password 를 입력받아 로그인 성공, 실패 여부 판단)
2. 로그아웃.
3. 글보기 (글목록 현재 생성되어있는 글번호와 글목록)
4. 글읽기 (글번호를 입력받으면 제목과 내용을 출력)
5. 글쓰기 (글쓰기 위해선 로그인 하여야만한다.)
6. 회원가입 (id와 password를 생성하여 게시판에 접근할수있도록 함. 중복가입방지 할 것)
0. 종료
LinkedList를 사용하였고 0~5번과제 수행완료 => STL vector 로 자료구조 변경 완료 => STL map 사용하여 6번 회원가입 구현완료
STL vector, 정말 편리하고 아주좋은. 자료구조이다.
잊어버렸을시 메모리누수로 이어져 짜증나는 부분이였다. 하지만. Vector 는 매우 좋다.. 그냥 환상적.. STL좋다. 정말..
결론으로 돌아와서 클래스기반 게시판코드 공개.
#ifndef __BOARD_H__
#define __BOARD_H__
#include<Windows.h>
#include<string>
#include<vector>
#include<map>
class Board {
private:
std::string loginedId;
// logined user state check
char* userId ;
char* userPw ;
std::map<std::string, std::string> membership;
std::map<std::string, std::string>::iterator it;
char* inputHead;
char* inputBody;
// 생성자 내에서 값을 저장하기 위해 서 생성한 변수
// 로그인 계정값은 변경되면 안되므로 const화 완료.
// 로그인여부를 체크해줄 변수.
int listIndex = 0;
// 값을 지우기위해 인덱스값을 필요로함.
bool isLoginState = false;
// login상태를 확인해주는 변수
std::vector<std::string> vWriteHead = std::vector<std::string>();
std::vector<std::string> vWriteBody = std::vector<std::string>();
// 관리자 로그인.
const std::string adId = "admin";
const std::string adPw = "admin";
bool adminLoginState = false;
public:
//회원가입
void newMemberShip();
// Vector 구현
void newPost();
// 글쓰기
void allReadPost_vector();
// 글목록을 출력.
void readPostVector();
// 글 읽기 , 글번호를 입력받아서 글제목, 글 내용을 작성.
void loginMark();
//로그인 유저의 정보를 입력.
Board();
//생성자로 추상화된 객체 하나 만들어줌.
virtual ~Board();
void login();
// login하기위한 조건.
void logout();
//logout 진행.
};
#endif
#include"Board.h"
#include<cstdio>
/*
게시판
여섯개의 메뉴
1. 로그인 V
-아이디와 비밀번호를 입력해서 로그인을 하면 됨.
아이디 : 자신의 이니셜\ 비번 휴대폰 뒷자리 4자리
2. 로그 아웃 V
-로그아웃
3.글 목록 V
- 현재 글의 목록을 보여주면 됨.
4. 글 보기 V
- 글번호를 입력하여 해당 글을 출력하면됨.
5. 글 쓰기 V
- 로그인을 한경우에만 제목과 내용을 입력받아서 글을 쓰면됨.
6. 회원가입 V
- id pw 를 입력하면 가입이 완료됨.
0. 종료. V
- 종료.
LinkedList 로 구현 -> Vector 로 변경 구현 -> Map 을 이용하여 회원가입 구현
-> 중복값 입력 시 예외 문 추가 확인.
*/
// PostBoard !!
//
Board::Board() {
Board::inputBody = new char[1001];
Board::inputHead = new char[101];
}
Board::~Board() {
delete[] inputBody;
delete[] inputHead;
delete[] userId;
delete[] userPw;
}
// Boad 복사 생성자로 클래스 내부에서 모든행동을 진행함.
void Board::login() {
char inputId[30];
char inputPw[30];
if (Board::isLoginState == false) {
// 로그아웃 상태인경우만 접근가능.
system("cls");
printf("========= 로그인========= \n");
printf("=ID : ");
fseek(stdin, 0, SEEK_END);
scanf("%29[^\n]s", &inputId);
std::string id = inputId;
printf("\n=PW : ");
fseek(stdin, 0, SEEK_END);
scanf("%29[^\n]s", &inputPw);
std::string pw = inputPw;
printf("로그인중..\n");
Sleep(1000);
if (id == adId && pw == adPw) {
Board::adminLoginState = true;
system("cls");
}
// Admin loginstate.
else {
Board::it = membership.begin();
if (membership.empty()) {
printf("가입정보가 없습니다.\n");
printf("메인 메뉴(6)번으로 회원가입하세요\n");
Sleep(1000);
}
else {
for (; it != membership.end(); ++it) {
if (it->first == id) {
std::string tempPw = it->second;
if (tempPw == pw) {
printf("로그인 성 공! \n");
Sleep(1000);
Board::isLoginState = true;
loginedId = id;
break;
}
else {
printf("비밀번호가 다릅니다.\n");
Sleep(1000);
break;
} // false pw print
} // id check logic
} // id, pw check loop for
}
}// if IsLoginState check
}// admin
else {
printf("이미 로그인 되어있습니다.\n");
Sleep(1000);
}
system("cls");
}
void Board::logout() {
if (Board::isLoginState == true || Board::adminLoginState == true) {
Board::isLoginState = false;
Board::adminLoginState = false;
printf("로그 아웃 중...\n");
Sleep(1000);
printf("성공적으로 로그아웃 되었습니다.\n");
}
else {
printf("로그인 정보가 없습니다.\n");
printf("이전메뉴 돌아갑니다.\n");
}
Sleep(1000);
system("cls");
}
void Board::newPost() {
// Used Vector DataStruct
if (isLoginState) {
char* body = this->inputBody;
char* head = this->inputHead;
printf("글 제목은 100byte , 내용은 1000byte 까지만 입력가능합니다.\n");
printf("제목입력 : ");
fseek(stdin, 0, SEEK_END);
scanf("%100[^\n]s", head);
printf("내용입력 : ");
fseek(stdin, 0, SEEK_END);
scanf("%1000[^\n]s", body);
this->vWriteBody.push_back(body);
this->vWriteHead.push_back(head);
Board::listIndex++;
printf("\n입력완료\n");
}
else {
printf("권한이 없습니다.\n");
printf("로그인 해주세요.\n");
}
Sleep(500);
}
void Board::allReadPost_vector() {
if (Board::listIndex <= 0) {
printf("게시판에 글이 없습니다.\n");
Sleep(1000);
}
else {
for (int i = Board::listIndex-1; i >= 0; i--) {
printf("No.%d |제목 : %s\n", i, Board::vWriteHead[i].c_str());
}
printf("\n");
Sleep(2000);
}
}
void Board::readPostVector(){
if (this->listIndex < 1) {
printf("게시판에 글이 없습니다. \n");
}
else {
printf("읽으실 글 번호를 입력해 주세요 : ");
printf("시작은 0번부터 입니다.\n");
fseek(stdin, 0, SEEK_END);
int pNumber;
scanf("%d", &pNumber);
if (pNumber < 0 || pNumber >= this->listIndex) {
printf("글이 없거나 잘못 입력하셨습니다. \n");
}
else {
printf("제목 : %s\n", this->vWriteHead[pNumber].c_str());
printf("\n\n내용 : %s \n", this->vWriteBody[pNumber].c_str());
}
}
Sleep(2000);
}
void Board::loginMark() {
if (Board::adminLoginState) {
printf("login : %s \n", adId.c_str());
Board::isLoginState = false;
}
else {
if (Board::isLoginState == true) {
printf("login : %s \n",Board::loginedId.c_str());
}
else {
printf("login : Not Conect \n");
}
}
}
void Board::newMemberShip() {
printf("\n회원 가입 메뉴입니다.\n");
Board::userId = new char[5];
Board::userPw = new char[10];
printf("가입하실 정보를 입력해주세요.\n");
printf("Id 는 4byte / Pw 9byte 까지 입력가능\n");
printf("\nID : ");
fseek(stdin, 0, SEEK_END);
scanf("%4s", Board::userId);
printf("\nPW : ");
fseek(stdin, 0, SEEK_END);
scanf("%9s", Board::userPw);
if (membership.empty()) {
Board::membership.insert(std::pair<std::string, std::string>(Board::userId, Board::userPw));
printf("\n 가입성공!");
printf("\n메인메뉴(1)번에 들어가셔서 로그인 하세요\n");
Sleep(1000);
}
else {
it = membership.begin();
for (; it != membership.end(); ++it) {
if (it->first == Board::userId) {
printf("현재 입력한 값은 이미 존재합니다.\n");
printf("메인메뉴로 돌아갑니다.\n");
Sleep(1000);
break;
}
// 중복값 입력 방지.
else {
Board::membership.insert(std::pair<std::string, std::string>(Board::userId, Board::userPw));
printf("\n 가입성공!");
printf("\n메인메뉴(1)번에 들어가셔서 로그인 하세요\n");
Sleep(1000);
break;
} // id 가 다를경우만 가입가능.
}//std::map key 값 확인하는 loop
}// membership 이 empty 가 아닐시.
} // new Membership Function.
#include"Board.h"
#include<cstdio>
int main() {
int startPoint;
Board* board1 = new Board();
printf("■■■■■■■■■■■■■■■■■\n");
printf("\n");
printf("\tWelcome to Board\n");
printf("\n");
printf("■■■■■■■■■■■■■■■■■\n");
printf("\n");
printf("\t종료하시려면\n\n\t0을 입력하세요\n");
printf("\n");
printf("■■■■■■■■■■■■■■■■■\n");
fseek(stdin, 0, SEEK_END);
scanf("%d", &startPoint);
if (startPoint != 0) {
system("cls");
printf("\n\n");
while (true) {
system("cls");
int inputMenu;
printf("■■■■■■■■■■■■■■■■■\n■■ 메뉴를 선택하세요\t ■■\t");
board1->loginMark();
printf("■■1. 로그인 ■■\n");
printf("■■2. 로그아웃 ■■\n");
printf("■■3. 글 목록 ■■\n");
printf("■■4. 글 보기 ■■\n");
printf("■■5. 글 작성 ■■\n");
printf("■■6. 회원 가입 ■■\n");
printf("■■0. 종 료 ■■\n");
printf("■■■■■■■■■■■■ : ");
fseek(stdin, 0, SEEK_END);
scanf("%d", &inputMenu);
if (inputMenu == 0) {
break;
}
else if (inputMenu == 1) {
// Login
board1->login();
}
else if (inputMenu == 2) {
// login state
board1->logout();
}
else if (inputMenu == 3) {
// Post list print
// Linked_List
// board1->allHeadPost();
board1->allReadPost_vector();
}
else if (inputMenu == 4) {
//board1->readPost();
board1->readPostVector();
}
else if (inputMenu == 5) {
//board1->newAddPost();
board1->newPost();
}
else if (inputMenu == 6) {
board1->newMemberShip();
}
else {
system("cls");
}
}//while문
}
fseek(stdin, 0, SEEK_END);
fgetc(stdin);
return 0;
}