내용 정리

 

1장은 데이터베이스라는 용어의 어원과 간단한 개념을 잡는 과정이라고 할 수 있다.

 

학과 과정 중 MySql을 공부해서 이해하는데 어렵지 않았다.

 

 

 

4차 산업혁명 이후 다양한 데이터들이 수집되고 있으며 이를 잘 활용하는 사람이 이 시대를 이끄는 자가 될 수 있다.

 

수많은 데이터를 관리하기 위해서는 기존의 엑셀이나 워드 같은 

 

파일 시스템으로 데이터를 효율적으로 관리하기가 어려워졌다.

 

데이터를 효율적으로 관리하기 위해서 데이터베이스라는 개념이 등장하였다.

 

 

 

DBMS

 

데이터베이스 관리 시스템(DBMS: DataBase Management System)의 약자.

 

데이터베이스 관리 시스템은 데이터베이스의 데이터 조작과 관리를 극대화한 시스템 소프트웨어이다.

 

 

응용 프로그램이 데이터를 DBMS에 요청하고,

 

DBMS는 자신이 관리하는 데이터베이스로 관련 작업을 수행하고

 

그 결과값을 제공한다.

 

 

 

응용프로그램 중간에 DBMS가 데이터베이스를 조작하고

 

결괏값을 전달한다고 생각하면 쉽겠다.

 

 

 

데이터 모델

 

 

여러가지 모델이 있지만 관계형 데이터 모델을 사용한다.

 

추가적으로 관계형 데이터 모델을 바탕으로 객체 개념을 도입하여

 

객체 관계형 DBMS로 영역을 확장하고 있다.

 

 

데이터를 구성하는 방법은 쉽게 말해 '표'와 같다.

 

이러한 방법으로 데이터를 구성하고 관리한다.

 

 

추가로

 

사원 번호 0001와 0003의 부서는 같다.

 

이렇게 되면 부서의 위치와 전화번호도 같게 되는데

 

이 데이터를 계속 한 사람마다 관리한다면 저장공간은 불필요하게 증가하고

 

데이터가 중복이 된다.

 

이러한 데이터는 정규화 과정을 거쳐서 효율적으로 데이터가 관리되는데

 

목차를 보니 이 책에서는 다루고 있지 않은데 따로 찾아보는 것을 추천한다.

 

 

 

관계형 데이터베이스와 SQL

 

관계형 데이터베이스를 관리하는 시스템은 RDBMS라고 불린다. 

 

SQL(Structured Query Language)의 약자이다.

 

SQL은 RDBMS에서 데이터를 다루고 관리하는 데

 

사용하는 데이터베이스 질의 언어이다.

 

 

 

취업 후 3개월이 흘렀고, 금융권에 배정을 받아 이제 막 업무를 익히고 있다.

 

금융권은 수 많은 데이터를 관리해야하므로, 시스템 관리자인 나도 데이터를 관리해야 했다.

 

그 중 오라클 프로그램을 사용하여 데이터를 관리하고 있으며, 기존에 학부생 때 공부한 부분으로는 부족하다 생각하여

 

오라클 및 SQL공부를 하려 한다. 

 

Pro*c를 공부하기에 앞서 Oracle공부를 먼저 간단하게 마무리 하려 한다.

 

 

인턴이었지만 상당히 빠른 상반기 전형중 빠른 편이었다.

 

 

서류 제출

 

서류 제출은 없고, 간단한 정보 입력으로 서류전형은 모두 통과이다.

 

실력 위주의 개발자를 뽑기 때문에

 

코딩 테스트와 필기 테스트로 

 

지원자를 판단하려고 하는 것 같다.

 

 

 

온라인 코딩 테스트

 

온라인 코딩테스트 메일

 

지원서 마감 이틀 뒤 코딩 테스트 안내 메일이 왔다.

 

3/16(토) 10시 ~ 13시 총 3시간이다.

 

환경은 프로그래머스 환경에서 진행된다.

 

문제는 총 5문제

 

그중 4문제를 해결했다.

 

 

5문제 중 3문제는 어렵지 않았다.

 

하지만 여러 가지 예외에 대해 생각해야 맞을 수 있다.

 

난도가 높다고 생각하는 문제는

 

2문제였는데

 

탐색 문제와 문자열을 다루는 문제였다.

 

 

 

 

오프라인 필기 테스트

 

