HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
장지원 페이지/
🗑️
Trash
/
장지원, JANG JIWON
장지원, JANG JIWON
/C언어/
Week1

Week1

2023.06.27 to 2023.07.03

 
 

1. code block project 생성법

생성법
project 생성 : new → project → console application → D: coding에 생성하기 (내가 여기 모든 프로그래밍 자료를 정리해두기 때문에)
 

2. code block 실행법

실행법
: f9를 눌러서 실행할 수 있음. 만약 코드를 수정하고 다시 실행해보고 싶을 때 ? 재활용 화살표(?) 누르고 다시 실행하기 ! (근데,, 실행할 때 30초 걸리는데, 과연 이게 맞는 방법일까,,)
 
앗 환경설정 버튼 눌러야함 ! 재활용 버튼 말고 !!
 

3. code black에서 re-bulid가 느린 이유? , 시간이 30초씩 걸리는 이유

이유 및 해결 방법
 
아직 찾지 못함…
 
음.. 빌드를 하고 나서 첨 실행할 때 시간이 30초씩 걸림 → 이후에는 굉장히 빠르게 실행됨. 뭐지 ㅋㅋ..
 

4. C programming 시작 : 기본 문법

1.변수의 이름
 

개념

 
hello world 출력
#include <stdio.h> int main(void){ printf("hello world"); return 0; } 출력 : hello world계속하려면 아무 키나 누르십시오...
 
사칙 연산 수행
#include <studio.h> int main(void){ int aaa; aaa = 12+34; printf("%d", aaa); return 0; } 출력 : 46계속하려면 아무 키나 누르십시오...
→ int aaa는 변수 할당, 마치는 부분에는 ; 꼭 붙여주어야함.
 
사칙 연산과 줄바꿈
#include <studio.h> int main(void){ int bbb; bbb = 15*12*20; printf("Volume is %d.\n", bbb); return 0; } 출력 : Volume is 3600. 계속하려면 아무 키나 누르십시오...
→ \n은 역슬레쉬, bbb까지 출력 된 이후에 줄 바꿈이 됨. 여기서 마침표는 마침표를 출력하기 위해서 넣은거임. 딱히 이유 없음 !!
 
입력
#include <studio.h> int main(void){ int aaa; int bbb; int ccc; scanf("%d", &aaa) scanf("%d", &bbb) ccc = aaa + bbb print ("%d", ccc); return 0; } 출력 : 64
→ scanf : 입력 받음, &뒤에 있는 변수에 입력이 저장됨
 
입력과 더 나은 출력
#include <studio.h> int main(void){ int aaa; int bbb; int ccc; scanf("%d", &aaa) scanf("%d", &bbb) ccc = aaa + bbb print ("%d + %d = %d\n", ccc); return 0; } 출력 : 21 + 43 = 64
→ 아 ! %d는 숫자를 표현하기 위한 파라미터구나 ! 머 이렇게 이해하면 되지 않을까..
 
C언어에서는 Python과 달리 자료형을 미리 선언해 주어야 함.
변수 여러 개를 한 줄로 선언할 수 있음 → int a,b,c; 이런식으로
initialization : 변수를 선언하면서 값을 바로 저장하는 과정 ex. int a=2,b,c;
%d의 역할 ? : 정수를 출력할 때만 쓰임, 실수형을 출력하고 싶다면 %f, 정수형을 출력하고 싶다면 %c를 넣으면 됨. → 각 type과 맞지 않는 걸 사용한다면 제대로 출력되지 않아 !
변수의 이름은 Python에서 다루었던 것과 동일
 

예제

 
\n 부분이 헷갈려서 이 부분의 예제를 가져와 봄 : 그냥 enter 친다고 생각하면 될 듯? 왜 헷갈린거임 ㄷㄷ
#include <stdio.h> int main(void){ printf("pareto Principle:\n80 percent of the outputs"); printf("comes\nfrom 20 percent of the inputs. \n"); return 0; } 출력 : pareto Principle: 80 percent of the outputscomes from 20 percent of the inputs.
2.조건문
 

