자료구조와 알고리즘 02 完 / (01~06)

Loser·2021년 6월 14일
0

Write Date : 2021.6.15
Last Edit : 2021.6.18

Last Page : -

연습문제
Q1

// Q1_키의 최댓값을 구하는 프로그램을 수정하여
// 키의 최솟값을 구하는 프로그램을 작성하시오.

// 배열 요소의 최솟값을 구합니다(값을 입력 받습니다.)

#include <stdio.h>
#include <stdlib.h>

// 요소 개수가 n인 배열 a의 요소의 최솟값을 구합니다.
int minof(const int a[], int n)
{
    int i;
    int min = a[0];
    for (i = 1; i < n; i++)
        if (a[i] < min) min = a[i];
    return min;
}

int main()
{
    int i;
    int *height;
    int number;
    printf("사람수 : "); scanf("%d", &number);
    height = calloc(number, sizeof(int));

    printf("%d 사람의 키를 입력하세요.\n", number);
    for (i = 0; i < number; i++)
    {
        printf("hegiht[%d] : ", i); scanf("%d", &height[i]);
    }
    printf("최솟값은 %d입니다.\n", minof(height, number));
    free(height);
    return 0;
}

Q2

// Q2_키의 최댓값을 구하는 프로그램을 수정하여
// 키의 합계를 구하는 프로그램을 작성하시오.

// 배열 요소의 합계를 구합니다(값을 입력 받습니다.)

#include <stdio.h>
#include <stdlib.h>

// 요소 개수가 n인 배열 a의 요소의 합계를 구합니다.
int sumof(const int a[], int n)
{
    int i;
    int sum;
    sum = 0;
    for (i = 0; i <= n; i++)
        sum += a[i];
    return sum;
}

int main()
{
    int i;
    int *height;
    int number;
    printf("사람수 : "); scanf("%d", &number);
    height = calloc(number, sizeof(int));

    printf("%d 사람의 키를 입력하세요.\n", number);
    for (i = 0; i < number; i++)
    {
        printf("hegiht[%d] : ", i); scanf("%d", &height[i]);
    }
    printf("합계는 %d입니다.\n", sumof(height, number));
    free(height);
    return 0;
}

Q3

// Q3_키의 최댓값을 구하는 프로그램을 수정하여
// 키의 평균을 구하는 프로그램을 작성하시오.
// 평균을 구하는 과정에서 정수가 아닌 실수로 평균값을 구한다.

// 배열 요소의 평균을 구합니다(값을 입력 받습니다.)

#include <stdio.h>
#include <stdlib.h>

// 요소 개수가 n인 배열 a의 요소의 평균을 구합니다.
double aveof(const int a[], int n)
{
    int i;
    double ave;
    ave = 0;
    for (i = 0; i <= n; i++)
        ave += a[i];
    ave /= (double)n;
    return ave;
}

int main()
{
    int i;
    int *height;
    int number;
    printf("사람수 : "); scanf("%d", &number);
    height = calloc(number, sizeof(int));

    printf("%d 사람의 키를 입력하세요.\n", number);
    for (i = 0; i < number; i++)
    {
        printf("hegiht[%d] : ", i); scanf("%d", &height[i]);
    }
    printf("평균값은 %.2f입니다.\n", aveof(height, number));
    free(height);
    return 0;
}

Q4

// Q4_ 키를 난수로 생성한 후 키의 최댓값을 구하는 프로그램을 수정하여
// 키와 함께 사람도 난수로 생성하도록 수정하여 프로그램을 작성하라.
// 사람 수는 5 이상 20이하의 난수로 입력받아야한다.

// 배열 요소의 최댓값을 구한다.(값을 난수로 생성)
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

// 요소 개수가 n인 배열 a의 최댓값을 구한다.
int maxof(const int a[], int n)
{
    int i;
    int max = a[0];
    for (i = 1; i < n; i++)
        if (a[i] > max) max = a[i];
    return max;
}

int main()
{
    int i, number;
    int *height;
    srand(time(NULL)); // 시간으로 난수의 seed(씨앗)을 초기화.
   
    number = 5 + rand() % 20;
    printf("%d명의 키의 값을 입력받습니다.\n", number);

    height = calloc(number, sizeof(int));

    for (i = 0; i < number; i++)
    {
        height[i] = 100 + rand() % 90; // 100 ~ 189의 난수를 생성 , 대입
        printf("height[%d] = %d\n", i, height[i]);
    }
    printf("최댓값은 %d입니다.\n", maxof(height, number));

    free(height);
    return 0;
}

