포인터 변수의 활용( return 값 두개이상 받기 )
void Increase(int* a, int* b)
{
*a += 1;
*b += 1;
}
void Insert(int* a, int* b)
{
*a = 100;
*b = 100;
}
int main()
{
int num1 = 10;
int num2 = 20;
Increase(&num1, &num2);
return 0;
}
C++
복사
배열을 인자로 함수에 넘기기
배열도 결국 다수의 int 변수의 나열이기 때문에 모든 변수의 주소를 보낼 필요가 없고
시작 주소 하나만 보내면된다. 즉 int arr[0]의 주소만 보내면 된다. 결국 int변수 주소를 보내는 샘과 같다.
여기서 특징은 주소값에 덧셈을 하면 실제 사칙연산이 아니라 포인터 변수의 주소 자료형의 데이터 크기만큼 증가해서 배열처럼 사용이 가능하다.
#include <iostream>
#include <map>
void bbq(/*int* pArr*/ int pArr[10])
{
*(pArr) = 100; //pArr[0]
*(pArr + 1) = 100; // pArr[1]
*(pArr + 2) = 100; // pArr[2]
*(pArr + 3) = 100;
*(pArr + 4) = 100;
*(pArr + 5) = 100;
*(pArr + 6) = 100;
*(pArr + 7) = 100;
*(pArr + 8) = 100;
*(pArr + 9) = 100; // pArr[9]
pArr[0] = 100;
pArr[1] = 100;
pArr[2] = 100;
pArr[3] = 100;
pArr[4] = 100;
pArr[5] = 100;
pArr[6] = 100;
pArr[7] = 100;
pArr[8] = 100;
pArr[9] = 100;
}
int main()
{
int vect[10] = {};
// 배열의 이름이 해당 배열의 첫번째 변수의 주소와 같다.
// 그말인즉슨 배열이름은 곧 배열의 시작두소이다.
bbq(/*&vect[0]*/ vect);
return 0;
}
JavaScript
복사
포인터 변수를 활용하는 제일 큰 이유는 배열 전체를 복사해서 전달인자로 넘기면 배열의 크기만큼의 변수가 복사를 해야하지만 배열의 주소만 보내면 8바이트(64bit) 만 복사하면 끝난다.
다만 *(pArr + 1) 이런 방식으로 사용하면 상당히 코드를 작성하는데 불편하다.
그래서 문법상 포인터변수는 배열처럼 바로 사용이 가능하다.
다만 주의해야 할 점이 전달된 배열의 크기를 넘어가지 않게 주의해서 사용해야 한다.
배열에 이름은 해당 배열의 시작 주소이다. 그래서 이름을 전달인자로 넘겼을시에 복사가 되는것이 아니라 원본이 그대로 넘어간다. (주의해야한다)
void Increase(int pArr[7])
{
for (int i = 0; i < 7; i++)
{
pArr[i]++;
}
}
int main()
{
int arr[7] = { 123, 42, 2, 66, 7, 9, 10 };
Increase(arr);
return 0;
}
C++
복사
그래서 조사식에서 배열에 이름을 넣으면 값에 주소가 보여진다.
2차원 배열을 포인터 변수로 전달해야할 때는 문법이 약간 다르다.
void kfc2D(int(*pArr2D)[3]/*int pArr2D[3][3]*/)
{
pArr2D[0][0] = 100;
pArr2D[0][1] = 100;
pArr2D[0][2] = 100;
pArr2D[1][0] = 100;
pArr2D[1][1] = 100;
pArr2D[1][2] = 100;
pArr2D[2][0] = 100;
pArr2D[2][1] = 100;
pArr2D[2][2] = 100;
}
void kfc(int* pArr /*int pArr[3]*/)
{
pArr[0] = 100;
pArr[1] = 100;
pArr[2] = 100;
}
int main()
{
int arr[3][3] = {};
//int** pArr2D = arr; 틀리다.
int(*pArr2D)[3] = arr; //이렇게 해야한다.
// 보통은 1차원배열로 여러번 나누어서 2차원배열을 사용한다.
// 그러한 가장 큰 이유는 가독성 ( 하나의 함수는 하나의 일만 하도록 만들어야 한다. )
kfc2D(arr);
kfc(arr[0]);
kfc(arr[1]);
kfc(arr[2]);
return 0;
}
JavaScript
복사
최대값 최소값 찾기
#include <iostream>
#include <map>
int main()
{
int vect[10] = { 1,2,3,4,5,6,7,8,9,10 };
int max = 0;
int min = 987654321;
int maxIdx = -1;
int minIdx = -1;
for (int i = 0; i < 10; i++)
{
if (max < vect[i])
{
max = vect[i];
maxIdx = i;
}
if (min > vect[i])
{
min = vect[i];
minIdx = i;
}
}
return 0;
}
JavaScript
복사
2차원 배열에서 최소,최대값 위치 기억하기
int vect[3][3] =
{
3, 4, 1,
5, 5, 7,
8, 3, 2,
};
int min = 987654321;
int dy = 0;
int dx = 0;
for (int y = 0; y < 3; y++)
{
for (int x = 0; x < 3; x++)
{
if (vect[y][x] < min)
{
min = vect[y][x];
dy = y;
dx = x;
}
}
}
C++
복사
연습문제
문제 1번
main함수에서 숫자2개를 입력받고, ABC 함수에 입력받은 값을 전달 해 주세요
ABC 함수는 전달받은 숫자 2개의 합과 곱을 계산 해 주는 함수입니다
[TIP] 특정 함수에서 숫자 여러개 return 해주기
일반적으로 함수는 한 개의 숫자만 return 할 수 있습니다.
void ABC( )
{
return 5;
}
아래와 같이 짜면 에러가 발생하지요
void ABC( )
{
return 5, 6; //에러 , return 에 값 두개를 쓸 수 없습니다
}
값을 2개 이상 돌려주는 방법은
1. return 대신 전역변수를 쓴다
2. return 대신 포인터를 쓴다
이렇게 두 가지 방법이 있습니다.
입력 예시
5 6
출력 예시
11 30
문제 2번
다음 배열을 전역배열로 하드코딩 해 주세요
A | D | F |
Q | W | E |
Z | X | C |
main 함수에서 찾을 문자를 입력받고, Find함수에 입력받은 문자를 보내주세요. (Find함수 호출)
Find함수에서는 전달 받은 문자가 있는 좌표를 찾아주세요
main함수에서 Find함수가 찾은 좌표를 출력 해 주세요
(전역변수를 사용하지 말고 포인터를 사용해서 문제를 풀어주세요)
입력 예시
F
출력 예시
0,2
문제 3번
한 문장을 main함수에서 입력 받아주세요
stringLen이라는 함수를 만들고, 입력받은 문장을 stringLen으로 전달 해 주세요 (함수 호출)
stringLen함수에서 전달받은 문장의 길이를 구하고 문장의 길이를 return 해 주세요
main에서는 문장의 길이를 출력하면 됩니다.
입력 예시
BBQWORLD
출력 예시
8글자
문제 4번
main함수에서 KFC함수를 호출 해 주세요
KFC함수에서는
- 한 문장 (최대 10글자)을 입력받아주세요
- 그 문자에서 대문자 / 소문자가 각각 몇개인지 Counting 해 주세요
main 함수에서는 KFC함수에서 구한 대/소문자 갯수를 각각 출력 해 주세요
(전역배열 / 전역변수를 사용하지 말고, 포인터를 이용 해 주세요)
입력 예시
MINcoding
출력 예시
대문자3개
소문자6개
문제 5번
•
전역변수를 사용하지 않고, 포인터를 활용해서 문제입니다
아래의 배열을 전역으로 선언 및 하드코딩 해 주세요
4 | 5 | 6 | 1 | 3 | 1 |
2 | 1 | 3 | 6 | 3 | 6 |
Input함수에서 좋아하는 숫자 3개를 입력받아주세요
Process함수에서는 좋아하는 숫자가 각각 몇개인지 Counting 해 주세요
Output함수에서는 좋아하는 숫자의 갯수를 출력 해 주세요
[TIP] argument
숫자 4개를 받는 함수 ABC가 있다고 한다면,
ABC함수를 호출하기 위해서 이렇게 쓸 수 있습니다
ABC(1, 2, 3, 4);
여기서 보내는 값인 1, 2, 3, 4를 argument(아규먼트)라고 부릅니다
•
> ABC함수를 호출하기 위해서는 argument 4개를 써야 합니다
[HINT] 이 문제를 풀기 위해서는
input함수는 argument가 3개 (포인터 3개) 를 써야합니다
ex) main함수에서 input(&a, &b, &c);
process함수는 argument가 6개 (변수3개, 포인터3개) 를 써야합니다
ex) main함수에서 process(a, b, c, &r1, &r2, &r3);
output함수는 argument가 6개를 써야합니다
ex) main함수에서 output(a, b, c, r1, r2, r3);
입력 예시
1 2 3
출력 예시
1=3개
2=1개
3=3개
문제 6번
아래 2차배열을 하드코딩해주세요
이 2차배열은 문자가 들어있기 때문에 int가 아니라 char 2차 배열 입니다.
전부 문자열 처리하여 하드코딩하면 됩니다.
0 ~ 9 사이의 숫자를 입력받고, 그 숫자가 존재하는 해당하는 칸을 찾으세요
그리고 그 칸에 써있는 알파벳을 출력 해 주세요
4 | 5 | 7 | 1 | 3 | 2 |
D | F | Q | W | G | Z |
ex) 숫자 3을 입력받으면, 숫자 3의 위치를 먼저 찾아주세요
그리고 그 숫자 밑에있는 알파벳 G를 출력하시면 됩니다
입력 예시
1
출력 예시
W
문제 7번
•
전역배열 / 전역변수를 쓰지 않고 푸는 문제입니다
main함수에서 문장 2개를 입력받으세요
그리고 2개의 문장을 FindABC 함수로 전달 해 주세요
FindABC 함수에서는 대문자 A / 대문자B / 대문자 C를 각각 Counting하는 함수입니다
main함수에서는 FindABC함수를 통해서 구한 A, B, C의 개수를 출력 해 주세요
입력 예시
A_ShowABC
ABCDEFG
출력 예시
A:3
B:2
C:2
문제 8번
아래와 같은 구조체를 먼저 정의 해 주세요
구조체 변수 int1, int2 를 만들어 주세요
이 구조체 변수에 들어갈 내용을 입력 받고
평균을 구해서 출력 해 주세요
name = char 배열
age = int 변수
weight = int 변수
[TIP] 정의하다 라는 뜻
1. 함수 정의
함수를 호출하려면 함수를 미리 만들어 놔야 합니다.
함수를 미리 만들어 두는 것을 "함수를 정의하다" 라고 표현합니다
2. 구조체 정의
구조체 변수를 만드려면 미리 구조체 Type을 만들어 두어야 합니다
구조체 Type을 미리 만들어 두는 것을 "구조체 정의하다" 라고 표현합니다
구조체 변수를 만드는 것은 "선언하다" 라고 부릅니다.
정의하다 vs 선언하다 이 단어를 구분할 줄 알아야 합니다.
"정의하다"라는 용어 알아두세요!
입력 예시
JASON
35
80
TOMS
20
40
출력 예시
JASON & TOMS
평균27세
평균60KG
문제 9번
아래 배열을 전역으로 하드코딩 해 주세요
(전역변수를 쓰지않고 푸는 문제입니다)
D | A | S |
Q | W | V |
R | T | Y |
main함수에서
- 좌표 2쌍(숫자 4개) 입력 받아주세요 (y축, x축)
- Find함수를 호출하는데 입력받은 숫자를 넘겨주세요
Find함수는 좌표 2쌍에 해당하는 값을 찾아주는 함수입니다
main함수에서 좌표에 해당하는 값을 출력 해 주세요
입력 예시
0 2
1 1
출력 예시
S W
문제 10번
아래 표는 나라별 거리를 나타낸 표 입니다
알파벳은 나라를 의미합니다
A 나라에서 E 나라까지 가려면 B, C, D를 거쳐야 합니다
따라서 거리는 2 + 5 + 1 = 8 이 됩니다
민스는 지효를 만나기 위해 얼마나 멀리 떨어져 있는지 알아보려고 합니다
민스가 있는 나라와, 지효가 있는 나라를 입력 받고
두 사람의 거리를 계산해서 출력 해 주세요
ex) 만약 E B를 입력받았다면
E와 B 사이에 D와 C가 있으니까 1 + 5 = 6 이 정답입니다
[힌트] 알파벳을 인덱스로 바꾸는 방법
char ch1, ch2;
cin >> ch1 >> ch2;
int aIndex = ch1 - 'A';
int bIndex = ch2 - 'A';
입력 예시
E B
출력 예시
6
문제 11번
1x5 배열 A, B, C 3개를 만들고 숫자 15개를 입력 받으세요.
배열 A와 배열 B의 각각 같은 index값 끼리 곱을 합니다.
그리고 배열 C칸과 같은 index끼리 합을 구한 결과를 출력 하세요.
ex)
입력: => 출력: 10 17 10 15 67
3 5 1 2 7
1 2 1 5 9
7 7 9 5 4
입력 예시
3 5 1 2 7
1 2 1 5 9
7 7 9 5 4
출력 예시
10 17 10 15 67
문제 12번
3 | 4 | 1 | 6 |
3 | 5 | 3 | 6 |
5 | 4 | 6 | 0 |
위 배열을 하드코딩 해 주세요
현재 세번째 Line은 비어져 있습니다.
숫자 4개를 for문으로 입력받고, 세번째 Line을 채워주세요
For문을 돌려서
MAX와 MIN값을 찾아내고, 각 MAX와 MIN값의 좌표를 출력 해 주세요
ex) 9 2 1 1 을 입력하였다면 아래와 같이 배열이 만들어집니다
3 | 4 | 1 | 6 |
3 | 5 | 3 | 6 |
9 | 2 | 1 | 1 |
5 | 4 | 6 | 0 |
그리고 MAX는 9, MIN값은 0 입니다
가장 빨리 찾아지는 MAX와 MIN값의 좌표를 출력하면 됩니다
입력 예시
9 0 1 1
출력 예시
MAX=9(2,0)
MIN=0(2,1)