개념

 
if문을 사용하는 이유, 큰 범주에서의 사용법은 Python에서와 같음
차이점이 있다면 파이썬에서는 ‘:’로 코드블럭을 구분해주는데, C에서는 ‘{}’로 코드블럭을 구분해줌
 
if문 기본 예제
#include <stdio.h> int main(void){ int aa; scanf("%d", &aa); if(aa>99) # 중괄호로 묶어주는 부분에서는 따옴표를 쓰지 않는듯? { printf("Your grade is A.\n"); } return 0; }
따옴표 어디 쓰고 어디 안쓰는지 중요히 보기 !!
 
기본 관계 연산자는 ==, <, > (파이썬에서와 같음)
단, and ⇒ &&, or ⇒ ||, not ⇒ ! 쓴다는 점에서 차이점 가지고 있음 (not은 파이썬과 동일)
 
조건문에서의 기본 관계 연산자
#include <stdio.h> int main(void){ int x; scanf("%d",&x); if ((2<x) && (x<5)) { printf("OK"); } return 0; }
조건문 쓸 때 괄호 쳐주기 중요 !! 와.. 무조건 “ 써주어야해 !! ‘ 이거 쓰면 안됨..
 
중첩 조건문 (nested of)
# include <stdion.h> x = 60 if (x > 50){ if (x > 80){ printf("%d is greater than 80\n", x); } else { printf("%d is etween 50 and 80\n", x); } return 0; }
조건을 추가로 주고 싶다면, elif 대신 else if를 사용
중괄호 잘 사용하기 !! 파이썬에서는 :과 tab으로 코드블럭 쉽게 나타내었지만 여기서는 그렇지 않아 !!
 
조건 연산자를 통한 조건문 구현 → 파이썬에서 list comprehension, lambda function 처럼 간단히 표현하는 방법
형식은 “조건 ? 식1 : 식2” 와 같이 사용함. 조건이 맞다면 식1, 조건이 틀리다면 식2 수행
 
조건 연산자
# include <stdio.h> int main(void){ int a,b,c; scanf("%d",&a); scanf("%d",&b); c = (a>b) ? a : b; printf("%d\n",c); return 0; }
 

예제

 
귀찮으니 적지 않겠음
3.반복문
 

개념

 
while 문 : 파이썬에서와 동일
#include <stdio.h> int main(void){ int i; i = 0; while (i<5) { printf("****\n"); i = i+1 # i += 1 처럼 쓸 수 있고, i = ++i 처럼 쓸 수도 있음 (아, 이거 ++i, i++랑 헷갈린다.. 전위, 후위 연산자로 부른다고 함..! 우선 아직 쓰지말기 !!) } # c에서는 +=을 연산자의 축약형이 아닌 복합 대입 연산자 라고 부른다고 함 return 0; }
 
while문을 이용해서 1부터 10까지의 합 출력해주는 프로그램 작성
# include <stdio.h> int main(void){ i = 0; # 초기 상태 정의 sum = 0; while i<=10 { sum = sum + i; i = i+1; } printf('%d\n',sum); return 0; }
추가로 입력 받은 수를 더하는 함수를 만들고 싶을 땐 while문 코드블럭 속에 scanf 삽입하면 됨 !
 
for문 : 파이썬에서와 조금은 차이가 있는듯
for(초기 조건; 조건; 증감 연산) 형태를 사용함
파이썬에서는 start, stop, step 이용한 것과 조금은 차이가 있는것 같음 !! C에서는 stop 조건 대신 while문에서 처럼 실행 조건을 줌 !!
특이한 점 : for문의 변수 i도 위에서 정의해 주어야해 !
 
#include <stdio.h> int main(void){ int sum, i; sum = 0; for (i=1; i<=10; ++i) { sum += i; } printf("%d\n", sum); return 0; }
 
