[복학생 갱생 프로젝트] #0 오리엔테이션
복학생 갱생 프로젝트 시작
스터디 플랜
작성자와는 다르게 벌써 전역하고 복학을 준비하는 동기들을 보니 상당히 꼴받았다. 오랜만에 동기들을 만나서 보니 뇌가 태어난 직후로 초기화된 것을 확인하고 사건의 심각성을 체감하여 C언어의 기초부터 가르키는 복학생 갱생 프로젝트를 시작하게 된다...
[ 스터디 구성원 ]
[ 스터디 커리큘럼 ]
1_기초문법,입출력,연산자
2_제어문
3_전처리
4_포인터,배열,함수
5_문자열,구조체
6_동적할당1
7_동적할당2
실습#1_기초문법,입출력,연산자
Hello World!
- C언어를 맨 처음 배운다면 가장 먼저하는 것은 무엇일까? 바로 Hello World!이다.
#include <stdio.h>
int main(){
printf("Hello, World!");
return 0;
}
- 함수 내에 존재하는 문장의 끝에는 세미콜론 문자 ; 을 붙여준다. 세미콜론은 문장의 끝을 표현하기 위한 문자이다.
/* 헤더파일 선언문 */
#include <stdio.h>
-
stdio.h 파일의 내용을 불러오겠다는 의미
-
printf 함수와 같은 표준함수의 호출을 위해서 필요
/* 함수의 호출문 */
printf("Hello world!");
- printf라는 이름의 함수를 호출하는 문장
- 인자는 문자열 “Hello world!”
- 인자는 소괄호를 통해서 해당 함수에 전달된다.
return 0;
- 함수를 호출한 영역으로 값을 전달(반환)
- 현재 실행중인 함수의 종료
printf
int main(){
printf("Hello!\n");
printf("%d\n",1234);
printf("%d %d\n",10,20);
return 0;
}
- printf 함수에서의 %d는 10진수 정수의 출력을 의미한다.
%d
- 문자열에 삽입된 %d를 서식문자라고 한다.
- 서식문자는 출력의 형태를 지정하는 용도이다.
- %d는 부호가 있는 10진수 정수의 형태로 출력하라는 의미이다.
출력의 대상은?
- 큰 따옴표로 표시되는 문자열의 뒤에 이어서 표시하며 콤마로 각각을 구분한다.
- 서식문자 %d가 2개이면, 출력 대상도 2개여야 한다.
\n은 이스케이프 시퀀스(escape sequence) 또는 특수문자라 불리며 개 행을 의미하는 용도로 사용된다.
#include <stdio.h>
int main(){
printf("11의 10진수는 %d\n", 11);
printf("11의 16진수는 %x\n", 11);
printf("11의 8진수는 %o\n", 11);
printf("11의 4자릿수 표현은 %04d\n", 11);
printf("실수 11.1의 소숫점 2자리까지 표현은 %.2f\n", 11.1);
printf("65의 아스키코드 문자 표현은 %c\n", 65);
return 0;
}
Variable
int main(){
int num1, num2; // 변수 num1, num2의 선언
int num3=30, num4=40; // 변수 num3, num4의 선언 및 초기화
printf("num1: %d, num2: %d \n", num1, num2);
num1 = 10; // 변수 num1의 초기화
num2 = 20; // 변수 num2의 초기화
printf("num1: %d, num2: %d \n",num1, num2);
printf("num3: %d, num4: %d \n",num3, num4);
return 0;
}
실행결과
num1: -823921389, num2: -823921389
num1: 10, num2: 20
num3: 30, num4: 40
int num1,num2;
- 변수를 선언만 할 수 있다.
- 콤마를 이용하여 둘 이상의 변수를 동시에 선언할 수 있다.
- 선언만 하면 값이 대입되기 전까지 쓰레기 값(의미없는 값)이 채워진다.
int num3=30, num4=40;
- 선언과 동시에 초기화 할 수 있다.
변수의 이름 규칙 (의미 있는 이름을 짓는 것이 가장 중요!)
- 변수의 이름은 알파벳, 숫자, 언더바( _ )로 구성된다.
- C언어는 대소문자를 구분한다.
- 변수의 이름은 숫자로 시작할 수 없고, 키워드도 변수의 이름으로 사용할 수 없다.
- 이름 사이에 공백이 삽입될 수 없다.
- 다양한 자료형
#include <stdio.h>
int main(){
char c = 65;
int i = 100000;
float f = 0.1f;
double d = 0.11;
printf("c = %d\n", c);
printf("i = %d\n", i);
printf("f = %f\n", f);
printf("d = %lf\n", d);
return 0;
}
| 자료형 | 크기 | 타입 |
|---|---|---|
| char | 1Byte(8bit) | 정수 or 문자 |
| short | 2Byte(16bit) | 정수 |
| int | 4Byte(32bit) | 정수 |
| float | 4Byte(32bit) | 실수 |
| double | 8Byte(64bit) | 실수 |
- 정수타입 변수 자료형의 범위표현

