본문 바로가기

강의자료/C/C++

021. 배열을 인자로 받는 함수, 연습문제

◈ 이 글은 강의를 위하여 제가 직접 작성한 내용입니다. 따라서 퍼가실 경우, 출처를 명확히 해주시기 바랍니다!!
◈ This ariticle was written by me for teaching. So if you want to copy this article, please clarify the source!!


# 배열을 인자로 사용하는 함수의 특성에 대해서 알아보자.
1. 배열의 값을 모두 넘기는 것은 불가능하다. -> 값은 하나만 주고받을 수 있다.
2. 때문에 배열을 함수에 넘길때는 값대신에 주소를 넘긴다.
3. 배열은 언제나 배열의 크기와 같이 넘겨야 한다.
4. 문자열은 널문자로 끝을 구분하므로 배열의 크기는 몰라도 상관없다.
// 배열을 인자로 사용하는 함수의 특성에 대해서 설명한다.
// 1. 배열의 값을 모두 넘기는 것은 불가능하다. -> 값은 하나만 주고받을 수 있다.
// 2. 때문에 배열을 함수에 넘길때는 값대신에 주소를 넘긴다.
// 3. 배열은 언제나 배열의 크기와 같이 넘겨야 한다.
// 4. 문자열은 널문자로 끝을 구분하므로 배열의 크기는 몰라도 상관없다.

#include 
#include 
using namespace std;

int Max(int ary[],int counts )
{
	int max=ary[0]; // *(ary+0)
	for(int i=1; i < counts; i++)
	{
		if(ary[i] > max) max=ary[i];
	}
	return max;
}

int Min(int ary[],int counts )
{
	int min=ary[0]; 
	for(int i=1; i < counts; i++)
	{
		if(ary[i] < min) min=ary[i];
	}
	return min;
}

void main()
{
	int randnum[10];
	int counts=sizeof(randnum)/sizeof(int);

	srand((unsigned)time(0));
	for(int i=0;i < counts;i++)
	{
		randnum[i] = rand() % 100 + 1;
		cout << randnum[i] << "  ";
	}
	cout << endl;

	cout << "최대값 : " << Max(randnum, counts) << endl;
	cout << "최소값 : " << Min(randnum, counts) << endl;
}

5. 일반변수는 함수에 값을 넘기므로 함수에서 값을 바꿔도 원본에는 영향을 주지 않는다.
6. 배열은 함수에 주소를 넘기므로 함수에서 값을 바꾸면 원본까지 같이 바뀐다.
// 일반변수는 함수에 값을 넘기므로 함수에서 값을 바꿔도 원본에는 영향을 주지 않는다.
// 배열은 함수에 주소를 넘기므로 함수에서 값을 바꾸면 원본까지 같이 바뀐다.

#include 
using namespace std;

void ChangeValue( int v );
void ChangeArray( int num[], int counts );

void main()
{
	int v = 1;
	ChangeValue(v);
	cout << "v의 값은 : " << v << endl;

	int num[] = {1,2,3,4,5,6,7,8,9};
	int counts = sizeof(num)/sizeof(int);
	ChangeArray(num, counts);
	for(int i=0; i < counts; i++)
	{
		cout << "num[" << i << "] = " << num[i] << endl;
	}
	
}

void ChangeValue( int v )
{
	v = 101;
}

void ChangeArray( int num[], int counts )
{
	for(int i=0; i < counts; i++)
	{
		num[i] += 100;
	}
}
# 연습문제 : 배열을 인자로 받아 스왑하는 함수를 만들어보자.
#include 
using namespace std;

void ShowArray(int ary[], int counts)
{
	for(int i=0; i < counts; i++)
	{
		cout << "Array[" << i << "] = " << ary[i] << endl;
	}
}

void ReverseArray( int ary[], int counts )
{
	int last = counts-1;
	for(int i=0; i < counts/2; i++)
	{
		int temp = ary[i];       
		ary[i] = ary[last-i];
		ary[counts-1-i] = temp;
	}
}