break와 continue
#include<stdio.h> void main() { int i; for (i = 0; i <= 100; i++) { if (i == 31) //i가 31과 같지 않을 경우 반복문을 계속 실행 break; //i가 31과 같아질 경우 for문을 탈출 printf("%d \n", i); } }
break문 예시
 
#include<stdio.h> void main() { int i; for (i = 0; i <= 10; i++) { if (i > 3) continue; //i가 3보다 큰 정수가 되면 하단의 printf를 건너뛰고 for (조건식)으로 돌아갑니다. printf("%d \n", i); } }
continue문 예시
 
break와 continue 쓸 때는 {} 중괄호로 묶어주지 않는듯.. 엥 책에는 또 묶어주고 있음 → 기타 반복문 파트에 이거 적어두었음 ! 확인해보기
 
4.중첩 반복문
 

개념

 
놀라운 사실 printf에는 줄 바꿈이 없음 !!
printf(”*”)
printf(”*”) 하면
**이 출력 된다 !!
 
별 대각선으로 출력시키기 (for문 중첩)
# include <stdio.h> int main(void){ int i, j; for (i=0; i<4; ++i) { for (j=0; j<4, ++j) { if (i==j) { printf("*"); } else { printf(" "); } } printf("\n") } }
 
파이썬과 중첩문 쓰는 방식도 비슷함
 
 
5.기타 반복문
 

개념

 
do-while문
 
형식
초기화
do {
반복되는 작업
증감 연산
} while (조건);
 
do-while문 예시
#include <stdio.h> int main() { int i = 0; do // 처음 한 번은 아래 코드가 실행됨 { printf("Hello, world! %d\n", i); // Hello, world!와 i의 값을 함께 출력 i++; // i를 1씩 증가시킴 } while (i < 100); // i가 100보다 작을 때 반복. 0부터 99까지 증가하면서 100번 반복 return 0; }
특별한 경우 제외하고는 안 쓰임. 나중에 필요할 때 찾아보자 ^^
 
쉼표 연산자
두 문장을 한 문장처럼 만들어주는 연산자
 
예를 들어
sum = 0; for (i=1; i <= 10; ++i) { sum += i; } ############################################################# (위 코드와 아래 코드는 동일) for (sum=0, i=1; i<10; ++i) # 이 자리에서 sum과 i를 같이 초기화 시켜주는 거임 { sum += i; }
위처럼 사용할 수 있음 → 음 내가 쓸 일은 없을 듯 .. 너무 헷갈림 .. 그래도 남의 코드 볼 때 이해하기 위해서 알아두기
 
break와 continue문 : 반복 작업을 하다가 break문을 만나면 반복문을 종료하고, continue문을 만나면 반복문 몸체 끝으로 이동함 (파이썬과 동일)
 
break문 예시 / continue문 예시
#include <stdio.h> int main(void){ int a, i; scanf("%d",&a); for(i=2; i<a; ++i) { if(a%i == 0) { break; } printf("%d\n", i); } return 0; }
#include <stdio.h> int main(void){ int a, i; scanf("%d", &a); for (i=2; i<a; ++i) { if(a%i == 0) { continue; } printf("%d\n", i); } return 0; }
continue문이 실행되면 printf는 실행되지 않고 바로 다음 for문으로 넘어감 (파이썬과 같음)
 
continue를 악용했을 때(?) 예시
#include <stdio.h> int main(void){ int a, i; scanf("%d", &a); i = 2; while(i<a) { if(a%i == 0) { continue; } printf("%d\n", i); ++i; } return 0; }
이 때 continue가 실행되면, printf와 ++i가 모두 실행되지 않고 넘어가게 됨. 이 때 i가 증가하지 않게 되므로 i값은 계속 그대로 이게 됨 → 무한 루프
 
무한 루프를 활용할 수도 있음
우선 무한 루프 형태를 어떻게 하면 쉽게 구현할 수 있을까?
 
while(1) 이런식으로 무한 루프를 생성할 수 있음
관련 없는 말이지만, for문에서 초기화 자리, 증감 자리 비워둘 수 있음 !! —> ? 안되는데 ? 오류 생기는데 ? 책이 잘못 알려준 건가 ㅋㅋ
 
