For 문 문법

for 문은 초기식 조건식 증감식으로 구성되어있다.

for문 흐름도

실습1

while 문을 for 문을 통해 구현해보자.

while문으로 만든 반복문

#include <stdio.h>

int main()
{
    int start,end,temp;
    int sum=0;
    scanf("%d %d",&start,&end);
    if(start>end){
        temp=end;
        end=start;
        start=temp;
    }
    for(int i=start;i<=end; i++)
    {
        sum+=i;
    }
    printf("sum= %d\n",sum);
    return 0;
}

 

실습2 Factorial을 구하는 함수

Factorial 흐름도

#include <stdio.h>
void exec_add(void){
    int start,end,temp;
    int sum=0;
    scanf("%d %d",&start,&end);
    if(start>end){
        temp=end;
        end=start;
        start=temp;
    }
    for(int i=start;i<=end; i++)
    {
        sum+=i;
    }
    printf("sum= %d\n",sum);
}
int factorial(int num){
    int facto=1;
    for(int i=num;i>=1;i--){
        facto*=i;
    }
    return facto;
}

int main()
{
    int num;
    int facto;
    scanf("%d",&num);
    facto=factorial(num);
    printf("%d",facto);
    return 0;
}

 

실습3. Combination 함수 만들기

#include <stdio.h>
void exec_add(void){
    int start,end,temp;
    int sum=0;
    scanf("%d %d",&start,&end);
    if(start>end){
        temp=end;
        end=start;
        start=temp;
    }
    for(int i=start;i<=end; i++)
    {
        sum+=i;
    }
    printf("sum= %d\n",sum);
}
int factorial(int num){
    int facto=1;
    for(int i=num;i>=1;i--){
        facto*=i;
    }
    return facto;
}
int combination(int n, int r){
    combi=factorial(n)/(factorial(n-r)*factorial(r));
    return combi;
}
int main()
{
    int n,r;
    int combi;
    scanf("%d %d",&n,&r);
    combi=combination(n,r);
    printf("%d",combi);
    return 0;
}

 

'Computer engineering > C' 카테고리의 다른 글

반복문-While(3)  (0) 2021.05.03
반복문-While(2)  (0) 2021.05.02
반복문-While(1)  (0) 2021.05.02
If-else 조건문  (0) 2021.04.21
If 조건문  (0) 2021.04.11

횟수가 정해진 반복

화면에 "hello world\n"을 다섯 줄 출력=>printf 함수 다섯 번 호출

단순이 이렇게 적을 수 있지만 500번 호출하려면 500번을 그대로 다 써야하는가? 아니다.

 

반복문을 사용한다면 훨씬 편리할 것이다. 흐름도를 살펴보자.

#include <stdio.h>

int main()
{
    int count=0;
    while(count<500){
        printf("hello world\n");
        count++;
    }
    return 0;
}

    

그러나 위처럼 단순한 반복은 없다.

예) 1부터 1000까지 합 구하기.

#include <stdio.h>

int main()
{
    int count=1;
    int sum=0;
    
    while(count<=1000){
        sum+=count;
        count++;
    }
    printf("1-1000까지의 합은 : %d\n",sum);
    return 0;
}

 

while 문 내부 계산 내용 및 결과는 얼마든지 복잡할 수 있다.

예2) 짝수 홀수 별 총합 구하기.

#include <stdio.h>

int main()
{
    int start,end,temp;
    int sum=0;
    int even_sum=0;
    int odd_sum=0;
    scanf("%d %d",&start,&end);
    if(start>end){
        temp=end;
        end=start;
        start=temp;
    }
    while(start<=end){
        if((start%2)==0){
            even_sum+=start;
        }
        else if((start%2)==1){
            odd_sum+=start;
        }
        start++;
    }
    printf("even_sum=%d\n",even_sum);
    printf("odd_sum=%d\n",odd_sum);
    return 0;
}

'Computer engineering > C' 카테고리의 다른 글

반복문-for  (0) 2021.05.06
반복문-While(2)  (0) 2021.05.02
반복문-While(1)  (0) 2021.05.02
If-else 조건문  (0) 2021.04.21
If 조건문  (0) 2021.04.11

앞선 포스트 처럼 반복문은

-조건에 맞는동안 계속 반복

-횟수가 정해진 반복

이 2가지로 나눌 수 있다.

 

조건에 맞는 동안 계속 반복

예제1] -1이 입력될때까지 더한다 

=>0이상의 수만 더한다.

 