Q5

// Q5_ 배열 요소를 역순으로 정렬하는 프로그램을 수정하여
// 정렬하는 과정을 일일이 출력하도록 작성하라.

// 배열 요소를 역순으로 정렬합니다.
#include <stdio.h>
#include <stdlib.h>

// type형 x와 y를 교환.
#define swap(type, x, y) do {type t = x; x = y; y = t;} while(0)

// 요소 개수가 n인 배열 a의 요소를 역순으로 정렬
void ary_reverse(int a[], int n)
{
    int i;
    int j;
    for (i = 0; i < n / 2; i++)
    {
        for ( j = 0; j < n; j++)
        {
            printf("%d ", a[j]);
        }
        putchar('\n');
        printf("a[%d]과 a[%d]를 교환합니다.\n", i, n - i - 1);
        swap(int , a[i], a[n - i - 1]);
    }
    for ( j = 0; j < n; j++)
    {
        printf("%d ", a[j]);
    }
    printf("\n역순 정렬을 종료합니다.\n");
}

int main()
{
    int i, nx;
    int *x;

    printf("요소의 갯수 : "); scanf("%d", &nx);
    x = calloc(nx, sizeof(int));
    for (i = 0; i < nx; i++)
    {
        printf("x[%d] : ", i); scanf("%d", &x[i]);
    }

    ary_reverse(x, nx);

    printf("배열의 요소를 역순으로 정렬했습니다.\n");
    for (i = 0; i < nx; i++)
        printf("x[%d] = %d\n", i, x[i]);
    free(x);

    return 0;
}

Q6

// Q6_ 기수변환 프로그램을 수정하여
// 배열의 맨 앞쪽에 아랫자리가 아니라 윗자리를 저장하는 프로그램을 작성하시오
// 배열요소를 역순으로 정렬하는 함수를 이용하여 바꾸면된다.


// 정수를 2진수 ~ 36진수로 기수 변환
#include <stdio.h>

#define swap(type, x, y) do{type t = x; x = y; y = t;} while(0)

void ary_rev (char a[], int n)
{
    int i;
    for ( i = 0; i < n / 2; i++)
    {
        swap(int, a[i], a[n - i - 1]);
    }
}

// 정수 값 x를 n진수로 변환하여 배열 d에 아랫자리부터 저장.
int card_convr(unsigned x, int n, char d[])
{
    char dchar[] = "0123456789ABCDEFGHIJKLMNOPQRRSTUVWXYZ";
    int digits;
    digits = 0; // 변환 후의 자릿수.
    if (x == 0) // 0이면
        d[digits++] = dchar[0]; // 변환 후에도 0
    else
        while(x)
        {
            d[digits++] = dchar[x % n]; // n으로 나눈 나머지를 저장한다.
            x /= n;
        } 
        return digits;
} 

int main()
{
    int i;
    unsigned no; // 변환하려는 정수
    int cd; // 기수
    int dno; // 변환 후 자릿수.

    char cno[512]; // 변환한 값의 각 자리의 숫자를 저장하는 문자 배열.
    int retry;
    puts("10진수를 기수 변환합니다.");
    printf("변환하는 음이 아닌 정수 : "); scanf("%u", &no);   
    do 
    {
        do
        {
            printf("어떤 진수로 변환할까요?(2~36) : "); scanf("%d", &cd);
        }while(cd < 2 || cd > 36);

        dno = card_convr(no, cd, cno); // no를 cd진수로 변환.
        ary_rev(cno, dno);
        printf("%d진수로는", cd);
        for (i = 0; i < dno; i++) 
            printf("%c", cno[i]);
        printf("입니다.\n");
        printf("한번 더 할까요? 1... 예 / 0... 아니오 :  "); scanf("%d", &retry);
    } while(retry == 1);

    return 0;
}

Q7

// Q7_ 기수변환 프로그램을 수정하여
// 배열의 맨 앞쪽에 아랫자리가 아니라 윗자리를 저장하고 
// 기수 변환 과정을 자세히 출력하는 프로그램을 작성하라.

// 배열요소를 역순으로 정렬하는 함수를 이용하여 바꾸면된다.


// 정수를 2진수 ~ 36진수로 기수 변환
#include <stdio.h>

#define swap(type, x, y) do{type t = x; x = y; y = t;} while(0)

