많은 자료가 있을 때는 배열을 사용한다. 아래는 배열을 사용하는 경우의 예시이다. 상황에 따라 1차원 또는 다차원 배열 필요
6.1 1차원 배열 한 분반의 성적을 읽어 평균과 분산을 구하는 문제 배열 선언 배열에 값 읽어 들이기 평균 계산 분산 계산
6.1.1 사용 규칙 배열의 크기는 미리 지정되어야 한다. (즉 컴파일 할 때 상수로 지정) 몇 가지 예 따라서 충분히 큰 크기로 선언해야 한다. 메모리 낭비 가능성 예, 1000으로 선언했는데 데이터가 50개 라면 950개는 낭비
배열을 함수 매개변수로 넘길 때, 데이터 개수를 알려주어야 함 (아래 예에서 no가 그 역할을 함) 함수 정의에서 배열의 크기는 생략 가능
배열 요소에 접근하는 방법
배열의 초기화
연습 문제
6.1.2 배열과 포인터 배열과 포인터는 매우 밀접한 관련 배열의 이름은 포인터이고, 첫 번째 요소의 주소를 갖는다. 몇 가지 예제
몇 가지 예제를 살펴 보면,
6.1.3 문자 배열 문자열과 포인터는 밀접한 관련 문자열은 배열로 표현되기 때문 문자열 끝에는 문자열 끝을 나타내는 가 채워 짐
문자형 배열과 상수 문자열을 가리키는 포인터의 차이
문자열의 길이를 알아내는 함수 strlen() 첫 요소에서 시작하여 이 나타날때까지 진행
문자열이 같은지 비교하는 함수 strcmp() s와 t가 같으면 0, s가 크면 1, s가 작으면 -1 반환
문자열을 복사하는 함수 strcpy()
연습 문제
6.2 다차원 배열 여러 분반의 성적을 저장해야 하는 경우 2차원 배열 필요 int score[100][1000]; // 최대 100개 분반, 분반당 최대 1000명 행 우선으로 저장됨 총 100*1000*4=약 400킬로 바이트 할당됨 실제 20분반에 분반 별로 40명 학생이 있다면 20*40*4=3.2킬로 바이트만 사용, 나머지는 낭비 (6.3절의 동적 메모리 사용하면 낭비 제거)
여러 분반의 성적 처리 프로그램 main() 함수: 세 개 함수를 호출하는 역할
여러 분반의 성적 처리 프로그램 주요 자료 구조 score[][]: 성적 데이터 저장을 위한 2차원 배열 no_student[]: 분반 별 학생수를 저장하는 1차원 배열 ave[], var[]: 분반 별 평균과 분산을 저장하는 1차원 배열
여러 분반의 성적 처리 프로그램 성적을 읽어 들이는 함수 read_score()
여러 분반의 성적 처리 프로그램 평균과 분산을 구하는 함수 compute_stat()
내부 변수 버전으로 수정해 보자. 즉, 주요 자료 구조를 main() 안에 선언 이제 매개 변수를 통해 데이터를 교환해야 한다.
3차원 배열 여러 과목 있고, 과목 당 여러 분반 있고, 분반 당 여러 학생 있는 상황
연습 문제
6.3 동적 메모리와 포인터 배열 동적 메모리 할당을 위한 라이브러리 함수 malloc()과 free()
성적 처리 프로그램을 동적 메모리 버전으로 수정하면, 바뀐 부분에 주목할 것
2차원 배열의 동적 메모리 int *score[MaxClass]로 정의 MaxClass개의 int *형 요소를 갖는 1차원 배열 ‘포인터 배열’이라 부름
여러 분반의 성적 처리 프로그램을 동적 메모리 버전으로 수정하면, main() 함수
주요 자료 구조
성적을 읽어 들이는 함수 read_score() 파란 부분이 동적 메모리 할당
연습 문제
6.4 포인터 배열과 2차원 배열 2차원 배열, 포인터 배열, 그리고 포인터 배열의 포인터 메모리 낭비 가능성: 2차원 배열 > 포인터 배열 > 포인터 배열의 포인터 프로그래밍 쉬움: 2차원 배열 > 포인터 배열 > 포인터 배열의 포인터 좋은 프로그래밍 스타일 가급적 포인터 배열 또는 포인터 배열의 포인터를 사용하라
‘포인터 배열의 포인터’를 사용한다면, 생각보다 손질할 곳이 적다. 프로그램 [6.10]에서 두 곳을 수정
2차원 배열의 초기화 방법
연습 문제
6.5 파일 입출력: fscanf와 fprintf 많은 데이터를 입력해야 하는 경우, 키보드에서 직접 입력하는 것은 매우 번거로움 이때는 파일을 통해 입출력 하는 것이 적절함 파일 포인터를 통해 파일에서 읽거나 파일에 씀 라이브러리 함수 fscanf()와 fprintf() 파일 포인터가 있다는 점만 빼면, scanf()와 printf()와 같다.
파일 포인터는 어떻게 생성하나? fopen()을 이용한다. 예), fp_in=fopen(“score_data.txt”, “r”); score_data.txt라는 파일을 r (읽기) 모드로 열고, 그 파일 포인터를 fp_in에 대입한다. 이제 fscanf(fp_in, …)을 수행하면 score_data.txt에서 읽게 된다. 파일 모드 (부록 D에서 fopen() 함수 참조) “r” 읽기 “w” 쓰기 “a” 덧붙여 쓰기 파일 사용이 끝나면 fclose()로 닫는다.
뒤에 계속 …
연습 문제
6.6 프로그래밍 연습: 마방진
알고리즘으로 정리하면,
보다 상세하게 다시 정리하면,
C 코딩 하면,
연습 문제