레이블이 array인 게시물을 표시합니다. 모든 게시물 표시
레이블이 array인 게시물을 표시합니다. 모든 게시물 표시

2015년 6월 8일 월요일

C/C++ 배열의 예제 및 풀이 #2

다음과 같은 배열 예제를 작성해 보자.

  1. int형 배열에 0부터 255까지의 정수를 순서대로 저장한다.
  2. 모든 배열의 요소와 각각의 16진수 값을 출력한다.

먼저 크기가 256인 정수형 배열을 선언한다.

int ia[256];

이 경우 선언과 동시에 초기화를 할 수도 있겠지만 초기화할 요소의 숫자가 많으므로 반복문을 이용하여 수행한다.

for (int k=0; k<256; k++) {
ia[k] = k;
}

이것에 의해서 0번 요소는 0, 1번 요소는 1, …, 255번 요소는 255로 초기화된다. 이제 각각의 요소를 출력하기 위해서 다시 for 반복문을 사용한다.

for(int k=0; k<256; k++) {
printf("ia[%d] = %d : %x\n", k, ia[k], ia[k]);
}

printf()함수의 %x 서식문자는 정수형 숫자 데이터를 16진수로 출력하는 것이다.

 전체 프로그램은 다음과 같다.

#include  <stdio.h>
int main(void)
{
int ia[256];
for(int k=0; k<256; k++) {
ia[k] = k;
}
for(int k=0; k<256; k++) {
printf("ia[%d] = %d : %x\n", k, ia[k], ia[k]);
}
}
실행 예:
ia[0] = 0 : 0
ia[1] = 1 : 1
ia[2] = 2 : 2

… 중간 생략…

ia[252] = 252 : fc
ia[253] = 253 : fd
ia[254] = 254 : fe
ia[255] = 255 : ff

이 예제와 같이 많은 수의 배열 요소를 초기화할 때에는 반복문이 사용되기도 한다.

C/C++ 배열 예제 및 풀이 #1

 다음과 같은 예제를 배열을 이용하여 풀어 보자.

  1. C++의 배열에 사용자가 입력한 다섯 개의 float 형 데이터를 저장한 후 그것을 화면에 출력하라.
  2. 입력 받은 숫자들 중 가장 큰 최대값을 화면에 출력하라.

먼저 다섯 걔의 float형 값을 갖는 배열을 선언해야 한다.

float fa[5];

그 다음 사용자로부터 입력 받은 수를 저장하는 반복문을 작성해야 한다.

float fi;
for(int k=0; k<5; k++) {
scanf("%f", &fi);
fa[k]=fi;
}

이 반복문에서 정수형 변수 k는 0,1,2,3,4 값에 대해서 반복을 수행하며 입력된 실수를 배열 fa에 저장하게 된다.

 이제 다 입력 받은 데이터를 화면에 출력하는 것도 반복문을 사용하면 된다.

for(int k=0; k<5; k++) {
printf("fa[%d] : %f\n", k, fa[k]);
}

여기서 printf() 함수의 첫 번째 %d에는 인덱스가, %f 자리에는 배열의 k번째 요소가 출력이 된다.

 전체 프로그램은 다음과 같다.

#include  <stdio.h>
int main(void)
{
float fa[5];
float fi;
for(int k=0; k<5; k++) {
scanf("%f", &fi);
fa[k]=fi;
}

for(int k=0; k<5; k++) {
printf("fa[%d] : %f\n", k, fa[k]);
}
}
실행 예:
11
-22
1.5
4.7
-123.456
fa[0] : 11.000000
fa[1] : -22.000000
fa[2] : 1.500000
fa[3] : 4.700000
fa[4] : -123.456001

 이제 사용자가 입력한 숫자들 중 최대값을 찾는 알고리듬을 다음과 같이 고안해 보자. 최대값을 저장할 변수를 fmax로 선언한다.

float fmax;

그리고 사용자가 처음 입력한 숫자를 fmax의 값으로 대입한 후 그 이후에는 새로 입력된 숫자가 이전에 저장된 fmax 값보다 클 경우 fmax 값을 갱신한다. 다섯 개의 숫자에 대해서 이 작업을 수행하면 마지막에 fmax 변수에는 가장 큰 값이 남아 있게 된다.