흐름도

이 흐름도에서 -1을 입력하게 된다면 빠져나오긴 하지만 한가지 문제가 생긴다. sum 단계에서 -1을 입력함과 동시에 빠져나오기 전, -1을 더하고 빠져나오게 된다.

흐름도의 문제점

이를 수정할 수 있는 방법은 무엇일까? 방법은 간단하다. 다시 -1을 빼주면 된다.

흐름도 수정본

#include <stdio.h>

int main()
{
    int sum=0;
    int input=0;
    while(input>-1){
        scanf("%d",&input);
        sum+=input;
    }
    sum-=input;
    printf("sum= %d\n",sum);
    return 0;
}

예제2] 사용자에게 계속 무언가를 할 것인지 물어보는 반복

흐름도

#include <stdio.h>
void sum_input(void){
    int sum=0;
    int input=0;
    while(input>-1){
        scanf("%d",&input);
        sum+=input;
    }
    sum-=input;
    printf("sum=%d\n",sum);
    return 0;
}


int main()
{
    int sum,cont,input;
    cont=1;
    sum,input=0;
    
    while(cont==1){
        scanf("%d",&input);
        sum+=input;
        printf("계속 더하겠습니까?(예:1, 아니오:0)");
        scanf("%d",&cont);
    }
    printf("sum=%d\n",sum);
    return 0;
}

do-while문 사용

조건에 맞는동안 계속 반복(조건검사 전 무조건 한 번은 수행)

do{} 부분이 무조건 한번 수행한 후 조건을 비교하여 계속 수행할 것인지 판단. 무조건 한 번은 실행한다.

 

#include <stdio.h>
void sum_input(void){
    int sum=0;
    int input=0;
    while(input>-1){
        scanf("%d",&input);
        sum+=input;
    }
    sum-=input;
    printf("sum=%d\n",sum);
    return 0;
}
void sum_input_qna(void){
    int sum,cont,input;
    cont=1;
    sum,input=0;
    
    while(cont==1){
        scanf("%d",&input);
        sum+=input;
        printf("계속 더하시겠습니까?(예:1, 아니오:0)");
        scanf("%d",&cont);
    }
    printf("sum=%d\n",sum);
    return 0;
}

int main()
{
    int menu;
    do{
        printf("메뉴를 입력하세요.: ");
        scanf("%d",&menu);
        if(menu!=1&&menu!=2) printf("1,2중에 입력하세요.\n");
    }while(menu!=1 &&menu!=2);
    return 0;
}

 

'Computer engineering > C' 카테고리의 다른 글

반복문-for  (0) 2021.05.06
반복문-While(3)  (0) 2021.05.03
반복문-While(1)  (0) 2021.05.02
If-else 조건문  (0) 2021.04.21
If 조건문  (0) 2021.04.11

반복구조

계속 반복해야 하는 상황

1) 조건에 맞는동안 계속 반복

 

2) 횟수가 정해진 반복

간단한 while-switch 문 예제

#include <stdio.h>
int calculator(int a, char op, int b)
{
    int result;
    switch(op){
        case '+':
            result=a+b;
            break;
        case '-':
            result=a-b;
            break;
        case '*':
            result=a*b;
            break;
        case '/':
            result=a/b;
            break;
        case '%':
            result=a%b;
            break;
        default:
            printf("잘못된 연산자를 입력했습니다.");
            return -1;
    }
}
void testCaluclator(void){
    int a, b, c;
    char op;
    printf("숫자 연사자 숫자 형식으로 입력하세요");
    scanf("%d %c %d", &a,&op,&b);
    
    c=calculator(a,op,b);
}
void testGrade(){
    int score;
    printf("input score");
    scanf("%d",&score);
    if(score>90) printf("A\n");
    else if(score >80) printf("B\n");
    else if(score>70) printf("C\n");
    else if(score>60) printf("D\n");
    else printf("F\n");
}
int leafyear(int year){
    if(((year%4==0)&&(year%100!=0))||(year%400==0))
        return 29;
    else
        return 28;
}
int daysofmonth(int month){
    int result,year;
    switch(month)
    {   if(month<1||month>12){
            printf("잘못된 입력입니다.");
            return -1;
    }
        case 2:
            printf("input year: ");
            scanf("%d",&year);
            result=leafyear(year);
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            result=30;
            break;
        default:
            result=31;
    }
    return result;
}
void testDaysofmonth()
{
    int mon;
    printf("몇일인지 알고 싶은 월을 입력하세요 : ");
    scanf("%d",&mon);
    printf("%d월은 '%d일까지 있습니다",mon,daysofmonth(mon));
}
int main()
{
    int cont=1;
    int choice=0;
    
    while(cont)
    {
        printf("input choice : ");
        scanf("%d",&choice);
        switch(choice){
            case 1:
                testCaluclator();
                break;
            case 2:
                testGrade();
                break;
            case 3:
                testDaysofmonth();
                break;
            case -1:
                cont=0;
                break;
            default:
                printf("잘못된 입력입니다.");
        }
    }
    return 0;
}

 