scanf
int main(){
int num;
scanf("%d", &num);
}
- scanf 함수에서의 %d는 10진수 정수의 입력을 의미한다.
- 변수의 이름 num 앞에 &를 붙인 이유는 뒤에 가서 설명하겠다.
int main(){
int result;
int num1, num2;
printf("정수 one: ");
scanf("%d", &num1); // 첫 번째 정수 입력
printf("정수 two: ");
scanf("%d", &num2); // 두 번째 정수 입력
result = num1 + num2;
printf("%d + %d = %d \n", num1, num2, result);
return 0;
}
실행결과
정수 one: 3
정수 two: 4
3 + 4 = 7
- scanf 함수를 통해 num1과 num2의 값을 입력받을 수 있다.
int main(){
int result;
int num1, num2, num3;
printf("세 개의 정수 입력: ");
scanf("%d %d %d", &num1, &num2, &num3);
result=num1+num2+num3;
printf("%d + %d + %d = %d\n", num1, num2, num3, result);
return 0;
}
실행결과
세 개의 정수 입력: 4 5 6
4 + 5 + 6 = 15
- 한 번의 scanf 함수호출을 통해서 둘 이상의 데이터를 원하는 방식으로 입력 받을 수 있다.
comment
주석의 이해
주석은 소스코드에 삽입된 메모를 의미한다. 이는 컴파일러 대상에서 제외되기 때문에 주석의 유무는 컴파일 및 실행 결과에 영향을 미치지 않는다.
주석의 필요성
코드의 분석은 단순히 글을 읽는 것 처럼 간단하지 않다. 나 혼자 보는 것만이 아니라 다른 사람이 내 코드를 봐야하는 경우도 있다. 그렇기 때문에 코드에 대한 설명인 주석을 간단하게라도 달아놓을 필요가 있다.
- 블럭 단위 주석
/* 주석처리 된 문장 */
/*
주석처리 된 문장
주석처리 된 문장
주석처리 된 문장
*/
- 행 단위 주석
// 주석처리 된 문장
// 주석처리 된 문장
// 주석처리 된 문장
주석을 다는 방식은 프로젝트 별로 팀원과 상의하여 결정하게 된다.
operator
- 연산자
| 연산자 | 연산자의 기능 | 결합방향 |
|---|---|---|
| = | 연산자 오른쪽에 있는 값을 연산자 왼쪽에 있는 변수에 대입힌다. | <— |
| + | 두 피연산자의 값을 더한다. | —> |
| - | 왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 뺀다. | —> |
| * | 두 피연산자의 값을 곱한다. | —> |
| / | 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눈다. | —> |
| % | 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게 되는 나머지를 반환한다. | —> |
int main(){
int num1=9, num2=2;
printf("%d+%d=%d \n", num1, num2, num1+num2);
printf("%d-%d=%d \n", num1, num2, num1-num2);
printf("%d*%d=%d \n", num1, num2, num1*num2);
printf("%d/%d의 몫 \n", num1, num2, num1/num2);
printf("%d/%d의 나머지 \n", num1, num2, num1%num2);
return 0;
}
실행결과
9+2=11
9-2=7
9x2=18
9/2의 몫=4
9/2의 나머지=1
함수호출 문장에 연산식이 있는 경우
연산이 이뤄지고 그 결과를 기반으로 함수의 호출이 진행된다.
| 연산자 | 연산자의 기능 | 결합방향 |
|---|---|---|
| < | ex) n1 < n2 :: n1이 n2보다 작은가? | –> |
| > | ex) n1 > n2 :: n1이 n2보다 큰가? | –> |
| == | ex) n1 == n2 :: n1이 n2보다 같은가? | –> |
| != | ex) n1 != n2 :: n1이 n2보다 다른가? | –> |
| <= | ex) n1 <= n2 :: n1이 n2보다 같거나 작은가? | –> |
| >= | ex) n1 >= n2 :: n1이 n2보다 같거나 큰가? | –> |
- 연산의 조건을 만족하면 참을 의미하는 1을 반환하고 만족하지 않으면 거짓을 의미하는 0을 반환하는 연산자들이다.
- C언어는 0이 아닌 모든 값을 참으로 간주한다. 다만 1이 참을 의미하는 대표적인 값일 뿐이다.
int main(){
int num1=10;
int num2=12;
int result1, result2, result3;
result1=(num1==num2);
result2=(num1<=num2);
result3=(num1>num2);
printf("result1: %d \n",result1);
printf("result2: %d \n",result2);
printf("result3: %d \n",result3);
return 0;
}
실행결과
result1: 0
result2: 1
result3: 0
| 연산자 | 연산자의 기능 | 결합방향 |
|---|---|---|
| && | ex) A && B :: A와 B 모두 ‘참’이면 연산결과로 ‘참’을 반환(논리 AND) | –> |
| || | ex) A || B :: A와 B 둘 중 하나라도 ‘참’이면 연산결과로 ‘참’을 반환(논리 OR) | –> |
| ! | ex) !A :: A가 ‘참’이면 ‘거짓’, A가 ‘거짓’이면 ‘참’을 반환(논리 NOT) | <– |
int main(){
int num1=10;
int num2=12;
int result1, result2, result3;
result1=(num1==10 && num2==12);
result2=(num1<12 || num2>12);
result3=(!num1);
printf("result1: %d \n",result1);
printf("result2: %d \n",result2);
printf("result3: %d \n",result3);
return 0;
}
실행결과
result1: 1
result2: 1
result3: 0
- 위의 예제에서 num1은 0이 아니므로 참과 거짓의 관계로 본다면 거짓에 해당한다. 따라서 ! 연산의 결과로 참을 의미하는 1을 반환한다.
- 복합 대입연산자