void main()
{
	int num[] = {1,2,3,4,5,6,7,8,9};
	int counts = sizeof(num)/sizeof(int);

	ShowArray(num, counts);

	// 배열을 역순으로 재정렬한다.
	ReverseArray(num, counts);
	cout << "------------" << endl;

	ShowArray(num, counts);
}

/* 
>>실행결과
Array[0] = 1
Array[1] = 2
Array[2] = 3
Array[3] = 4
Array[4] = 5
Array[5] = 6
Array[6] = 7
Array[7] = 8
Array[8] = 9
------------
Array[0] = 9
Array[1] = 8
Array[2] = 7
Array[3] = 6
Array[4] = 5
Array[5] = 4
Array[6] = 3
Array[7] = 2
Array[8] = 1
*/
# 종합 연습문제
// 1. randnum에 1~100사이의 값을 랜덤하게 입력한 후 10개씩 화면에 출력하시오.
// 2. 배열을 입력받아 '최대값', '최소값', '짝수의합', '홀수의합', '총합', '평균'을 구하는 함수들을 만드시오.
// 3. randnum배열을 위에서 만든 함수에 대입한 후 그 결과값을 출력하시오.
// 4. 배열을 입력받아 소수를 (10개씩) 출력하는 함수를 만들고 randnum배열을 대입하시오.


#include 
#include 
using namespace std;

int Max(int ary[],int counts )
{
	int max = ary[0]; 
	for(int i=1;i < counts;i++)
	{
		if(ary[i] > max) 
			max=ary[i];          
	}
	return max;     
}
int Min(int ary[],int counts )
{
	int min = ary[0]; 
	for(int i=1;i < counts;i++)
	{
		if(ary[i] < min) 
			min=ary[i];          
	}
	return min;     
}
int ArraySumEven( int num[], int counts )
{
	int sum = 0;
	for(int i=0; i < counts; i++)
	{
		if(num[i]%2 == 0) sum += num[i];
	}
	return sum;
}
int ArraySumOdd( int num[], int counts )
{
	int sum = 0;
	for(int i=0; i < counts; i++)
	{
		if(num[i]%2 == 1) sum += num[i];
	}
	return sum;
}
int ArraySum( int num[], int counts )
{
	int sum = 0;
	for(int i=0; i < counts; i++)
	{
		sum += num[i];
	}
	return sum;
}
int ArrayAverage( int num[], int counts )
{
	int sum = ArraySum(num, counts);
	int average = sum / counts;

	return average;
}

bool IsPrime( int num )
{
	if( num < 2 ) return false;

	for(int i=2;i < num;i++)
	{
		if(num%i==0) return false;
	}

	return true;
}

void ShowArrayPrime( int num[], int counts )
{
	int cnt = 0;
	for(int i=0;i < counts;i++)
	{
		if(IsPrime(num[i]))
		{
			cout.width(3);
			cout << num[i] << "  ";
			cnt++;
			if(cnt!=0 && cnt%10==0) cout << endl;
		}
	}
	cout << endl;
}


void main()
{
	int randnum[100];
	int counts=sizeof(randnum)/sizeof(randnum[0]);

	// 배열에 1~100사이의 수를 랜덤하게 삽입.
	// 화면에 배열의 값을 모두 출력.

	srand((unsigned)time(NULL));
	for(int i=0;i < counts;i++)
	{
		if(i!=0 && i%10==0) cout << endl;
		randnum[i] = rand() % 100 + 1;
		cout.width(3);
		cout << randnum[i] << "  ";
	}
	cout << endl << endl;

	cout << "배열의 최대값은 " << Max(randnum, counts) << endl;
	cout << "배열의 최소값은 " << Min(randnum, counts) << endl;
	cout << "배열의 짝수의 합은 " << ArraySumEven(randnum, counts) << endl;
	cout << "배열의 홀수의 합은 " << ArraySumOdd(randnum, counts) << endl;
	cout << "배열의 총합은 " << ArraySum(randnum, counts) << endl;
	cout << "배열의 평균은 " << ArrayAverage(randnum, counts) << endl;

	cout << endl << "[ 배열중 소수만 출력 ]" << endl;
	ShowArrayPrime(randnum, counts);
	cout << endl;
}