'Computer engineering > C' 카테고리의 다른 글

반복문-While(3)  (0) 2021.05.03
반복문-While(2)  (0) 2021.05.02
If-else 조건문  (0) 2021.04.21
If 조건문  (0) 2021.04.11
4. 대입 및 산술 연산자  (0) 2021.04.01

if 문에서는 조건이 참일 경우에만 처리를 하였지만 조건이 거짓인 경우에도 처리를 하여야하는 경우도 많다.

예를 들어 온도가 25도 이상이면 가벼운 옷차림을 하고 그렇지 않으면 두꺼운 옷차림을 선택한다고 하자. 이런 경우에 사용할 수 있는 문장이 if-else문이다. 

 

흐름도는 다음과 같다.

if-else 흐름도
if-else syntax

예제를보면 다음과 같다.

/******************************************************************************

Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.

*******************************************************************************/
#include <stdio.h>

void eatLunch2(void){
    int money;
    
    printf("돈이 얼마 있나요?");
    scanf("%d",&money);
    if(money>=10000) printf("돈까스를 먹는다.\n");
    else if(money>=5000) printf("짜장면을 먹는다.\n");
    else if(money>=2500) printf("라면을 먹는다.\n");
    else printf("굶는다.\n");
    
}

int isLeafYear(int year)
{
    int result;
    if(year%4==0){
        if(year%100!=0)return 1;
        else if(year%400==0) return 1;
    }
    return 0;
    
}
int main()
{
    int year;
    eatLunch2();
    printf("올해는 몇년도인가요?");
    scanf("%d",&year);
    year=isLeafYear(year);
    if(year) printf("윤년입니다.year--> %d\n",year);
    else printf("윤년이 아닙니다.\n");
    return 0;
}



 

#include <stdio.h>

int main(void)
{
    int location,sex,age;
    printf("거주지- 서울:1, 경기:2, 충남:3");
    printf("성별-남자:1,여자:2");
    printf("나이-숫자로 입력(10대 미만, 10대,20대,30대 이상으로 구분)");
    scanf("입력순서대로 적으시오(거주지,성별,나이):%d %d %d", &location,&sex,&age);
    if((location=1)&&(sex=1)&&(age<10)) printf("서울거주 10대 미만 남자");
    else if((location=1)&&(sex=1)&&(age>10&&age<20)) printf("서울거주 10대 남자");
    else if((location=1)&&(sex=1)&&(age>20&&age<30)) printf("서울거주 20대 남자");
    else if((location=1)&&(sex=1)&&(age>30)) printf("서울거주 30대 이상 냠쟈");
    else if((location=1)&&(sex=2)&&(age>10&&age<20)) printf("서울거주 10대 여자");
    else if((location=1)&&(sex=2)&&(age>20&&age<30)) printf("서울거주 20대 여자");
    else if((location=1)&&(sex=2)&&(age>30)) printf("서울거주 30대이상 여자");
    else if((location=2)&&(sex=1)&&(age>10&&age<20)) printf("경기거주 10대 남자");
    else if((location=2)&&(sex=1)&&(age>20&&age<30)) printf("경기거주 20대 남자");
    else if((location=2)&&(sex=2)&&(age>30)) printf("경기거주 30대이상 남자");
    else if((location=2)&&(sex=2)&&(age>10&&age<20)) printf("경기거주 10대 여자");
    else if((location=2)&&(sex=2)&&(age>20&&age<30)) printf("경기거주 20대 여자");
    else if((location=2)&&(sex=2)&&(age>30)) printf("경기거주 30대이상 여자");
    else if((location=3)&&(sex=1)&&(age>10&&age<20)) printf("충남거주 10대 남자");
    else if((location=3)&&(sex=1)&&(age>20&&age<30)) printf("충남거주 20대 남자");
    else if((location=3)&&(sex=1)&&(age>30)) printf("충남거주 30대이상 남자");
    else if((location=3)&&(sex=2)&&(age>10&&age<20)) printf("충남거주 10대 여자");
    else if((location=3)&&(sex=2)&&(age>20&&age<30)) printf("충남거주 20대 여자");
    else if((location=3)&&(sex=2)&&(age>30)) printf("충남거주 30대이상 여자");
    
    return 0;
    
}

 

