프로그램을 작성하다 보면 두 변수의 값을 바꾸어야 할 일이 많으므로, 

이 일을 해주는 함수를 따로 만들어 두면 편하다.

 

1. 포인터를 이용하여 값을 바꾸는 함수

[ 코드 ]

#include <stdio.h>
#include <iostream>

using namespace std;

void wrong_swap(int a, int b){
	int temp;

	temp = a;
	a = b;
	b = temp;
}

int main(){
	int x = 1, y = 2;
	wrong_swap(x,y);
	cout << "X 값 : " << x << " Y 값 : " << y << endl;
	return 0;
}

[ 결과 ]

tot4766@tot4766:~/main/코딩/c++/알고리즘$ ./a.out
X 값 : 1 Y 값 : 2

>> 이 경우에는 함수의 호출로 단순히 변수값들만 호출이 되어진다.
>> X와 Y 값들 자체가 바뀌는 것이 아니다.
>> 즉, 포인터 형태로 인자를 받아야 한다.

 

[ 코드 ]

#include <stdio.h>
#include <iostream>

using namespace std;

void wrong_swap(int* a, int* b){
	int temp;

	temp =*a;
	*a = *b;
	*b = temp;
}

int main(){
	int x = 1, y = 2;
	wrong_swap(&x,&y);
	cout << "X 값 : " << x << " Y 값 : " << y << endl;
	return 0;
}

[ 결과 ]

tot4766@tot4766:~/main/코딩/c++/알고리즘$ ./a.out
X 값 : 2 Y 값 : 1

 

2. 배열의 두 원소 바꾸기

배열의 i번째 원소와 j번째 원소를 바꾸는 함수를 만들어 보자.

 

[ 코드 ]

#include <iostream>

using namespace std;

void swap_arr(int arr[], int i, int j){
	int temp;

	temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}

int main(void){
	int arr[] = {1,5,6,78,8,6};
	int i = 1, j = 2;
	cout << i << "와 " << j <<"번째 원소를 바꾼다.";
	cout << "변경 전" << arr[i] << "와" << arr[j] << endl;
	swap_arr(arr,i,j);
	cout << "변경 후" << arr[i] << "와" << arr[j] << endl;

	return 0;
}

[ 결과 ]

tot4766@tot4766:~/main/코딩/c++/알고리즘$ ./a.out
1와 2번째 원소를 바꾼다.변경 전5와6
변경 후6와5

>> 배열의 원소들의 경우에는 각각의 변수를 호출하기 보다는 변수들의 메모리 주소를 호출하여
>> 변수를 받기 때문에, 포인터를 따로 사용하지 않아도 된다.

'CS > 알고리즘' 카테고리의 다른 글

[자료구조] 원형 큐  (0) 2024.11.04
[알고리즘] 0.5 연결리스트  (0) 2022.04.16
[알고리즘] 0.4 은행 대기번호 관리  (0) 2022.04.16
[알고리즘] 0.3 배열 회전  (0) 2022.04.16
[알고리즘] 0.1 최대와 최소  (0) 2022.04.16

두 개의 정수(int 형)를 인자로 받아서 둘 중 큰 값을 반환하는 함수 max()와
둘 중 작은 값을 반환하는 함수 min()을 작성해보자

 

1. 최대 값과 최소 값을 구하는 함수

[ 코드 ]

#include <iostream>

using namespace std;

int max(int x, int y){
	if (x>y){
    	return x;
        }
    return y;
}

int min(int x, inty){
	if (x<y){
    	return x;
	}
    return y;
}

int main(void){
	cout << max(5,10) << endl;
    cout << min(5,10) << endl;
}

 

[ 결과 ]

tot4766@tot4766:~/main/코딩/c++/알고리즘$ ./a.out
10
5

 

2. 배열의 최대 값을 구하는 함수

[ 코드 ]

#include <iostream>

using namespace std;

int max_arr(int* arr, int len){
	// int* arr 혹은 int arr[]의 경우에는
    // 배열 메모리의 주소만을 담고 있는 포인터이다.
    
    // 배열의 실제 크기를 알 수 없으므로 다른 매개변수를 통해서 
    // 배열의 크기를 받아야 한다.
    
    int max, i;
    max = arr[0];
    for (i = 0; i < len; i++){
    	if( arr[i] >= max ){
        	max = arr[i];
            }
        }
        
    return max;
}

int main(void){
	int arr[] = {1,4,5,8,9};
    int len = sizeof(arr) / sizeof(*arr);
    cout << max_arr(arr,len) << endl;
 	
    return 0;
}

 

[ 결과 창 ]

tot4766@tot4766:~/main/코딩/c++/알고리즘$ ./a.out
9

 

3.  매크로로 구현해보기

[ 코드 ]

#include <iostream>
#define max(x,y) ((x)>(y) ? (x) : (y))
#define min(x,y) ((x)<(y) ? (x) : (y))

using namespace std;

int main(void){
	cout << "5와 10사이의 최대 최소 비교" << endl;
	cout << "max값 :" << max(5,10) << endl;
	cout << "min값 :" <<min(5,10) << endl;

	int i,j;
	i = 4;
	j = max(3,i++);
	// 매크로의 경우에는 변수를 여러번 호출하기에 오류가 발생할 수 있다.
	// 일반적으로는 i=4, j=5 이겠지만,
	// 매크로의 함수의 경우에는 
	// j = ((3)>(i++) ? (3) : (i++));와 같이 설정이 되어진다.
	// 결국에는 i=6, j=5 으로 나오게 된다.
	cout << "i값 : " << i << endl;
	cout << "j값 : " << j << endl;

	int a, b;
	a = 3;
	b = a++;
	// 전위 증가 >> 변수 호출 후의 계산 진행
	// b = a한 후에 a +=1 을 진행
	return 0;
}

[ 결과 창 ]

tot4766@tot4766:~/main/코딩/c++/알고리즘$ ./a.out
5와 10사이의 최대 최소 비교
max값 :10
min값 :5
i값 : 6
j값 : 5

+ Recent posts