CS/자료구조

Programming Exercise: Lab #1

arsenic-dev 2025. 3. 25. 13:26

경희대학교 박제만 교수님의 자료구조 수업을 기반으로 정리한 글입니다.

Encoding errors

▶ 운영체제별로 줄 바꿈 문자를 채택한 게 다르다.

  • CR (Carriage Return, \r): 커서가 해당 라인의 젤 앞쪽으로 이동 e.g., Mac OS (클래식 버전)
  • LF (Line Feed, \n): 커서는 그대로 있으면서 줄만 바꿈 e.g., Unix, Linux, Mac OS (현대 버전)
  • CRLF (CR + LF, ENTER): 줄도 바꾸면서 커서도 제일 앞쪽으로 이동 e.g, Windows

간혹 협업을 하다 보면 어떤 사람이 Mac OS에서 작업한 코드를 Windows에서 받아 실행 시키려고 하면 에러가 나는 경우가 있다.

따라서, Mac에서 작성된 파일을 Windows에서 사용할 경우, “LF” or “CR” to “CRLF” 변환이 필요할 수 있다.

How to build a specific file

main()은 프로그램이 시작할 때 제일 먼저 시작되어야 하는 함수이다.

만약 main()이 여러 개면 어떤 main()을 먼저 실행시켜야 될지 모르게 되기에 컴파일 에러가 발생한다.

 

때문에 빌드를 할 때 main()이 여러 개면 그룹별로 각각 빌드하여

아래와 같은 방식으로 특정한 파일들만 컴파일하고 나머지는 제외시키는 방식이 필요하다.

▶ Visual Studio - Windows

 

 
 

컴파일 vs 빌드

▶ 인간이 고급 언어를 이용하여 만든 프로그램을 컴퓨터가 이해할 수 있도록 변환하는 과정

  • 컴파일: 사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꿔주는 과정 중 하나
  • 빌드: 위 이미지처럼 변환하는 전체 과정

실제 코딩을 하고 완성되면 run을 실행하여 빌드된 프로그램을 실행하여 결과를 화면에서 볼 수 있는데,

이때 모든 빌드 과정이 자동으로 실행되어 우리는 컴파일, 빌드라는 개념을 크게 생각하지 않는다.

 

Frequently Asked Errors

Visual Studio - "PDB API...."

디버깅할 때 프로그램의 심볼 정보(PDB 파일)를 찾을 수 없어서 발생하는 오류이다.

 

오류 발생 이유

  • PDB(Program Databse) 파일이 없거나 손상됨
  • 심볼 서버가 설정되지 않음
  • 빌드 후 디버깅 정보가 제대로 로드되지 않음

오류 해결 방법

1. 온라인에서 심볼 정보 다운로드

  • 상단 메뉴 바에서 [디버그] - [옵션]
  • 아래의 그림과 같은 창에서 [디버깅] - [기호] 탭
  • 기호 파일 위치에서 "Microsoft 기호 서버" 선택 후 확인

▶ 디버깅 옵션에서 Microsoft 기호 서버 설정

 

2. 기존 빌드 캐시 삭제 후 새로 컴파일하여 PDB 파일 생성

  • if the error continues...
  • [빌드] - [솔루션 정리]

Visual Studio - "v143용 빌드 도구를 찾을 수 없습니다...."

프로젝트가 v143(Visual Studio 2022 기본 빌드 도구)로 설정되어 있지만, 해당 빌드 도구가 설치되지 않아서 발생하는 오류이다.

 

오류 발생 이유

  • 다른 버전의 Visual Studio에서 프로젝트를 열었음
  • v143 빌드 도구가 설치되지 않았음

오류 해결 방법

  • 상단 메뉴 바에서 [프로젝트] - [속성]
  • [일반] - [플랫폼 도구 집합] 에서 자신의 visual studio 버전에 맞게 선택

▶ 현재 설치된 Visual Studio에 맞는 플래폼 도구 집합 버전 선택

Exercise #1

Problems

  • Implement the function AddFunction(a, b).
  • It simply returns the sum of two input parameters (a+b).
int add(int a, int b) {
    int ret = 0;
    ret = a + b;
    
	return ret;
}

▶ add()

 

※ 디버깅 기능은 오류를 감지하는 게 아니라, 오류 원인을 분석하는 도구로 "디버깅 시작 (F5)"는 어디서 오류가 발생했는지 보여주고 "디버그 없이 실행 (Ctrl + F5)"은 디버깅 없이 빠르게 실행하는 방식이다.