'Computer engineering > C' 카테고리의 다른 글

반복문-While(2)  (0) 2021.05.02
반복문-While(1)  (0) 2021.05.02
If 조건문  (0) 2021.04.11
4. 대입 및 산술 연산자  (0) 2021.04.01
3. #define이란?  (0) 2021.04.01

If 조건문 사용하기

if 조건문은 괄호 안에 조건식을 지정하여 사용한다.

if(조건식)
{
	코드
}

 

C언어에서 조건문은 if()형식으로 사용하며 ()안에는 조건식이 들어간다. 그리고 {}안에는 조건식이 만족할 때 실행할 코드를 넣어준다.

 

if 조건문의 기본형태

 

다음예제를 보자.

 

#include <stdio.h>
void eatLunch(void)
{
    int money=0;
    printf("돈이 있나요?(1-yes, 0-no) : ");
    scanf("%d",&money);
    if(money==1){
        printf("점심식사를 한다\n");
    }
}

void exam(void)
{
    int math, eng;
    printf("수학점수와 영어점수를 입력하세요: ");
    scanf("%d %d",&math,&eng);
    if(math>=80&&eng>=80){
        printf("갈비찜을 먹는다"); 
    }
}
int isLeafYear(int year)
{
    int result;
    result=((year%4==0)&&(year%100!=0))||(year%400==0);
    return result;
}
int main()
{
    int year;
    eatLunch();
    exam();
    printf("연도를 입력하세요: ");
    scanf("%d",&year);
    if(isLeafYear(year))  printf("%d년도는 윤년입니다.",year);
    printf("프로그램종료 .\n");
    return 0;
}

eatLunch() 함수를 살펴보면,

money변수를 0으로 지중해주고, 값을 입력받는다. 이후 if문을 활용해 money가 1이라면 '점심식사를 한다'를 그렇지 않다면 pass해주는 함수이다.

exam() 함수를 살펴보면,

math,eng변수를 선언해주고, 수학점수와 영어점수를 입력받는다. 이후 if문을 활용해 영어점수와 수학점수가 80점 이상이라면 '갈비찜을 먹는다'를, 그렇지 않다면 pass해주는 함수이다.

isLeafYear()함수를 살펴보면,

윤년을 확인하는 함수이고, result를 선언해준 후, result값이 4로 나누어떨어지고 100으로 나누어떨어지지 않으며 400으로 나누어떨어지면 윤년을 내보내준다.

이 과정을 main 함수에서 if 문을 통해 지정해주었다. 

if 조건문과 세미콜론

if 조건문을 사용할 때는 ;(세미콜론)을 항상 주의해야한다. 

다음 예제를 확인해보자.

#include <stdio.h>
 
int main()
{
    int num1 = 5;
 
    if (num1 == 10);    // if 조건문 끝에는 세미콜론을 붙이면 안 됨
    {
        printf("10입니다.\n");
    }
 
    return 0;
}

10입니다.

if 조건문 끝에 세미콜론이 붙어있다. 이렇게 되면 if는 제대로 동작하지 않고, 뒤에 오는 코드가 무조건 실행되어 버린다. 그래서 num1에는 5가 들어있기 때문에 "10 입니다."가 출력되면 절대 안되지만 출력된다.

 

if 조건문 끝에 세미콜론을 붙이면 실제로는 다음과 같은 코드가 된다.

if (num1 == 10);
 
printf("10입니다.\n");

if와 printf는 전혀 관계가 없이 떨어진 상태가 되므로 조건식이 어떻든 printf는 항상 실행된다. 

그런데 왜 컴파일 에러가 발생하지 않는가? C언어에서는 다음과같이 코드를 {}(중괄호)로 감쌀 수 있기 때문이다.

{
   printf("10입니다.\n");
}

printf를 중괄호로 감싸도 동작은 달라지지 않지만 변수를 선언하고 사용할 때는 약간의 차이가 있다.

 

if 조건문에서 중괄호 생략하기

if 조건문에서 실행할 코드가 한 줄이라면 다음과 같이 중괄호를 생략할 수 있다.

 

#include <stdio.h>
 
