[자료구조] : 배열과 포인터[주사, 난수]

지환·2022년 2월 9일
0

자료구조

목록 보기
3/38
post-thumbnail

출처 | DO IT 자료구조와 함께하는 알고리즘 입분

배열과 포인터

  • 배열을 사용하면 반드시 나오는 개념은 포인터다. 이전에 포인터에 대한
    내용은 많이 다뤘기 떄문에 설명은 생략하겠다.
  • *핵심 ) 포인터 p가 배열의 요소 e를 가리킬 때,
    1. 요소 e의 i만큼 뒤쪽의 요소를 나타내는 *(p+i)는 == p[i];
    2. 요소 e의 i만큼 앞쪽의 요소를 나타내는 *(p-i)는 == p[-i];

p는 a를 가리키고 있고 a[3]에 접근하는 식을 구해라 라고 가정하면,

배열의 각 요소에 접근하는 식(*)
a[i], *(a+i), p[i], *(p+i)
아래 4개의 식은 배열의 각 요소를 가리키는 포인터(&)
&a[i], a+i, &p[i], P+i 같은 의미다.

공백 포인터 NULL

  1. 객체 포인터, 함수 포인터와는 다른 개념이다.
  2. 모든 포인터형으로 형 변환이 가능하고, 결과는 NULL 포인터다.
  3. NULL의 정의는 = 값 0을 갖는 모든 정수, 상수다.

헤더파일 정리 : <stddef.h> , <stdio.h>, <stdlib.h>, <stlib.h>, <time.h>

배열의 최대값을 구하는 아이디어

max = a[0];
if(a[1] > max) max = a[1];
if(a[2] > max) max = a[2];

요소의 개수가 3이면 if문 2개를 작성한다. 
계속 이어나가면 if문은 n-1개 작성한다.
정리하면,

max = a[0];
for(int i = 0; i < n; i++)
{
    if(a[i]>max) max = a[i];

}

<배열 요소의 최댓값을 구하는 함수를 구해보자>

//배열 요소의 최댓값을 구하는 함수 

#include <stdio.h>

//const 함수는 값을 고정시키는 문법이다. 변수의 초기값을 변경할 수 없게 만든다.
int max(const int a[], int n) // int *a[0] = age
{
	int i;
	int max = a[0]; 
	for (int i = 0; i < n; i++)
	{
		if (a[i] > max) max = a[i];
	}
	return max;

}


int main()
{
	int i, * age, number;
	printf(" 사람 수를 입력하세요 : ");
	scanf_s("%d", &number);
	age = calloc(number, sizeof(int));
	printf("%d 사람의 나이를 입력하세요 : \n", number);
	for (int i = 0; i < number; i++)
	{
		printf("age[%d] : ", i);
		scanf_s("%d", age + i);
	}
	printf("최댓값은 %d입니다.\n", max(age, number));
    free(age);

}
  1. 함수 선언에서 매개변수의 배열 표기(a[])는 배열이 아니라 포인터를 선언 하는 것과 같다.
  2. max 함수를 호출하면 전달된 포인터 age(&age[0])에서 매개변수 a가 초기화된다. 포인터 a는 age[0]의 주소를 가리키게 된다.

<결과>

다음은 난수에 대해 알아보겠다.

<난수를 사용해 배열의 요솟값을 설정해보자>

#include <time.h>
#include <stdio.h>
#include <stdlib.h>


int maxof(const int a[], int n)
{
	int i;
	int max = a[0];
	for (int i = 0; i < n; i++)
	{
		if (a[i] > max) max = a[i];
	}
	return max;
}

int main()
{
	int* age, i, number;
	printf("사람 수 : ");
	scanf_s("%d", &number);
	age = calloc(number, sizeof(int));
	srand(time(NULL));
	for (i = 0; i < number; i++)
	{
		age[i] = 100 + rand() % 90;
		printf("age[%d] = %d\n", i, age[i]);
	}
	printf("최댓값은 %d입니다. \n", maxof(age, number));

	free(age);


	return 0;

}
  1. 추가적으로 srand 함수가 사용됐다.
    age[i] = 100 + rand() % 90; ( 100~189까지 난수가 생성됐다.)

※ 참고
난수의 생성단계를 요악했다.

  • rand함수, srand함수, time 함수의 선언이 들어 있는 헤더파일을 포함시킨다.
  • 난수의 srand(씨앗)를 초기화하기 위해 srand 함수를 호출한다.
  • 난수를 생성하기 위해 rand 함수를 호출한다.

<결과>

난수의 생성과 관련된 예제를 보겠다. 2개의 난수를 생성해보자.

#include <stdio.h>
#include <stdlib.h>

x = rand();
y = rand();
printF(" x 값은 %d값이고, y값은 %d입니다.", x, y);
  • x와 y는 다른 값을 출력한다. 이와 같은 다른 값도 컴퓨터 환경에선 정해져있다. 왜냐하면 rand 함수는 seed를 활용해 난수를 생성하기 때문이다.
srand(50);라고 seed의 값을 50으로 설정
1. rand함수가 seed의 값을 기준으로 값을 정한다. 
2. 이런 문제를 해결하기 위해 srand 함수는 매개변수가 (random) 임의의 난수여야한다.
3. 대표적인 방법은 srand 함수에 time 현재 시간의 값을 주는 방법이다.

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

srand(time(NULL));
x = rand();
y = rand();
printf("x 값은 %d이고 y값은 %d이다.\n", x, y);
  • time 함수가 반환하는 것은 현재 시간이다. 따라서 프로그램을 실행할 때마다 시간이 달라지고, 현재 시간의 값을 seed로 전달하면 난수도 무작위로 바뀌게 된다.

다음 시간에는 배열의 요소를 역순으로 출력하는 예제를 살펴보겠다.

profile
아는만큼보인다.

0개의 댓글