본문 바로가기
cs/CS50

3: 배열-3(메모리와 배열:전역변수)

by 이쟝 2021. 11. 25.

3. 메모리

c에는 아래와 같은 여러 자료형이 있고, 각각의 자료형은 서로 다른 크기의 메모리를 차지함

bool: 불리언, 1바이트(8비트)
char: 문자, 1바이트
int: 정수, 4바이트(32비트)
float: 실수, 4바이트
long: (더 큰) 정수, 8바이트(64비트)
double: (더 큰) 실수, 8바이트
string: 문자열, ?바이트

 

RAM이라고 하는 칩이 메모리 역할을 함

사진에서 여러 개의 노란색 사각형이 메모리를 의미하고, 작은 사각형 하나가 1바이트를 의미함

예) char 타입의 변수를 하나 생성하고, 그 값을 입력한다고 하면 한 사각형 안에 그 변수의 값이 저장됨

*string은 선언할 때 " "(큰따옴표로) / char은 '  '(작은따옴표로)


4. 배열

예) 세 개의 점수를 저장하고 그 평균을 출력하는 코드 짜기

 

#include <cs50.h>
#include <stdio.h>
int main(void){
    //Scores
    int score1 = 73;
    int score2 = 86;
    int score3 = 99; 
    //Print average
    printf("Average: %i\n",(score1+score2+score3)/3);
}

 

만약 점수의 개수가 더 많아지면 많은 부분을 수정해줘야 함 이때 활용할 수 있는 것이 배열의 개념!

배열은 같은 자료형의 데이터를 메모리상에 이어서 저장하고 이를 하나의 변수로 관리하기 위해 사용함

위 코드를 배열을 이용해 바꾸게 된다면?

 

#include <cs50.h>
#include <stdio.h>
int main(void){
    //Scores
    int scores[3];
    scores[0] = 73;
    scores[1] = 86;
    scores[2] = 99; 
    //Print average
    printf("Average: %i\n",(scores[0]+scores[1]+scores[2])/3);
}

 

  • Int scores[3]; 은 int 자료형을 가지는 크기 3의 배열을 scores라는 이름으로 생성하겠다는 의미(세 개의 값을 하나의 변수에 저장하기 위한 공간을 의미)
  • 배열의 인덱스는 0부터 시작해서, scores의 인덱스는 0,1,2, 세 개가 있음
  • 이 인덱스를 변수명 뒤 대괄호 [ ] 사이에 입력해 배열의 원하는 위치에 원하는 값을 저장하고 불러올 수 있음

전역 변수

전역 변수(global variable): 함수 바깥에서 선언하는 변수

- 어떤 변수에 특정 값을 지정하고 바꾸고 싶지 않다면 main 함수 바깥에 const를 사용해 상수를 선언!

- const로 해당 변수를 상수로 지정하면, clang 컴파일러는 값을 바꾸지 않도록 해 줌

- 상수는 변하지 않는 값(상수를 선언할 때는 항상 대문자로!)

 

#include <cs50.h>
#include <stdio.h>

const int N = 3;

int main(void){
    //Scores
    int scores[N];
    scores[0] = 79;
    scores[1] = 88;
    scores[2] = 99; 
    //Print average
    printf("Average: %i\n",(scores[0]+scores[1]+scores[2])/3);
}

 

- 상수는 한 번 값을 지정해 놓고 까먹은 뒤에 다시 값을 바꿀 때 코드를 컴파일링 하기 전 값을 수정하기에 편리함(코드 맨 위에 있어서 코드를 살펴볼 필요가 없음)

- 여기서 전역 변수는 N이다!

- scores의 크기로 전역 변수를 선언했기 때문에 점수 개수가 바뀌었을 때 수정해야 하는 코드가 줄었지만 일일이 배열의 인덱스마다 점수를 지정해야 해서 불편함

 

배열의 동적 선언 및 저장

 

#include <cs50.h>
#include <stdio.h>

//평균을 계산하는 함수의 프로토타입
float average(int length, int array[]);

int main(void){
    //사용자로부터 점수의 개수 입력
     int n = get_int("number of scores: ");
    //점수 배열 선언 및 사용자로부터 값 입력받기
     int scores[n];
     for(int i=0;i<n,i++)
     {
         scores[i] = get_int("Score %i: ", i+1); //i는 0부터 시작하기 때문에 +1을 더해줌
     }
    //평균 출력 //소수점 첫번째 숫자까지만 나타내기 위해(.1f) //n은 배열의 길이, scores는 배열이름
    printf("Average: %.1f\n", average(n, scores));
}
//평균을 계산하는 함수
float average(int length, int array[])
{
    sum = 0; //배열을 다 더해주고 길이만큼 나눠 주기
    for(int i=0;i<length;i++)
    {
        sum += array[i];
    }
    return (float)sum/(float)length; //소수점이 나올 수 있기 때문
}

 

- 배열의 크기를 사용자에게 직접 입력받고, 배열의 크기만큼 루프를 돌면서 각 인덱스에 해당하는 값 역시 사용자에게 동적으로 입력받아 저장함

- average라는 함수를 따로 선언해 평균을 구함

- average 함수는 length와 array [ ], 즉 배열의 길이와 배열을 입력으로 받음. 함수 안에서는 배열의 길이만큼 루프를 돌면서 값의 합을 구하고 최종적으로 평균값을 반환함

 

https://www.boostcourse.org/cs112/joinLectures/41307

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org

 

'cs > CS50' 카테고리의 다른 글

3: 배열-5(문자열의 활용)  (0) 2021.11.28
3: 배열-4(문자열과 배열)  (0) 2021.11.27
3: 배열-2(버그와 디버그)  (0) 2021.11.25
3: 배열-1(컴파일링)  (0) 2021.11.25
2: C언어-6(오버플로우)  (0) 2021.11.24