int main()
{
    int num1 = 10;
 
    if (num1 == 10)
        printf("10입니다.\n");    // 실행할 코드가 한 줄이라면 중괄호 생략
 
    return 0;
}

10입니다.

마찬가지로 if 조건문 끝에는 절대 세미콜론을 붙이면 안 된다.

if에 세미콜론을 붙이면 if printf는 관계가 없이 떨어진 상태가 된다. 즉, 중괄호 없이 한 줄로 코드를 만들면 관계가 없는 상태가 좀 더 명확하게 보일 것이다.

if에서 실행할 코드가 두 줄 이상일 때는 중괄호 생략에 주의하자.

#include <stdio.h>
 
int main()
{
    int num1 = 5;
 
    if (num1 == 10)
        printf("if 조건문\n");    // if에서 중괄호를 생략하면 첫 번째 줄만 실행됨
        printf("10입니다.\n");    // 중괄호가 없으므로 if의 결과와는 관계 없이 항상 실행됨
 
    return 0;
}

10입니다.

if로 실행할 printf가 두개인데도 중괄호를 생략하면 첫 번째 printf만 실행된다. 여기서는 num1에 5가 들어있으므로 조건식이 거짓이라 "if 조건문"은 출력되지 않지만, 뒤에 오는 printf는 if와 관계 없이 항상 실행되므로 "10입니다."가 출력된다.

 

if로 실행할 코드가 두 줄 이상이라면 반드시 중괄호로 묶어두자.

 

#include <stdio.h>
 
int main()
{
    int num1 = 5;
 
    if (num1 == 10)
    {   // if로 실행할 코드가 두 줄 이상이라면 중괄호로 묶어줌
        printf("if 조건문\n");
        printf("10입니다.\n");
    }
 
    return 0;
}

사용자가 입력한 값에 if 조건문 사용하기

이번에는 scanf함수를 사용해, 사용자가 입력한 값을 변수에 저장하고, if 조건문으로 값을 비교해보자.

#define _CRT_SECURE_NO_WARNINGS    // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
 
int main()
{
    int num1;

    scanf("%d", &num1);    // 입력받은 값을 변수에 저장
 
    if (num1 == 10)             // num1이 10이면
    {
        printf("10입니다.\n");  // "10입니다."를 출력
    }
 
    if (num1 == 20)             // num1이 20이면
    {
        printf("20입니다.\n");  // "20입니다."를 출력
    }
 
    return 0;
}

소스를 컴파일 한후, 실행한 뒤 10을 입력하고 엔터 키를 누르자.

10 (입력)
10입니다.

입력 값이 num1에 저장되고 if로 num1이 10인지 비교하였다. 여기서는 10을 입력했으므로 "10입니다"가 출력된다. 

'Computer engineering > C' 카테고리의 다른 글

반복문-While(1)  (0) 2021.05.02
If-else 조건문  (0) 2021.04.21
4. 대입 및 산술 연산자  (0) 2021.04.01
3. #define이란?  (0) 2021.04.01
2. 수의 체계 -실수  (0) 2021.03.25

대입 및 산술연산자에 대해 알아보자.

 

연산자(Operator)  <= 명령어

1. 대입 연산자=> a=b => b의 값을 a에 대입한다.

 

2. 산술 연산자=> a+b => a와 b를 더한다.

나눗셈 시 주의사항은 다음과 같다.

단순히 4/3을 한다면 값은 1이 나온다. 우리가 원하는 값은 1.3333...을 원하는데 이 값이 아닌 정수를 뽑아낸다. 

그러므로 나눗셈 자체를 4.0/3.0으로 처리하여 실수로 계산할 수 있게 해줘야 한다.

코드를 예로 살펴보자.

 

#include <stdio.h>

int main(void){
    int big=0;
    int small=0;
    
    printf("작은수와 큰수를 각각 입력하시오");
    scanf("%d %d",&small,&big);
    
    printf("큰수를 작은수로 나눈 값: %d\n",big/small);
    printf("작은수를 큰수로 나눈 나머지 값: %d",small%big);
    
    return 0;
}

3. 관계 연산자=> a<b => b가 a보다 크다.

4. 논리 연산자=> a&&b => a와 b가 참(true)이다.

 

순서는 다음과 같다.

우선순위 같은 경우는 그래도 다 알아두시는게 좋다.

이제 이것들이 무엇을 의미하는지 알아보자.

 

1. 소괄호 () : 수학에서 괄호 속을 먼저 연산하는 것을 떠올리면 된다.

 

