소개
이 랩에서는 C++ 에서 배열과 문자열을 조작하는 방법을 배우게 됩니다. 이 랩은 1 차원 배열 생성 및 초기화, 배열 요소 접근 및 수정, 2 차원 배열 구현, C 스타일 문자열 및 String 클래스 사용, 배열 요소 정렬, 선형 검색 수행, 그리고 getline() 을 사용한 문자열 입력 처리 등 다양한 주제를 다룹니다. 이러한 실습을 통해 C++ 프로그래밍에서 기본적인 배열 및 문자열 연산에 대한 강력한 이해를 얻게 될 것입니다.
1 차원 배열 생성 및 초기화
이 단계에서는 C++ 에서 1 차원 배열을 생성하고 초기화하는 방법을 배우게 됩니다. 배열은 동일한 유형의 여러 요소를 연속적인 메모리 위치에 저장할 수 있게 해주는 기본적인 데이터 구조입니다.
WebIDE 를 열고 ~/project 디렉토리에 arrays_intro.cpp라는 새 파일을 생성합니다. 배열을 초기화하는 다양한 방법을 살펴보겠습니다.
touch ~/project/arrays_intro.cpp
arrays_intro.cpp 파일에 다음 코드를 추가합니다.
#include <iostream>
int main() {
// Method 1: Declare and initialize an array with specific size
int numbers[5] = {10, 20, 30, 40, 50};
// Method 2: Let compiler determine array size
int scores[] = {85, 92, 78, 95, 88};
// Method 3: Initialize array with default value zero
int zeros[6] = {0};
// Method 4: Create an array and initialize later
int temperatures[4];
temperatures[0] = 72;
temperatures[1] = 68;
temperatures[2] = 75;
temperatures[3] = 80;
// Print array elements
std::cout << "First method - numbers array:" << std::endl;
for (int i = 0; i < 5; i++) {
std::cout << "Element " << i << ": " << numbers[i] << std::endl;
}
return 0;
}
배열 초기화를 자세히 살펴보겠습니다.
int numbers[5] = {10, 20, 30, 40, 50};: 배열 크기를 명시적으로 정의하고 모든 요소를 초기화합니다.int scores[] = {85, 92, 78, 95, 88};: 컴파일러가 배열 크기를 결정하도록 합니다.int zeros[6] = {0};: 모든 요소를 0 으로 초기화합니다.- 인덱스
temperatures[index] = value를 사용하여 수동으로 값을 할당합니다.
프로그램을 컴파일하고 실행합니다.
g++ arrays_intro.cpp -o arrays_intro
./arrays_intro
예시 출력:
First method - numbers array:
Element 0: 10
Element 1: 20
Element 2: 30
Element 3: 40
Element 4: 50
배열에 대한 주요 사항:
- 배열은 선언되면 고정된 크기를 갖습니다.
- 배열 인덱싱은 0 부터 시작합니다.
- 여러 가지 방법으로 배열을 초기화할 수 있습니다.
- 항상 배열 범위를 초과하지 않도록 합니다.
인덱스를 사용하여 배열 요소에 접근 및 수정
이 단계에서는 C++ 에서 인덱스를 사용하여 배열 요소에 접근하고 수정하는 방법을 배우게 됩니다. 이전 단계의 배열 초기화를 기반으로 개별 배열 요소와 상호 작용하는 방법을 살펴보겠습니다.
WebIDE 를 열고 ~/project 디렉토리에 array_indexing.cpp라는 새 파일을 생성합니다.
touch ~/project/array_indexing.cpp
array_indexing.cpp 파일에 다음 코드를 추가합니다.
#include <iostream>
int main() {
// Create an array of student scores
int scores[5] = {85, 92, 78, 95, 88};
// Accessing array elements by index
std::cout << "First student's score: " << scores[0] << std::endl;
std::cout << "Third student's score: " << scores[2] << std::endl;
// Modifying array elements
std::cout << "Original second student's score: " << scores[1] << std::endl;
scores[1] = 96; // Update the second student's score
std::cout << "Updated second student's score: " << scores[1] << std::endl;
// Calculating array element sum
int total_score = 0;
for (int i = 0; i < 5; i++) {
total_score += scores[i];
}
std::cout << "Total class score: " << total_score << std::endl;
// Average score calculation
double average_score = static_cast<double>(total_score) / 5;
std::cout << "Average class score: " << average_score << std::endl;
return 0;
}
배열 인덱싱에 대한 주요 사항:
- 배열 인덱스는 0 부터 시작합니다.
- 대괄호
[]를 사용하여 요소에 접근합니다. - 인덱스를 사용하여 요소를 읽고 수정할 수 있습니다.
- 배열 범위를 벗어난 인덱스에 접근하지 않도록 주의하십시오.
프로그램을 컴파일하고 실행합니다.
g++ array_indexing.cpp -o array_indexing
./array_indexing
예시 출력:
First student's score: 85
Third student's score: 78
Original second student's score: 92
Updated second student's score: 96
Total class score: 442
Average class score: 88.4
중요한 인덱싱 규칙:
- 첫 번째 요소는 인덱스 0 에 있습니다.
- 마지막 요소는 인덱스 (배열 크기 - 1) 에 있습니다.
- 배열 범위를 벗어난 인덱스에 접근하면 정의되지 않은 동작이 발생합니다.
행렬 구현을 위한 2 차원 배열 사용
이 단계에서는 C++ 에서 2 차원 배열을 생성하고 사용하는 방법을 배우게 됩니다. 2 차원 배열은 행과 열이 있는 테이블 또는 행렬과 같아서 그리드와 같은 구조로 데이터를 저장하고 조작할 수 있습니다.
WebIDE 를 열고 ~/project 디렉토리에 matrix_arrays.cpp라는 새 파일을 생성합니다.
touch ~/project/matrix_arrays.cpp
matrix_arrays.cpp 파일에 다음 코드를 추가합니다.
#include <iostream>
int main() {
// Method 1: Declare and initialize a 3x3 matrix
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// Method 2: Declare matrix and initialize later
int grades[2][4];
grades[0][0] = 85;
grades[0][1] = 92;
grades[0][2] = 78;
grades[0][3] = 95;
grades[1][0] = 88;
grades[1][1] = 90;
grades[1][2] = 82;
grades[1][3] = 87;
// Print the first matrix
std::cout << "First Matrix:" << std::endl;
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
std::cout << matrix[row][col] << " ";
}
std::cout << std::endl;
}
// Print the grades matrix
std::cout << "\nGrades Matrix:" << std::endl;
for (int row = 0; row < 2; row++) {
for (int col = 0; col < 4; col++) {
std::cout << grades[row][col] << " ";
}
std::cout << std::endl;
}
return 0;
}
2 차원 배열에 대한 주요 사항:
array[row][column]과 같이 두 개의 인덱스를 사용하여 요소에 접근합니다.- 첫 번째 인덱스는 행을 나타내고, 두 번째 인덱스는 열을 나타냅니다.
- 여러 가지 방법으로 초기화할 수 있습니다.
- 중첩 루프는 일반적으로 행과 열을 반복하는 데 사용됩니다.
프로그램을 컴파일하고 실행합니다.
g++ matrix_arrays.cpp -o matrix_arrays
./matrix_arrays
예시 출력:
First Matrix:
1 2 3
4 5 6
7 8 9
Grades Matrix:
85 92 78 95
88 90 82 87
중요한 2 차원 배열 개념:
- 배열은 2 차원 이상을 가질 수 있습니다.
- 각 행은 서로 다른 수의 열을 가질 수 있습니다.
- 오류를 방지하기 위해 항상 배열 범위를 주의하십시오.
C 스타일 문자열을 널 종료자로 초기화
이 단계에서는 C++ 에서 C 스타일 문자열과 널 종료 문자의 중요성에 대해 배우게 됩니다. C 스타일 문자열은 문자 배열이며, 문자열의 끝을 표시하기 위해 특수 문자 '\0'로 끝납니다.
WebIDE 를 열고 ~/project 디렉토리에 c_style_strings.cpp라는 새 파일을 생성합니다.
touch ~/project/c_style_strings.cpp
c_style_strings.cpp 파일에 다음 코드를 추가합니다.
#include <iostream>
#include <cstring>
int main() {
// Method 1: Initialize string with explicit null terminator
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
std::cout << "Greeting: " << greeting << std::endl;
// Method 2: Initialize as a string literal (automatically adds null terminator)
char name[] = "John Doe";
std::cout << "Name: " << name << std::endl;
// Method 3: Declare with fixed size and initialize
char message[20] = "Welcome to C++!";
std::cout << "Message: " << message << std::endl;
// Demonstrate string length
std::cout << "Length of name: " << strlen(name) << std::endl;
// Manual string length calculation
int length = 0;
while (name[length] != '\0') {
length++;
}
std::cout << "Manual length of name: " << length << std::endl;
return 0;
}
C 스타일 문자열에 대한 주요 사항:
- 널 종료 문자
'\0'는 문자열의 끝을 표시합니다. - 항상 널 종료 문자를 위해 한 문자를 더 할당합니다.
- 문자열 리터럴은 자동으로 널 종료 문자를 추가합니다.
strlen()함수는 널 종료 문자 앞의 문자를 계산합니다.
프로그램을 컴파일하고 실행합니다.
g++ c_style_strings.cpp -o c_style_strings
./c_style_strings
예시 출력:
Greeting: Hello
Name: John Doe
Message: Welcome to C++!
Length of name: 8
Manual length of name: 8
중요한 문자열 초기화 개념:
- 널 종료 문자는 문자열 연산에 필수적입니다.
- 항상 널 종료 문자를 위한 충분한 공간을 확보하십시오.
- 오버플로를 방지하기 위해 문자열 버퍼 크기에 주의하십시오.
String 클래스 메서드 사용 (length, substr, find)
이 단계에서는 문자열 조작을 더 쉽고 직관적으로 만들어주는 C++ 의 강력한 string 클래스 메서드에 대해 배우게 됩니다. length(), substr(), find()와 같은 주요 메서드를 살펴보겠습니다.
WebIDE 를 열고 ~/project 디렉토리에 string_methods.cpp라는 새 파일을 생성합니다.
touch ~/project/string_methods.cpp
string_methods.cpp 파일에 다음 코드를 추가합니다.
#include <iostream>
#include <string>
int main() {
// Create a string
std::string message = "Hello, C++ Programming!";
// Using length() method
std::cout << "String length: " << message.length() << std::endl;
// Using substr() method
std::cout << "First 5 characters: " << message.substr(0, 5) << std::endl;
std::cout << "Substring from index 7: " << message.substr(7) << std::endl;
// Using find() method
std::string search_word = "Programming";
size_t position = message.find(search_word);
if (position != std::string::npos) {
std::cout << "'" << search_word << "' found at index: " << position << std::endl;
} else {
std::cout << "Word not found" << std::endl;
}
// Additional find() example
std::string email = "user@example.com";
size_t at_symbol = email.find('@');
size_t dot_symbol = email.find('.');
std::cout << "Username: " << email.substr(0, at_symbol) << std::endl;
std::cout << "Domain: " << email.substr(at_symbol + 1, dot_symbol - at_symbol - 1) << std::endl;
return 0;
}
string 클래스 메서드에 대한 주요 사항:
length(): 문자열의 문자 수를 반환합니다.substr(): 문자열의 일부를 추출합니다.- 첫 번째 인수는 시작 인덱스입니다.
- 두 번째 인수는 (선택 사항) 부분 문자열의 길이입니다.
find(): 부분 문자열 또는 문자를 검색합니다.- 첫 번째 발생 인덱스를 반환합니다.
- 찾을 수 없으면
std::string::npos를 반환합니다.
프로그램을 컴파일하고 실행합니다.
g++ string_methods.cpp -o string_methods
./string_methods
예시 출력:
String length: 23
First 5 characters: Hello
Substring from index 7: C++ Programming!
'Programming' found at index: 11
Username: user
Domain: example
중요한 string 메서드 개념:
- String 메서드는 강력한 텍스트 조작 기능을 제공합니다.
- 인덱싱은 0 부터 시작합니다.
- 잠재적인 오류를 처리하기 위해 항상 반환 값을 확인하십시오.
C 스타일 문자열과 String 클래스 간 변환
이 단계에서는 C 스타일 문자열과 C++ string 클래스 간의 변환 방법을 배우게 됩니다. 이러한 변환은 C++ 에서 서로 다른 문자열 표현을 사용할 때 필수적입니다.
WebIDE 를 열고 ~/project 디렉토리에 string_conversion.cpp라는 새 파일을 생성합니다.
touch ~/project/string_conversion.cpp
string_conversion.cpp 파일에 다음 코드를 추가합니다.
#include <iostream>
#include <string>
#include <cstring>
int main() {
// C-style string to C++ string
const char* c_style_str = "Hello, C++ World!";
std::string cpp_string(c_style_str);
std::cout << "C++ String: " << cpp_string << std::endl;
// C++ string to C-style string
std::string message = "Converting strings";
const char* c_str = message.c_str();
std::cout << "C-style String: " << c_str << std::endl;
// Manual conversion using strcpy
char buffer[50];
strcpy(buffer, message.c_str());
std::cout << "Copied to buffer: " << buffer << std::endl;
// String length comparison
std::cout << "C++ string length: " << message.length() << std::endl;
std::cout << "C-style string length: " << strlen(c_str) << std::endl;
return 0;
}
주요 변환 메서드:
std::string(c_style_str): C 스타일 문자열을 C++ string 으로 변환.c_str(): C++ string 을 C 스타일 문자열로 변환strcpy(): 문자열을 문자 배열로 수동 복사
프로그램을 컴파일하고 실행합니다.
g++ string_conversion.cpp -o string_conversion
./string_conversion
예시 출력:
C++ String: Hello, C++ World!
C-style String: Converting strings
Copied to buffer: Converting strings
C++ string length: 18
C-style string length: 18
중요한 변환 개념:
- C++ string 에서
const char*를 얻으려면.c_str()을 사용하십시오. - 변환 시 버퍼 크기에 주의하십시오.
strlen()은 C 스타일 문자열과 함께 작동합니다..length()는 C++ string 과 함께 작동합니다.
버블 정렬을 사용하여 배열 요소 정렬
이 단계에서는 C++ 에서 버블 정렬 (Bubble Sort) 알고리즘을 구현하여 배열 요소를 정렬하는 방법을 배우게 됩니다. 버블 정렬은 목록을 반복적으로 통과하면서 인접한 요소를 비교하고, 순서가 잘못된 경우 교환하는 간단한 정렬 방법입니다.
WebIDE 를 열고 ~/project 디렉토리에 bubble_sort.cpp라는 새 파일을 생성합니다.
touch ~/project/bubble_sort.cpp
bubble_sort.cpp 파일에 다음 코드를 추가합니다.
#include <iostream>
int main() {
// Initialize an unsorted array
int numbers[5] = {64, 34, 25, 12, 22};
int size = 5;
// Print original array
std::cout << "Original Array: ";
for (int i = 0; i < size; i++) {
std::cout << numbers[i] << " ";
}
std::cout << std::endl;
// Bubble Sort implementation
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
// Compare adjacent elements
if (numbers[j] > numbers[j + 1]) {
// Swap elements
int temp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = temp;
}
}
}
// Print sorted array
std::cout << "Sorted Array: ";
for (int i = 0; i < size; i++) {
std::cout << numbers[i] << " ";
}
std::cout << std::endl;
return 0;
}
주요 버블 정렬 개념:
- 인접한 요소를 비교합니다.
- 순서가 잘못된 경우 요소를 교환합니다.
- 정렬될 때까지 배열을 반복적으로 통과합니다.
- 시간 복잡도 (Time complexity): O(n²)
프로그램을 컴파일하고 실행합니다.
g++ bubble_sort.cpp -o bubble_sort
./bubble_sort
예시 출력:
Original Array: 64 34 25 12 22
Sorted Array: 12 22 25 34 64
중요한 정렬 참고 사항:
- 버블 정렬은 간단하지만 큰 배열에는 비효율적입니다.
- 교육 목적으로 좋습니다.
- 실제 응용 프로그램에는 더 효율적인 정렬 알고리즘이 존재합니다.
배열에서 선형 검색 구현
이 단계에서는 C++ 에서 선형 검색 (Linear Search) 알고리즘을 구현하는 방법을 배우게 됩니다. 선형 검색은 배열에서 각 요소를 순차적으로 확인하여 대상 (target) 을 찾거나 배열의 끝에 도달할 때까지 요소를 찾는 간단한 방법입니다.
WebIDE 를 열고 ~/project 디렉토리에 linear_search.cpp라는 새 파일을 생성합니다.
touch ~/project/linear_search.cpp
linear_search.cpp 파일에 다음 코드를 추가합니다.
#include <iostream>
int linearSearch(int arr[], int size, int target) {
// Iterate through each element in the array
for (int i = 0; i < size; i++) {
// Check if current element matches the target
if (arr[i] == target) {
return i; // Return the index if found
}
}
return -1; // Return -1 if target is not found
}
int main() {
// Create an array of student scores
int scores[] = {85, 92, 78, 95, 88, 76, 90};
int size = sizeof(scores) / sizeof(scores[0]);
// Target score to search
int targetScore = 78;
// Perform linear search
int result = linearSearch(scores, size, targetScore);
// Display search results
if (result != -1) {
std::cout << "Target score " << targetScore
<< " found at index " << result << std::endl;
} else {
std::cout << "Target score " << targetScore
<< " not found in the array" << std::endl;
}
// Try another search
int missingScore = 100;
result = linearSearch(scores, size, missingScore);
if (result != -1) {
std::cout << "Score " << missingScore
<< " found at index " << result << std::endl;
} else {
std::cout << "Score " << missingScore
<< " not found in the array" << std::endl;
}
return 0;
}
주요 선형 검색 개념:
- 각 배열 요소를 순차적으로 확인합니다.
- 대상을 찾으면 대상의 인덱스를 반환합니다.
- 대상이 배열에 없으면 -1 을 반환합니다.
- 시간 복잡도 (Time complexity): O(n) - 선형 시간
- 간단하며 정렬되지 않은 배열에도 작동합니다.
프로그램을 컴파일하고 실행합니다.
g++ linear_search.cpp -o linear_search
./linear_search
예시 출력:
Target score 78 found at index 2
Score 100 not found in the array
중요한 검색 참고 사항:
- 선형 검색은 간단하지만 큰 배열에는 비효율적입니다.
- 작은 배열 또는 정렬되지 않은 컬렉션에 적합합니다.
- 정렬된 배열에는 더 효율적인 검색 알고리즘이 존재합니다.
getline() 함수를 사용하여 문자열 입력 처리
이 단계에서는 C++ 에서 getline()을 사용하여 텍스트 입력의 전체 줄을 읽는 방법을 배우게 됩니다. cin >>와 달리 getline()은 공백이 있는 문자열을 읽고 더 복잡한 입력 시나리오를 처리할 수 있습니다.
WebIDE 를 열고 ~/project 디렉토리에 getline_input.cpp라는 새 파일을 생성합니다.
touch ~/project/getline_input.cpp
getline_input.cpp 파일에 다음 코드를 추가합니다.
#include <iostream>
#include <string>
int main() {
// Declare a string to store input
std::string fullName;
std::string address;
// Prompt for full name input
std::cout << "Enter your full name: ";
std::getline(std::cin, fullName);
// Prompt for address input
std::cout << "Enter your full address: ";
std::getline(std::cin, address);
// Display input with additional information
std::cout << "\n--- User Information ---" << std::endl;
std::cout << "Name: " << fullName << std::endl;
std::cout << "Address: " << address << std::endl;
// Demonstrate reading multiple lines
std::string multiLineText;
std::cout << "\nEnter a multi-line description (press Ctrl+D to finish):" << std::endl;
std::string line;
while (std::getline(std::cin, line)) {
multiLineText += line + "\n";
}
std::cout << "\nYour description:" << std::endl;
std::cout << multiLineText;
return 0;
}
주요 getline() 개념:
- 공백을 포함하여 텍스트의 전체 줄을 읽습니다.
- 구문:
std::getline(input_stream, string_variable) - 여러 줄의 입력을 읽을 수 있습니다.
- 공백이 있는 복잡한 입력을 처리합니다.
- 전체 이름, 주소 등을 읽는 데 유용합니다.
프로그램을 컴파일합니다.
g++ getline_input.cpp -o getline_input
./getline_input
예시 상호 작용:
Enter your full name: John Michael Smith
Enter your full address: 123 Main Street, Anytown, USA
--- User Information ---
Name: John Michael Smith
Address: 123 Main Street, Anytown, USA
Enter a multi-line description (press Ctrl+D to finish):
This is a sample
multi-line description
with several lines of text.
Your description:
This is a sample
multi-line description
with several lines of text.
중요한 입력 처리 참고 사항:
getline()은 개행 문자까지 읽습니다.- 전체 텍스트 입력을 캡처하는 데 유용합니다.
- 다른 입력 방법과 결합할 수 있습니다.
요약
이 랩에서는 C++ 에서 1 차원 배열을 생성하고 초기화하는 방법, 인덱스를 사용하여 배열 요소에 접근하고 수정하는 방법, 행렬을 위한 2 차원 배열을 구현하는 방법, 널 종결자 (null terminator) 로 C 스타일 문자열을 초기화하는 방법, string 클래스 메서드를 사용하는 방법, C 스타일 문자열과 string 클래스 간에 변환하는 방법, 버블 정렬 (bubble sort) 을 사용하여 배열 요소를 정렬하는 방법, 배열에서 선형 검색 (linear search) 을 구현하는 방법, 그리고 getline() 을 사용하여 문자열 입력을 처리하는 방법을 배우게 됩니다.
배열 크기를 지정하고 모든 요소를 초기화하는 방법, 컴파일러가 크기를 결정하도록 하는 방법, 모든 요소를 0 으로 초기화하는 방법, 인덱스를 사용하여 값을 수동으로 할당하는 방법을 포함하여 다양한 방식으로 배열을 초기화하는 방법을 탐구할 것입니다. 또한 인덱스를 사용하여 배열 요소에 접근하고 수정하는 방법과 오류를 방지하기 위해 배열 범위를 처리하는 방법을 배우게 됩니다. 또한 2 차원 배열, C 스타일 문자열 및 string 클래스를 사용하여 이들 간에 변환하고 다양한 작업을 수행하는 방법을 배우게 됩니다.