void ary_rev (char a[], int n)
{
    int i;
    for ( i = 0; i < n / 2; i++)
    {
        swap(int, a[i], a[n - i - 1]);
    }
}

// 정수 값 x를 n진수로 변환하여 배열 d에 아랫자리부터 저장.
int card_convr(unsigned x, int n, char d[])
{
    char dchar[] = "0123456789ABCDEFGHIJKLMNOPQRRSTUVWXYZ";
    int digits;
    digits = 0; // 변환 후의 자릿수.
    if (x == 0) // 0이면
        d[digits++] = dchar[0]; // 변환 후에도 0
    else
        while(x)
        {
            printf("%d | %4d", n, x); 
            d[digits++] = dchar[x % n]; // n으로 나눈 나머지를 저장한다.
            printf("... %d\n", x % n);
            x /= n;
            printf("  +---------\n");
        }
        printf("%12d\n", x % n);
        return digits;
} 

int main()
{
    int i;
    unsigned no; // 변환하려는 정수
    int cd; // 기수
    int dno; // 변환 후 자릿수.

    char cno[512]; // 변환한 값의 각 자리의 숫자를 저장하는 문자 배열.
    int retry;
    puts("10진수를 기수 변환합니다.");
    printf("변환하는 음이 아닌 정수 : "); scanf("%u", &no);   
    do 
    {
        do
        {
            printf("어떤 진수로 변환할까요?(2~36) : "); scanf("%d", &cd);
        }while(cd < 2 || cd > 36);

        dno = card_convr(no, cd, cno); // no를 cd진수로 변환.
        ary_rev(cno, dno);
        printf("%d진수로는", cd);
        for (i = 0; i < dno; i++) 
            printf("%c", cno[i]);
        printf("입니다.\n");
        printf("한번 더 할까요? 1... 예 / 0... 아니오 :  "); scanf("%d", &retry);
    } while(retry == 1);

    return 0;
}

Q8

// Q8_ 배열 b의 모든 요소를 배열 a에 복사하는 함수를 작성하라.
// n은 요소 갯수입니다.
#include <stdio.h>
#include <stdlib.h>

void ary_copy(int a[], const int b[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        a[i] = b[i];
    }
}


int main()
{
    int i;
    int nx;
    printf("배열의 크기 : "); scanf("%d", &nx);
    int *x, *y;
    x = calloc(nx, sizeof(int));
    y = calloc(nx, sizeof(int));

    for (i = 0; i < nx; i++)
    {
        printf("x[%d] : ", i); scanf("%d", &x[i]);
    }

    puts("배열 X를 Y에 복사합니다.");
    
    ary_copy(y, x, nx);

    for (i = 0; i < nx; i++)
    {
        printf("x[%d] = %d\n", i, x[i]);
        printf("y[%d] = %d\n", i, y[i]);
    }

    free(x);
    free(y);

    return 0;
}

Q9

// Q9_배열 b의 모든 요소를 배열 a에 역순으로 복사하는 함수를 작성하라.
// n은 요소 개수이다.

#include <stdio.h>
#include <stdlib.h>

void ary_rcopy(int a[], const int b[], int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        a[i] = b[n - i - 1];
    }
}

int main()
{
    int i;
    int nx;
    printf("배열의 크기 : "); scanf("%d", &nx);
    int *x, *y;
    x = calloc(nx, sizeof(int));
    y = calloc(nx, sizeof(int));

    for (i = 0; i < nx; i++)
    {
        printf("x[%d] : ", i); scanf("%d", &x[i]);
    }

    puts("배열 X를 Y에 복사합니다.");
    
    ary_rcopy(y, x, nx);

    for (i = 0; i < nx; i++)
    {
        printf("x[%d] = %d\n", i, x[i]);
        printf("y[%d] = %d\n", i, y[i]);
    }

    free(x);
    free(y);

    return 0;
}

Q10

// Q10_배열 a의 모든 요소를 뒤섞는함수를 작성하라.
// n은 요소 개수이다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define swap(type, x, y) do {type t = x; x = y; y = t;} while(0)

void shuffle(int a[], int n)
{
    srand(time(NULL));
    int i;
    int random;
    random = rand()%n;
    for (i = 0; i < n; i++)
    {
        swap(int, a[i], a[random]);
    }
}

