https://balabala.tistory.com/44?category=947457 
 

[MFC] 채팅 프로그램 - 서버 (1/3)

- 설명 - 프로젝트 명 : ChatServer(대화 상자) ① CSocket 클래스 이용 : 동기식(블로킹)으로 동작 ② 서버 클라이언트 1:1 통신 ③ 해당 글은 서버용 채팅 프로그램 만드는 법 설명 1. MFC 애플리케이션

balabala.tistory.com


[따라하다가 안되던 부분들]

2. 다이얼로그 디자인 및 ID

 

형식을 CString 으로 하니 에러가 나서 CEdit, CStatic으로 변경했다. 

Control을 다루는 부분도 형식에 따라서 변경했다.

그림3. 멤버변수 설정

10. [전송] 버튼 클릭 메시지 함수 작업

위 작업에 따라서 메세지 함수 소스 코드 변경

void CChatServerDlg::OnBnClickedButtonSend()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	UpdateData(TRUE);
	char pTmp[256];
	CString strTmp, strText;
	CStringA strTextA;

	m_strSend.GetWindowText(strText);

	strTextA = CStringA(strText);

	// pTmp에 전송할 데이터 입력
	memset(pTmp, '\0', 256);
	memcpy(pTmp, strTextA.GetBuffer(), strTextA.GetLength());
	m_strSend.Clear();

	// 전송
	m_socCom->Send(pTmp, 256);

	// 전송한 데이터도 리스트박스에 보여준다.
	strTmp = pTmp;
	int i = m_list.GetCount();
	m_list.InsertString(i, strTmp);

	UpdateData(FALSE);
}

 

 

https://badayak.com/category/%EC%BB%B4%ED%93%A8%ED%84%B0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D?page=3 

 

'컴퓨터/프로그래밍' 카테고리의 글 목록 (3 Page)

생활 속에서 컴퓨터·모바일 기기를 편리하게 사용하는 방법과 IT 소식을 소개합니다.

badayak.com

 

'Study' 카테고리의 다른 글

Git 시작하기  (0) 2022.04.29

https://eachan.tistory.com/6

 

GDI+를 이용한 더블 버퍼링

지금까지 찾아본 GDI+ 더블 버퍼링 코드를 보면 거의 비슷한 내용이지만 구현하는 방법이 조금씩 달라서 도대체 어떤 것을 써야할지 헷갈리는 경우가 있다. 이럴 경우를 위해서 본인이 현재 쓰는

eachan.tistory.com

.

http://www.tipssoft.com/bulletin/board.php?bo_table=update&wr_id=982 

 

팁스소프트 > 팁스웨어 자료실 > [소스] 좌표 확대 및 축소하기 (맵핑 모드 미사용)

[소스] 좌표 확대 및 축소하기 (맵핑 모드 미사용)  글쓴이 : 관리자   트랙백 주소 : http://www.tipssoft.com/bulletin/tb.php/update/982    TransferCoordinate-Step1.zip (32.9K) [42] DATE : 2009-09-23 13:56:03   팁스소프

www.tipssoft.com

 

https://luckygg.tistory.com/233

 

[MFC] Dynamic Layout 적용하여 컨트롤 Resizing하기(예제 포함)

소개 Visual Studio 2015 MFC에는 동적 레이아웃(Dynamic Layout) 기능이 추가되었습니다. 이 기능은 Dialog의 Resizing에 따라 자동으로 Control들의 크기가 조정되는 것을 의미합니다. 아래 애니메이션을 보면..

luckygg.tistory.com

 

방법 ①  ShowWindow함수 사용

//OnInitDialog() 부분에 추가하면 된다.

 

원형 : BOOLL_stdcall ShowWindow(HWND hWnd, int nCmdShow);

설명 : 지정된 윈도우의 표시 상태를 설정한다.

반환 : 성공여부를 반환한다.

매개변수 

 - HWND hWnd : 대상 윈도우 핸들

 - nCmdWhow : 지정하고자 하는 보이기 상태. 이 값에 따라 최소화, 최대화 혹은 보통 상태로 시작

 

SW_SHWO : 윈도우를 활성화하며 보인다.