for(int k=0; k<5; k++) {
scanf("%f", &fi);
fa[k]=fi;
if (k==0) { // 첫 번째 데이터가 입력된 경우
fmax = fi;
} else {  // 두 번째 데이터 이후
if (fi > fmax)
fmax = fi;
}
}
}

위에서 보면 if ~ else 제어문으로 첫 번째 데이터와 그 이후의 데이터를 구분했으며 k변수가 0이면 첫 데이터라고 판단한다. 반복문이 종료되면 fmax 변수에는 최대값이 저장되어 있으므로 그것을 출력하면 된다.

printf("The maximum value is %f.", fmax);

전체 프로그램은 다음과 같다.

#include  <stdio.h>
int main(void)
{
float fa[5];
float fi;
float fmax;
for(int k=0; k<5; k++) {
scanf("%f", &fi);
fa[k]=fi;
if (k==0) {
fmax = fi;
} else {
if (fi > fmax)
fmax = fi;
}
}
printf("The maximum value is %f.", fmax);
}
실행 예:
11
-22
1.5
4.7
-123.456
The maximum value is 11.000000.

이 프로그램을 조금만 고치면 최소값을 출력하도록 할 수 있다. 직접 수정해서 결과를 확인해 보기 바란다.


2015년 5월 7일 목요일

C/C++의 배열과 포인터

 포인터와 배열은 깊은 관계가 있는데 사실 배열의 이름이 바로 포인터이다. 다음 예를 보자.

#include <stdio.h>
int main()
{
   int iaa[] = {11,22,33,44,55};
   int ib = 4;
   printf("iaa : %p\n", iaa); //(1)
   printf("*iaa : %d\n", *iaa); //(2)
   printf("*(iaa+ib) : %d\n", *(iaa+ib)); //(3)
   printf("iaa[ib] : %d\n", iaa[ib]); //(4)
}

iaa : 0028ff08
*iaa : 11
*(iaa+ib) : 55
iaa[ib] : 55

이 예에서 (1)의 결과 를 보면 포인터(주소)값이 찍히는 것을 알 수 있으며 (2), (3), (4)의 결과를 보면 배열명은 내부적으로 배열의 첫 번째 요소의 포인터(주소)임을 알 수 있다. 그래서 배열의 첫 번째 요소를 참조하는 다음 표현식은 모두 같은 것들이다.

  • *iaa
  • *(iaa + 0)
  • iaaa[0]

마찬가지로 배열의 5번째 요소는

  • iaa[5]
  • *(iaa+5)

로 표현할 수 있다.
 또 다른 예를 보자.

#include <stdio.h>
int main()
{
   int iaa[] = {11,22,33,44,55};
int *ip = iaa;
for(int k=0; k<5; k++){
printf("iaa[%d]:%d, ", k, ip[k]);  //(1)
}
printf("\n");
for(int k=0; k<5; k++){
printf("iaa[%d]:%d, ", k, *(ip+k)); //(2)
}
printf("\n");
for(int k=0; k<5; k++){
printf("iaa[%d]:%d, ", k, *(ip++)); //(3)
}
}

iaa[0]:11, iaa[1]:22, iaa[2]:33, iaa[3]:44, iaa[4]:55,
iaa[0]:11, iaa[1]:22, iaa[2]:33, iaa[3]:44, iaa[4]:55,
iaa[0]:11, iaa[1]:22, iaa[2]:33, iaa[3]:44, iaa[4]:55,

여기서 (1)과 (2)는 완전히 같은 코드이다. 즉 ip[k] 와 *(ip+k)는 완전히 동일한 표현식이다. 하지만 (3)에서는 앞의 경우들과 달리 ip값이 직접 증가하여 변한다는 점이 다르다. 하지만 배열명에 정수를 더하거나 뺄 수 없다. 즉 iaa++, --iaa 과 같은 표현식은 에러를 발생시킨다. 배열 포인터를 직접 증감시킬 수 없으므로 다른 포인터를 하나 선언해서 거기에 배열 포인터를대입한 다음 그 포인터를 조작해야 한다.
 배열과 포인터의 차이점을 요약하면 다음과 같다.
  • 배열은 메모리가 자동으로 생성되지만 포인터는 메모리를 할당해야 한다.
  • 배열은 주소 이동이 불가능하지만 포인터는 가능하다.
  • 배열은 크기가 ‘데이터형×배열크기’ 이지만 포인터는 2 또는 4바이트이다.