int main()
{
    int i;
    int nx;
    printf("배열의 크기 : "); scanf("%d", &nx);
    int *x;
    x = calloc(nx, sizeof(int));

    for (i = 0; i < nx; i++)
    {
        printf("x[%d] : ", i); scanf("%d", &x[i]);
    }

    puts("섞기전의 배열 X입니다.");
    for (i = 0; i < nx; i++)
    {
        printf("x[%d] = %d\n", i, x[i]);
    }


    puts("배열 X를 섞습니다");
    
    shuffle(x, nx);

    for (i = 0; i < nx; i++)
    {
        printf("x[%d] = %d\n", i, x[i]);
    }

    free(x);

    return 0;
}

Q11

// Q11_ dayofyear 함수를 변수 i와 days를 사용하지 않고 구현한다.
// 또한 for문이 아닌 while문을 사용한다.

// 한 해의 지난 날 수를 구합니다.
#include <stdio.h>

// 각 달의 날 수
int mdays[][12] = 
{
    {31, 28, 31, 30 ,31, 30, 31, 31, 30, 31, 30 ,31},
    {31, 29, 31, 30 ,31, 30, 31, 31, 30, 31, 30 ,31}
};

// year 가 윤년인가?
int isleap(int year)
{
    return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}

// y년 m월 d일 그해 지난 날 수를 구합니다.
int dayofyear(int y, int m, int d)
{
    int i;
    int days = d; // 날 수
    // for (i = 1; i < m; i++)
    // {
    //     printf("%d\n", i);
    //     days += mdays[isleap(y)][i - 1];
    // }   
    // return days;
    while(--m != 0)
    {
        d += mdays[isleap(y)][m - 1];  
    }

    return d;
}

int main()
{
    int year, month, day; // 년 월 일
    
    int retry;
    do
    {
        printf("년 : "); scanf("%d", &year);
        printf("월 : "); scanf("%d", &month);
        printf("일 : "); scanf("%d", &day);
        printf("%d년의 %d일째입니다.\n", year, dayofyear(year, month, day));
        printf("다시 할까요? (1...예 / 0... 아니오) : "); scanf("%d", &retry);
    } while(retry == 1);

    return 0;
}

Q12

// Q12_ 프로그램의 시력분포를 오른쪽 처럼 그래프 모양으로
// 출력하도록 프로그램을 작성하라.
// 0.1 ~ : *
// 0.2 ~ : ***
// 0.3 ~ : * 



// 신체검사 데이터용 구조체 배열
#include <stdio.h>
#define VMAX 21 // 시력의 최댓값 2.1 x 10 

// 신체검사 데이터형
typedef struct
{
    char name[20]; // 이름
    int height; // 키
    double vision; // 시력
} PhysCheck;

// 키의 평균값을 구합니다.
double ave_height (const PhysCheck dat[], int n)
{
    int i;
    double sum = 0;
    for (i = 0; i < n; i++)
        sum += dat[i].height;
    
    return sum / n;
}

// 시력 분포를 구합니다.
void dist_vision(const PhysCheck dat[], int n, int dist[])
{
    int i;
    for (i = 0; i < VMAX; i++)
    {
        dist[i] = 0;
    }
    for (i = 0; i < n; i++)
        if (dat[i].vision >= 0.0 && dat[i].vision <= VMAX / 10.0)
            dist[ (int)(dat[i].vision * 10) ]++;
}

int main()
{
    int i;
    PhysCheck x[] = 
    {
        { "박현규", 162, 0.3 },
        { "함진아", 173, 0.3 },
        { "최윤미", 175, 2.0 },
        { "홍연의", 171, 2.0 },
        { "이수진", 168, 0.8 },
        { "김영준", 174, 0.8 },
        { "박용규", 169, 0.8 },
    };

    int nx = sizeof(x) / sizeof(x[0]); // 사람 수

    int vdist[VMAX]; // 시력 분포
    puts("●○● 신체검사표 ●○●");
    puts("   이름          키  시력  ");
    puts("------------------------");
    for (i = 0; i < nx; i++)
        printf("%-18.18s%4d%5.1f\n", x[i].name, x[i].height, x[i].vision);
    
    printf("\n평균키 : %5.1f cm\n", ave_height(x, nx));
    dist_vision(x, nx, vdist);
    printf("\n시력 분포\n");
    for (i = 0; i < VMAX; i++)
    {   int j;
        printf("%3.1f ~ : ", i/10.0);
        for (j = 0; j < vdist[i]; j++)
            printf("*");
        printf("\n");
    }

    
    
    return 0;
}

