함수의 정의


함수는 여러개의 문장을 하나로 묶어 주는 역할을 하며, 직접 구현을 하거나, 이미 정의되어 있는 함수를 사용 할 수 있다.

반복적으로 사용 할 수있고, 함수 내부에 다른 함수를 호출 할 수도 있다.


함수를 선언하는 방법은 다음과 같다.


def <함수명>(매개변수1, 2, ... N ):

     <구문>

     return <반환값>


예제 )

def test (a, b ):

c = a + b

return c


위와 같이 test라는 함수를 내가 정의를 한다면, 이제 test라는 함수가 생성되고, 다른 함수 내에서 test를 사용 할 수 있게 된다.

test(20,10)을 입력하면 30이 반환된다. 





스코핑룰


먼저 코드를 통해서 예를 들어 보자.


value = 1000  --- ( 1 )


def example():

   value = 200  --- ( 2 )


다음 (2)와 같이 example이라는 함수 내에서 value라는 값에 200을 대입하면 (1)의 값이 200으로 바뀔까? 

아니면 example이라는 함수 내에서 200이라는 값으로 초기화된 value가 생길까??? 


파이썬에서는 스코핑룰에 대해 모르고 변수에 대해 접근을 한다면 생각치 못한 결과를 가져 올 수 있다.


위의 예제에서는 전역함수에서의 value와 함수 내의 지역변수 value 2가지의 value가 생성되었다고 생각하면 된다. 파이썬 내에서는

변수를 지역, 전역, 내장의 순서로 검색을 한다. 그렇다면 만약 example 함수 내의 지역에서 value라는 값을 접근하고 싶다면 어떻게 하면 될까?


value = 1000

def example():
global value
value = 200

example()
c = value
print(c)

위와 같이 global 키워드를 통해 value를 선언하여 주면 전역변수 value를 사용하겠다고 선언하는 것과 같다. 위의 예제를 실행하면

value의 값은 200이 출력이 된다.





람다함수


람다함수는 이름이 없는 함수이다. 즉 다른 함수들 처럼 이름을 통해 호출 하는 것이 아닌 필요로 하는 위치에서 몸체만 정의하여 사용 하는 것이다.


lambda 인자 : < 구문 >


- 람다함수 내에서는 return 구문을 따로 적지 않지만, 하나의 반환 값을 돌려준다. 

- 여러 개의 인자를 일반함수와 동일하게 전달 받을 수 있다.


예제 ) 

x = 3
y = 3

value = (lambda _x, _y : _x * _y) (x,y)
print(value)
출력결과 = 9



pass


함수 지역 내에 아무런 동작도 취하지 않고 넘어 가겠다고 선언하는 키워드


예제)

def test():
pass

test()

출력결과 = 




이터레이터


리스트, 튜플 등 순회 가능한 객체의 각 요소를 순서대로 접근 할 수 있도록 해주는 객체


예제)


l = [1, 2, 3, 4, 5, 6]

for ele in l:
print(ele)


출력결과 :  1

               2 

               3

               4

               5

               6


원리는 다음과 같다. for문 내에서 이터레이터 객체를 가져오고, 이터레이터 내의 __next__() 함수를 실행한다. 그 다음 for문은 StopIteration 예외를 만날때까지 __next__() 함수를 수행한다. 이렇게하여 첫번째 요소부터 마지막 요소까지 순회를 할 수 있다.

__next__()는 내장함수인 next()를 통해서도 사용가능하다.


name = "jaehoon"

it = iter(name)

s = next(it)
print(s)

s = next(it)
print(s)

s = next(it)
print(s)
print ( it.__next__())
print ( it.__next__())


출력결과 :

첫번째 print :  j

두번째 print : a

세번째 print : e

네번째 print : h

다섯번쨰 print : o

   




제너레이터


이터레이터를 만들어주는 도구로서 함수의 반환을 return 대신 yield를 사용한다.


예제)


#1
def returnName():
name = "jaehoon"
for c in name:
yield c

result = iter( returnName() )

print( result.__next__() )
print( result.__next__() )
print( result.__next__() )
print( result.__next__() )
print( result.__next__() )

#2
for c in returnName():
print(c)



#1의 경우 yield가 아닌 return 이였을 경우 j만 반환되고 Stopoperation 예외가 반환이 된다. return을 통해서 해당 함수를 종료하였기 때문이다.

