[컴퓨터 과학 cs50] 배열(2) 좀 더 동적으로 만들 순 없을까?

2021. 1. 29. 22:52컴퓨터과학/cs50

반응형

전역변수

const int N = 3; //변수명은 대문자로 적어야 N이라는 값을 사용할 수 있다.

관습에 따라 n은 소문자가 아니라 대문자로 쓴다.

 

 

상수는 말 그대로 변하지 않는 것이다!

const로 해당 변수를 상수로 지정하면, clang 컴파일러는 여러분이나 다른 사람들이 실수로 그 값을 바꾸지 않도록 해준다. 그럼 이제 n을 어디에 사용하든 언제나 같은 값을 가진다. 이를 전역 변수라 한다.

함수 바깥에서 선언하는 변수를 말한다. 엉성해 보이지만 상수는 예외이다.

상수는 우리가 한 번 값을 지정해 놓고 까먹은 뒤에 몇 주, 몇 달 뒤에 찾아와서 과제 수가 4개나 5개로 바뀌었다면, 코드를 컴파일링하기 전 값을 수정하기에 편리하다. 이유는 코드 맨 위에 있기 때문이다! 그래서 코드를 막 살펴 볼 필요가 없다!

 

하지만, 여전히 일일히 배열의 인덱스마다 점수를 지정해줘야하는 불편함이 있다!

 

 

배열의 동적 선언 및 저장

 

for루프와 함수를 선언하여 좀 더 동적인 프로그램을 작성할 수 있습니다.

 

1. int n에 get_int함수를 사용해서 점수의 갯수를 값으로 받고,

2. scores라는 배열을 만들어서 배열의 크기를 n으로 설정한다. 

3. for 루프를 만들어서 사용자에게 i번째 점수를 계속해서 물을 수 있다.

 

i는 0부터 시작해서 n직전까지 세기 때문에 사용자가 요청한 갯수만큼 점수를 입력할 수 있다.

 

 

평균은 소수점이 될 수도 있다! 그럼 어떤 자료형을 사용해야할까~? double이나 float이다!

average라는 함수를 만들고, 사용자가 입력한 값들의 평균을 내기 위해서는 2가지를 알아야한다.

먼저 점수가 들어가는 배열의 길이를 알아야하고, 그 배열 자체도 받아야한다. array[]로 나타낸다!

배열의 크기는 아직모르지만, 컴파일러가 알아서 계산해줄테니 float average(int length, int array[])이렇게 정의한다.

 

우리가 만든 average함수는 맨 아래에 있고, C는 바보 같아서, 위에서 아래로 왼쪽에서 오른쪽으로 시키는 대로만 한다!

average 함수가 아래에 있는데, 그걸 위쪽의 main에서 사용한다는 건 불가능하다는 뜻!

그러면, 우리가 만든 average함수를 main위로 붙여넣기하면 문제가 해결된다!

하지만 그럼 main부분이 아래로 내려가고, 보통은 main이 위에 있는게 좋다! 그래야 보기 편하니까!

 

 

그래서 함수 프로토타입을 사용한다! 유일하게 복사 붙여넣기가 허용되는 순간이다!

함수의 첫줄을 복사해서 붙여 넣은 뒤 중괄호 없이 세미콜론만 붙여준다!

그럼 문제가 해결된다!!

clang에게 함수의 존재를 알리고, 당장 함수를 정의하지는 않겠지만, 적어도 존재 자체는 미리 알려주는 것이다!

 

C에서는 정수를 정수로 나누면?? 정수가 나온다. 하지만 정수는 소수점 뒤에 숫자들을 저장할 수 없다!

따라서 우리의 점수가 99.9점이라도, 소수점 뒤 숫자들은 모두 버려지고, 우리의 점수는 99점이 된다!

이를 고칠 수있는 방법 몇 가지가 있다!

1. 형 변환 기능을 쓰자!

 

 

만약 자바나 파이썬 다른언어로 코딩을 해본 사람은 왜 함수에 배열의 길이를 넣어줘야하는지 궁금할 수 있다!

C의 배열은 스스로의 길이를 기억하지 못한다!

즉, 다른 언어에서는 몰라도, C에서는 이 과정이 필요하다!

 

int를 float이나 다른걸로 나누면 어떻게 될까? 보통은 더 강력한 자료형이 나오게 된다.

그래서 int를 float로 나누게 되면, float를 얻게 된다~!

 

반응형