4.3 배열과 함수 167 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 void addDescending( int a[], int len, int val ) { if ( val > a[len-1] ) { a[len-1] = val; for ( int i=len-1 ; i>0 ; i-- ) { if ( val < a[i-1] ) return ; a[i] = a[i-1]; a[i-1] = val; } } } void main() { int score[5] = {0,0,0,0,0}; for ( int i=0 ; i<8 ; i++ ) { int newScore = rand()%100; addDescending( score, 5, newScore ); printf("[%2d] ", newScore); printRanking( score, 5, " 순위" ); } } 코드 설명 4행 프로그램 4.4의 3~8행의 printArray() 함수 추가. 5~14행 랭킹 배열에 새로운 값 val 추가 함수. 17행 점수 배열 생성 및 0으로 초기화. 19~20행 난수(0~99) 발생 및 랭킹 배열에 등록. • 이 코드는 일반적인 내림차순 정렬과는 다른데, 배열에는 항상 최고 점수 5개만 저 장되어야 하고, 새로운 점수가 등록되면 기존의 5등은 사라져야 한다. 그래도 알고 리즘은 다소 복잡하다. • srand()를 사용하지 않아 실행할 때마다 결과가 동일하다. • 이 방법을 잘 활용하면 실제 게임의 랭킹 관리를 구현할 수 있을 것이다. • 실제 게임에서는 점수뿐 아니라 경기자를 포함한 그 게임의 다양한 정보가 추가되어 야 할 것이다. 이 경우 구조체의 배열이 사용되어야 할 것이다.
20
Embed
4.3 167...포인터와 배열 포인터는 배열과 거의 동일하게 사용할 수 있다. 배열의 이름이 포인터의 역할을 하는데, 이때는 상수 포인터로 주소
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
4.3 배열과 함수 167
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void addDescending( int a[], int len, int val ) {
if( val > a[len-1] ) {
a[len-1] = val;
for( int i=len-1 ; i>0 ; i-- ) {
if( val < a[i-1] ) return;
a[i] = a[i-1];
a[i-1] = val;
}
}
}
void main()
{
int score[5] = {0,0,0,0,0};
for( int i=0 ; i<8 ; i++ ) {
int newScore = rand()%100;
addDescending( score, 5, newScore );
printf("[%2d] ", newScore);
printRanking( score, 5, "순위" );
}
}
코드 설명
4행 프로그램 4.4의 3~8행의 printArray() 함수 추가.
5~14행 랭킹 배열에 새로운 값 val 추가 함수.
17행 점수 배열 생성 및 0으로 초기화.
19~20행 난수(0~99) 발생 및 랭킹 배열에 등록.
• 이 코드는 일반적인 내림차순 정렬과는 다른데, 배열에는 항상 최고 점수 5개만 저
장되어야 하고, 새로운 점수가 등록되면 기존의 5등은 사라져야 한다. 그래도 알고
리즘은 다소 복잡하다.
• srand()를 사용하지 않아 실행할 때마다 결과가 동일하다.
• 이 방법을 잘 활용하면 실제 게임의 랭킹 관리를 구현할 수 있을 것이다.
• 실제 게임에서는 점수뿐 아니라 경기자를 포함한 그 게임의 다양한 정보가 추가되어
야 할 것이다. 이 경우 구조체의 배열이 사용되어야 할 것이다.
Choi
문구 상자
printArray
Choi
화살표
Choi
취소선
Choi
취소선
Choi
취소선
Choi
취소선
Choi
취소선
202 CHAPTER 04 배열, 구조체와 파일
실습문제
1. double배열을받아다음의처리를하는함수를구현하고테스트프로그램을작성하라.
(1) 배열을 평균과 표준 편차를 구하는 함수를 각각 구현하라.
void average( double array[], int len );
void deviation( double array[], int len );
(2) 배열에서 최댓값을 찾아 반환하는 함수와, 최솟값의 위치를 반환하는 다음 함수를
각각 구현하라.
double findMaxValue( double array[], int len );
int findMinPosi( double array[], int len );
(3) 배열을 역순으로 만드는 함수를 구현하라.
void reverse( double array[], int len );
2. 5×5크기의체커보드와관련된다음프로그램을작성하라.
(1) 5×5 크기의 2차원 배열에 0과 1을 임의로 채우는 함수를 구현하라.
void randomMap( int map[5][5] );
(2) 체커 보드를 보기 좋게 화면에 출력하는 함수를 구현하라.
void printMap( int map[5][5] );
(3) 가로나 세로 또는 대각선이 모두 0이거나 1인 부분을 찾아 화면으로 출력하는 함수
를 구현하라.
void checkMap( int map[5][5] );
Choi
문구 상자
double
Choi
취소선
Choi
취소선
Choi
취소선
Choi
취소선
Choi
화살표
Choi
화살표
Choi
문구 상자
double
212 CHAPTER 05 함수의 진화
포인터에 증감 연산자를 적용할 수도 있다. p++과 p--는 각각 p가 가리키는 주소를 다음
항목이나 이전 항목의 주소로 변경한다. 배열의 이름은 포인터의 역할을 하지만 주소 값을
변경할 수 없는 상수 포인터임에 유의하라. 따라서 A+1은 가능하지만 A++와 같이 배열의
이름이 가리키는 주소를 바꿀 수는 없다.
▒ 포인터와 배열
포인터는 배열과 거의 동일하게 사용할 수 있다. 배열의 이름이 포인터의 역할을 하는데,
이때는 상수 포인터로 주소 값의 변경이 불가능하다. 포인터가 어떤 유효한 메모리의 주소
를 가리킨다면 이제 포인터를 배열처럼 사용하는 것이 가능하다. 함수의 매개변수 전달과
반환에서도 마찬가지이다. 프로그램 5.2는 배열과 포인터의 관계를 보여준다. 배열 이름(주
소)을 포인터에 복사할 수도 있고(5행), 포인터에 항목 추출 연산자 []를 적용할 수도 있다
(13행).
포인터와 배열의 관계프로그램 5.2
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
#include <stdio.h>
void main()
{
int list[5] = { 1, 2, 3, 4, 5 };
int* p = list;
printf("list= ");
for (int i = 0; i < 5; i++)
printf("%d ", *p++); // 포인터 연산
p = list; // 포인터에 배열 주소 복사
for (int i = 0; i < 5; i++)
sum += p[i]; // 포인터에 항목 추출 연산자 적용
printf("\nsum = %d\n", sum);
}
포인터가 가리키는 배열의 항목을 참조하기 위해 9행과 같은 포인터 연산을 사용할 수 있
다. 그렇지만 13행과 같이 인덱스 연산자를 사용하는 것이 훨씬 편리할 것이다. 예전에는
Choi
문구 상자
, sum=0
Choi
화살표
Choi
연결 선
6.6 응용: 기존 게임의 클래스 변환 279
랭킹 처리를 위한 RankingBoad 클래스프로그램 6.3
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#define NUM_MVP 5
struct PlayInfo {
char name[200];
int nMove;
double tElapsed;
};
class RankingBoard {
PlayInfo MVP[NUM_MVP];
int nMVP = NUM_MVP; // VS2013:OK, VS2010:Error
void init() {...} // initRanking()과 동일
public:
RankingBoard(): nMVP(NUM_MVP) {} // VS2010 이하인 경우 추가
void load(char* fname) {...} // loadRanking()과 동일
void store(char* fame) {...} // storeRanking()과 동일
void print() {...} // printRanking()과 동일
int add(int nMove, double tElap){...} // addRanking()과 동일
};
이 클래스를 사용하는 코드는 다음과 같다. 프로그램의 실행 결과는 프로그램 4.10과 전
적으로 동일하다.
랭킹 함수 테스트를 위한 프로그램프로그램 6.4
01
..
07
08
09
10
11
12
13
14
#include "RankingBoard.h" // 클래스 헤더 파일 포함
// 프로그램 4.10의 2~6행 추가(코드 동일)
RankingBoard board;
board.load("ranking.txt");
board.print();
for (int i = 0; i < 5; i++)
board.add(rand() % 500, rand() % 1000 * 0.1);
board.store("ranking.txt");
}
Choi
취소선
Choi
문구 상자
fname
Choi
화살표
6.6 응용: 기존 게임의 클래스 변환 281
PlayInfo
+name : char[]+nMove : int+tElapsed : double
RankingBoard
-nMVP : int-MVP[] : PlayInfo
-init()+load(char[])+store(char[])+print()+add(int, double) : int