2. 콤마 연산자 : 성격이 동일한 자료형을 나열할 때 쓰인다.

 int num1, num2, num3, ... ;

 

3. 단항연산자 : 1개의 항에 대하여 연산을 해준다.

 3-1) 논리연산자 ! : 피연산자 a의 값이 거짓(0)이면 참(1)을, 그 외의 수는 거짓(0)을 반환한다. 사용법 [ !a ]

 3-2) 비트연산자 ~ : 피연산자 a를 bitwise(비트 반전) 시킨다. 즉, 1100 -> 0011. 사용법 [ ~a ]

 3-3) 증감연산자 ++, -- : 피연산자의 앞에 오냐(전위증가), 뒤에 오냐(후위증가)에 따라 의미가 약간 달라진다.

    ++a (전위증가) 의 경우 a를 1 증가시키고 나머지 연산을 시행하는 반면

    a++ (후위증가) 의 경우 연산을 모두 마친 후, 최종적으로 a를 증가시킨다.

 

    ※ 후위증가가 전위증가보다는 우선순위가 높다. 사용법 [ ++a, --a, a++, a-- ]

 3-4) sizeof(변수, 자료형) : 입력받은 변수 혹은 자료형의 크기를 byte 단위로 반환한다. 사용법 [ sizeof(int), sizeof(a) ]

 3-5) casting연산자 (자료형) : 명시적으로 자료형을 변환해준다. 낮은 곳에서 높은 곳으로 형변환(casting)이 될 때는 데이터 손실이 일어나지 않지만, 높은 곳에서 낮은 곳으로 형변환이 될 때에는 데이터 손실이 일어난다.

   (double)3 : 3이라는 숫자는 정수형이지만, double로 형변환 하여 3.0과 동일한 가치를 지닌다. 상위형변환 이므로 데이터 손실이 일어나지 않는다.

   (int)3.5 : 3.5라는 숫자는 실수형이지만, integer로 형변환 하여 3이라는 가치를 지닌다. 하위형변환 이므로 데이터 손실이 일어난다.

 

4. 산술연산자 : 뺄셈, 곱셈, 나머지연산 - 덧셈, 뺄셈 순으로 수학과 동일하다.

 a+b, a-b, a*b, a/b : 각 연산에 대한 결과 반환. 단, 5/2의 경우 2.5가 아니라 2가 된다. (int / int = int가 되는데 2.5는 double형이므로 하위형변환이 묵시적으로 일어남)

 a%b : a를 b로 나눈 나머지 값을 반환한다. 즉, 123%10 = 3이다.

 

5. 비트이동 연산자 <<, >> : a의 비트를 <<(좌측), >>(우측)으로 b만큼 비트를 이동한다. 밀려나는 값들은 사라지고, 새로운 자리에는 0이 들어온다.

 a << 2 : a의 비트가 00001110 이면 00111000이 된다.

 

 ※ 비트를 왼쪽으로 한 번 이동하는 것은 2를 곱하는 효과, 오른쪽으로 한 번 이동하는 것은 2로 나누는 효과를 가져온다.

 

6. 관계연산자 : 다음 식이 참이면 1을 반환, 거짓이면 0을 반환한다.

 a<b, a>b, a<=b, a>=b, a==b (같다 라는 표현은 =을 두개 사용하여 나타낸다), a!=b (a와 b가 다르다)

 

7. 비트논리연산자 : and, or, xor의 논리값을 반환한다.

 a&b : a와 b가 둘 다 참(1)일 때만 1을 반환한다. 그 외에는 0

 a|b : a와 b가 둘 다 거짓(0)일 때만 0을 반환한다. 그 외에는 1

 a^b : a와 b가 서로 다를 때 1을 반환한다. 그 외에는 0

 

 n bit에 대하여 n 비트 전부를 개별로 검사한다. 그리고 그 값을 개별적으로 반환하여 합하여 계산한다. 

즉, 11000000 & 01000001 = 01000000으로 반환한다. 이는 특정 비트를 검사할 때 매우 유용하다. 특정 비트가 검사된다면 왼쪽 예와 같이 0이 아닌 값을 반환하기 때문이다. 가령 예를 들어 하위 두번 째 비트가 1인지 아닌지 여부를 검사한다고 가정하자. 그러면

& 00000010을 주면 하위 두번 째 비트가 1일 경우에만 0이 아닌 수가 반환된다.

 