하지만 yield이기 때문에 함수가 최근 호출되었던 정보 상태로 유지가 되기 때문에 

#1의 출력결과는 


첫번째 print :  j

두번째 print : a

세번째 print : e

네번째 print : h

다섯번쨰 print : o 




#2번의 경우 


첫번째 print :  j

두번째 print : a

세번째 print : e

네번째 print : h

다섯번쨰 print : o 

여섯번쨰 print : o 

일곱번쨰 print : n


로 앞서 배웠던 이터레이터 객체를 사용하는 것과 같은 결과가 나온다.



제약조건


데이터의 무결성을 보장하기 위한 조건.




데이터 무결성


DB에 저장된 데이터의 일관성을 의미하며 데이터의 입력, 수정을 제한하여 안전성을 저해하는 요소를 예방하는 것을 의미

즉, 해당 데이터에 대해 무작위로 입력, 수정을 할 수 없도록 막는 것.




제약 조건


1. NOT NULL 

2. UNIQUE

3. PRIMARY KEY

4. FOREIGN KEY

5. CHECK




1. NOT NULL


NULL 값을 넣을 수 없음. Default를 정의하여 해당 데이터가 없을 경우에 Defalut값을 넣도록 할 수 있다.


사용예시 ) char_id varchar2(8) NOT NULL;




2. UNIQUE


중복된 값이 아닌 유일한 값만 넣을 수 있음. 해당 테이블 내에서 동일한 값이 들어가게 되면 에러가 난다.


사용예시 ) user_num number UNIQUE;




3. PRIMARY KEY


Null 값을 갖지 못하며, 중복된 값을 가질 수 없음. 즉 NOT NULL, UNIQUE를 동시에 정의 한 것 과 같다.


사용예시 ) user_num PRIMARY KEY;




4. FOREIGN KEY


외래키, 해당 컬럼은 반드시 다른 테이블의 기본키와 참조 관계를 갖고 외래키로 지정된 컬럼은 참조관계를 가진 테이블의 기본키에 있는 값만을 가질 수 있다. 이 경우에 자식 테이블이 참조하는 데이터는 부모 테이블에서 삭제가 불가능하다. 옵션을 통해서 부모테이블에 삭제되면 자식테이블도 삭제 가능


사용예시 ) constraints 외래키명 FOREIGN KEY references 참조테이블명(기본키 컬럼명)





5. CHECK 


입력 될 수 있는 데이터의 종류를 제한. 기본 연산자, 비교연산자, IN, NOT IN 등 사용이 가능하다.