Q13

// Q13_ 날짜를 나타내는 구조체가 오른쪽처럼 주어져있다.
// typdef struct
// {
//     int y; // 년
//     int m; // 월 
//     int d; // 일
// } Date;

// 아래의 함수들을 작성하라.


// 한 해의 지난 날 수를 구합니다.
#include <stdio.h>

typedef struct
{
    int y; // year
    int m; // month
    int d; // day
} Date;

// 날짜 x의 n일 뒤의 날짜를 반환하는 함수.
Date After(Date x, int n);

// 날짜 x의 n일 앞의 날짜를 반환하는 함수.
Date Before(Date x, int n);

// 각 달의 날 수
int mdays[][12] = 
{
    {31, 28, 31, 30 ,31, 30, 31, 31, 30, 31, 30 ,31},
    {31, 29, 31, 30 ,31, 30, 31, 31, 30, 31, 30 ,31}
};

// year 가 윤년인가?
int isleap(int year)
{
    return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}

// Y년 M월 D일임을 나타내는 구조체를 반환하는 함수
Date Dateof(int y, int m, int d)
{
    Date x = {y, m , d};
    return x;
}


// // y년 m월 d일 그해 지난 날 수를 구합니다.
// int dayofyear(int y, int m, int d)
// {
//     int i;
//     int days = d; // 날 수
//     // for (i = 1; i < m; i++)
//     // {
//     //     printf("%d\n", i);
//     //     days += mdays[isleap(y)][i - 1];
//     // }   
//     // return days;
//     while(--m != 0)
//     {
//         d += mdays[isleap(y)][m - 1];  
//     }

//     return d;
// }

int main()
{
    int year, month, day; // 년 월 일
    int retry;
    int adays, bdays;
    
    do
    {
        Date ymd;
        printf("년 : "); scanf("%d", &year);
        printf("월 : "); scanf("%d", &month);
        printf("일 : "); scanf("%d", &day);
        ymd = Dateof(year, month, day);
        printf("%d년 %d월 %d일.\n", ymd.y, ymd.m, ymd.d);

        
        printf("N일만큼 앞의 날짜를 구합니다. : "); scanf("%d", &adays);
        ymd = After(ymd, adays);
        printf("%d일만큼 앞의 날짜는 %d년 %d월 %d일입니다.\n", adays, ymd.y, ymd.m, ymd.d);
        

        
        printf("N일만큼 뒤의 날짜를 구합니다. : "); scanf("%d", &bdays);
        ymd = Before(ymd, bdays);
        printf("%d일만큼 뒤의 날짜는 %d년 %d월 %d일입니다.\n", adays, ymd.y, ymd.m, ymd.d);
        
        
        printf("다시 할까요? (1...예 / 0... 아니오) : "); scanf("%d", &retry);
    } while(retry == 1);

    return 0;
}


// 날짜 x의 n일 뒤의 날짜를 반환하는 함수.
Date After(Date x, int n)
{
    if (n < 0)
        return Before(x, -n);
    x.d += n;

    while (x.d > mdays[isleap(x.y)][x.m - 1])
    {
        x.d -= mdays[isleap(x.y)][x.m - 1]; // x.m-1은 데이터 검출 작업 (인덱스 0부터 시작)
        if (++x.m > 12) // 월의 실제 움직임.
        {
            x.y++;
            x.m = 1;
        }
    }
    return x;
}

// 날짜 x의 n일 앞의 날짜를 반환하는 함수.
Date Before(Date x, int n)
{
    if (n < 0)
        return After(x, -n);
    x.d -= n;
    while (x.d < 1)
    {
        if(--x.m < 1)
        {
            x.y--;
            x.m = 12;
        }
        x.d += mdays[isleap(x.y)][x.m - 1];
    }

    return x;
}

자료구조
데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계

배열
요소 개수는 상수만 사용할 수 있다. (변수 사용 불가)
상수식은 상수만을 포함하는 식으로, 실행 시점이 아닌 컴파일 시점에 계산된다.

C언어의 메모리 구조
프로그램을 실행하면 운영체제(OS)는 프로그램이 사용할 메모리 영역을 할당한다.
할당하는 메모리 영역은 크게 데이터, 스택, 힙 영역으로 나뉘어진다.

할당 시기 : 프로그램이 실행될 때마다 할당
할당 장소 : RAM
할당 용도 : 프로그램 실행에 필요한 메모리 영역 할당.