11111101 & 00000010 = 00000000 (거짓값 : 하위 두번 째 비트가 1로 세팅되어 있지 않다)

11100011 & 00000010 = 00000010 (참 값 : 하위 두번 째 비트가 1로 세팅되어 있다)

11000000 & 00000010 = 00000000 (거짓값 : 하위 두번 째 비트가 1로 세팅되어 있지 않다)

 

8. 논리연산자 : and, or의 논리값을 반환한다. 이 때에는 피연산자 자체가 0이 아닌 경우 참, 0인 경우 거짓을 나타낸다.

 a&&b : a와 b가 둘다 참일 때만 1을 반환한다. 11111101 && 00000010의 경우 둘 다 0이 아닌 수라 참의 값을 지니므로 결과는 참이 된다. 주로 관계연산자와 같이 사용된다. (a>=b) && (a>100) 와 같이 사용한다.

 a||b : a와 b가 둘다 거짓일 때만 0을 반환한다.

 

9. 조건연산자 : a? b: c 의 꼴이며, a가 참이면 b, 거짓이면 c를 반환한다.

 int max = (a>b)? a: b; 의 형태로 사용된다 // a가 b보다 크면 a, 작으면 b가 반환되서 max라는 변수에 할당이 된다.

 

10. 할당 및 복합 할당연산자 (오른쪽에서 왼쪽으로)

 a = b :  b의 값을 a에 저장한다.

 a += b, a = a+b 와 동일한 의미를 지닌다. a+b값을 a에 저장하라는것을 현재 a값에 b값을 더해 다시 a에 저장하라는 의미로도 해석하는것이다.

 a -= b, a = a-b 와 동일, a와b를 뺀값을 a에 저장하라는 의미이다.

 a *= b, a = a*b 와 동일, a와b를 곱한값을 a에 저장하라는 의미이다

 a /= b, a = a/b 와 동일, a와b를 나눈 몫을 a에 저장하라는 의미이다

 a %= b,a %= b 와 동일, a와b를 나눈 나머지를 a에 저장하라는 의미이다.

 

'Computer engineering > C' 카테고리의 다른 글

If-else 조건문  (0) 2021.04.21
If 조건문  (0) 2021.04.11
3. #define이란?  (0) 2021.04.01
2. 수의 체계 -실수  (0) 2021.03.25
1. 수의 체계 -보수  (0) 2021.03.25

C언어에서는 컴파일러에 특정 작업을 지시하는 전처리기(preprocessor)를 제공한다. 보통 전처리기는 반복되는 값이나 작업을 미리 정의할 때 사용하며 컴파일 옵션 설정이나 조건부 컴파일도 가능하다.

 

#define은 컴파일 직전에 처리되므로 전처리기에 명령한다.

바뀐 코드는 전처리기 과정 때 임시로 생성될 뿐 원본 코드에 영향을 주지 않는다.

 

다음 코드를 살펴보자.

#include <stdio.h>
#define PI 3.14

float circle_area(float r)
{
    return PI*r*r;
}

int main()
{
    printf("%f",circle_area(4));
    
    return 0;
}

다음을 해석해보면 

#define PI 3.14

는 'PI는 3.14라는 것을 정의해준다' 이다.

 

이해하기도 쉽고 간단하며 유용한 방법이다. 실제 저런 변수값은 정말 많이 쓰이는 경우가 많은데 하나하나 지정해서 써준다기보다는 메크로로 지정하여 주는게 이해하기도 쉽고 사용하기도 편리하다.

*보통 define 매크로는 대문자로 지정해준다(약속이다).

 

특히 상수값(잘 변하지 않는값)을 표현할때 많이쓰인다. 물론 상수 뿐만아니라 Array도 지정해줄 수 있다. 

 

 

전체 흐름도

 

 

 

'Computer engineering > C' 카테고리의 다른 글

If-else 조건문  (0) 2021.04.21
If 조건문  (0) 2021.04.11
4. 대입 및 산술 연산자  (0) 2021.04.01
2. 수의 체계 -실수  (0) 2021.03.25
1. 수의 체계 -보수  (0) 2021.03.25

실수의 저장 방법

int 정수(Integer)

변수 선언에 따라 각 값은 다음과 같다.

변수 선언 표

위 값보다 더 큰 경우를 사용하게 될 경우에는 어떻게 해야할까?

 

float, double(실수)를 선언해주어야 한다.

float은 4byte이다.

float(4byte)

double은 8byte이다. 엄청나게 큰 수를 저장할 수 있다.