SW_SHOWMAXMIZED : 윈도우를 최대화된 상태로 활성화 한다.

SW_SHOWMINMIZED : 윈도우를 최소화한 상태로 활성화 한다.

SW_HIDE : 윈도우를 숨긴다.

SW_SHOWNOACTIVATE : 최근 크기와 위치에 윈도우를 보이며 활성화 상태는 변경되지 않는다.


방법 

//OnInitDialog() 부분에 추가하면 된다.

-> 제목 표시줄 삭제

LONG style = ::GetWindowLong( m_hWnd, GWL_STYLE );

style &= ~WS_CAPTION;
style &= ~WS_SYSMENU;

::SetWindowLong( m_hWnd, GWL_STYLE, style );
int screenx = GetSystemMetrics( SM_CXSCREEN );
int screeny = GetSystemMetrics( SM_CYSCREEN );

// resize:
SetWindowPos( NULL, -4, -4, screenx+8, screeny+4, SWP_NOZORDER );

출처 : https://gdnn.tistory.com/117

출처 : https://godtory.tistory.com/27

출처 :https://pkss.tistory.com/entry/%EB%8B%A4%EC%9D%B4%EC%96%BC%EB%A1%9C%EA%B7%B8-%EC%A0%84%EC%B2%B4%ED%99%94%EB%A9%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0


1. 생성

헤더 파일 : <string>

 

 string str("abcd");  // 바로 생성

 string str1;                 // 선언 후 값 주기

      str1 = "abcd";

 string str2(str1);

 

* 문자열 끝에 null이 들어가지 않는다.


2. 인자 접근

① str.at(index);

해당 위치(index)에 해당하는 문자를 반환한다. index가 범위를 벗어나면 예외 리턴.

 

함수 예시 : str.at(0);    // "Hello" -> 'H'를 리턴


② str.operator[index]

일반 배열처럼 대괄호를 이용해서 인자에 접근 가능하다. 

해당 위치(index)에 해당하는 문자를 반환한다.

*at과 다른 점 : index(인덱스) 범위를 검사하지 않기 때문에 at 함수보다는 빠르다.

하지만 예외를 리턴하지 않는다. 

 

함수 예시: str[0];    // "Hello" -> 'H'를 리턴

 

③ str.front();

맨 앞 인자를 반환한다.

 

함수 예시: str.front();    // "Hello" -> 'H'를 리턴

 

④ str.back();

맨 뒤 인자를 반환한다.

 

함수 예시: str.back();    // "Hello" -> 'o'를 리턴


3. size 관련 함수

str.size();

사이즈를 반환한다.

 

함수 예시: str.size();    // "Hello" -> 5를 리턴

 

str.length();

길이를 반환한다. (size()와 같다고 생각하면 된다.)

 

함수 예시: str.length();    // "Hello" -> 5를 리턴

 

str.capacity();

할당된 메모리 크기(bytes)를 반환한다.

메모리 할당을 size(길이)에 대비해서 여유롭게 한다.

size(길이)가 capacity(메모리)를 넘게 될 때 새롭게 더 큰 capacity(메모리)를 할당한다.

 

함수 예시 : str1.capacity();    // "HelloHello" size(길이)는 10, capacity(메모리)는 15

함수 예시 : str2.capacity();    // "HelloHelloHelloH" size(길이)는 16, capacity(메모리)는 31

 

str.resize(n); , str.resize(n,c);

string을 n만큼의 크기로 만든다. 

만약 그 크기가 원래 사이즈보다 작다면, 남은 스트링을 버린다.  

만약 그 크기가 원래 사이즈 보다 크다면, 빈 공간으로 남은 공간을 채운다.

만약 c를 사용한다면 남은 공간을 c로 채울 수 있다.

 

함수 예시 : str.resize(5)          // "HelloHello" -> "Hello" size는 5

함수 예시 : str.resize(6)          // "Hello" -> "Hello " size는 6, 제일 뒤에 빈칸

함수 예시 : str.resize(10, 'v') // "Hello" -> "Hello vvvv" 

 

⑤ str.shrink_to_fit();

