C언어 심화 (13주차) [배열(array)]
←저번에 보고 넘어간것들
■지역 변수와 전역 변수
■자동(auto) 변수
■레지스터(register) 변수
■정적(static) 변수
■extern 변수
■변수와 메모리 영역
→이번주에 보고 넘어갈것들
■배열 개요
■일차원 배열
■다차원 배열
■문자형 배열
■배열을 함수 매개변수로 전달
변수와 배열
※변수
→ 단독 주택
→ int x; // 4byte짜리 단독주택 1가구
※배열
→ 같은 평수로 구성된 아파트
→ int x[5]; // 4byte짜리 5가구
※ 배열?
배열이란 연속적인 항목들이 동일한 크기의 순서를 갖고 나열되어 있는 데이터들의 집합
1차원 배열
배열명 다음에 구두점 대괄호 ( [ ] ) 를 쓰며 대괄호 안에 배열의 크기를 나타내는 수를 하나 씀
●첨자 (subscript) 또는 인덱스 (index)
자료형 배열명[첨자];
int score[7];
● 배열명 만드는 규칙은 변수명 만드는 규칙과 동일
● 배열 선언문에서 사용하는 첨자는 양의 정수이며 배열의 크기
● score배열은 정수형 자료 7개를 저장할 수 있음
● 7개의 공간을 배열의 원소(element)라 함
13-1. 배열 원소 예시
배열에 3개를 써놨는데 왜 오류가 날까?
→ 가장 많이하는 실수로 배열은 0부터 3까지라고 생각하지만 엄연히 괄호안의 숫자는 배열의 갯수지 범위가 아님
→ 배열의 해당 범위는 괄호안에 써놓은 숫자 (n - 1) 만큼 해당됨
일차원 배열 초기화
일차원 배열 초기화 방법
▶ int score[5]={10,20,30,40,50};
▶ 변수 초기화와 달리 원소가 많으므로 중괄호({})로 묶어 줌
▶ score[0]에는 10이, score[1]에는 20 등이 차례대로 초기화됨
문자형 배열 초기화 방법
▶ char name[ ]={'H','a','n',' ','S',' ','H','\0'};
▶ 배열 선언과 함께 초기화까지 할 경우 원소의 개수 8은 생략 가능
▶ 문자 배열의 마지막 원소는 반드시 널(NULL) 문자인 '\0'
▶ 문자형 배열은 문자열과 관련이 있는데 C 언어에서 문자열은 항상 널 문자로 끝나기 때문
문자 배열은 문자열 형태로 초기화할 수도 있음
▶ char name[ ]="Han S H";
▶ 널 문자가 자동으로 마지막 원소에 할당됨
▶ 원소의 개수는 8개
▶ 주의:char name[7]="Han S H";//널 문자 저장 안되므로 제대로 된 문자열 아님
13-2. 배열의 초기화
배열 초기화 방법
배열 원소가 초기화 데이터 수보다 많으면 나머지 원소들은 0으로 초기화됨
100개의 원소를 갖는 배열을 2개만 초기화하면 나머지 98개는 모두 0으로 자동 초기화
int han[100]={10,20}
배열 원소의 수가 초기화한 데이터 수보다 적으면 “초기화 데이터가 너무 많다”는 에러가 발생
int han[2]={10,20,30}
error C2078: 이니셜라이저가 너무 많습니다.
배열을 선언과 동시에 초기화한 경우와, 선언 먼저하고 값을 대입한 경우인데 각 원소에는 같은 값이 할당됨
int han[3]={10,20,30}; // 배열 선언과 초기화
int han[3]; // 배열 선언
han[0]=10; // 대입
han[1]=20; // 대입
han[2]=30; // 대입
13-3. 배열의 초기화 2
int han[10]; 0,1에 10,20이 대입되고 나머지는 모두 0으로 초기화
han2[10] = {0};는 그 안의 데이터를 모두 0으로 초기화
13-4. 배열의 초기화와 대입
13-5. 1차원 배열의 이름
사진을 보면 알수 있겠지만 (배열의 이름 = 그 배열의 시작 주소)이다.
13-6. 1차원 배열 활용법
13-7. 5개 숫자 입력받아 역순으로 출력
최종 선택 정렬(selection sort) 알고리즘
우선 0번 방이 최대값을 갖는 방이라 가정
0번 방 값과 1~2번 방에서 값이 더 큰 방의 인덱스를 저장
0번 방과 인덱스 방의 값을 교환
1번 방이 최대값을 갖는 방이라 가정
1번 방 값과 2번 방에서 값이 더 큰 방의 인덱스를 저장
1번 방과 인덱스 방의 값을 교환
쉽게 설명하면 0번방이 무조건 가장 큰값을 가지는방이라 가정하고, (인덱스 사용)
0번에 있는값과 1~2번에 있는값을 비교해 가장큰값을 0번방에, 나머지는 그대로 둔다.
그걸 1번방,2번방으로 옮기면서 계속 반복한다.
13-8. 3개의 수를 큰수부터 작은수 순서대로 출력 (쉬운 정렬)
13-9. 5개 숫자 입력받아 역순으로 출력 (selection sort)
13-10. 5개 숫자 입력받아 내림차순으로 출력 (selection sort)
13-11. 주사위를 100만번 던졌을때 각눈이 나올 확률
8 : 매번 실행할 때마다 다른 난수표를 사용하기 위해서 srand()를 먼저 호출
srand()의 매개변수로 숫자를 넘겨줘야 하는데 매번 다르게 하기 위해 현재 시간을 리턴하는 time()이라는 함수를 사용. srand(time(NULL))는 매번 다른 난수표를 선택하게 함
10 : rand()를 사용해서 리턴되는 난수들은 0~RAND_MAX(32,767)라는 범위의 숫자 우리가 필요한 것이 0부터 5까지 6가지이므로 rand()가 0~5까지의 난수만 리턴하도록 설정. 어떤 수를 X라는 값으로 나누게 되면, 그 나머지는 항상 0 ~ X-1의 수가 됨. rand()%6을 하면, 0~5까지의 난수로 변환할 수 있음 "++frequency[rand()%6]"는 0~5의 수가 나오면 그 배열 값의 크기를 1증가시킴
다차원 배열
다차원 배열은 2차원 배열, 3차원 배열 등 n차원 배열이 가능
일반적으로 3차원 이상의 배열은 이해하기 어려워서 잘 사용하지 않음
int x[3]; // 1차원 배열
int x[4][3]; // 2차원 배열, int x[3]이 4개
int x[5][4][3]; // 3차원 배열, int x[4][3]이 5개
2차원 배열 x의 초기화는 두 가지 방법
int x[3][2]={1,2,3,4,5,6};
int x[3][2]={ {1,2}, {3,4}, {5,6} };
2차원 배열도 물리적으로는 1차원적으로 저장
배열의 크기는 선언시 사용한 첨자를 곱(3x2)하면 되고 마지막 원소는x[3][2]가 아니라 x[2][1]인 것을 명심
13-12. 2차원 배열 초기화
han [0][0] 배열부터 시작해서 han[1][2]배열 까지 유효하다.
범위를 벗어난 다차원 배열값 호출은 오류는 나지 않지만 엉뚱한 값이 나옴
13-13. 2차원 배열의 초기화와 대입
x[0][0],[0][1],[0][2]의 값을 printf로 출력
배열 안의 변수를 초기화 (1,2), 배열 끼리의 연산도 가능
13-14. 2차원 배열을 1차원 배열처럼 사용
13-15. 두 3 x 3 행렬을 더하는 프로그램
13-16. 문자형 배열 초기화 방법
13-17. 문자형 배열 초기화와 배열명
한글은 한단어가 2바이트에 처리되므로 1바이트만 출력할수가 없어 '?'로 표시됨
13-18. 배열로 이름 입력받아 출력하기
scanf()함수로 문자열을 입력받을때는 %s로 하고 매개변수로 배열의 이름만 쓰면 끝.
(전에도 말했다시피 배열의 이름이 그 배열의 시작주소이기 때문)
10바이트의 크기를 가진 배열이므로 널문자까지 감안해 한글은 4글자, 영어는 9글자까지만 입력해야함.
더 긴 문자열을 입력하면 실행시 오류가 남
13-19. 배열로 다수의 이름 입력받아 출력
배열을 함수 매개변수로 전달 (매우 중요함)
13-20. 5개의 수를 입력받아 평균 구하기 (배열을 함수 매개변수로)
13-21. 배열을 함수 매개변수로 전달
함수를 선언하고 그밑에 배열안에 집어넣을 데이터값을 입력한다.
해당 내용은 인덕대학교 2021년도 1학기 C프로그래밍 한성현 교수님 강좌에서 발췌한 내용입니다.
강좌 내용을 원저작자 허락없이 무단 이용시, 처벌의 대상이 될수 있습니다.