728x90
반응형
컴파일링
컴파일링은 4단계로 나눌 수 있다.(전처리 → 컴파일 → 어셈블 → 링크)
전처리(Preprocessing)
- #으로 시작되는 C 소스 코드는 전처리기에게 실질적인 컴파일이 이루어지기 전에 무언가를 실행하라고 알려줌
#include <stdio.h>
#include <cs50.h>
컴파일(Compiling)
- 전처리한 소스코드를 어셈블리어라는 저수준 프로그래밍 언어로 컴파일함
(컴퓨터가 이해하도록 하기 위해서)
어셈블(Assembling)
- 어셈블리 코드를 CPU가 이해할 수 있도록 오브젝트 코드로 변환함
(연속된 0과 1로 이루어진 명령어 형태)
링크(Linking)
- 여러 개의 다른 오브젝트 코드 파일을 실행 가능한 하나의 오브젝트 코드 파일로 합쳐줌
디버깅
버그(Bug)
코드에 들어있는 오류
디버깅(Debugging)
디버거 프로그램 통해 코드에 있는 버그를 식별하고 고치는 과정
- 중지점(중단점 : Breaking Point) : 프로그램이 멈추는 특정 지점
❗ 행의 좌측을 클릭하여 중단점 설정 가능
코드의 디자인
check50 : 코드를 테스트해서 코드의 정확성을 측정함
style50 : 작성한 코드를 심미적으로 잘 작성돼 있는지 검사함
(작동상 문제는 없음)
고무오리 : 고무오리 같은 무언가 대상이 되는 물체를 앞에 두고, 작성한 코드를 말로 설명해주는 과정을 거쳐 논리적 오류를 찾아낼 수 있음
배열
메모리
- bool : 불리언, 1바이트 (참 / 거짓)
- char : 문자, 1바이트 (작은 따옴표 ’ ’ 사용)
- int : 정수, 4바이트
- float : 실수, 4바이트
- long : (더 큰) 정수, 8바이트
- double : (더 큰) 실수, 8바이트
- string : 문자열, ?바이트 (큰 따옴표 ” “ 사용)
형변환(Casting)
#include <stdio.h>
int main()
{
char c1 = 'H';
char c2 = 'I';
char c3 = '!';
//char 에서 int로 형변환
printf("%i %i %i \n", (int) c1, (int) c2, (int) c3);
}
//72 73 33 출력
배열
#include <cs50.h>
#include <stdio.h>
float average(int length, int array[]);
int main(void)
{
// 사용자로부터 점수의 갯수 입력
int n = get_int("Scores: ");
// 점수 배열 선언 및 사용자로부터 값 입력
int scores[n];
for (int i = 0; i < n; i++)
{
scores[i] = get_int("Score %i: ", i + 1);
}
// 평균 출력
printf("Average: %.1f\n", average(n, scores));
}
//평균을 계산하는 함수
float average(int length, int array[])
{
int sum = 0;
for (int i = 0; i < length; i++)
{
sum += array[i];
}
return (float) sum / (float) length;
}
- 배열은 0부터 시작
- N이 고정된 값(상수)이라면 그 값을 선언할 때 const를 앞에 붙여서 전역 변수
(관례적으로 이런 전역 변수의 이름은 대문자로 표기) - 정수끼리 계산을 하면 결과는 소수점을 버리고 정수로 나옴
문자열과 배열
문자열(string) : 문자(char) 자료형의 데이터들의 배열
\0
: 널 종단 문자(문자열의 끝을 나타냄)
string names[4];
names[0] = "EMMA";
names[1] = "RODRIGO";
names[2] = "BRIAN";
names[3] = "DAVID";
printf("%s\n", names[0]);
//2차원 배열
//names[인덱스 방 번호][특정 위치]
printf("%c%c%c%c\n", names[0][0], names[0][1], names[0][2], names[0][3]);
문자열의 활용
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
string s = get_string("Input: ");
printf("Output:\n");
for (int i = 0, n = strlen(s); i < n; i++)
{
printf("%c\n", s[i]);
}
}
#include <cs50.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
string s = get_string("Before: ");
printf("After: ");
for (int i = 0, n = strlen(s); i < n; i++)
{
printf("%c", toupper(s[i]));
}
printf("\n");
}
strlen()
: 문자열의 길이를 반환하는 함수
toupper()
: 대문자로 변환하는 함수
명령행 인자
#include stdio.h>
#include <cs50.h>
// void는 명령행 인자값이 없을 때 사용, 생략 가능
int main(void)
{
}
#include <cs50.h>
#include <stdio.h>
// 명령행 인자값으로 정수형 argc와 문자열 배열인 argv를 갖는다.
int main(int argc, string argv[])
{
if (argc == 2)
{
printf("hello, %s\n", argv[1]);
}
else
{
printf("hello, world\n");
}
}
argc
: main 함수가 받게될 입력의 개수
argv[]
: 입력이 포함되어 있는 배열
(argv[0]은 기본적으로 프로그램의 이름으로 저장됨)
728x90
반응형
'CS50 정리' 카테고리의 다른 글
CS50 6강[자료구조] (2) | 2024.02.25 |
---|---|
CS50 5강[메모리] (0) | 2024.02.21 |
CS50 4강[알고리즘] (0) | 2024.02.20 |
CS50 2강[C언어] (0) | 2024.02.20 |
CS50 1강[컴퓨팅 사고] (2) | 2024.02.20 |