4月15日の学習内容


こうぞうたい

  • プログラムexシーケンス図
    ->1)順番に
    ->2)制御手順
    ->3)必要な機能を実現する
  • 抽象化
    ->簡略化/符号化/普遍化現象
    ->主に配列、構造体、関数を使用して抽象化します.
    なぜ
  • 抽象画が必要なのか
    和弦は人が編んだものだから!
    ->コードの解釈を容易にします.
    ->他の人が引き継ぎを受け、メンテナンスが便利です.
    ->他の人とコードを書くのが便利です.
  • タイル:複数の属性が同じデータを、同じ名前と順序を持つ連続番号の関連データとして抽象化します.
    構造:データ(データ型別)と実際に使用されているデータを組み合わせて抽象化
    関数:プロシージャ(コード)を特定の機能ユニットとして抽象化します.
    最悪の抽象化->抽象レベルを向上させるプロセス
  • 構造化プログラミング
    ->ソースコードの意図/意味を決定するための構造化されたプログラム設計
    ->データ構造化ex)配列、リスト、構造体など.(データ構造)
    ->プロセス構造化ex)関数など.
  • オブジェクト向けプログラミング
  • こうぞうたい


    ->変数セット
    ->一部の変数がシード概念に分類できる場合
    ex) studentName[10], studentAge[10], studentKorScore[10] ....
    以上の変数は「学生」の「XXX」に分けられます.
    ⑪名前、年齢、国語の点数、順位などは「学生」という構造体で組み合わせて使う
    1.構造体の位置を定義する:構造体で使用される関数の前に定義します.
    2.構造体定義方法
    struct 구조체 이름{
    	구조체 안의 하위 변수들
    };
    ex)
    struct student {
        string name;
        int age;
        int homeTown;
        int pride;
    }seoyeon, jaehyuk; //처럼 구조체 끝나는 중괄호 뒤에 변수를 미리 선언할 수 있다.
    // 위에 따르면 name, age, homeTown, pride를 하위변수를 가진 구조체 student형성
    -構造体は、新しく作成したデータ型です.
    3.構造体の使用方法
    student abcd (구조체를 사용할 변수이름)
    
    abcd.name
    abcd.age
    abcd.homeTown
    abcd.pride
    // 형식으로 사용 가능 
  • 構造で使用可能な変数
  • 汎用変数(int、float、stringなど)、配列、先に宣言された構造体、クラスなどの多くは
  • を使用することができる.
    4.構造体宣言と初期化
    ▲基本的に、構造体変数の概念はアレイ変数の概念と同じである
    . int a[3] = { 50, 70, 80 };
    ・構造体変数は、以下の宣言に従って初期化することもできる.

    脱出ゲーム構造体の深化バージョンの追加

    #include <iostream>
    #include <string>
    #include <conio.h>
    #include <Windows.h>
    
    using namespace std;
    
    struct player {
    	int stamina;
    	char inputMoveKey;
    	int playerXPosition;
    	int playerYPosition;
    };
    
    struct escape {
    	int escapeXPosition;
    	int escapeYPosition;
    };
    
    struct field { //0:평지, 1:벽, 2:숲, 3:늪지
    	int map[20][20];
    	int mapmemory[20][20];
    	int wallCount;
    	int forestCount;
    	int swampCount;
    };
    
    struct control {
    	bool isClear = false;
    	int stageCount;
    	int inputStage;
    	int failCount;
    	int fieldCheckNum;
    };
    
    int main()
    {
    	system("mode con: cols=100 lines=40");
    	srand(time(NULL));
    	int x = 0, y = 0; // for문을 위한 변수
    	player person = { 60,0,0,0 };
    	escape escap;
    	field map;
    	control menu;
    	
    	menu.stageCount = 1;
    	menu.failCount = 0;
    	
    	cout << "플레이 하고싶은 스테이지의 수를 입력하세요 >> _";
    	cin >> menu.inputStage;
    
    	while (1) {
    		for (x = 0; x < 20; x++) { //맵 전부 평지화
    			for (y = 0; y < 20; y++) {
    				map.map[x][y] = 0;
    			}
    		}
    
    		x = rand() % 5 + 15;
    		y = rand() % 5 + 15;
    		map.map[x][y] = 9;
    		escap.escapeXPosition = x;
    		escap.escapeYPosition = y;
    
    		person.playerXPosition = 0;
    		person.playerYPosition = 0;
    		map.map[person.playerXPosition][person.playerYPosition] = 7;
    
    		map.wallCount = 0;
    		map.forestCount = 0;
    		map.swampCount = 0;
    		while (map.wallCount != 20 && map.forestCount != 20 && map.swampCount != 20) { // 1사분면 지형처리
    			x = rand() % 10;
    			y = rand() % 10;
    			menu.fieldCheckNum = rand() % 3 + 1;
    			if (x != 0 && y != 0 && menu.fieldCheckNum == 1 && map.map[x][y] != 2 && map.map[x][y] != 3 && map.map[x][y] != 7) {
    				map.map[x][y] = 1;
    				map.wallCount++;
    			}
    			else if (x != 0 && y != 0 && menu.fieldCheckNum == 2 && map.map[x][y] != 1 && map.map[x][y] != 3 && map.map[x][y] != 7) {
    				map.map[x][y] = 2;
    				map.forestCount++;
    			}
    			else if (x != 0 && y != 0 && menu.fieldCheckNum == 3 && map.map[x][y] != 1 && map.map[x][y] != 2 && map.map[x][y] != 7) {
    				map.map[x][y] = 3;
    				map.swampCount++;
    			}
    		}
    
    		map.wallCount = 0;
    		map.forestCount = 0;
    		map.swampCount = 0;
    		while (map.wallCount != 20 && map.forestCount != 20 && map.swampCount != 20) { // 2사분면 지형처리
    			x = rand() % 10;
    			y = rand() % 10 + 10;
    			menu.fieldCheckNum = rand() % 3 + 1;
    			if (menu.fieldCheckNum == 1 && map.map[x][y] != 2 && map.map[x][y] != 3) {
    				map.map[x][y] = 1;
    				map.wallCount++;
    			}
    			else if (menu.fieldCheckNum == 2 && map.map[x][y] != 1 && map.map[x][y] != 3) {
    				map.map[x][y] = 2;
    				map.forestCount++;
    			}
    			else if (menu.fieldCheckNum == 3 && map.map[x][y] != 1 && map.map[x][y] != 2) {
    				map.map[x][y] = 3;
    				map.swampCount++;
    			}
    		}
    
    		map.wallCount = 0;
    		map.forestCount = 0;
    		map.swampCount = 0;
    		while (map.wallCount != 20 && map.forestCount != 20 && map.swampCount != 20) { // 3사분면 지형처리
    			x = rand() % 10 + 10;
    			y = rand() % 10;
    			menu.fieldCheckNum = rand() % 3 + 1;
    			if (menu.fieldCheckNum == 1 && map.map[x][y] != 2 && map.map[x][y] != 3) {
    				map.map[x][y] = 1;
    				map.wallCount++;
    			}
    			else if (menu.fieldCheckNum == 2 && map.map[x][y] != 1 && map.map[x][y] != 3) {
    				map.map[x][y] = 2;
    				map.forestCount++;
    			}
    			else if (menu.fieldCheckNum == 3 && map.map[x][y] != 1 && map.map[x][y] != 2) {
    				map.map[x][y] = 3;
    				map.swampCount++;
    			}
    		}
    
    		map.wallCount = 0;
    		map.forestCount = 0;
    		map.swampCount = 0;
    		while (map.wallCount != 20 && map.forestCount != 20 && map.swampCount != 20) { // 4사분면 지형처리
    			x = rand() % 10 + 10;
    			y = rand() % 10 + 10;
    			menu.fieldCheckNum = rand() % 3 + 1;
    			if (menu.fieldCheckNum == 1 && map.map[x][y] != 2 && map.map[x][y] != 3 && (x != escap.escapeXPosition && y != escap.escapeYPosition) ) {
    				map.map[x][y] = 1;
    				map.wallCount++;
    			}
    			else if (menu.fieldCheckNum == 2 && map.map[x][y] != 1 && map.map[x][y] != 3 && (x != escap.escapeXPosition && y != escap.escapeYPosition) ) {
    				map.map[x][y] = 2;
    				map.forestCount++;
    			}
    			else if (menu.fieldCheckNum == 3 && map.map[x][y] != 1 && map.map[x][y] != 2 && (x != escap.escapeXPosition && y != escap.escapeYPosition) ) {
    				map.map[x][y] = 3;
    				map.swampCount++;
    			}
    		}
    		for (x = 0; x < 20; x++) {
    			for (y = 0; y < 20; y++) {
    				map.mapmemory[x][y] = map.map[x][y];
    			}
    		}
    		while (1) {
    			for (x = 0; x < 20; x++) {
    				for (y = 0; y < 20; y++) {
    					map.map[x][y] = map.mapmemory[x][y];
    				}
    			}
    			map.map[0][0] = 0;
    			map.map[person.playerXPosition][person.playerYPosition] = 7;
    			system("cls");
    			cout << "\t┌───────────────────────┐" << endl;
    			cout << "\t│    남은스태미너 : " << person.stamina << "\t│" << endl;
    			cout << "\t└───────────────────────┘" << endl;
    			cout << "\t     << " << menu.stageCount << " 스테이지 >>" << endl;
    			cout << "\t   << 남은 기회 - " << 3 - menu.failCount << " >>" << endl;
    			cout << "\t << 남은 스테이지 - " << menu.inputStage - menu.stageCount << " >>" << endl;
    			cout << "■■■■■■■■■■■■■■■■■■■■■■" << endl;
    			for (x = 0; x < 20; x++) {
    				cout << "■";
    				for (y = 0; y < 20; y++) {
    					if (map.map[x][y] == 0) {
    						cout << "  ";
    					}
    					else if (map.map[x][y] == 1) {
    						if (person.playerXPosition - 2 <= x && person.playerXPosition + 2 >= x && person.playerYPosition - 2 <= y && person.playerYPosition + 2 >= y) {
    							cout << "■";
    						}
    						else {
    							cout << "  ";
    						}
    					}
    					else if (map.map[x][y] == 2) {
    						if (person.playerXPosition - 2 <= x && person.playerXPosition + 2 >= x && person.playerYPosition - 2 <= y && person.playerYPosition + 2 >= y) {
    							cout << "♠";
    						}
    						else {
    							cout << "  ";
    						}
    					}
    					else if (map.map[x][y] == 3) {
    						if (person.playerXPosition - 2 <= x && person.playerXPosition + 1 >= x && person.playerYPosition - 2 <= y && person.playerYPosition + 2 >= y) {
    							cout << "▩";
    						}
    						else {
    							cout << "  ";
    						}
    					}
    					else if (map.map[x][y] == 7) {
    						cout << "●";
    					}
    					else if (map.map[x][y] == 9) {
    						cout << "E";
    					}
    				}
    				cout << "■" << endl;
    			}
    			cout << "■■■■■■■■■■■■■■■■■■■■■■" << endl;
    			cout << " ■ : 벽 /   : 길(이동시 스태미너 1소모)/ ♠ : 숲(이동시 스태미너 2소모)" << endl;
    			cout << " ▩ : 늪(이동시 스태미너 3소모) / E : 탈출구" << endl;
    
    			cout << "이동 => w : 위 / s : 아래 / a : 왼쪽 / b : 오른쪽" << endl;
    
    			person.inputMoveKey = _getch();
    			if (person.inputMoveKey >= 65 && person.inputMoveKey <= 90) { //입력한게 대문자였을경우 소문자로 변환
    				person.inputMoveKey += 32;
    			}
    			switch (person.inputMoveKey) {
    			case 'w': //위쪽 이동
    				if (person.playerXPosition != 0 && map.map[person.playerXPosition - 1][person.playerYPosition] != 1) { //배열에서[0][]일경우 위쪽으로 이동할 수 없어야함
    					map.map[person.playerXPosition][person.playerYPosition] = 0;
    					person.playerXPosition--;
    					if (map.map[person.playerXPosition][person.playerYPosition] == 2) {
    						person.stamina -= 2;
    					}
    					else if (map.map[person.playerXPosition][person.playerYPosition] == 3) {
    						person.stamina -= 3;
    					}
    					else
    					{
    						person.stamina--;
    					}
    				}
    				break;
    			case 'a': //왼쪽 이동
    				if (person.playerYPosition != 0 && map.map[person.playerXPosition][person.playerYPosition - 1] != 1) { //배열에서 [][0]일경우 왼쪽으로 이동 할 수 없어야함
    					if (map.map[person.playerXPosition][person.playerYPosition - 1] == 5) {
    					}
    					map.map[person.playerXPosition][person.playerYPosition] = 0;
    					person.playerYPosition--;
    					if (map.map[person.playerXPosition][person.playerYPosition] == 2) {
    						person.stamina -= 2;
    					}
    					else if (map.map[person.playerXPosition][person.playerYPosition] == 3) {
    						person.stamina -= 3;
    					}
    					else
    					{
    						person.stamina--;
    					}
    				}
    				break;
    			case 's': //아래쪽 이동
    				if (person.playerXPosition != 19 && map.map[person.playerXPosition + 1][person.playerYPosition] != 1) { //배열에서 [20][]일경우 아래쪽으로 이동 할 수 없어야함
    					if (map.map[person.playerXPosition + 1][person.playerYPosition] == 5) {
    					}
    					map.map[person.playerXPosition][person.playerYPosition] = 0;
    					person.playerXPosition++;
    					if (map.map[person.playerXPosition][person.playerYPosition] == 2) {
    						person.stamina -= 2;
    					}
    					else if (map.map[person.playerXPosition][person.playerYPosition] == 3) {
    						person.stamina -= 3;
    					}
    					else
    					{
    						person.stamina--;
    					}
    				}
    				break;
    			case 'd': //오른쪽 이동
    				if (person.playerYPosition != 19 && map.map[person.playerXPosition][person.playerYPosition + 1] != 1) { //배열에서 [][20]일경우 오른쪽으로 이동 할 수 없어야함
    					if (map.map[person.playerXPosition][person.playerYPosition + 1] == 5) {
    					}
    					map.map[person.playerXPosition][person.playerYPosition] = 0;
    					person.playerYPosition++;
    					if (map.map[person.playerXPosition][person.playerYPosition] == 2) {
    						person.stamina -= 2;
    					}
    					else if (map.map[person.playerXPosition][person.playerYPosition] == 3) {
    						person.stamina -= 3;
    					}
    					else
    					{
    						person.stamina--;
    					}
    				}
    				break;
    			}
    			if (person.playerXPosition == escap.escapeXPosition && person.playerYPosition == escap.escapeYPosition) {
    				person.stamina = 60;
    				menu.stageCount++;
    				break;
    			}
    			else if (person.stamina <= 0) {
    				system("cls");
    				cout << endl << endl;
    				cout << "\t\t┌───────────────────────────────────────────┐" << endl;
    				cout << "\t\t│   탈출에 실패했습니다. 남은 기회 확인 중  │" << endl;
    				cout << "\t\t└───────────────────────────────────────────┘" << endl;
    				person.stamina = 60;
    				menu.failCount++;
    				Sleep(2000);
    				break;
    			}
    		}
    		if (menu.stageCount > menu.inputStage) {
    			menu.isClear = true;
    			break;
    		}
    		else if (menu.failCount > 5) {
    			menu.isClear = false;
    			break;
    		}
    	}
    	if (menu.isClear) {
    		system("cls");
    		cout << endl;
    		cout << "  ■    ■    ■■    ■    ■    ■    ■■■    ■■■■" << endl;
    		cout << "   ■  ■   ■    ■  ■    ■   ■     ■    ■  ■" << endl;
    		cout << "     ■     ■    ■  ■    ■          ■■■    ■■■■" << endl;
    		cout << "     ■     ■    ■  ■    ■          ■  ■    ■" << endl;
    		cout << "     ■       ■■      ■■            ■    ■  ■■■■" << endl;
    		cout << endl;
    		cout << "  ■■■■    ■■■    ■■■    ■■    ■■■    ■■■■" << endl;
    		cout << "  ■        ■        ■        ■    ■  ■    ■  ■" << endl;
    		cout << "  ■■■■  ■■■■  ■        ■■■■  ■■■■  ■■■■" << endl;
    		cout << "  ■              ■  ■        ■    ■  ■        ■" << endl;
    		cout << "  ■■■■  ■■■      ■■■  ■    ■  ■        ■■■■" << endl;
    		cout << endl;
    		cout << "    ■■■  ■        ■■■■    ■■    ■■■    ■  ■" << endl;
    		cout << "  ■        ■        ■        ■    ■  ■    ■  ■  ■" << endl;
    		cout << "  ■        ■        ■■■■  ■■■■  ■■■    ■  ■" << endl;
    		cout << "  ■        ■        ■        ■    ■  ■  ■          " << endl;
    		cout << "    ■■■  ■■■■  ■■■■  ■    ■  ■    ■  ■  ■" << endl << endl;
    		cout << "\t\t┌────────────────────────────┐" << endl;
    		cout << "\t\t│     탈출에 성공했습니다.   │" << endl;
    		cout << "\t\t└────────────────────────────┘" << endl;
    	}
    	else {
    		system("cls");
    		cout << endl;
    		cout << "  ■    ■    ■■    ■    ■    ■    ■■■    ■■■■" << endl;
    		cout << "   ■  ■   ■    ■  ■    ■   ■     ■    ■  ■" << endl;
    		cout << "     ■     ■    ■  ■    ■          ■■■    ■■■■" << endl;
    		cout << "     ■     ■    ■  ■    ■          ■  ■    ■" << endl;
    		cout << "     ■       ■■      ■■            ■    ■  ■■■■" << endl;
    		cout << endl;
    		cout << "  ■    ■     ■■    ■■■■■" << endl;
    		cout << "  ■■  ■   ■    ■      ■" << endl;
    		cout << "  ■ ■ ■   ■    ■      ■" << endl;
    		cout << "  ■  ■■   ■    ■      ■" << endl;
    		cout << "  ■    ■     ■■        ■" << endl;
    		cout << endl;
    		cout << "  ■■■■    ■■■    ■■■    ■■    ■■■    ■■■■" << endl;
    		cout << "  ■        ■        ■        ■    ■  ■    ■  ■" << endl;
    		cout << "  ■■■■  ■■■■  ■        ■■■■  ■■■■  ■■■■" << endl;
    		cout << "  ■              ■  ■        ■    ■  ■        ■" << endl;
    		cout << "  ■■■■  ■■■      ■■■  ■    ■  ■        ■■■■" << endl;
    		cout << "\t\t┌────────────────────────────┐" << endl;
    		cout << "\t\t│     탈출에 실패했습니다.   │" << endl;
    		cout << "\t\t└────────────────────────────┘" << endl;
    	}
    }
    

    Visual Studio学習内容

     /*
        구조체
        1. 절차적
        2. 구조적
        3. 객체지향적
    
        ### 추상화 ###
        C언어에서 코드를
        추상화 하는데 사용되는 삼총사 : 배열, 구조체, 함수
        추상화 : 현상을 간략화 / 기호화 / 보편화 해서 표현한것
        코드에서 추상화가 필요한 이유 : 코드는 사람이 짜는 것이기 때문에
        다른 사람이 코드를 해석하기 편리해야 하고
        다른 사람이 인수인계받아서 유지보수 하기 편리해야 하고
        다른 사람들과 함께 공동으로 코드를 만들기 편리해야하고
        
        - 배열 : 속성이 동일한 여러 개의 데이터를 같은 이름과 순서를 지정한 연속된 번호로 서로 연관 되어 있음을 표시함으로서 추상화함
        - 구조체 : 데이터(자료형)을 실제로 쓰이는 데이터끼리 묶어서 추상화
        - 함수 : 프로세스(코드)를 특정 기능 단위로 묶어서 추상화
    
        최악의 추상화 -> 추상화 단계를 상승시키는 과정
        string a, b, c;             // <- 최악의 추상화
        string a[3];                // <- 위보다는 좀 낫다
        string name1, name2, name3; // <- 조금 더 나아지고
        string studentName[3];      // <- 위의 것보다 의도가 명료하게 드러나기 떄문에 좋은 추상화다.
    */
    
    /*
        구조체
        - 변수를 모아 놓은 집합체
        - 특정 변수들이 무언가의 하위 개념으로 묶일 수 있을 때
        - studentName[10], studentAge[10], studentKorScore[10] ....
        - 위 변수들은 '학생'의 XXX로
        ∴ 이름, 나이, 국어점수, 석차 등등을 '학생'이라는 구조체로 묶어서 사용
    
        1. 구조체를 정의하는 위치 : 구조체가 사용되는 함수의 앞에 정의한다.
        { 해당 함수의 바깥쪽 앞(위) }
        2. 구조체 정의의 방법
        struct 구조체 변수 명 {
            구조체 안에 들어갈 하위 변수들;
        };
        -> 구조체는 일종의 우리가 새롭게 만든 데이터형.
    
        3. 구조체 선언과 초기화
        기본적으로 구조체 변수의 개념은 배열 변수의 개념과 동일
        int a[3] = { 50, 70, 80 };
        구조체 변수도 다음과 같이 선언과 같이 초기화를 진행 할 수 있다.
    
        player.HP = player.HP - monster[n].dmg;
    */
    #include <iostream>
    #include <conio.h>
    #include <cstdlib>
    #include <Windows.h>
    #include <string>
    
    using namespace std;
    //구초체 정의 위치
    struct score {
        int kor;
        int eng;
        int math;
    };
    
    struct student {
        string name; //일반 변수 사용 가능
        int monthlyScore[10]; //배열도 사용가능
        int age;
        string homeTown;
        int pride;
        score myScore; //미리 정의한 구조체도 변수로 사용 가능
    }seoyeon,jaehyuk; //처럼 중괄호 뒤에 변수 이름을 미리 선언할 수 있다.
    // name, age, homeTown, pride라는 하위 변수를 가지고 있는 student라는 구조체를 정의 한다.
    
    int main() // 지금 우리가 쓰고있는 유일한 함수
    {
    
        //구조체 사용 방법
        student doil;
        doil.name = "박도일";      // 구조체를 사용하는 변수의 이름값
        doil.age = 27;            //구조체를 사용하는 변수의 나이값
        doil.homeTown = "전주";       //구조체를 사용하는 변수의 고향값
        doil.pride = 97;            //구조체를 사용하는 변수의 자신감값
    
        doil.myScore.eng = 70;
        doil.myScore.kor = 75;
        doil.monthlyScore[0] = 90;
        
        score myScore = { 50, 80, 90 }; //배열을 초기화 하듯 구조체도 초기화 가능.
        cout << myScore.kor << " " << myScore.eng << " " << myScore.math << endl;
        //monster a = { "고블린", 79, 55.12f, true, 100 }; 처럼 다양한 변수가 있는 구조체에도 한번에 초기화 가능.
    
        //초간단 실습. student 구조체를 사용해서 자기 자신의 정보를 입력하고 확인해보자.
        cout << doil.name << endl;
        cout << doil.age << endl;
        cout << doil.homeTown << endl;
        cout << doil.pride << endl;
        cout << doil.monthlyScore[0] << endl;
    
        /*
            과제 : 미궁탈출 게임의 업데이트 
            사용할 수 있는 모든 요소에 구조체를 활용해서 소스코드를 개선하기.
            맵 타일에 지형 정보를 넣고(숲, 늪, 평지)
            player : 피로도를 넣고
            플레이어가 어느 지형에 있는지, 플레이어의 피로도가 얼마인지 (숲-2, 늪-3, 평지-1)
        */
    
    }