string 길이에 비해 낭비되고 있는 capacity(메모리)를 줄이는 함수이다.

 

함수 예시 : str.resize(5);                // "HelloHelloHelloH

                                                                  > "Hello" size(길이)는 5지만  capacity(메모리)는 여전히 31

함수 예시 : str.shrink_to_fit();    // "Hello"처럼 size(길이) 5가 된 string의 capacity(메모리)에

                                                                    알맞게 str의 capacity(메모리)가  31->15으로 줄어든다.

 

⑥ str.reserve(n);

string을 넣기 전, 미리 n만큼의 size(길이)에 맞는 capacity(메모리)를 할당하는 함수이다.

⑦ str.clear();

 스트링에 들어있는 문자열을 지우는 함수이다. 

이때, size와 length는 0이 되고, capacity는 그대로 남게 됩니다.

 

함수 예시 : str.clear();    // "Hello" -> "" 

                                                    size와 lenth는 0이 되고, capacity(메모리)는 15 그대로 이다.

                                                    (메모리 해제X)

 

⑧ str.empty();

스트링이 비었는지 확인하는 함수이다. 비었으면 true를 반환한다. 

비었음의 기준은 size, length가 0인 것 이다. capacity(메모리)와는 관계가 없다.

 

함수 예시 : if(str.empty()) { return true; }  


4. 

 str.c_str();

C++의 string 문자열을 C의 문자열로 변경해주는 함수이다.

 

함수 예시 : const char* arr = str.c_str();    // "HelloHello" -> "HelloHello\0"로 반환.

 str.substr(); , str.substr(index); , str.substr(index, len);

string을 잘라서 반환하는 함수이다.

 

함수 예시 : str.substr();            // "HelloHello" 그대로 반환.

함수 예시 : str.substr(6);         // "ello"를  반환. index 5 번째 인자부터 끝까지의 string을 반환.

함수 예시 : str.substr(6, 1);    // "e"를 반환. 5번째 인자부터, 1의 길이만큼 string을 반환.

 str.replace(index, len, str2);

string의 index위치에서 len 길이까지의 범위를 매개변수로 들어온 str2 전체로 대체 하는 함수이다.

 

함수 예시 : str1.replace(5, 2, str2);

// "HelloHello"의 5번째 인자에서부터 2개를 str2("AAAA")로 대체한다.

     -> "HelloAAAAllo" 로 변경
함수 예시 : str1.replace(str1.find("AAAA"), 2, "He");

// "HelloAAAAllo"에서 "AAAA"를 찾아 "He"로 대체한다.

     -> "HelloHello" 로 변경

 

 str.compare(str2); 

매개변수로 들어온 str을 비교해서 같으면 0을 반환하고, 다르면 0이 아닌 값을 반환하는 함수이다.

매개변수로 들어온 스트링의 값보다 작을때(사전순 빠를때) 음수(0보다 작은값)를 반환하고 ,

매개변수로 들어온 스트링의 값보다 클때(사전순 느릴때) 양수(0보다 큰값)를 반환한다.

 

함수 예시 : str1.compare(str2);

// str1("Hello"), str2("HiHi")는 같지 않기 때문에 0이 아닌 값을 반환하고,

     H까지는 둘이 똑같고, 그다음 str1의 "e"와, str2의 "i"를 비교한다.

    이때, "e"가 "i"보다 사전상 더 앞선글자이기 때문에 str1이 더 작은 글자가 된다.

    그렇기 때문에 음수(0보다 작은값)를 반환하게 된다.

함수 예시 : str1.compare("Hello");

// str1("Hello")와 "Hello"는 같기 때문에 0을 반환한다.

함수 예시 : str1.compare(0, 1, str2);

