4月15日の学習内容
19799 ワード
こうぞうたい
->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
// 형식으로 사용 가능
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)
*/
}
Reference
この問題について(4月15日の学習内容), 我々は、より多くの情報をここで見つけました https://velog.io/@poker5323/4월-15일-학습-내용テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol