3. 메모리
c에는 아래와 같은 여러 자료형이 있고, 각각의 자료형은 서로 다른 크기의 메모리를 차지함
bool: 불리언, 1바이트(8비트) char: 문자, 1바이트 int: 정수, 4바이트(32비트) float: 실수, 4바이트 long: (더 큰) 정수, 8바이트(64비트) double: (더 큰) 실수, 8바이트 string: 문자열, ?바이트 |
사진에서 여러 개의 노란색 사각형이 메모리를 의미하고, 작은 사각형 하나가 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
'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 |