[C] C언어 스터디 2주차
개발환경
- visual studio 20xx
- IDE 통합 개발 환경
- 프로젝트 하나 새로 만들기!
- 단축키를 외워두면 좋아요 :)
- ctrl+shift+a : 새 파일 생성
- Hello C World!
- c언어 파일 실행 과정
- 사용자 작성 코드(.c) → 전처리(.i) → 컴파일(.s) → 어셈블(.o) → 링크(.exe)
- IDE는 편집기, 컴파일러, 디버거 등을 묶은 통합 개발 환경
Hello World!
printf()
printf("Hello world")
형식(서식) 지정자
- %d, %i, %f, %lf, %u, %p, %x, %c, %s
- 출력할 문자에 따라 각각 다른 서식 문자들
- 쓰다보면 자주 쓰는건 당연히 외워짐
printf("%d", 30); // %d 정수, %f %lf 실수, %c 문자, %s 문자열
printf("%lf", 35.5);
printf("%c", 'a');
printf("%s", "Hello, C world");
특수문자
- \t, \n, \\, \a, \b … Too much!!
- 마찬가지
printf("\t") // 탭
printf("\n") // 개행 (엔터)
printf("\\") // 특수문자 때문에 이렇게 써야 함
기본 문법
- 세미콜론
- 주석
- 중괄호
- 들여쓰기
printf("");
// 한줄 주석
/* 여러 줄
주석
*/
파이썬 들여쓰기로 문단을 구분, C에서는 { 중괄호 } 로 블록을 구분한다.
변수
변수란?
- x = ~~~
- 알려지지 않은 양, 정보…
- 자료를 담는 상자…
자료형
- 정수 int, short, long
- 실수 float, double
- 문자 char
- 포인터 *___
구조체 …
- 선언, 초기화 시 예시
int sum, num; // 초기화 정수만 담을 수 있는 변수
double avg = 0.0; // 선언과 동시에 초기화 실수를 담을 수 있는 변수
char = 'a';
int main() {
return 0;
}
void main() {
}
- main() 함수는 하나의 프로그램에 하나만 존재한다!
- 프로그램을 실행한다. == main() 함수를 실행한다. 같은 개념으로 보면 되는 것
- 호출하는 곳에 반환을 하는 것
- main() 을 호출하는 곳은 운영체제, 프로그램이 (main 함수가) 수행이 완료 되고 0을 return 한다는 것은 프로그램이 문제없이 다 수행 되고 정상적으로 종료가 된다는 의미!
- 운영체제가 알아서 잘 하니까.. void main() 해도 상관은 없음.
int sum = "string"; // Syntax 문법오류!
int num = 1;
double avg = 99.9;
Error
Syntax 오류, Sementic 오류
- 문법 오류는 컴파일러가 알아서 잡아냄.
- 의미 오류는 내가 원하는 결과가 안나오는 거… 프로그램을 잘못 짠거!
크기 및 범위
- 참고 - 정수
- 참고 - 실수
- 참고 - 문자
- bit - byte - kb - mb - gb - tb - …
- 0, 1 만 있으니까! bit 두 가지.
- 8bit == 1byte == 2^8
- 첫 번째 비트는 부호비트! +-
- 범위 벗어나면 오버플로우, 언더플로우
- 자료형의 크기 구하기
- sizeof(자료형 or 표현식)
- 바이트의 크기를 알려줌!
sizeof(int*4)
- 왜?
- 동적으로 메모리를 할당 받을 때 얼마나 받을 건지.
int *arr = (int*)malloc(sizeof(int)*10);
ASCII CODE
- 문자 1byte
- 알파벳 기준으로 1byte
- 한글은 2byte 인 경우가 많음
char ch = 'a';
printf("%c\n", ch); // a
printf("%d\n", ch); // 97
- 응용 예시
- 문자로 연산하기 (암호화 등)
"Hello, I'm Human\n" -> 암호화
'H'+10 하면 -> 'R'
- 대소문자 변환하기
반복문 하고서 다시 올게요.
Tip)
소문자 이면 -> -32 하면 대문자
대문자 이면 -> +32 하면 소문자
상수
const
- literal : 문자 그대로 값 자체
- 고정된 값
const double pi = 3.14;
define
- 전처리기와 함께 선언
#define pi = 3.14
scanf()
- 키보드로부터 입력 받는 함수
#define _CRT_SECURE_NO_WARNINGS
- 입력 받는 변수의 형식에 따라
int num;
scanf("%d", &num)
- & : 주소!!! // 포인터에서 나올꺼라..
컴퓨터 메모리 어딘가에 저장된 num이라는 변수의 주소를 가져와서 여기에 입력받은 정수를 넣어줘라!
- 버퍼라는 개념 (임시 저장소) - 나중에… 질문이 생기면 오세요.
연산자
대입 연산자
- =
int a = 0;
double b;
b = 10.0;
산술 연산자
- +, -, *, /
- %
사칙연산
% : 나머지 연산자
int a = 10;
a % 5 는? 0
a = 5;
a % 2 는? 1
약수를 출력하는거...
num // 입력 받았다!
num % i // i : 1 ~ num-1 까지 1씩 증가하면서 반복
위 공식이 0이 되면 그 순간 i는 num의 약수! 나머지가 0이면 약수!
복합대입 연산자
- +=, -=, *=, /=, %=
// 단지 축약한 것!
int a = 10;
int b = 5;
a += b; // 얘랑
a = a + b; // 얘랑 같은 의미다!
// -=, *=, /=, %= 모두 똑같이!
증감 연산자
- ++, –
- 최소 단위를 증가시킨다! (정수형 에서는 1을 증가시켜라!)
- ++a // 얘랑
- a = a+1 // 얘랑 같은 의미
- 전위, 후위 차이
- ++a;
- 증가를 먼저 시키고 문장을 수행
- a++;
- 문장이 모두 수행 된 다음에 증가
- ++a;
for (int i=0; i<10; i++) {
printf("%")
}
int a = 1;
printf("%d", ++a); // printf가 수행되기 전에 ++a 가 먼저 수행 되니까 2가 출력! 여기서 a는 2가 됨
printf("%d", a++); // a=2 인 상태, printf 출력 2가 출력! a는 3이 됨.
관계 연산자
- >, <, ==, !=, >=, <=
수학이랑 똑같음!
논리 연산자
, &&, !
or, and, not
// 참 거짓 판단할 때
조건 연산자
- (조건) ? (참일 경우 수행) : (거짓일 경우 수행)
- if else 랑 비슷한 역할.
- 삼항 연산자.
int sum = 10;
sum >= 5 ? printf("5 이상입니다.") : printf("5 미만입니다.");
비트 연산자
, &, ^, ~ - >>, <<
- 10진수를 2진수로 바꿔서 연산한다고 생각하면 됨!!
1011 : 11
1101 : 13
or 연산 : 11 | 13 => 15 (1111)
and 연산 : 11 & 13 => 9 (1001)
…
연산자 우선순위
- ~ + x / 그런것처럼!! 우선 순위
- 외울 필요는 없지만 많이 하다보면 익숙해짐
- 연산자들은 주로 조건문과 함께 사용되기 때문에… 응용은 이후에!
조건문
if문, else if문, else문
- if ( 조건 ) { 수행 }
- 컴퓨터에서, ‘참’ 이라고 하면 1이죠. 0은 거짓.
- a도 참, -574 참, 100 참.. 0만 아니면 전부 참
int sum = 10;
if (sum == 10) {
printf("10 입니다!");
break;
}
- if (조건) { 수행 } else { 수행 }
int sum = 10;
if (sum >= 5) {
printf("5 이상입니다.");
} else {
printf("5 미만입니다.");
}
- if (조건) { 수행 } else if (조건) { 수행 }
- 필터가 한번 걸러지고, 남은것들 중에서 또 거르는거!!
int sum = 10;
if (sum <= 5) {
printf("5 이하입니다.");
} else if (sum <= 7) {
printf("7 이하입니다.");
} else if () {...}
- if (조건) { 수행 } == (조건) ? (수행) else {수행} == : (수행)
- ex) 입력 받은 숫자가 몇자리 수 인지 판단하여 출력하는 프로그램
- if else 조건문 이용
- % 연산자 이용
if (num / 10 < 10) {
printf("10의 자리수 입니다.");
} else if (num / 100 < 10) {
printf("100의 자리수 입니다.");
}
else if (num / 1000 < 10) {
printf("1000의 자리수 입니다.");
}
switch문
- switch(변수 or 연산) { case _: 수행 break; case _: 수행 break; default : 수행 }
- break를 꼭 써줘야 해요!
int num = 5;
switch(num) {
case 5: // 5 입니다
break;
case 4: // 4 입니다
break;
default : 수행
}
- ex) 일회용 계산기
char op = '+';
switch(op) {
case '+': printf("%d", 10+5);
break;
case '-': printf("%d", 10-5);
break;
...
default:
printf("종료합니다.");
}
반복문
for문
- for (초기식; 조건식; 변화식) { 수행 }
for (int i=1; i<=10; i++) {
printf("%d", i);
}
- ex) ‘a’를 입력받아 ‘z’까지 출력하는 프로그램
for (int i=0; i<26; i++) {
printf("%c", ch+i);
}
- ex) 2부터 9까지 구구단 출력 프로그램
과제!
- ex) 별찍기 프로그램
*
**
***
****
*****
int num;
scanf("%d", &num);
for (int i = 0; i < num; i++) {
for (int j = 0; j <= i; j++) {
printf("*");
}
printf("\n");
}
while문, do while문
- while (조건) { 수행 }
while(1) {
printf("무한반복");
}
int i = 0;
while(i < 10) {
i++;
printf("열번 반복");
}
- do { 수행 } while (조건)
- 최소 한 번 수행할 때
- ex) 약수 출력 프로그램
num = 15;
for (int i=1; i<num; i++) {
if (num % i == 0) {
printf("%d는 %d의 약수입니다\n", i, num);
}
}
- ex) menu 주문 프로그램
생략
break, continue
- break; : 분기 및 반복 탈출 ( { } 탈출 )
- continue : 이후 코드 수행하지 않고, 다시 조건으로
for (int i=1; i<num; i++) {
if (num % i != 0) {
continue;
}
printf("%d는 %d의 약수입니다\n", i, num);
}
- ex) 짝수 출력 프로그램
과제!
rand(), srand()
#include
- rand() % _
- 랜덤 숫자를 반환 하는데, 랜덤 반환 그 기준이 뭐냐?
- seed 라는 기준으로.
- srand((unsigned)time(NULL))
- 랜덤 반환 기준인 seed를 ‘시간’ 으로 하자. 매번 달라지게!
- 한 번만 실행 시켜주면 됨.
srand((unsigned)time(NULL));
printf("%d\n", rand() % 10); // 10으로 나눈 나머지 숫자 중에 랜덤으로 하나 반환 (0~9)
printf("%d", rand() % 50); // 0~49
과제
다음 화면이 출력되도록 프로그램을 작성하시오
정수 두 개를 입력받아 몫과 나머지를 출력하는 프로그램
- 산술 연산자 응용
실수 두 개를 입력받아 합과 평균을 출력하는 프로그램
- 산술 연산자 응용
길이를 입력 받아 cm를 feet로 변환하는 프로그램
- 산술 연산자 응용
1피트는 30.48cm 임
다음 코드를 반드시 활용하시오
#define FEET 30.48
임의의 달을 입력해 상반기 / 하반기를 판별하는 프로그램
- ? : 조건 연산자를 반드시 활용하시오
정수 세 개를 입력 받아 가장 큰 수를 변수 max에 담아 출력하는 프로그램
- ? : 조건 연산자를 반드시 활용하시오
정수를 입력 받아, 각 자리수의 합을 구하는 프로그램을 작성하시오.
- 반복문, % 연산자 응용
정수를 입력 받아, 해당 숫자의 구구단을 출력하는 프로그램을 작성하시오.
- 반복문 응용
예) 단 입력: 5
5x1=5 5x2=10 5x3=15
5x4=20 5x5=25 5x6=30
5x7=35 5x8=40 5x9=45
정수를 입력 받아, 소수인지 판별하여 출력하는 프로그램을 작성하시오.
- 소수 : 1과 자기 자신으로만 나누어지는 수. 1은 소수가 아니며, 2는 소수이다.
- 반복문, 조건문, % 연산자 응용
rand() 함수를 이용해 1~100 사이의 랜덤 숫자를 저장하고, 사용자로부터 숫자를 입력 받아 작은지, 큰지, 같은지를 판별하여 출력하는 숫자 맞추기 게임 프로그램을 구현하시오.
- srand(), rand(), 반복문, 조건문을 활용하시오.
정수 n을 입력 받아, 별 5개짜리 직각 삼각형이 가로, 세로 n번씩 반복 출력되는 프로그램을 구현하시오.
- 반복문 응용
- 아래는 입력에 따른 출력 예시
- 난이도 어려움
입력 : 1
*
**
***
****
*****
입력 : 3
*
**
***
****
*****
* *
** **
*** ***
**** ****
**********
* * *
** ** **
*** *** ***
**** **** ****
***************
*****
****
***
**
*
*****
****
***
**
*
* *
** **
*****
** **
* *
위 문제를 응용하여, 별 n개짜리 직각 삼각형이 가로, 세로 n번씩 반복 출력되는 프로그램을 구현하시오.
- 아래는 입력에 따른 출력 예시
입력 : 1
*
입력 : 2
*
**
* *
****
입력 : 3
*
**
***
* *
** **
******
입력 : 5
*
**
***
****
*****
* *
** **
*** ***
**** ****
**********
* * *
** ** **
*** *** ***
**** **** ****
***************
* * * *
** ** ** **
*** *** *** ***
**** **** **** ****
********************
* * * * *
** ** ** ** **
*** *** *** *** ***
**** **** **** **** ****
*************************