double(8byte)

float과 double은 저장방식이 다르다. 다음 그림을 보자.

우선 float부터 보자.

 

float의 저장 공간 시각화

floating point(점이 떠다닌다)는 의미는 float의 약자이다. 즉, 소수 점이 자리를 이동하면서 떠다닌다는 의미를 갖는다.

그렇기에 정수표현식으로 변환하여 저장한다.

32.46=>3.245*10^1 

즉, 4 앞에 있는 소수점을 한자리 앞으로 옮겨줌으로써 10^1을 곱해준다.

결국 지수부와 가수부는 각자 따로 저장된다.

다른 예로,

0.0000003245=>3.245*10^-7 

이또한 10^-7은 지수부에서 옮겨지고, 3.245는 가수부에서 처리된다.

 

float형 실습

 

#include <stdio.h>

int main()
{
    //pi: 3.1415926538979
    float pi=3.1415926538979f;
    
    printf("%f",pi);

    return 0;
}


3.141593

float형은 6자리까지 밖에 출력을 안해준다. 더 보고싶다면

printf("%.20f",pi);로 변경해주어야 한다. 그러면 소수점이 20자리까지 나올 것이다.

 

#include <stdio.h>

int main()
{
    //pi: 3.1415926538979
    float pi=3.1415926538979f;
    
    printf("%.20f",pi);

    return 0;
}

3.14159274101257324219

 

가만히 보니 값이 조금 다르다. 이는 값의 저장방식이 다르기 때문에 변형된것이다.

제대로 된 값을 찾고 싶으면 double 형을 사용하면된다.

 

정리해보면,

-float은 출력시 %f 

-float은 값 설정시 예를들어 2000이면 2000.0f 를지정해준다.

-float은 값이 어느정도 커지면 값이 정확하게 출력이 안된다.

-double은 출력시 %lf

-double은 어느정도 float보다는 값이 정확하지만(64bit이기 때문), 이또한 값이 더 커진다면 정확하게 출력이 안된다.

-int는 출력시 %d

 

 

'Computer engineering > C' 카테고리의 다른 글

If-else 조건문  (0) 2021.04.21
If 조건문  (0) 2021.04.11
4. 대입 및 산술 연산자  (0) 2021.04.01
3. #define이란?  (0) 2021.04.01
1. 수의 체계 -보수  (0) 2021.03.25

보수를 활용하여 -값을 표현한다.

 

보수(Complement): 보완해서 완전하게 만들어 주는 수(보완제, 보어 등)

 

이산수학에서 등장한다.

 

*10진수 6: 6에 대한 10의 보수는 4 -> 1 0 

*10진수 46: 46에 대한 10의 보수는 54 ->1 0 0

*2진수 1: 1에 대한 2의 보수는 1 -> 1 0

 

 

보수의 성질: 어떤 수의 보수는 그 수의 음수 표현으로 나타낼 수 있다.

 

*1234-234=1000  -> 1234+(-234)=1000

->(보수화) 1234+0324의 10의 보수

각 자리를 0으로 만드는 수(네자리 수 연산임을 유의한다)

각 자리를 9로 만드는 수(9의 보수 +1)

 

즉, 0324+9765+1=10000

9765+1=9766

 

결국 9766은 234의 음수 값이 된다.

9763은 0234의 10의 보수

 

그러므로 1000이 남는다.

즉, 어떤 수의 보수를 취하면 그 수는 -성질을 띈다.

 

2진수로 연산

23-6=17

 

23의 2진표기
6의 2진표기

(보수화)

-6의 2진표기

각 자리를 모두 0으로 만든다(2의 보수)=>각 자리를 모두 1로 만든 후, +1을 해준다(1의 보수).

 

1을 더한 값

제일 앞 자리가 1이면 음수이다.

결국, 23+(-6)은 다음과 같다.

총 값은 17이 된다. 

 

 실제 컴퓨터에는 뺄셈 연산 기능이 없다.

컴퓨터는 2의 보수법을 활용해 음수를 저장한다. 즉, 보수를 취해 더해버린다.

 

연습문제

 

 

[출처: 선복근 교수님의 C Programming 강의]

'Computer engineering > C' 카테고리의 다른 글

If-else 조건문  (0) 2021.04.21
If 조건문  (0) 2021.04.11
4. 대입 및 산술 연산자  (0) 2021.04.01
3. #define이란?  (0) 2021.04.01
2. 수의 체계 -실수  (0) 2021.03.25

+ Recent posts