Exercise #2

Problems

  • Implement member functions for ADT SquareMatrix.
  • A square matrix(정방행렬) can be represented by a two-dimensional array with N rows and N columns.
  • It simply returns the sum of two input parameters (a+b).

▶ member functions 

int SquareMatrix::multiplyDiagonal()
{   
    if (MATRIX_SIZE == 0) return -1;

    int ret = 1;

    for (int i = 0; i < MATRIX_SIZE; i++) {
        ret *= matrix[i][i];
    }
    
    return ret;
}

▶ multiplyDiagonal()

 

※ ret: return

int SquareMatrix::borderSum()
{   
    if (MATRIX_SIZE == 0) return -1;
    
    int ret = 0;
    
    for (int i = 0; i < MATRIX_SIZE; i++) {
        ret += matrix[0][i];
        ret += matrix[MATRIX_SIZE-1][i];
        ret += matrix[i][0];
        ret += matrix[i][MATRIX_SIZE-1];
    }

    ret -= matrix[0][0];
    ret -= matrix[0][MATRIX_SIZE-1];
    ret -= matrix[MATRIX_SIZE-1][0];
    ret -= matrix[MATRIX_SIZE-1][MATRIX_SIZE-1];
    
    return ret;
}

▶ borderSum() - v1

int SquareMatrix::borderSum()
{
    if (MATRIX_SIZE == 0) return -1;
    
    int ret = 0;
    
    for (int i = 0; i < MATRIX_SIZE; i++) {
        ret += matrix[0][i];
        ret += matrix[MATRIX_SIZE-1][i];
    }
    
    for (int i = 1; i < MATRIX_SIZE - 1; i++) {
        ret += matrix[i][0];
        ret += matrix[i][MATRIX_SIZE - 1];
    }
    
    return ret;
}

▶ borderSum() - v2 (improved)

void SquareMatrix::makeEmpty()
{   
    for (int i = 0; i < MATRIX_SIZE; i++) {
        for (int j = 0; j < MATRIX_SIZE; j++) {
            matrix[i][j] = 0;
        }
    }
}

▶ makeEmpty() - v1

void SquareMatrix::makeEmpty()
{
    memset(matrix, 0, sizeof(matrix));
}

▶ makeEmpty() - v2

Exercise #3

Problems

  • Implement swapItems() and removeLargestItem().

 

▶ removeLargestItem() removes and returns the largest item in the list

▶ swapItems(int firstItem, int SecondItem) swaps data[firstItem] and data[secondItem]

void UnsortedType::swapItems(int firstItemIndex, int secondItemIndex){
    // Time Complexity: O(1)
  
    int temp = data[firstItemIndex];

    data[firstItemIndex] = data[secondItemIndex];
    data[secondItemIndex] = temp;
}

▶ swapItems()

int UnsortedType::removeLargestItem(){
    // Time Complexity: O(N)
    
    int maxItem = data[0];
    int maxItemIndex = 0;

    for (int i = 1; i < length; i++) {
        if (data[i] > maxItem) {
            maxItem = data[i];
            maxItemIndex = i;
        }
    }
    
    data[maxItemIndex] = data[length - 1];
    length--;
    
    return maxItem;
}

▶ removeLargestItem(N)


참고자료

https://brunch.co.kr/@hongjyoun/97

 

CRLF와 LF는 무슨 차이일까?

줄바꿈 형식 통일이 필요해 | 타자기로 글을 쓰던 시절, 줄바꿈을 하는 2가지 방법 옛날에 컴퓨터가 나오기 이전에 타자기로 글을 쓰다가 종이 끝까지 다 썼을 때 줄바꿈을 해야 됐다. 그때 일어

brunch.co.kr

https://shoveling.tistory.com/7

 

[기본개념] 컴파일(Compile) & 빌드(Build)란?

컴파일(Compile)이란? 컴퓨터는 인간의 언어를 이해할 수 없다. 그렇기에 인간은 고급언어로 프로그래밍 후 저급언어로 변환을 해야하는데, 이때 이루어지는 과정을 컴파일이라고 한다. 저급언어

shoveling.tistory.com

'CS > 자료구조' 카테고리의 다른 글

Chapter 4: Queue  (0) 2025.03.31
Chapter 3: Stack  (1) 2025.03.28
Chapter 2: Unsorted/Sorted Lists  (3) 2025.03.23
Chapter 1: Software, Data Structure, and C++  (2) 2025.03.22
Chapter 0: Introduction  (1) 2025.03.21