[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 오류

  • 문법 오류는 컴파일러가 알아서 잡아냄.
  • 의미 오류는 내가 원하는 결과가 안나오는 거… 프로그램을 잘못 짠거!



크기 및 범위

image-20210703154303043

image-20210703155245485

image-20210703155458021

image-20210703154334309

  • 범위 벗어나면 오버플로우, 언더플로우
  • 자료형의 크기 구하기
    • sizeof(자료형 or 표현식)
    • 바이트의 크기를 알려줌!
sizeof(int*4)
  • 왜?
    • 동적으로 메모리를 할당 받을 때 얼마나 받을 건지.
int *arr = (int*)malloc(sizeof(int)*10);


ASCII CODE

image-20210703155604526

  • 문자 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++;
      • 문장이 모두 수행 된 다음에 증가
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 / 그런것처럼!! 우선 순위

image-20210703162834250

  • 외울 필요는 없지만 많이 하다보면 익숙해짐
  • 연산자들은 주로 조건문과 함께 사용되기 때문에… 응용은 이후에!



조건문

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



과제

다음 화면이 출력되도록 프로그램을 작성하시오


정수 두 개를 입력받아 몫과 나머지를 출력하는 프로그램

  • 산술 연산자 응용

image-20210703164802077



실수 두 개를 입력받아 합과 평균을 출력하는 프로그램

  • 산술 연산자 응용

image-20210703164656809



길이를 입력 받아 cm를 feet로 변환하는 프로그램

  • 산술 연산자 응용
  • 1피트는 30.48cm 임

  • 다음 코드를 반드시 활용하시오

    #define FEET 30.48
    

image-20210703164829996



임의의 달을 입력해 상반기 / 하반기를 판별하는 프로그램

  • ? : 조건 연산자를 반드시 활용하시오

image-20210703164845554



정수 세 개를 입력 받아 가장 큰 수를 변수 max에 담아 출력하는 프로그램

  • ? : 조건 연산자를 반드시 활용하시오

image-20210703164856050



정수를 입력 받아, 각 자리수의 합을 구하는 프로그램을 작성하시오.

  • 반복문, % 연산자 응용

image-20210703172147021



정수를 입력 받아, 해당 숫자의 구구단을 출력하는 프로그램을 작성하시오.

  • 반복문 응용
)  입력: 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(), 반복문, 조건문을 활용하시오.

image-20210703170936734



정수 n을 입력 받아, 별 5개짜리 직각 삼각형이 가로, 세로 n번씩 반복 출력되는 프로그램을 구현하시오.

  • 반복문 응용
  • 아래는 입력에 따른 출력 예시
  • 난이도 어려움
입력 : 1
*
**
***
****
*****
입력 : 3
*
**
***
****
*****
*    *
**   **
***  ***
**** ****
**********
*    *    *
**   **   **
***  ***  ***
**** **** ****
***************
    
    
*****
****
***
**
*
    
*****
 ****
  ***
   **
    *
    
*   *
** **
*****
** **
*   *



위 문제를 응용하여, 별 n개짜리 직각 삼각형이 가로, 세로 n번씩 반복 출력되는 프로그램을 구현하시오.

  • 아래는 입력에 따른 출력 예시
입력 : 1
*
입력 : 2
*
**
* *
****
입력 : 3
*
**
***
*  *
** **
******
입력 : 5
*
**
***
****
*****
*    *
**   **
***  ***
**** ****
**********
*    *    *
**   **   **
***  ***  ***
**** **** ****
***************
*    *    *    *
**   **   **   **
***  ***  ***  ***
**** **** **** ****
********************
*    *    *    *    *
**   **   **   **   **
***  ***  ***  ***  ***
**** **** **** **** ****
*************************




© 2020.07. by Sanggoe

Powered by Sanggoe