데이터 영역

  • 전역 변수와 정적(static) 변수가 할당되는 영역
  • 프로그램을 시작하면 할당하고, 프로그램을 종료하면 메모리에서 해제함.

스택(Stack) 영역

  • 함수 호출시 생성되는 지역 변수와 매개변수가 저장되는 영역
  • 함수 호출이 완료되면 사라짐.

힙(Heap) 영역

  • 필요에 따라 동적으로 메모리를 할당.

힙 영역은 할당해야 할 메모리 영역의 크기를 프로그램이 실행되는 동안 결정해야 하는 경우에 사용한다.

힙 영역은 관리가 가능한 데이터 외에 다른 형태의 데이터를 관리하기 위한 빈 공간 (Free Space)이다. 즉, 동적 할당을 통해 생성된 동적 변수를 관리하기 위한 영역인것이다.
힙 영역은 위의 다른 영역을 모두 할당하고 남은 공간이다. 남은 공간이라 하여 영역에 제한이 있는것은 아니고 시스템의 메모리 영역의 여유 공간에 따라 달라진다.
동적 변수는 어느 시점에 얼마만큼의 공간을 할당할지 정확하게 예측할 수 없으므로 프로그램 실행중 (Run Time)에 결정한다.

void 포인터
모든 자료형의 메모리 확보 또는 해제할때 사용하는 함수들은 특정한 자료형의 포인터를 주고받을 때 자료형이 서로 맞지 않으면 문제가 발생하므로 void 포인터를 반환하거나 받는데 사용한다.
void 포인터는 모든 형의 객체를 가리킬 수 있다.
void 포인터의 값을 모든 자료형의 포인터에 대입할수 있고, 거꾸로 모든 자료형의 포인터 값을 void 포인터에 대입할 수 있습니다.

포인터란?
포인터는 '객체또는 함수를 가리키는것' 으로 정의할 수 있다.

배열의 요소를 가리키는 포인터는 다음과 같은 규칙이 성립한다.

포인터 p가 배열의 요소 e를 가리킬때
_p + i 는 e의 i개만큼 뒤쪽의 요소를 가리키는 포인터가 되고
p - i 는 e의 i개만큼 앞쪽의 요소를 가리키는 포인터가 된다.

포인터 p가 배열의 요소 e를 가리킬때
요소 e의 i개만큼 뒤쪽의 요소를 나타내는 (p+i)는 p[i]로 표기할 수 있고.
요소 e의 i개만큼 앞족의 요소를 나타내는
(p-i)는 p[-i]로 표기할 수 있다.

int a[]를 인수로 받게되면 단순한 포인터이지 배열이 아니므로 배열의 요소 개수는 새로운 인수로 받아야한다. ( 호출하는 함수는 배열의 요소 개수를 알수가 없다.)

함수 형식 매크로에서 ㅓdo문을 사용한이유.
do문은 do부터 세미콜론까지가 하나의 구문이다.
"do - while();" 이런식이기때문. 그래서 while(0)로 한번만 실행되게 한다.

기수 변환
10진수 정수를 n진수 정수로 변환하려면 정수를 n으로 나눈 나머지를 구하는 동시에 그 몫에 대해 나눗셈을 반복해야한다. 이 과정을 몫이 0이 될 때까지 반복하고 이런 과정으로 구한 나머지를 거꾸로 늘어 놓은 숫자가 기수로 변환된 숫자다.

윤년 구하는법
윤년은 4의 배수 가운데 100의 배수를 제외하고, 제외한 100의 배수 가운데 400의 배수를 다시 포함시키면 된다.

year % 4 == 0 && year % 100 != 1 || year % 400 == 0;
4의 배수포함 100의 배수제외 400의 배수를 포함

구조체

typedef 선언을 사용해 짧은 이름으로 다시 만들어 사용할 수 있다. 예를들어

typdef struct xyz XYZ; /* struct xyz와 동의어인 XYZ를 선언 */

라고 선언하면 struct szyz에 대하여 typdef 이름인 동의어 XYZ를 사용할 수 있다.

이렇게 하면 변수 a와 포인터 p는 간단하게 선언하고 정의할 수 있다.

XYZ a; // XYZ형 (struct xyz형)의 a
XYZ *p = &a; // a를 가리키는 XYZ *형 (즉, struct xyz *형)의 포인터 p
profile
whatever

0개의 댓글

관련 채용 정보