코딩 테스트 합격 발표가 3/21(목) 이였는데

 

필기 테스트는 3/23(토) 였다.

 

오후 시간 대에 강남에서 시험을 보았으며

 

90분 동안 시험을 본다.

 

 

여러 층에서 시험을 보는데 한층에 100명 정도 넘게 있었던 것 같다.

 

난이도는 정보처리기사와 비교할 수 없이 어렵다....

 

문제를 풀면서 도중에 정말 실력도 있고

 

많이 알아야 들어갈 수 있구나 생각했다.

 

아마도 시험 후 2만원 짜리 스타벅스 카드를 받은 것 같다.

 

 

 

내용 정리

 

배열에 대한 간단한 내용은 빠르게 스킵하고

 

1차원, 2차원, 3차원 배열의 구조를 정리한후, 버블정렬에 대해 정리하려 한다.

 

 

배열은 배열명만으로 모든 배열 원소를 한번에 입출력하거나 저장할 수 없으며,

배열 원소 단위로 입출력하거나 저장해야 한다.

 

→ 표준 입력 함수에서는 입력된 자료를 저장할 기억장소의 주소를 명시해야 하므로 배열 원소 앞에 '&'붙인다.

ex) scanf("%d",&quiz[0]);

 

 

 1차원 배열

 

예제로 간단한 1차원 배열 문제를 확인하고 넘어가려 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//프로그램 7-3 설문조사 결과 구하기
 
#include <stdio.h>
#define PERSONS 30
#define STARS 6
 
int main()
    int i;
 
    //배열 초기화
    int survey[PERSONS] = { 132532123452
        332145235134231423 };
 
    int vote[STARS] = { 0 }; //각 연예인의 투표수 0으로 초기화
 
    for (i = 0; i < PERSONS; i++)
    {
        vote[survey[i]]++;  //선택 된 연예인 득표수 증가
    }
 
    printf("연예인 득표수\n");
    printf("================\n");
    for (i = 1; i < STARS; i++)
    {
        printf(" %d번   %d표\n", i, vote[i]);
    }
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

위의 예제 실행결과

 

 

 2차원 배열

 

2차원 배열 (출처: 네이버 지식백과)

 

 

2차원 배열은 1차원 배열이 여러 개 모인 배열로

표 형태의 구조로 표현한다.

학창시절 배웠던 행렬이라고 생각하면 편리한거같다.

 

바로 예제를 통해 프로그래밍 하는 방법을 확인 해보자

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//프로그램 7-7 2*3행렬 A와 B의 덧셈 결과인 행렬 C구하기
 
#include <stdio.h>
#define N 2 //행 수
#define M 3 //열 수
 