무한 루프를 이용해서 입력이 음수면 종료하는 프로그램 제작
#include <stdion.h> int main(void){ int a, sum; sum 0; while(1) { scanf("%d", &a); if (a<0) { break; } sum = sum + a; } printf("%d\n", sum); return 0; }
이런식으로 무한 루프를 활용할 수 있음 → 몇 개의 수를 입력 받을지 예상할 수 없기 때문에 이를 이용하는 것임 !1 오 ㄷㄷ 이거 상당히 좋은 아이디어인듯
 
 

5. 자료형과 형변환

1.자료형
 

개념

 
비트와 바이트
컴퓨터는 모든 값은 0이나 1로 저장함 ex. 2 : 00000010 / 65 : 01000001 (더 길게 표현 되지만 설명하기 쉽게 이렇게 나타내겠음)
이 한 자리를 비트라고 하고, 8비트가 모이면 1바이트가 됨 (1bit,b / 1byte,B)
 
더 큰 단위 1KB = 1000B 또는 1024B (컴퓨터는 2의 지수승이 자연스럽기 때문에 두 가지 경우로 나눌 수 있는 것)
1MB = 1000KB 또는 1024KB / 1GB = 1000MB 또는 1024MB
 
💡
1. 정수형
 
대표적으로 int가 있음 → 파생돼서 6개 더 존재
 
signed short int
unsigned short int
signed int
unsigned int
signed long int
unsigned long int
  1. signed vs unsigned
unsigned : 양수만 (이 때 양수는 0 포함 한다고 정의함) 표현할 수 있는 자료형, signed : 음수만 표현할 수 있는 자료형
 
예를 들어 4비트로는 총 16가지의 수를 표현할 수 있음 0~15를 표현할 수도 있고, 8~15를 표현하지 않는 대신 -8~-1을 표현해서 -8~7까지의 수를 표현할 수도 있음
즉 0~2^n-1 또는 -2^(n-1)~2^(n-1)-1 두 가지로 표현 가능함 → signed는 양수 표현 범위를 줄여서 음수를 저장하는 것
 
  1. long vs short
변수 하나가 차지하는 크기를 구별함 short int 는 16비트, long int는 32비트임
C언어에서는 short int는 최소 16비트 long int는 최소 32비트라고 정의하고 있음 int는 16비트 이상 32비트 이하 여야함
그래서 컴퓨터마다 각 자료형의 크기가 다를 수 있음
(생략형 표현에서 signed은 생략 가능, unsigned이라면 붙여주어야 해) short int : 16 비트, int : 32 비트, long int : 32 비트라고 가정할 것
 
 
notion image
 
  1. 정수형의 변환 명세1
C에서는 10진법 뿐만 아니라 8진법 또는 16진법으로도 수를 표기할 수 있음 →
8진법으로 표기하려면 0으로 시작해야함, 0123은 10진수 123이 아니라, 8진수 123임
16진법으로 표기하려면 0x나 0X로 시작해야함, 0x1A1b는 16진수임
 
notion image
 
 
int나 long int로 대부분 설정되어있음
만약 설정되어있지 않은 변수를 long int로 설정하고 싶으면 끝에 L이나 l을 추가해주면 됨 ex. 122L : 이건 long int형의 123임
unsigned형으로 설정하고 싶으면 u,U 붙이면 됨
 
  1. 정수형의 변환 명세2
위 사진으로 첨부한 표 6-6을 보면 10진수 형태 말고도 8, 16진수 형태로 출력시킬 수 있다는 것 확인할 수 있음
++ 각 변환 명세의 앞에 h를 넣으면 short, l을 넣으면 long에 대한 변환 명세가 됨 → 즉, &hu는 short unsigned int에 대한 변환 명세인 것
 
 
notion image
 
