학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

포인터 활용

학습목표

함수에서 포인터의 활용을 공부한다.

학습주제

성적 프로그램에 포인터를 적용한다.

예습내용

 

예제1

함수에서 2차원 배열을 포인터를 이용해 또다른 번지의 배열로 받는다.

#include "stdafx.h"

#include "iostream.h"

 

void Print(int *in, int r, int c);

 

int main(int argc, char* argv[])

{

              int i,j,a[3][3]={{1,2,3},{4,5,6},{7,8,9}};

              int *b;

 

              b = &a[0][0];

              for(i=0;i<3;i++)

                             for(j=0;j<3;j++)

                                           cout<<a[i][j]<<" "<<&a[i][j]<<endl;

             

              cout<<"============="<<endl;

              Print(&a[0][0],3,3);

              return 0;

}

 

void Print(int *in, int r, int c)

{

              int i,j,out[3][3];

 

              for(i=0;i<r;i++)

                             for(j=0;j<c;j++) {

                                           out[i][j]=*in;

                                           in++;

                             }

              for(i=0;i<r;i++)

                             for(j=0;j<c;j++)

                                           cout<<out[i][j]<<" "<<&out[i][j]<<endl;

}

1 0x0012FF54

2 0x0012FF58

3 0x0012FF5C

4 0x0012FF60

5 0x0012FF64

6 0x0012FF68

7 0x0012FF6C

8 0x0012FF70

9 0x0012FF74

=============

1 0x0012FEC4

2 0x0012FEC8

3 0x0012FECC

4 0x0012FED0

5 0x0012FED4

6 0x0012FED8

7 0x0012FEDC

8 0x0012FEE0

9 0x0012FEE4

다음은 2차원 배열의 초기 번지를 함수로 전달하여 다른 메모리 번지의 배열로 받았다. 여기서 함수의 out[3][3]에서 배열의 크기가 3으로 고정되어 있으나 3 변수로 되어야 일반적인 프로그램이 된다. 이는 뒤에서 배우는 malloc 등의 함수를 쓰면 일반적인 프로그램을 만들 있다. 프로그램은 뒤에 다시 예를 들겠습니다.

실습방법

   

1. 2차원 배열을 함수로 전달

프로그램을 실행해 보고 아래 과제를 푼다.

C반은 아래 예제를 실행하고 과제를 프로그램 하시오. (수업시간의 메트릭스 곱은 생략)

다음은 이차원 메트릭스의 합을 연산하는 프로그램을 만든다. 메모리는 항상 1차원 이므로 이차원의 메트릭스를 연산 하려면 1차원의 메모리를 2차원의 메트릭스로 Copy 후에 연산하고 2차원의 결과를 다시 1차원의 메모리로 Copy 해야 한다.

예제2 메트릭스

메인 함수의 a,b 행렬을 함수의 A,B 행렬로 Copy 하고 C=A+B 연산 후에 C 메인 함수의 c Copy 한다.

#include "stdafx.h"

#include "iostream.h"

 

void MatrixAdd(int *in1, int *in2, int *re, int r, int c);

 

int main(int argc, char* argv[])

{

              int i,j,a[3][3]={{1,2,3},{4,5,6},{7,8,9}},b[3][3]={1,1,1,2,2,2,3,3,3},c[3][3];

 

              MatrixAdd(&a[0][0],&b[0][0],&c[0][0],3,3);

             

              // 결과를 출력한다.

              for(i=0;i<3;i++) {

                             for(j=0;j<3;j++)

                                           cout<<c[i][j]<<" ";

                             cout<<endl;

              }

 

              return 0;

}

 

void MatrixAdd(int *in1, int *in2, int *re, int r, int c)

{

              int i,j,A[3][3],B[3][3],C[3][3];

 

              // 함수 내의 행렬로 값을 복사한다.

              for(i=0;i<r;i++)

                             for(j=0;j<c;j++) {

                                           A[i][j]=*in1;

                                           in1++;

                             }

              for(i=0;i<r;i++)

                             for(j=0;j<c;j++) {

                                           B[i][j]=*in2;

                                           in2++;

                             }

             

              // C=A+B 연산한다.

              for(i=0;i<r;i++)

                             for(j=0;j<c;j++)

                                           C[i][j]=A[i][j]+B[i][j];

             

              // 연산 결과를 리턴 되는 번지로 쓴다.

              for(i=0;i<r;i++)

                             for(j=0;j<c;j++) {

                                           *re=C[i][j];

                                           re++;

                             }

}

2 3 4

6 7 8

10 11 12

 

2. 성적 프로그램의 1차원 배열 인수전달

12 배열의 예제2 프로그램을 포인터를 사용해 인수를 받아 보자.

예제3 성적 프로그램

빨간색 글씨는 수정한 부분이다. 파란색 글씨를 수정하여 포인터를 이용한 함수로 완성하시오.

#include "stdafx.h"

#include "stdio.h"

#include "iostream.h"

 

void Input(int *kor,int *eng, int total);

void Calculate(int kor[],int eng[], int sum[], int total);

void Output(int kor[],int eng[], int sum[], int total);

 

int main(int argc, char* argv[])

 

{

 

              int i;

              int kor[3],eng[3],sum[3];

              float ave[3];

 

              Input(&kor[0],&eng[0],3);

              Calculate(&kor[0],&eng[0],&sum[0],3);

              Output(&kor[0],&eng[0],&sum[0],3);

 

              return 0;

}

 

void Input(int *kor,int *eng, int total)

{

              int i;

 

              for(i=0;i<total;i++) {

                             cin>>*kor>>*eng;

                             kor++;

                             eng++;

              }

}

 

void Calculate(int kor[],int eng[], int sum[], int total)

{

              int i;

              for(i=0;i<3;i++)

                             sum[i]=kor[i]+eng[i];

}

 

void Output(int kor[],int eng[], int sum[], int total)

{

              int i;

              for(i=0;i<3;i++)

                             cout<<kor[i]<<"+"<<eng[i]<<"="<<sum[i]<<endl;

}

 

처음

   

과제1

예제2 참조하여 아래 메트릭스의 합을 구하는 프로그램을 만드시오.

과제2

예제3 프로그램을 완성하시오.

중요함수