int main()
{
    int A[N][M], B[N][M], C[N][M];
    int i, j;
 
    printf("행렬A 입력\n");
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < M; j++)
        {
            printf("%d행 %d열:",i+1,j+1);
            scanf("%d"&A[i][j]);
        }
    }
 
    printf("\n행렬B 입력\n");
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < M; j++)
        {
            printf("%d행 %d열:", i + 1, j + 1);
            scanf("%d"&B[i][j]);
        }
    }
 
    printf("\n행렬A \n");
    for (i = 0; i < N; i++)
    {
        printf("[");
        for (j = 0; j < M; j++)
        {
            printf("%3d",A[i][j]);
        }
        printf("]\n");
    }
 
    printf("\n행렬B \n");
    for (i = 0; i < N; i++)
    {
        printf("[");
        for (j = 0; j < M; j++)
        {
            printf("%3d", B[i][j]);
        }
        printf("]\n");
    }
 
    printf("\n행렬C(A+B)\n");
    for (i = 0; i < N; i++)
    {
        printf("[");
        for (j = 0; j < M; j++)
        {
            C[i][j] = A[i][j] + B[i][j];
            printf("%3d", C[i][j]);
        }
        printf("]\n");
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
 

 

1차원 배열과 별반 다를게 없다. 배열 선언, 출력, 입력시에 차원 수만 다르다.

 

 

 

 

 3차원 배열

 

2차원에서 한 차원이 더 늘어났으므로, 3차원 입체 공간이다.

표가 여러 면이 겹쳐저 있다고 생각하면 된다.

 

3차원 배열의 논리적 구조(출처: https://kr.mathworks.com/help/matlab/math/multidimensional-arrays.html)

 

A[면][행][열] 이런 식이다.

 

 

 

※ char형 배열을 이용한 문자열 처리

 

문자열이 "Seoul"이면 배열의 원소 자리는 6자리 필요

끝에 널(\0)문자 포함!

 

배열명은 포인터! 이 부분은 포인터 챕터에서 포스팅.

따라서 입력받을 때는 &가 필요없다.

 

 

 

※ 버블정렬

 

배열에서 이웃하는 두 원소씩 차례대로 정렬하는 작업을

반복하여 배열 전체를 정렬하는 방법.

 

버블 정렬 (출처:  http://blog.naver.com/PostView.nhn?blogId=justant&logNo=20204028286&parentCategoryNo=&categoryNo=33&viewDate=&isShowPopularPosts=false&from=postView)

 

그림을 보면 버블정렬의 정의가 쉽게 이해 된다.

 

 

{5,4,3,2,1}의 배열을 정렬해 보자

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//버블정렬
//1. 단순 버블 정렬
 
#include <stdio.h>
 
int main()
{
    int a[5= { 54321 };
    int i, j, k, temp;
 
    for (i = 0; i < 5 - 1; i++)
    {
        printf("step%d\n", i+1);
 
        for (j = 0; j < 5 - 1; j++)
        {
            if (a[j] > a[j + 1])
            {
                temp = a[j + 1];
                a[j + 1= a[j];
                a[j] = temp;
            }
            printf("%d번째 비교:", j + 1);
            for (k = 0; k < 5; k++)
            {
                printf("%d", a[k]);
            }
            printf("\n");
        }
 
        printf("\n");
    }
    return 0;
}

버블 정렬 과정

 

step1

1번째 4와 5를 비교하여 5를 뒤로이동.

2번째 5와 3을 비교하여 5를 뒤로 이동.

step1이 끝나면 맨 앞의 5가 맨 뒤로 이동하는 것을 볼 수 있다.

 

나머지 step도 마찬가지.

 

 

그러나 이 방법은 비효율적이며 배열의 원소 수가 많을 경우 연산 낭비이다.

 

step2의 4번째

step3의 3번째 4번째

step4의 2번째 3번째 4번째

원소의 순서가 변하지 않는 낭비 연산임을 알 수 있다.

 

 

원소의 순서가 변경될 때만 출력해보면

확실하게 절반 정도의 연산이 낭비임을 알 수 있다.

 

원소의 순서가 변경 될 때만 출력

 

맨 위의 그림처럼 정렬이 완료된 마지막 원소를 제외하고

정렬을 하면 효율적인 알고리즘이 될 것이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//버블정렬
//2. 정렬된 원소를 제외한 나머지 원소 정렬
 
#include <stdio.h>
 
int main()
{
    int a[5= { 54321 };
    int i, j, k, temp;
 
    for (i = 0; i < 5 - 1; i++)
    {
        printf("step%d\n", i + 1);
 
        for (j = 0; j < 5 - (i+1); j++)
        {
            if (a[j] > a[j + 1])
            {
                temp = a[j + 1];
                a[j + 1= a[j];
                a[j] = temp;
            }
            printf("%d번째 비교:", j + 1);
            for (k = 0; k < 5; k++)
            {
                printf("%d", a[k]);
            }
            printf("\n");
        }
 
        printf("\n");
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

단순 버블정렬과 다른 부분은

for (j = 0; j < 5 - (i+1); j++)

고작 이부분.

 

반복 횟수인 i번을 추가로 빼주는 것이다.

 

의미는

 

step1에서는 원소가 5개 이므로 4번 모두 비교를 하고

step2에서는 step1에서 정렬이 된 마지막 원소를 제외하고 3번 비교를 한다.

...

step4에서는 맨 앞 두 원소만 비교하여 정렬한다.

 

효율성을 개선한 버블정렬

 

하지만 이 알고리즘도 완벽하게 효율적인 알고리즘이 아니다.

 

완전하게 내림차순인 경우의 배열만 이 알고리즘이 효율적이다.

 

만약 배열에 {1,2,3,5,4}가 저장되어 있다면

 

 

사진 설명을 입력하세요.

step1에서 {1,2,3,4,5} 로 정렬이 되고

나머지 step는 연산 낭비이다.

 

이는 한 step진행 후

원소 순서에 변화가 생기는지 여부를 확인 할 수 있는

flag변수를 사용해서 비효율을 줄일 수 있다.

 

이부분은 생략한다.


 

연습 문제

 

11, 12번을 풀어보겠다.

 

 

문제 11: 2*3 행렬 A와 3*4 행렬 B를 곱한 결과인 2*4 행렬 C를 구하여 다음과 같이 출력하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//연습문제 11
 
#include <stdio.h>
 
int main()
{
    int A[2][3= { { 123 }, { 456 } };
    int B[3][4= { { 3456 }, { 1243 }, { 4261 } };
    int C[2][4= { 0, };
    int i, j, k;
    int sum = 0;
 
    printf("행렬A\n");
    for (i = 0; i < 2; i++){
        printf("[ ");
        for (j = 0; j < 3; j++)
        {
            printf("%d ", A[i][j]);
        }
        printf("]\n");
    }
    printf("\n");
 
    printf("행렬B\n");
    for (i = 0; i < 3; i++){
        printf("[ ");
        for (j = 0; j < 4; j++)
        {
            printf("%d ", B[i][j]);
        }
        printf("]\n");
    }
    printf("\n");
 
    for (i = 0; i < 2; i++)
    {
        for (j = 0; j < 4; j++)
        {
            for (k = 0; k < 3; k++)
            {
                sum += A[i][k] * B[k][j];
            }
            C[i][j] = sum;
            sum = 0;
        }
    }
 
    printf("행렬C=A+B\n");
    for (i = 0; i < 2; i++){
        printf("[ ");
        for (j = 0; j < 4; j++)
        {
            printf("%d ", C[i][j]);
        }
        printf("]\n");
    }
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

3중 for문을 사용하여 곱셈하는데

약간 복잡하지만 충분히 생각해보면 이해가 된다.

 

 

 

 

문제 12: 10개 문항이 있는 학생 10명의 시험 답안지로부터 채점을 한 후 결과를 다음과 같이 출력하시오. 학생 10명의 시험 답안지는 다음과 같이 2차원 배열을 선언하면서 초기화한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <stdio.h>
#define STUDENT 10
#define N 10
 
int main()
{
    int paper[STUDENT][N] = 
    { { 1323423143 }, { 1222423142 },
    { 4323423142 }, { 1322433442 },
    { 1323423341 }, { 1124433243 },
    { 1323423142 }, { 1323323142 },
    { 2333324142 }, { 3442412142 } };
    
    int answer[N] = { 1323423142 };
    int score[STUDENT] = { 0, }; //각 학생의 점수배열
    int order[STUDENT] = { 0, }; //각 학생의 등수
    int high = 0//자신보다 높은 점수 있으면 1개씩 증가시키기
    int i,j;
 
    printf("\t문항별 채점 결과\n");
    printf("=========================================\n");
    
    printf(" 문항");
    for (i = 0; i < N; i++)
    {
        printf("%3d",i);
    }
    printf("  점수\n");
    printf("=========================================\n");
    
    for (i = 0; i < STUDENT; i++//점수 및 맞고 틀린 문제 확인
    {
        printf("%3d번", i+1);
        for (j = 0; j < N; j++)
        {
            if (paper[i][j] == answer[j])
            {
                printf("%3c",'o');
                score[i]++;
            }
            else
                printf("%3c",'x');
        }
        printf("  %d점\n",score[i]);
    }
 
    for (i = 0; i < STUDENT; i++)
    {
        for (j = 0; j < STUDENT; j++)
        {
            if (score[i] < score[j])
                high++
        }
        order[i] = high + 1;
        high = 0//자신 점수보다 높은 학생 수 0으로 초기화
    }    
 
    printf("\n\n\t  정렬 및 석차\n");
    printf("\t=================\n");
    printf("\t번호 점수 석차\n");
    printf("\t=================\n");
    for (i = 0; i < STUDENT; i++)
    {
        for (j = 0; j < STUDENT; j++)
        {
            if (order[j] == i+1)
                printf("\t%2d번%3d점%3d등\n", j + 1, score[j], order[j]);
        }
    }
    printf("\t=================\n");
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

 

내용 정리

 

전처리기는 하드웨어 작업에 사용할 꺼 같다. 
기본 코딩때 사용되는 #define와 #include만 정리하였다.

 

 

 #define 지시자
특정 기호 상수를 프로그래머가 정의한 치환 문자열로 대체하는 역할을 한다.

ex) #define PI 3.1415   (실수형 상수)
      #define MSG "잘못된 입력입니다."   (문자열 상수)
      #define SQUARE ((x)*(x))  (매크로 함수)

 

 

 

 #include 지시자
파일을 포함하는 지시자로 헤더 파일을 참조하기 위해 사용
printf, scanf를 사용할 수 있는 이유는
해당함수의 원형이 선언되어 있는 stdio.h 헤더파일 때문이다.

 

 


자세한 함수들은 다른 블로그 참고

https://whiteme7.blog.me/110043694088

 

[C] 표준 라이브러리 함수

---------------------------------------------------------------- 데이터 변환 함수 문자나 문자열을 수...

blog.naver.com

 

이번 chapter은 연습문제 생략

 

내용 정리

 

※ 조건문(if, switch)

 

 

if문과 switch문의 사용 방법은 간단하므로 생략하고

자주 실수하는 사항에 대해서만 정리하려 한다.

 


if문
if 와 else 쌍에 주의한다. 괄호가 필요하다.

 

1
2
3
4
5
6
scanf("%d",&x);
if(x>0)
    if(x%2 == 0)
        printf("양의 짝수 입니다.\n");
else
    printf("음수입니다.\n");

 

위처럼 작성하면 위의 맨 마지막 else문은

컴파일러는 바로 위의 if 문과 쌍으로 생각한다.

 

결국 else문은 (x>0) && (x%2 !=0) 일 때 조건으로 생각된다.

 

 

따라서 아래와 같이 괄호를 사용하여

컴파일러가 알 수 있게 확실히 명시한다.

 

1
2
3
4
5
6
7
8
scanf("%d",&x);
if(x>0)
{
    if(x%2 == 0)
        printf("양의 짝수 입니다.\n");
}
else
    printf("음수입니다.\n");

 

다시 정리하자면

컴파일러는 else와 짝을 이루는 if를 찾을 때 들여쓰기를 무시하고

else와 짝을 이루지 않는 상위의 if들 중 가장 가까운 if와 짝이 된다고 해석한다.

→ 괄호 사용 습관화

 

 

switch문

 

간단한 실수 이지만 break문을 빼고 자주 사용한다.

오류가 발견될 때 보통 입력받은 케이스 이후 케이스가 동작한다면

break문을 빠트린 것을 알 수 있다.

 

아래는 오류 케이스

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
 
int main()
{
    int a;
    scanf("%d"&a);
    switch (a)
    {
    case 1printf("입금하기 화면으로 이동합니다.\n");
    case 2printf("출금하기 화면으로 이동합니다.\n");
    case 3printf("송금하기 화면으로 이동합니다.\n");
    default:printf("잘못된 입력입니다.\n");
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

2를 입력하면

 

입력받은 케이스 case2 이외의 3, default 경우까지 모두 실행이 된다.

이 경우 break 문이 빠진것을 알 수 있으며

break문 case끝마다 추가해 주어야 한다.

 

아래와 같이 수정하면 문제없이 동작한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
 
int main()
{
    int a;
    scanf("%d"&a);
    switch (a)
    {
    case 1printf("입금하기 화면으로 이동합니다.\n"); break;
    case 2printf("출금하기 화면으로 이동합니다.\n"); break;
    case 3printf("송금하기 화면으로 이동합니다.\n"); break;
    default:printf("잘못된 입력입니다.\n");
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

case2의 break문이 실행되어 switch문을 벗어나게 된다.

 

 

 

※ 반복문(for, while, do~while)

 

 

for, while, do~while을 어떠한 경우에 사용해야 하는지 헷갈리는 경우가 많았다.

사용 방법은 간단하지만 많은 알고리즘 문제를 해결하다 보면 자연스럽게 익혀진다.

 

for와 while문의 차이를 자세히 알아보면

 

for문: 반복 횟수가 명확할 때 이용하면 편리

while문: 반복 횟수는 모르지만 어떤 조건은 만족 할 때까지 반복할지 아는 경우

do~while문: 무조건 한번은 실행하고, 조건 검사

 


 

연습 문제

 

11, 15, 22, 23, 24번을 풀어보겠다.

 

 

문제 11: 양의 정수 하나를 입력받고, 입력받은 수가 소수(prime number)인지 판단하는 프로그램을 작성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int main()
{
    int num;
    int i;
    printf("양의 정수:");
    scanf("%d"&num);
 
    for (i = 2; i < num; i++)
    {
        if (num%i == 0)
        {
            printf(">>%d는 소수가 아닙니다.\n", num);
            break;
        }
    }
    if (num == i)
        printf(">>%d는 소수입니다.\n", num);
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

2~자기자신까지 나누어 봐서 0으로 나누어 떨어지면

그 순간 소수 아니라고 판단하고, 종료.

만약 모두 0으로 나머지가 나누어 떨어지지 않는다면

소수.

 

 

 

문제 15: 어떤 수를 입력받고 입력받은 수보다 작은 소수를 전부 출력하는 프로그램을 작성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
int main()
{
    int max;
    int n = 2;
    int i;
 
    printf("최대 몇까지의 소수를 출력?");
    scanf("%d"&max);
 
    while (n < max)
    {
        for (i = 2; i < n; i++)
        {
            if ((n%i) == 0)
                break;
        }
        if (n == i)
            printf("%d ", n);
        n++;
    }
    return 0;
}

 

앞의 11번과 유사, 반복문 하나 더 추가

 

 

문제 22: 반복문을 이용해 다음과 같은 패턴을 출력하는 프로그램을 작성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//1번
#include <stdio.h>
 
int main()
{
    int i,j;
    
    for (i = 1; i <= 9; i++)
    {
        if ((i == 1|| (i == 9))
        {
            for (j = 1; j <= 9; j++)
            {
                printf("*");
            }
            printf("\n");
        }
        else
        {
            for (j = 1; j <= 9; j++)
            {
                if ((j == 1|| (j == 9))
                    printf("*");
                else
                    printf(" ");
            }
            printf("\n");
        }
    }
    return 0;
}
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//2번
#include <stdio.h>
 
int main()
{
    int i, j;
    
    for (i = 1; i <= 5; i++//1~5줄
    {
        for (j = 4; j >= i; j--)
        {
            printf(" ");
        }
        
        for (j = 1; j <= i * 2 - 1; j++)
        {
            printf("*");
        }
        printf("\n");
    }
    
    for (i = 1; i <= 4; i++//6~9줄
    {
        for (j = 1; j <= i; j++)
        {
            printf(" ");
        }
 
        for (j = 1; j <= 9- (i * 2) ; j++)
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//3번
#include<stdio.h>
 
int main()
{
    int i, j;
    for (i = 1; i <= 9; i++)
    {
        for (j = 1; j <= i; j++)
        {
            printf("%d", j);
        }
        printf("\n");
    }
    return 0;
}
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//4번
#include <stdio.h>
 
int main()
{
    int i, j;
    for (i = 9; i >= 1; i--)
    {
        for (j = 1; j <= i; j++)
        {
            printf("%d", j);
        }
        printf("\n");
    }
    return 0;
}

 

 

문제 23: 원하는 피보나치의 개수를 입력해서 그 개수만큼 수열이 출력되는 프로그램을 작성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
 
int main()
{
    int num,i;
    int fibo;
    int fibo_1 = 0;
    int fibo_2 = 1;
 
    printf("피보나치 개수 입력:");
    scanf("%d"&num);
 
    printf("\n*** 피보나치 수열 ***\n");
 
    printf("%d,%d", fibo_1, fibo_2);
 
    for (i = 2; i < num; i++)
    {
        fibo = fibo_1 + fibo_2;  //앞의 두 피보나치값 더해서 현재 피보나치 구함
        printf(",%d", fibo);
        fibo_1 = fibo_2;  //앞의 피보나치를 구할 때 2번째 값을 1번째 값으로 변경
        fibo_2 = fibo;  //현재 피보나치 값을 다음 피보나치를 구하기 위한 2번째 값으로 변경
    }
    printf("입니다.\n");
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

 

 

문제 24: 자연수 두 개 입력받은 후, 최대 공약수를 구하는 프로그램을 while문을 이용해 작성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int main()
{
    int x, y, r, temp;
    printf("두 개의 정수를 입력하시오:");
    scanf("%d %d"&x, &y);
 
    if (x < y) //y가 더 크면 큰 수를 x로 변경
    {
        temp = x;
        x = y;
        y = temp;
    }
    while (1)
    {
        if (y == 0)
        {
            printf("최대 공약수는 %d입니다.", x);
            break;
        }
        r = x % y;
        x = y;
        y = r;
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

 

무한루프 사용해서 y값이 0이 될때까지 x와 y값을 조절하여

y==0일 때 x값이 최대공약수, 무한루프 탈출

내용 정리

이번 장은 정리할 내용이 별로 없다

 

 

※ 산술 연산자


+, -, *, / 는 정수형, 실수형 모두 연산가능

 

%(나머지 연산자)는 정수형만 가능하다
5%2.5는 에러

연산자의 우선순위따지는것 보다 괄호사용 하는것이 간편

논리연산자, 비트연산자는 하드웨어 부분에서 많이 쓰는듯...
생략

 

 


형변환 연산자


자동 형 변환 : 컴파일러가 자동으로 처리
강제 형 변환: (자료형)피연산자 
     
형 변환은 기억공간의 크기를 변경하는 것이 아니라, 일시적으로 다른 형으로 변경


연습문제 풀이

 

10, 13, 16번을 풀어보겠다.

 

 

문제 10: 초 단위의 시간을 입력 받아 몇 시간, 몇 분, 몇 초인지를 계산하는 프로그램을 작성하시오.

 

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main()
{
    int sec;
    printf("초(sec)입력: ");
    scanf("%d"&sec);
    printf(">>입력한 %d초는 %d시간 %d분 %d초입니다.\n", sec, (sec / 3600), ((sec % 3600/ 60), (sec % 60));
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

 

 

문제 13: 조건 연산자를 이용해 세 수를 입력받아 가장 큰 수 를 구하는 프로그램을 작성하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
    int a, b, c;
    int max;
    printf("세 개의 정수:");
    scanf("%d %d %d"&a, &b, &c);
 
    (a > b) ? ((a > c) ? (max = a) : (max = c)) : ((b > c) ? (max = b) : (max = c));
    printf(">>가장 큰 수 = %d\n", max);
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

조건연산자 내부에 조건연산자 통해서 해결가능

 

 

 

문제 16: 연도를 입력받아 윤년인지 평년인지를 판단하는 프로그램을 작성하시오.

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
 
int main()
{
    int y;
    printf("년도를 입력하세요.:");
    scanf("%d"&y);
 
    if ((y % 4 == 0&& (y % 100 != 0|| (y % 400 == 0))
        printf("윤년\n");
    else
        printf("평년\n");
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

윤년의 조건이 전부인 문제.

 

 

 

 

 

 

 

내용 정리

 

※ 필드 폭, 정밀도

필드폭: 자료를 출력하는 데 사용할 전체 칸   
%+필드폭d: 부호 출력
%-필드폭d: 왼쪽 정렬 (사용 안 하면 오른쪽 정렬)

정밀도: 소수점 아래 자리 수 지정
%. 정밀도 f: 정밀도 3이라면 소수 4자리에서 반올림하여 나타낸다.

 

아래의 예제를 확인하면 확실히 이해할 수 있을 것이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
{
    double avg = 83.768;
 
    printf("avg = %5.1f\n", avg);
    printf("avg = %7.3f\n", avg);
    printf("avg = %.2f\n", avg);
    printf("avg = %5f\n", avg);
    return 0;
}

 

 

출력함수

printf
주의점: "(큰 따옴표) 출력하기 위해 이스케이프 문자인 사용


 ex) printf("My name is 'C'.");  → 작은 따옴표는 이스케이프 문자 필요 없음
     printf("You said \"Hello!\".");   큰 따옴표 이스케이프 문자 필요함!

문자 저장에는 작은 따옴표도 이스케이프 문자 필요
ex) char ch = '\'';

 

 

- putchar

문자 전용 출력 함수

변환 명세 필요 없음, 실행 속도 빠르다.  문자 출력 용이

 

ex) char grade = 'A';

putchar(grade);

putchar('+');

 

 A+ 출력, 개행하려면 putchar('\n');

 

 

- puts

문자열 전용 출력함수

변환 명세 필요 없음, 개행 문자 자동출력

puts("Hello!"); == printf("Hello!\n");

printf("% s\n", "Hello!");

 

 

입력함수

- scanf

scanf함수를 사용할 때는 키보드에서 입력되는 값을 주기억장치 몇 번지에 저장할지 명시해야 한다.

 기억 장소를 구해주는 연산자 &(앰퍼센트)를 사용

 

하지만 문자열을 저장하는 변수명이나 배열명은 그 자체가 문자열을 저장할 주기억장치의 시작 주소이므로 &를 붙이지 않는다.

 

문자열은 스페이스바, 탭키 전까지의 문자열이 변수에 저장

 

 

- getchar

문자 전용 입력함수

getchar() 형태로만 사용, 한 문자 입력을 받는다.

 

 

- gets

문자열 전용 입력함수

변환 명세 필요 없으며, 엔터키를 입력하기 전까지 모든 문자가 문자열로 저장.(공백 포함)

 

 

※fflush(stdin) 문자 입력과 버퍼 지우기

버퍼에 남아있는 개행 문자 때문에 문자를 입력할 때 오류 발생!

버퍼 안의 내용을 모두 지운 뒤 입력을 받아야 한다.

 

문자, 문자열 자료형 앞에 사용  공백도 입력문자로 사용하기 때문(숫자는 상관없음)

 

예제를 통해 입력 함수와 버퍼를 지워야 하는 이유를 확인해 보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int main()
{
    char a, b, c;
    int d, e;
 
    printf("1.문자입력:");
    a = getchar();
    printf("2.숫자입력:");
    d = scanf("%d"&d);
    //fflush(stdin);
    printf("3.문자입력:");
    a = getchar();
 
    return 0;
}

 

14열의 입력 함수가 처리될 때 버퍼에 있는 개행 문자가 삽입되어

입력을 수행하지 않고 메인 함수가 마무리된다.

 

따라서 12행의 주석처리를 해제하면 정상적으로 작동한다.


연습문제 풀이

 

7,8,9,10번을 풀어보겠다.

 

 

문제 7: 키보드에서 문자를 한 개 입력받은 후, 그 문자에 해당하는 ASCII코드 값을 구하는 프로그램을 작성하시오.

 

 

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
//연습문제7
int main()
{
    char ch;
    printf("문자를 입력하세요.:");
    ch = getchar();
    printf("%c의 ASCII코드 값은 %d입니다.\n", ch, ch);
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

문자, 숫자간 변환은 변환명세만 신경쓰면 된다.

 

 

 

문제 8: 키보드에서 8진수 정수와 16진수 정수를 하나씩 입력받은 후, 이 입력 값들과 두 정수의 합을 10진 정수로 출력하는 프로그램을 작성하시오.

 
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
//연습문제8
int main()
{
    int oct, hex;
    printf("8진수 16진수를 순서대로 입력하세요.:");
    scanf("%o %x"&oct, &hex);
    printf("%o(8) + %x(16) = %d", oct, hex, oct + hex);
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

문제 8 실행 결과

 

역시 변환명세만 신경쓰면 진수변경 용이하다.

 

 

 

문제 9: 반지름을 입력받아 원의 둘레와 면적, 그리고 구의 부피를 구한 후 세 개의 결과 값의 소수 자리를 세로로 맞추어 출력하시오.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
//연습문제9
int main()
{
    int r;
    double pi = 3.141592;
    printf("반지름(cm)을 입력하세요: ");
    scanf("%d"&r);
    printf("둘레= %7.2lf cm\n",pi* r* 2);
    printf("면적= %7.2lf cm2\n", pi* r * r);
    printf("부피= %7.2lf cm3\n", (4.0/3.0)*pi*r*r*r);
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
 

필드폭, 정밀도 문제이다. 맨 위의 예제에서 자세히 다뤘으니 설명은 패스

 

 

 

문제 10: 키와 몸무게를 입력받아 키에 맞는 표준 체중을 구한 후 자신의 몸무게와 표준 체중과의 차이를 출력하는 프로그램을 작성하시오.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
//연습문제10
int main()
    double height, weight;
 
    printf("키(cm)를 입력히세요.:");
    scanf("%lf"&height);
    printf("몸무게(kg)를 입력히세요.:");
    scanf("%lf"&weight);
 
    printf("당신의 키는 %.1lfcm (%.1lffeet)입니다.\n",height,height/30.48);
    printf("당신의 체중은 %.1lfkg (%.1lflb)입니다.\n",weight,weight*2.20459);
    printf("표준 체중 %.1lf과의 차이는 %+.1lfkg입니다.\n", (height - 100)*0.9, weight - ((height - 100)*0.9));
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter

 

문제 10 실행결과

조금 더 살을 찌워보자...

+ Recent posts