변환 명세에는 다양한 출력 형식을 추가해 줄 수도 있음 (%와 변환 명세 기호 사이에 몇 가지를 추가해 줌으로써)
width : 띄어쓰기, %5d는 5자리를 출력해주며 남는 자리는 공백으로 출력시켜줌 → 123456같이 5자리 보다 많은 값을 요구하면 요구하는 만큼 길게 출력시켜줌
flag : 공백 대신 무엇을 출력해줄지 지정해줌 (0, -: 왼쪽 맞춤, +:오른쪽 맞춤 인 줄 알았지만 아님.. 부호 출력해주는 문자임, #:%o나 %x하고만 쓰임)
prescion : 최소 몇 자리 출력시켜줄지
 
이러한 것들은 여러 조합으로 사용될 수 있어
 
💡
2. 실수형
실수형 또는 부동 소수형 이라고 부름 (int와 저장하는 방법이 다름 → 추가 내용은 IEEE 754 표준 등에서 찾아보기)
C에서 실수형은 3가지 종류가 있음
 
float
double
long double
float = 32비트, double = 64비트, long double = 대부분 64비트 추가로 96, 128비트 인 것도 존재 → double로도 충분히 정밀한 계산 할 수 있으므로 long double 사용할 일 거의 없을 듯
 
  1. 실수형 상수
12.34, 0.123등으로 표기 0.123같이 소수점 이상의 값이 0이면 .123과 같이 적어도 됨
상수를 적을 때 12., 12.0과 같이 표기해 주어야 함 (파이썬과 같음)
 
e나 E를 붙여서 실수형 상수를 지수승을 표현할 수도 있음 ex. 12.34e1 = 123.4가 됨, 12e1 = 120.이 됨
 
double : 123.0, float : 123.0f 또는 123.0F, long double : 123.0l → 실수형 상수의 기본형은 double임 float이나 long double을 표현하고 싶다면 앞에 뭐 붙여야해
 
2. 실수형의 변환 명세
%f : 우리에게 익숙한 십진수와 소수점의 형태로 출력, %e,E : 소수점 위의 수를 한 자리로 하고, 나머지는 10의 지수 승으로 곱해줌, %g,G : 컴퓨터에게 출력 형태를 맡김
입력은 어떠한 형태로도 받을 수 있음
 
notion image
 
double/ float를 구분하기 위해 double을 사용하려면 l붙여야함 %lf와 같이, long double은 %LF
 
💡
3.문자형
 
C언어에서는 문자가 정수로 바뀐 후에 저장됨.
 
notion image
 
문자열을 더하고 정수형을 출력하라고 하면 → 아스키 코드로 변환된 값이 출력되게 됨
여기서는 65와 70이 출력된다 !!
 
만약 %d가 아니라 %c를 사용한다면 문자형으로 출력되겠지 ?
 
그래서 C언어에서 정수형과 실수형이 있고, 문자형은 정수형의 일부로써 생각되기도 함
 
notion image
 
이러한 이유로 정수형은 signed, unsigned로 나누어짐 → 오잉.. 근데, 아스키 코드에도 음수가 있나..? signed는 왜 필요한거지?
 
  1. 예제
 
#include <stdio.h> int main(void){ char a; a = 'A'; while(a<='Z') { printf("%d, %c\n", a, a); a++; } return 0; }
65부터 90까지 돌면서 하나씩 출력해줌, %d 숫자, %c 문자 각각 한 번씩 출력해줌 → 65~90, A~Z까지 출력이 될 것
 
💡
4.sizeof
 
sizeof 연산자란? : 어떤 자료형이나 변수의 크기를 바이트 단위로 알려주는 것
 
sizeof() ← 이 속에 원하는 자료형을 넣는 식으로 사용함 (long과 같이 자료형을 적어도 되고, 2/5와 같이 연산을 적어도 됨)
 
sizeof 연산자는 배열이나 동적 할당을 배울 때 많이 쓰일 것임
 
  1. 예제
 
#include <stdio.h> int main() { printf("char: %d, short: %d, int: %d, long: %d, long long: %d\n", sizeof(char), // 1: sizeof로 char 자료형의 크기를 구함 sizeof(short), // 2: sizeof로 short 자료형의 크기를 구함 sizeof(int), // 4: sizeof로 int 자료형의 크기를 구함 sizeof(long), // 4: sizeof로 long 자료형의 크기를 구함 sizeof(long long) // 8: sizeof로 long long 자료형의 크기를 구함 ); return 0; }
요런식으로 활용
 
 
2.형변환
 

개념

 
💡
1. 형변환
 
자료형이 변하는 것
 
C언어에서도 파이썬과 마찬가지로 같은 자료형끼리 연산을 해주어야함
 
💡
2. 형 넓히기
 
두 개의 자료형이 있을 때 한 쪽 자료형은 다른 쪽 보다 넓거나 좁다고 말할 수 있음
→ 더 많은 수를 표현할 수 있는 자료형이 더 넓다고 함 ex. long형이 short형 보다 넓다
 
만약 서로 다른 자료형을 연산하면 더 좁은 자료형의 값이 넓은 자료형으로 변환되어 연산됨 ex. 3 + 4.0 → 3.0 + 4.0 = 7.0
이렇게 더 넓은 자료형으로 변환하는 것을 형 넓히기 (promotion, 형 올리기) 라고 함
 
형 넓히기에는 integral promotion 이란 것도 있음
char, short는 모두 int로 바뀐다는 것임 (signed면 int, unsigned면 unsigned int)
보통 컴퓨터가 가장 효율적으로 처리할 수 있는 자료형을 int형으로 정하기 때문이다
또한 short보다 int형이 더 잘 처리되므로 int로 바꿔서 연산함
 
 
notion image
 
이거 참고하면 될 듯
 
💡
3. 형 좁히기
 
더 좁은 자료형으로 변환 시켜야 할 경우가 생김 → 좁은 자료형에 변수를 저장할 때
ex. 2.5를 a라는 ‘정수형’ 변수에 저장 할 때 2.5를 더 좁은 자료형인 정수형 2로 바꾼 후 a에 저장함
이를 형 좁히기 (demotion, 형 내리기)라고 함
 
그러나, 이건 프로그래머가 의도한 값이 아니기 때문에 컴파일러에서 경고를 함
 
a = (int)2.5 이런식으로 형변환을 해주면 경고가 나오지 않음
즉, 형 좁히기가 일어날 것 같은 곳에 형변환을 해준다면 경고가 나오지 않을 것
 
?? 근데, 이 부분 이해가 안 감.. (책, 136p 질문) → 아 ~ 정수형 변수에 실수형을 저장하려 할 때의 문제점에 대해 말한 것 이구나
 
# include <stdio.h> int main(void){ int a,b; double c; a = 3; b = 2; c = a/b; printf("%.1f", c); #.1 안쓰면 1.00000 나옴 -> 이거 막기 위해서 한 자리 까지만 출력하라고 명령해주는 것 return 0; }
 
이 코드에서는 1.0이라는 결과가 출력 될 것
하지만, 대부분은 1.5라는 결과가 출력되길 원할 것임
 
# include <stdio.h> int main(void){ int a,b; double c; a = 3; b = 2; c = (double)a/b; printf("%.1f", c); #.1 안쓰면 1.00000 나옴 -> 이거 막기 위해서 한 자리 까지만 출력하라고 명령해주는 것 return 0; }
 
요로콤, 형변환을 해주면 1.5가 제대로 출력 되게 됨 → 형 넓히기에 의해 b도 double로 변환되어 연산이 진행 됨
→ 형변환은 어떤 연산을 의도하기 위해 사용할 수 있음
 
# include <stdio.h> int main(void){ float a,b,c,d; a = 10/4; b = 10/4.; c = (float)10/4; d = (int)(10/(float)4); printf("%.1f %.1f %.1f %.1f", a,b,c,d); return 0; }
2.0 2.5 2.5 2.0 이렇게 출력 됨