본문 바로가기
School Study/2021-2

[week 11] C++ 복습_7장 1차원 배열과 문자열 (1)

by 전전긍긍 2021. 12. 6.

20211111_C++_공부기록

 

  • 배열의 선언과 초기화
  • 배열 요소 접근
  • 배열 처리
  • 함수로 배열 전달
  • 배열 인수 보호

  • 배열(Array) : 같은 유형의 값들을 연속된 메모리 공간에 저장하기 위함

 

  • 배열 선언과 초기화

- 배열 선언

elementType arrayName[SIZE]; //요소유형 배열이름[크기]
// 배열을 선언할 때 배열의 크기는
//상수 const
const int SIZE = 10;

//상수가 아닌 변수로 선언한다면
//배열 크기의 변경가능성이 있음
//컴파일러 입장에서는 이미 공간을 마련했는데
//공간 크기를 변경하면 언짢음
//같은 요소 유형의 배열이라면
//한 번에 선언 가능
double list1[10], list2[25];

 

- 배열 초기화

//선언과 동시에 초기화 가능
double myList[4]= {1.9, 2.9, 3.4, 3.5};
double myList[4]; //선언 후
myList[0] = 1.9;  //값 대입으로 초기화
myList[1] = 2.9;
myList[2] = 3.4;
myList[3] = 3.5;

//이런 식의 초기화는 불가능
double myList[4];
myList ={1.9, 2.9, 3.4, 3.5} //집합기호는 동시에 선언할 때만 가능
// 선언과 초기화를 동시에 할 때는 배열크기를 생략해도 된다.
double myList[]= {1.9, 2.9, 3.4, 3.5};

//배열의 일부분만 초기화 하는 것도 가능. 나머지 2개는 0으로 초기화
double myList[4]= {1.9, 2.9};

  • 배열 요소 접근

- 배열 요소는 정수형의 인덱스를 통해 접근

- 배열 인덱스의 범위 : 0 ~ (배열크기 - 1)

- 범위 초과 오류(out-of-bounds) : 배열 크기 넘어가면 발생하는 오류

//인덱스를 사용하여 배열에 접근할 때 배열의 각 요소는 일반 변수와 거의 같다

//myList[0]과 myList[1]의 값을 myList[2]에 저장할 때
myList[2] = myList[0] + myList[1];

//1만큼 증가할 때
myList[0]++;

//큰 수를 반환할 때
cout << max(myList[1], myList[2]) << endl 

//myList[0]에 0, myList[1]에 1..myList[9]에 9를 대입할 때
for (int i = 0; i < 10; i++)
	myList[i] = i;	

//myList 배열의 모든 요소를 출력할 때
for (int i = 0; i < 10; i++)
	cout << myList[i] << endl;

  • 배열처리

사용자에게 10개의 수를 입력 받아 평균보다 큰 요소의 수가 몇 개인지 구하기

#include <iostream>
using namespace std;

int main()
{
	const int SIZE = 10;
	int list[SIZE];
	int total = 0;

	cout << "10개의 수를 입력하시오 : ";
	for (int i = 0; i < SIZE; i++)
	{
		cin >> list[i];
		total += list[i];
	}
	double average = total / SIZE;

	//평균보다 큰 요소의 개수 구하기
	int count = 0;
	for (int i = 0; i < SIZE; i++)
	{
		if (list[i] < average)
			count++;
	}

	cout << "average : " << average << endl;
	cout << "count : " << count << endl;

	return 0;
}

/*
10개의 수를 입력하시오 : 1 2 3 4 5 6 7 8 9 10
average : 5
count : 4
*/

  • 함수로 배열 전달
- 배열도 함수에 인수로 전달할 수 있다. 인수로 전달된 배열은 배열의 시작주소(원본)이다.
- 함수를 배열로 전달할 때, 보통은 배열의 크기도 전달한다.
- 복사본을 전달한다면 메모리 낭비이다. 그래서 대신에 배열의 시작주소를 보관할 수 있는 변수를 넘겨준다. (포인터->주소저장),(배열의 이름을 넘겨받아서 바로 원본에 접근)
void addOne(int[], int);
void printArray(int list[], int arraySize); //함수원형

int main()
{
  int numbers[5] = {1, 4, 3, 6, 8};
  addOne(numbers, 5);
  printArray( numbers, 5); //함수 호출 , 배열의 크기도 같이 전달
  return 0;
}

void addOne(int list[], int arraySize)
{
  for (int i = 0; i < arraySize; i++)
    list[i]++;
}
void printArray(int list[], int arraySize)
{
  for (int i = 0; i < arraySize; i++)
    cout << list[i] <<  " ";
}

  • 배열 인수 보호

- 함수에서 인수로 전달된 배열의 내용을 수정하고 싶지 않은 경우에는,

const 키워드 붙여 컴파일러에게배열은 변경될없다는 것을 릴 수 있다.

//오류 발생1
void p(const int list[], int arraySize) {
	list[0] = 100; // 에러 발생
}

int main()
{
  int numbers[5] = {1, 4, 3, 6, 8};
  p(numbers, 5);
  return 0;
}
//오류 발생2
//첫 함수에서 const선언했으면 그 다음 함수도 const선언해야 된다
void f2(int list[], int arraySize) {
	…
}
void f1(const int list[], int arraySize) {
	f2(list, size); //컴파일 오류발생
}

  • 예제: 복권번호

- 각 복권 티켓에는 1부터 10까지 5개의 서로 다른 숫자가 적혀 있음

- 사용자는 구입한 티켓에 1부터 10까지의 모든 숫자들이 표시되어 있기를 원함

- 사용자로 부터 티켓의 숫자들을 입력 받아 모든 숫자가 표시되어 있는지를 검사하는 프로그램을 작성

#include <iostream>
using namespace std;

int main()
{
	const int MAXSIZE = 10;
	bool isCovered[MAXSIZE];
	int number;

	cout << " 티켓의 숫자들을 입력하시오 (0은 종료) : " << endl;
	cin >> number;

	while (number != 0)
	{
		isCovered[number - 1] = true;
		cin >> number;
	}

	bool allCovered = true;
	for (int i = 0; i < MAXSIZE; i++)
	{
		if (!isCovered)
		{
			allCovered = false;
			break;
		}
	}

	if (allCovered)
		cout << "티켓의 모든 숫자가 커버되었음" << endl;
	else
		cout << "티켓의 모든 숫자가 커버되지 않았음" << endl;

	return 0;
}
//함수로 배열 전달
#include <iostream>
using namespace std;

bool isAllCovered(bool list[], int arraySize)
{
	bool allCovered = true;
	for (int i = 0; i < arraySize; i++)
	{
		if (!list[i])
		{
			allCovered = false;
			break;
		}
	}

	return allCovered;
}

int main()
{
	const int MAXSIZE = 10;
	bool isCovered[MAXSIZE];
	int number;

	for (int i = 0; i < MAXSIZE; i++)
		isCovered[i] = false;

	cout << " 티켓의 숫자들을 입력하시오 (0은 종료) : " << endl;
	cin >> number;

	while (number != 0)
	{
		isCovered[number - 1] = true;
		cin >> number;
	}

	bool allCovered = isAllCovered(isCovered, MAXSIZE);

	if (allCovered)
		cout << "티켓의 모든 숫자가 커버되었음" << endl;
	else
		cout << "티켓의 모든 숫자가 커버되지 않았음" << endl;

	return 0;
}

/*
 티켓의 숫자들을 입력하시오 (0은 종료) :
1 2 3 6 5
5 2 8 7 4
0
티켓의 모든 숫자가 커버되지 않았음
*/