int main(){
int num1 = 2, num2 = 4, num3 = 6;
num1 += 3;
num2 *= 4;
num3 %= 5;
printf("Result: %d, %d, %d \n", num1, num2, num3);
return 0;
}
실행결과
Result: 5, 16, 1
- 전위연산자, 후위연산자
| 연산자 | 연산자의 기능 | 결합방향 |
|---|---|---|
| ++num | 값을 1 증가 후, 속한 문장의 나머지를 진행 (선 증가, 후 연산) | <– |
| num++ | 속한 문장을 먼저 진행한 후, 값을 1 증가 (선 연산, 후 증가) | <– |
| –num | 값을 1 감소 후, 속한 문장의 나머지를 진행 (선 감소, 후 연산) | <– |
| num– | 속한 문장을 먼저 진행한 후, 값을 1 감소 (선 연산, 후 감소) | <– |
int main(){
int num1=12;
int num2=12;
printf("num1: %d \n",num1);
printf("num1++: %d \n",num1); // 후위 증가
printf("num1: %d \n\n",num1);
printf("num2: %d \n",num2);
printf("++num2: %d \n",num2); // 전위 증가
printf("num2: %d \n\n",num2);
return 0;
}
실행결과
num1: 12
num1++: 12
num1: 13
num2: 12
++num2: 13
num2; 13
- 삼항 연산자
#include <stdio.h>
int main(){
int a=10, b=11;
printf("a와 b중 더 변수는 %c이다.\n", a > b ? 'a' : 'b');
return 0;
}
실행결과
a와 b중 더 변수는 b이다.
- 연산자의 종류와 우선순위

퀴즈
-
y = 2x^2+3x+5 이차함수에서 x 값을 입력받은 후, y의 값을 출력하시오.
-
입력 : x = 3
- 출력 : y = 32
-
-
직사각형의 길이와 너비를 입력받은 후, 직사각형의 둘레를 출력하시오.
- 입력 : 길이 = 5, 너비 = 10
- 출력 : 둘레 = 30
- 입력 : 길이 = 5, 너비 = 10
-
하나의 정수를 입력받은 다음, 절대값을 출력
-
입력 : 10
- 출력 : 10
-
입력 : -10
- 출력 : 10
-
하나의 정수를 입력받은 다음, 짝수인지 홀수인지 출력.
-
문자열(“ ~ “)을 출력하는 서식문자는 %s
- 입력(정수 1개) = 21
- 출력 = 홀수
- 입력(정수 1개) = 21
-
-
정수 N을 입력받아 개월과 일수로 변환하라. 단, 1개월은 무조건 30일이라고 가정한다.
- 입력 = 100
- 출력 = 3개월 10일
- 입력 = 100
-
하루 중의 시간을 24시간으로 나타낸 정수를 읽어서, 시간과 분으로 바꾸어 출력.
- 예 : 1635
- 오후 4시 35분
- 예 : 1010
- 오전 10시 10분
- 예 : 1635
- 700MB 크기의 비디오 파일을 다운로드한다. 초당 전송속도(Kbps)를 입력받은 후, 소요시간을 시간, 분, 초 단위로 출력하라.
- 입력 : 100
- 출력 : 15시간 55분 44초
- 입력 : 100
댓글남기기