사용예시 ) gender varchar2(8) CHECK ( gender IN ('Man', 'Woman' ) 









운영체제란?


컴퓨터 사용자와 컴퓨터 하드웨어 간의 인터페이스를 담당하는 프로그램. 사용자가 응용 프로그램을 편리하게 실행 할 수 있도록 도와준다.

하드웨어와 컴퓨터 사용자를 연결하는 매개체 역할.





운영체제의 역할


하드웨어와 컴퓨터 사용자를 연결하는 역할. 응용프로그램 간의 하드웨어 사용 제어, 운영체제는 컴퓨터 하드웨어와 응용 프로그램 간의 인터페이스

역할을 하면서 CPU, 메모리와 같은 컴퓨터 자원을 관리하고 사용자에게 편의를 제공한다.


1. 조정자로서의 역할 : 운영 요소를 적절하게 사용 할 수있도록 제어. 다만 프로그램이 작업 할 수 있는 환경만 제공 할 뿐 직접일은 못한다.

                                    예를들어 워드프로세서 역할을 직접 수행하는 것이 아닌, 워드프로세서가 제 기능을 하도록 도움만 준다.


2. 자원 할당자 또는 관리자로서의 역할 : 각 응용 프로그램에 필요한 자원을 할당해준다.

                                                     (프로세서 시간, 메모리 공간, 파일저장 공간, 입출력장치 등 )

                                                     그런데 각 응용프로그램에서 동일한 자원을 요구하는 충돌이 발생 할 수 있다. 이럴때 운영체제는 

                                                     시스템을 공정하고 효율적으로 운영하기위해 자원 할당을 어떻게 할지에 대한 관리자 역할도 한다.


3. 입출력 장치와 사용자 프로그램 제어 : 시스템의 부적절한 사용이나 오류 방지를 위해 사용자 프로그램의 실행을 제어






버퍼링


입출력장치의 느린 속도를 보완하기 위한 운영체제의 기능 중 하나로 프로세서와 입출력장치를 유휴시간이 없도록 프로세서의 연산과정과 함께

어떤 작업의 입출력을 동시에 수행하는 방식

데이터 구성 단위로는 레코드가 쓰인다. 버퍼링의 성능은 처리되는 레코드 수에 따라 달라진다.




스풀링


디스크를 매우 큰 버퍼처럼 사용하는 것. 입력장치에서 미리 읽어들여 출력장치가 받을 수 있을 때 까지 출력파일을 저장.

버퍼링과 비교하여 스풀링은 한 작업의 입출력을 수행하면서 다른 작업의 계산도 할 수 있다는 장점을 갖는다.




운영체제의 유형별 특징


1. 다중프로그래밍 시스템

2. 시분할 시스템

3. 분산처리 시스템

4. 다중처리 시스템

5. 단일 사용자 시스템




다중프로그래밍 시스템


프로세서가 항상 수행할 작압을 가지도록하여 프로세서 이용률을 증진 시키는 방식. 수행 될 작업을 메모리에 적재하여 프로세서가 유휴하지 않는 상태로 만드는 방식. 인터럽트를 수행하여 여러 개의 작업이 수행 준비를 갖추고 있을때 해당 작업을 결정하여 수행한다.


시분할 시스템


다중프로그래밍을 논리적으로 확장한 개념으로 프로세서를 통해 다중 작업을 교대로 수행하여 컴퓨터가 여러개 있는것 처럼 착각하게 만든다.

여러작업이 메모리에 저장되어 있는 경우 한 작업이 다른 작업의 데이터를 변경하는 등의 작업에 대한 보호가 필요하다. 또한 다수의 사용자가 접근하는 파일은 접근 권한을 두어 특정 권한을 가진 사용자만 접근 할 수 있도록 파일 시스템을 보호해야 한다.


분산처리 시스템


시스템마다 운영체제와 메모리를 가지고 독립적으로 운영되며 필요할 때 통신하는 시스템 둘 이상의 독립된 컴퓨터 시스템을 통신선으로 연결한다.





운영체제 기능


자원관리와 프로그램을 위한 인터페이스 역할 수행


1. 자원관리 기능 메모리, 프로세스, 장치, 파일 등의 시스템 구성요소를 관리하는 역할


- 메모리 관리 : 프로세서가 명령어를 수행하려면 명령어가 메인 메모리에 있어야 한다. 프로그램을 수행하려면 프로그램이 절대주소로 맵핑되어 메인 메모리에 저장되어야 한다. 운영체제는 메모리의 사용부분, 사용자 점검, 기억 공간에 어떤 프로세스를 저장할지 결정, 기억 공간 할당 및 회수 결정을 담당한다.


- 보조기억장치 관리 : 비어있는 공간관리, 저장 장소 할당, 디스크 스케줄링을 담당한다.


- 프로세스 관리 : 프로세스와 스레드 스케줄링, 사용자, 시스템프로세스 생성 및 제거, 프로세스 중지와 재수행, 프로세스 동기화를 위한 기법제공, 

                       프로세스 통신을 위한 기법 제공, 교착상태 방지 기법 제공을 담당


- 장치 관리 : 임시 저장시스템, 장치드라이버 인터페이스, 특정하드웨어 장치를 위한 드라이버를 담당


- 파일 관리 : 파일 생성과 제거, 디렉터리 생성과 제거, 보조기억장치에 있는 파일의 맵핑, 안전한 저장매체에 파일 저장 담당


 2. 운영체제의 기타 기능

 

 - 시스템 보호 : 운영체제에 있는 프로세스는 다른 사용자들의 프로그램으로 부터 파일, 기억장치, 프로세서, 기타 자원등에 대하여 적절한 권한을 부여한                       프로세스만 수행될수 있어야 한다.


 - 네트워킹 : 시스템에 있는 프로세서는 통신 네트워크를 통해 연결된다.


 - 명령 해석기와 시스템 관리 :사용자가 입력한 여러가지 명령은 제어 문장에 의해 운영체제에 전달이 되고, 이 전달을 명령해석기가 담당




운영체제 서비스


운영체제는 사용자에게 다음과 같은 서비스를 제공한다.


부트스트래핑 서비스

사용자서비스

시스템 서비스

시스템 호출 서비스


1. 부트스트래핑 서비스


부트스트래핑 : 운영체제가 적재 되는 과정, 부팅이라고도 한다. 부트스트랩 로더는 disk track 0, 나머지는 다른 부분에 적재 된다.


                                       







'프로그래밍 > 운영체제' 카테고리의 다른 글

[ 기술면접 정리 서버 / 운영체제 ]  (0) 2019.03.06
[1] 컴퓨터 시스템 소개  (0) 2019.02.07
쓰레드란?  (0) 2019.02.05

레지스터

: 프로세서에 위치한 고속메모리, 프로세서가 바로 사용할 수 있는 데이터를 담는다.




메인 메모리

: 고유 주소를 갖는 워드, 바이트로 구성된 대규모 배열 주소를 읽거나 기록함으로써 상호작용 한다.

 프로세서는 메인 메모리로부터 데이터를 읽거나 쓴다.




캐시 

:처리 속도가 빠른 프로세서와 느린 메인 메모리 사이에서 데이터나 정보를 저장하는 고속 버퍼이다. 메인 메모리에서 일정 블록의 데이터를 가져와

워드 단위로 프로세서에 전달하여 정보를 빠르게 제공하는 역할

메인 메모리 주소 영역을 한 번 읽어 들일수 있는 라인크기로 나눈 후 각 블록에 번호를 부여 한 후 이번호를 태그로 저장.



캐시적중 (Cache Hit) : 프로세서는 메인메모리 접근 전에 캐시를 먼저 조사한다. 만약 캐시가 데이터를 보관하고 있으면, 캐시는 데이터 라인에서 요청한 데이터를 읽어

프로세서에 보낸다.


캐시실패 (Cache Miss) : 원하는 주소의 블록에 캐시에 없을때 캐시제어기는 메인메모리에서 해당 블록을 읽어 캐시에 넣고 프로세서에 전송




시스템의 동작 과정


Data를 디지털 형태로 입력받아 메모리에 저장된 명령어 목록에 따라 처리 후 출력. 저장






인터럽트


컴퓨터에서 설정된 장치에서 프로세서로 보내는 하드웨어 신호. 인터럽트를 받은 프로그램은 실행을 멈추고 다른 프로그램이 실행 된다.


시스템이 예측하지 못하는 갑작스런 정전, 시스템으로 부터의 긴급 요청, 잘못된 명령어 수행, 입출력 작업완료 같은 긴급상황을 처리하기 위해서 필요


프로그램의 정상 실행을 일시 정지 시키는 과정과 재개하는 과정의 연속으로 실행, 사용자 프로그램에 별도로 인터럽트를 위한 조치가 필요한것은 아니다.











참조 : 운영체제 그림으로 배우는 원리와 구조 / 구현회 저 / 한빛 아카데미

'프로그래밍 > 운영체제' 카테고리의 다른 글

[ 기술면접 정리 서버 / 운영체제 ]  (0) 2019.03.06
[2] 운영체제 소개  (0) 2019.02.07
쓰레드란?  (0) 2019.02.05


TCP / IP?

 

인터넷 네트워크의 핵심 프로토콜( 프로토콜(Protocol)은 규약이다. 일종의 약속이라는 뜻이다. 커뮤니케이션 하는 컴퓨터들 간에 오류를 최소화함으로써 정보를 원활하게 교환하기 위해 만들어진 규칙의 집합) 으로서. 인터넷에서 전송되는 정보나 파일들이 일정한 크기의 패킷들로 나뉘어 네트워크상 수많은 노드들의 조합으로 생성되는 경로들을 거쳐 분산적으로 전송되고, 수신지에 도착한 패킷들이 원래의 정보나 파일로 재조립되도록 하는 게 바로 TCP/IP의 기능이다.

 

프로토콜인 TCP는 전송할 파일을 좀 더 작은 패킷들로 나누어 인터넷 네트워크를 통해 전송하는 일과 수신된 패킷을 원래의 메시지로 조립하는 일을 담당.

IP는 각 패킷의 주소 부분을 처리해 패킷들이 목적지에 정확하게 도달하도록 하는 기능을 수행한다.

 

예를들어 20명의 사람이 오이도를 가는데 차 1대로 못가기 때문에 여러대의 차를 빌려 나누어 탄다. 그 중 대장은 연락을 통해 목적지를 정하고 그 목적지로 전원이 잘 도착 할 수 있도록 유도 하는 것과 같다.

 

 

클라이언트-서버 통신 모델

 

서버 클라이언트가 요청하는 서비스를 처리

클라이언트 : 서비스를 서버에게 요청

 

한 컴퓨터에서 실행되는 두 프로그램에 클라이언트-서버 모델을 적용하면 데이터 주고받기가 가능

 

접속이 성공하려면 반드시 상대 프로그램이 실행되어야함 동시접속 모델을 사용하면 타이밍문제로 실패확률 높음 따라서 서버-클라이언트 모델을 이용하여 먼저 실행하는쪽을 서버 후를 클라이언트로 하여 해결가능

 

 

네트워크로 연결된 컴퓨터는 반드시 TCP/IP로 연결가능


#include <iostream>
#include <cstring>
using namespace std;
struct Node
{
char m_cName[20];
int m_iHp;
int m_iMp;
int m_iSpeed;
int m_iRange;
char m_cPosition[20];
Node* next;
};
//////////////////
// 함수 //
//////////////////
int Menu();
void InputData();
void Insert( char* name, int hp, int mp, int speed, int range, char* position );
void PrintAll();
void Search();
void Delete();
void PositionDeleteAll();
void FindMaxHp();
void SortByHp();
//////////////////
// 변수 //
//////////////////
Node *head = NULL;
char inputName[20];
int inputHp;
int inputMp;
int inputSpeed;
int inputRange;
char inputPosition[20];
int maxHp;
int sortFlag;
//////////////////
// 메인 //
//////////////////
int main()
{
Insert("럭스", 477, 334, 330, 550, "mid");
Insert("베이가", 492, 342, 340, 525, "mid");
Insert("벨코즈", 507, 325, 340, 525, "bottom");
Insert("징크스", 517, 245, 325, 525, "bottom");
Insert("오리아나", 517, 334, 325, 525, "mid");
Insert("트위치", 525, 287, 330, 550, "jungle");
Insert("앨리스", 529, 324, 335, 550, "jungle");
Insert("바드", 535, 350, 330, 500, "bottom");
Insert("코그모", 546, 322, 325, 500, "bottom");
Insert("룰루", 552, 292, 325, 550, "suppot");
Insert("모데카이저", 555, 120, 340, 120, "mid");
Insert("드레이븐", 557, 310, 330, 550, "bottom");
Insert("자르반4세", 571, 302, 340, 175, "jungle");
Insert("케일", 574, 322, 335, 125, "top");
Insert("블리츠크랭크", 582, 267, 325, 125, "suppot");
Insert("문도박사", 582, 0, 345, 125, "top");
Insert("다이애나", 589, 297, 345, 150, "mid");
Insert("워윅", 592, 240, 345, 125, "jungle");
Insert("잭스", 592, 288, 350, 125, "top");
Insert("트린다미어", 625, 100, 345, 125, "top");
Insert("갱플랭크", 631, 282, 345, 125, "top");
while ( 1 )
{
switch ( Menu() )
{
case 1 :
Search();
break;
case 2 :
InputData();
Insert(::inputName, ::inputHp, ::inputMp, ::inputSpeed, ::inputRange, ::inputPosition);
break;
case 3 :
Delete();
break;
case 4 :
PositionDeleteAll();
break;
case 5 :
PrintAll();
break;
case 6 :
FindMaxHp();
break;
case 7 :
SortByHp();
break;
default :
break;
}
}
}
int Menu()
{
int num;
cout << "--------------Menu---------------" << endl;
cout << "1. 챔피언 Search" << endl;
cout << "2. 챔피언 Insert" << endl;
cout << "3. 챔피언 Delete" << endl;
cout << "4. Position DeleteAll" << endl;
cout << "5. PrintAll" << endl;
cout << "6. FindMaxHp" << endl;
cout << "7. SortByHp" << endl;
cout << "----------------------------------" << endl;
cout << "메뉴를 입력하세요 [ 1 ~ 7 ] : ";
cin >> num;
if ( 0 < num && num < 8)
return num;
}
void Insert(char* name, int hp, int mp, int speed, int range, char* position)
{
Node* temp = head;
if ( temp != NULL && temp->next != head ){
while ( temp->next != head)
temp = temp->next;
temp->next = new Node;
temp = temp->next;
temp->next = head;
temp->m_iHp = hp;
temp->m_iMp = mp;
temp->m_iSpeed = speed;
temp->m_iRange = range;
strcpy(temp->m_cName, name);
strcpy(temp->m_cPosition, position);
}
else if (head == NULL){
head = new Node;
head->next = head;
head->m_iHp = hp;
head->m_iMp = mp;
head->m_iSpeed = speed;
head->m_iRange = range;
strcpy(head->m_cName, name);
strcpy(head->m_cPosition, position);
}
else if ( temp->next == temp){
temp->next = new Node;
temp->next->next = head;
temp->next->m_iHp = hp;
temp->next->m_iMp = mp;
temp->next->m_iSpeed = speed;
temp->next->m_iRange = range;
strcpy(temp->next->m_cName, name);
strcpy(temp->next->m_cPosition, position);
}
}
void PrintAll()
{
Node *temp = head;
if ( head != NULL && (
!strcmp(temp->m_cPosition, "jungle") ||
!strcmp(temp->m_cPosition, "suppot") ||
!strcmp(temp->m_cPosition, "bottom") ||
!strcmp(temp->m_cPosition, "mid") ||
!strcmp(temp->m_cPosition, "top")) ){
while (temp->next != head)
{
cout << "이름 : " << temp->m_cName << endl;
cout << "체력 : " << temp->m_iHp << endl;
cout << "마력 : " << temp->m_iMp << endl;
cout << "속도 : " << temp->m_iSpeed << endl;
cout << "범위 : " << temp->m_iRange << endl;
cout << "포지션 : " << temp->m_cPosition << endl;
temp = temp->next;
}
cout << "이름 : " << temp->m_cName << endl;
cout << "체력 : " << temp->m_iHp << endl;
cout << "마력 : " << temp->m_iMp << endl;
cout << "속도 : " << temp->m_iSpeed << endl;
cout << "범위 : " << temp->m_iRange << endl;
cout << "포지션 : " << temp->m_cPosition << endl;
}
}
void Search()
{
Node* temp = head;
char name[20] = "NULL";
cout << "검색할 챔피언의 이름을 입력해주세요 : ";
cin >> name;
while ( temp->next != head){
if ( !strcmp(name, temp->m_cName) ){
cout << "이름 : " << temp->m_cName << endl;
cout << "체력 : " << temp->m_iHp << endl;
cout << "마력 : " << temp->m_iMp << endl;
cout << "속도 : " << temp->m_iSpeed << endl;
cout << "범위 : " << temp->m_iRange << endl;
cout << "포지션 : " << temp->m_cPosition << endl;
}
temp = temp->next;
}
if ( !strcmp(name, temp->m_cName) ){
cout << "이름 : " << temp->m_cName << endl;
cout << "체력 : " << temp->m_iHp << endl;
cout << "마력 : " << temp->m_iMp << endl;
cout << "속도 : " << temp->m_iSpeed << endl;
cout << "범위 : " << temp->m_iRange << endl;
cout << "포지션 : " << temp->m_cPosition << endl;
}
}
void Delete()
{
Node* temp = head;
Node* p = NULL;
char name[20] = "NULL";
cout << "삭제할 챔피언의 이름을 입력해주세요 : ";
cin >> name;
while ( temp->next != head){
if ( !strcmp(name, temp->next->m_cName) ){
p = temp->next;
temp->next = temp->next->next;
p->next = nullptr;
delete p;
}
else
temp = temp->next;
}
if ( !strcmp(name, head->m_cName) ){
p = head;
p = head->next;
delete head;
head = p;
temp->next= head;
}
}
void PositionDeleteAll()
{
Node* temp = head;
Node* p = NULL;
char position[20] = "NULL";
cout << "삭제할 Position을 입력해주세요 : ";
cin >> position;
while ( temp->next != head){
if ( !strcmp(position, temp->next->m_cPosition) ){
p = temp->next;
temp->next = temp->next->next;
p->next = nullptr;
delete p;
}
else
temp = temp->next;
}
if ( !strcmp(position, head->m_cPosition) ){
p = head;
p = head->next;
delete head;
head = p;
temp->next= head;
}
};
void InputData()
{
cout << "이름을 입력하세요: ";
cin >> ::inputName;
cout << "체력을 입력하세요: ";
cin >> ::inputHp;
cout << "마력을 입력하세요: ";
cin >> ::inputMp;
cout <<"속도 입력하세요: ";
cin >> ::inputSpeed;
cout << "범위를 입력하세요: ";
cin >> ::inputRange;
cout << "포지션을 입력하세요: ";
cin >> ::inputPosition;
}
void FindMaxHp()
{
Node* temp = head;
if ( head->m_iHp > maxHp)
maxHp = head->m_iHp;
while(temp->next != head)
{
if ( temp->m_iHp > maxHp)
maxHp = temp->m_iHp;
temp = temp->next;
}
if (temp->m_iHp > maxHp)
maxHp = temp->m_iHp;
cout << "가장 높은 체력 : ";
cout << maxHp << endl;
temp = head;
if ( head->m_iHp == maxHp){
cout << "이름 : " << head->m_cName << endl;
cout << "체력 : " << head->m_iHp << endl;
cout << "마력 : " << head->m_iMp << endl;
cout << "속도 : " << head->m_iSpeed << endl;
cout << "범위 : " << head->m_iRange << endl;
cout << "포지션 : " << head->m_cPosition << endl;
}
while(temp->next != head)
{
if ( temp->m_iHp == maxHp){
cout << "이름 : " << temp->m_cName << endl;
cout << "체력 : " << temp->m_iHp << endl;
cout << "마력 : " << temp->m_iMp << endl;
cout << "속도 : " << temp->m_iSpeed << endl;
cout << "범위 : " << temp->m_iRange << endl;
cout << "포지션 : " << temp->m_cPosition << endl;
}
temp = temp->next;
}
if (temp->m_iHp == maxHp){
cout << "이름 : " << temp->m_cName << endl;
cout << "체력 : " << temp->m_iHp << endl;
cout << "마력 : " << temp->m_iMp << endl;
cout << "속도 : " << temp->m_iSpeed << endl;
cout << "범위 : " << temp->m_iRange << endl;
cout << "포지션 : " << temp->m_cPosition << endl;
}
::maxHp = 0;
}
void SortByHp()
{
Node* temp = head;
Node* rotate = head;
Node* whileNode = head;
Node* remember = nullptr;
Node* prv = nullptr;
while(temp->next!= head){
if( temp->m_iHp > temp->next->m_iHp){
if ( temp == head){
if ( temp->next->next != head){
rotate = head;
while(rotate->next != head)
rotate = rotate->next;
remember = temp->next;
temp->next = temp->next->next;
remember->next = temp;
head = remember;
rotate->next = head;
temp = head;
}
else if ( temp->next->next == head){
remember = temp->next;
temp->next = temp->next->next;
remember->next = temp;
head = remember;
temp->next->next = head;
temp = head;
}
}
else if ( temp->next->next != head){
rotate = head;
while(rotate->next != temp){
rotate = rotate->next;
}
prv = rotate;
remember = temp->next;
temp->next = temp->next->next;
remember->next = temp;
prv->next = remember;
temp = head;
}
else if ( temp->next->next == head){
rotate = head;
while(rotate->next != temp){
rotate = rotate->next;
}
prv = rotate;
remember = temp->next;
temp->next = temp->next->next;
remember->next = temp;
prv->next = remember;
temp->next = head;
temp = head;
}
}
temp = temp->next;
}
sortFlag = 1;
}



















'프로그래밍 > C++언어' 카테고리의 다른 글

[ 기술면접 정리 서버 / C++ ]  (0) 2019.03.06

1. 원이 두 점에서 만나는 경우
r2 - r1 < d < r1 + r2


2. 두 원이 외접하는 경우 (한점에서 만난다)

d = r1 + r2


3. 두 원이 내접하는 경우 (한점에서 만난다)
d = r2 - r1
and
d != 0


4. 하나의 원이 다른 원을 포함하는 경우 (만나지 않는다)
d < r2 - r1


5. 두 원이 멀리 떨어져 만나지 않는 경우
d > r1 + r2


6. 두 원이 일치하는 경우 (무수히 많은 점에서 만난다)
d = 0
r1 = r2

+ Recent posts