// str1("Hello")의 0번째 인덱스 부터 길이가 1인 문자열 "H"와 

     str2("HiHi) 를 비교한다. 두 문자열이 다르기 때문에 0이 아닌 수를 반환합니다.

함수 예시 : str1.compare(0, 1, str2, 0, 1);   

// str1("Hello")의 0번째 인덱스 부터 길이 1인 문자열 "H"와 

     str2("HiHi")의 0번째 인덱스 부터 길이 1인 문자열 "H"를 비교한다.

     비교할 문자열이 같기 때문에 0을 반환한다.

 

⑤ str1.copy(arr, len, index);

복사를 하는 함수이다.

함수 원형 : size_t copy(char* arr, size_t len, size_t index = 0) const;

첫번째 매개변수 : char* 인걸 보면, C언어의 문자열(배열타입)을 받습니다. 

두번째 매개변수 : 복사할 문자열의 길이

세번째 매개변수 : 복사를 시작할 위치

return 값 :  실제로 복사된 길이, arr의 길이를 반환합니다.

 

함수 예시 :  char arr[10];                                          // 문자열을 복사해서 넣을 빈 배열을 만듭니다.

                      int arrLen = str1.copy(arr, 3, 2);    // index 2부터 3의 길이만큼 복사 -> "Hello"   

                                                                                             실제로 복사된 길이 3 반환

                      arr[arrLen] = '\0';                                 // C의 문자열의 끝에는 '\0'

⑥ str.find(str2); , str.find(str2, index);

매개변수로 들어온 문자열과 일치하는 게 있는지 확인하는 함수이다.  

만약에 일치하는게 있다면, 일치하는 부분의 첫번째 순서(index)를 반환한다.

두번째 매개변수로 들어온 index는 찾을 위치.

 

함수 예시 : str1.find("Hello");         // str1("HelloHello") 와 "Hello"를 비교

                                                                      -> 일치하는 부분의 첫번째 순서(index)인 0을 반환

함수 예시 : str1.find("Hello", 5);    // str1("HelloHello") 와 "Hello"를 5번째 인자부터 비교

                                                                       -> 일치하는 부분의 첫번째 순서(index)인 5를 반환

⑦ str.push_back(c);

함수를 호출하는 스트링의 맨뒤에 문자 c를 더하는 함수 이다.

 

함수 예시 : str.push_back('a');      //"HelloHello" -> "HelloHelloa"

⑧ str.pop_back();

함수를 호출하는 스트링의 맨뒤에 있는 문자 하나를 없애는 함수 이다.

 

함수 예시 : str.pop_back();            //"HelloHelloa" -> "HelloHello"


5. iterator 종류

 str.begin();

문자열의 첫 번째 문자를 가리키는 반복자(iterator 포인터)를 반환

 str.end();

문자열의 마지막의 바로 다음을 가리키는 반복자(iterator 포인터)를 반환


5. 기타 등등

swap(str1, str2)

str1과 str2를 바꾸는 함수. 서로 참조(reference)를 교환해서 스왑을 한다.

 

함수 예시 : swap(str1, str2);       // str1("Hello") ,str2("HiHi") -> str1("HiHi"), str2("Hello")


operator+

이어붙이기

 

함수 예시 : str1 += str2;                // str1("HiHi") += str2("Hello") = str1("HiHiHello") 


*[개발자 지망생]님 블로그를 보고 공부하며 제가 보기 편하게 정리 한 글 입니다.*

 

출처: https://blockdmask.tistory.com/338 [개발자 지망생]

'Study > C++' 카테고리의 다른 글

[C++] vector container  (0) 2022.01.06

버블정렬(Bubble sort)에 대해 설명하고 예제소스를 구현해보아라

  • 오름차순으로 정렬한다.
  • 서로 인접한 두 원소를 검사하여 정렬하는 알고리즘이다. 
  • 구현은 간단하지만 비효율적이다.
  • 시간 복잡도 : O(n^2)
void bubble_sort(int list[], int n)
{
    int temp;
    for (int i = n - 1; i > 0; i--) {
        // 0 ~ (i-1)까지 반복
        for (int j = 0; j < i; j++) {
            // j번째와 j+1번째의 요소가 크기 순이 아니면 교환
            if (list[j] < list[j + 1]) {
                temp = list[j];
                list[j] = list[j + 1];
                list[j + 1] = temp;
            }
        }
    }
}

선택정렬(Selection Sort)에 대해 설명하시고 예제소스를 구현해보아라

  • 오름차순으로 정렬한다.
  • 원소를 넣을 위치를 정해두고 어떤 원소를 넣을지 선택하는 알고리즘
  • 첫번째 자료를 두번째 자료부터 마지막 자료까지 차례대로 비교하여 가장 작은 값을 찾아 첫번째에 놓고, 두번째 자료를 세번재 자료부터 마지막 자료까지 차례대로 비교하여 그 중 가장 작은 값을 찾아 두번재에 놓고 ... 이러한 과정을 반복하여 정렬을 수행한다.
  • 구현은 간단하지만 비효율적이다.
  • 시간 복잡도 : O(n^2)
void selectionSort(int arr[], int size) {
    int minIndex;
    int temp;
    for (int i = 0; i < size - 1; i++) {

        minIndex = i;
        
        for (int j = i + 1; j < size; j++)
        {
            if (arr[j] < arr[minIndex])
            {
                minIndex = j;
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
}

삽입정렬(Insertion Sort)에 대해 설명하시오 예제소스를 구현해보아라

  • 오름차순으로 정렬한다.
  • 삽입 정렬은 두번째 자료부터 시작하여 그 앞(왼쪽)의 자료들과 비교하여 삽입할 위치를 지정한 후 자료를 뒤로 옮기고 지정한 자리에 자료를 삽입하여 정렬하는 알고리즘이다.
  • 즉, 두번째 자료는 첫번째 자료, 세 번째 자료는 두 번째와 첫 번째 자료, 네 번째 자료는 세 번째, 두 번째, 첫 번째 자료와 비교한 후 자료가 삽입 될 위치를 찾는다. 자료가 삽입될 위치를 찾았다면 그 위치에 자료를 삽입하기 위해 자료를 한칸 씩 뒤로 이동시킨다.
  • 처음 Key값은 두 번재 자료부터 시작한다.
  • 시간복잡도 : O(n^2)
void insertion_sort(int arr[], int size)
{
    int i, j;
    int key;

    for (i = 1; i < size; i++)
    {
        key = arr[i];
        for (j = i - 1; j >= 0; j--)
        {
            if (arr[j] < key) break;
            arr[j + 1] = arr[j];
        }
        arr[j + 1] = key;
    }
}

퀵 정렬(Quick Sort)에 대해 설명하시고 예제소스를 구현해보아라

  • 오름차순을 기준으로 정렬한다.
  • 리스트 안에 있는 한 요소를 선택한다. 이렇게 고른 원소를 피벗(pivot)이라고 한다. 피벗을 기준으로 피벗보다 작은 요소들은 왼쪽으로, 피벗보다 큰 요소들은 오른쪽으로 옮겨진다. 피벗을 제외한 왼쪽 리스트와 오른쪽 리스트를 다시 정렬한다. 이 과정을 더 이상 분할이 불가능할 때까지 반복한다.
  • 다른 정렬 알고리즘에 비해 속도가 빠르므로 사용빈도가 높다.
  • 시간복잡도 : 평균 O(nlogn) 최악 O(n^2)
void swap(int *arr,int a, int b){
    int tmp = arr[a];
    arr[a] = arr[b];
    arr[b] = tmp;
}
 
void quick_sort(int *arr, int start, int end)
{
    int pivot = arr[start];
    int left = start+1;
    int right = end;
 
    while(left <= right)
    {
 
        while(arr[left] < pivot)  { left++; }  //pivot보다 작은 경우는 건너뛰고 크거나 같은경우 멈춤
        while(arr[right] > pivot) { right--; } //pivot보다 큰 경우는 건너뛰고 작거나 같은경우 멈춤
 
        if(left <= right){ swap(arr, left, right); }
    }
 
    //1개로 쪼개질때 까지
    if(start < end)
    { 
        swap(arr, start, right);  	   //pivot값과 arr[right] 값 swap
 
        myQuickSort(arr, start, right-1);  //앞 부분
        myQuickSort(arr, right+1, end);    //뒷 부분
    }
 
    return;
}

 

 

[출처 및 참고 사이트]

https://gmlwjd9405.github.io/2018/05/06/algorithm-selection-sort.html

https://blockdmask.tistory.com/177

+ Recent posts