データ構造とアルゴリズム01の完了/(01-06)



Write Date : 2021.6.13
Last Edit : 2021.6.14
最終ページ:40ページ(完了!)
Chap(01)-基本アルゴリズム
練習問題
Q1
//q1_네 값의 최댓값을 구하는 함수 max4를 작성하세요.
#include <stdio.h>

int max4(int a, int b, int c, int d)
{
    int max;
    max = a;
    if(max < b) max = b;
    if(max < c) max = c;
    if(max < d) max = d;

    return max;
}

int main()
{
    printf("max4(%d %d %d %d) = %d\n", 3, 2, 1, 5, max4(3,2,1,5));
    printf("max4(%d %d %d %d) = %d\n", 1, 2, 4, 1, max4(1,2,4,1));
    printf("max4(%d %d %d %d) = %d\n", 3, 1, 2, 1, max4(3,1,2,1));
    // ...
    return 0;
}
Q2
// q2_세 값의 최솟값을 구하는 min3 함수
#include <stdio.h>

int min3(int a, int b, int c)
{
    int min;
    min = a;
    if(min > b) min = b;
    if(min > c) min = c;

    return min;
}

int main()
{
    printf("min3(%d %d %d) = %d\n", 1, 2, 3, min3(1,2,3));
    printf("min3(%d %d %d) = %d\n", 6, 5, 4, min3(6,5,4));
    printf("min3(%d %d %d) = %d\n", 8, 7, 9, min3(7,8,9));
    // ....
    return 0; 
}
Q3
// q2_네 값의 최솟값을 구하는 min4 함수
#include <stdio.h>

int min4(int a, int b, int c, int d)
{
    int min;
    min = a;
    if(min > b) min = b;
    if(min > c) min = c;
    if(min > d) min = d;

    return min;
}

int main()
{
    printf("min4(%d %d %d %d) = %d\n", 1, 2, 3, 4, min4(1,2,3,4));
    printf("min4(%d %d %d %d) = %d\n", 6, 5, 4, 7, min4(6,5,4,7));
    printf("min4(%d %d %d %d) = %d\n", 8, 7, 9, 10, min4(7,8,9,10));
    // ....
    return 0; 
}
Q4
// q4_ 세 값의 대소 관계 13종류의 모든 조합에 대해 중악밧을 구하여 출력하는
// 프로그램
#include <stdio.h>

int med3(int a, int b, int c)
{
    if (a >= b)
        if (b >= c)
            return b;
        else if (a <= c)
            return a;
        else
            return c;
    else if (a > c)
        return a;
    else if (b > c)
        return c;
    else
        return b;
}

int main()
{
    int a, b, c;

    printf("세 정수의 중앙값을 구합니다.\n");
    
    printf("%d %d %d is med = %d\n", 3, 2, 1, med3(3,2,1)); // A a > b > c
    printf("%d %d %d is med = %d\n", 3, 2, 2, med3(3,2,2)); // B a > b = c
    printf("%d %d %d is med = %d\n", 3, 1, 2, med3(3,1,2)); // C a > c > b
    printf("%d %d %d is med = %d\n", 3, 2, 3, med3(3,2,3)); // D a = c > b
    printf("%d %d %d is med = %d\n", 2, 1, 3, med3(2,1,3)); // E c > a > b
    printf("%d %d %d is med = %d\n", 3, 3, 2, med3(3,3,2)); // F a = b > c
    printf("%d %d %d is med = %d\n", 3, 3, 3, med3(3,3,3)); // G a = b = c
    printf("%d %d %d is med = %d\n", 2, 2, 3, med3(2,2,3)); // H c > a = b
    printf("%d %d %d is med = %d\n", 2, 3, 1, med3(2,3,1)); // I b > a > c
    printf("%d %d %d is med = %d\n", 2, 3, 2, med3(2,3,2)); // J b > a = c
    printf("%d %d %d is med = %d\n", 1, 3, 2, med3(1,3,2)); // K b > c > a
    printf("%d %d %d is med = %d\n", 2, 3, 3, med3(2,3,3)); // L b = c > a
    printf("%d %d %d is med = %d\n", 1, 2, 3, med3(1,2,3)); // M c > b > a

    return 0;
}
Q6
// q6_ while문이 종료될 때 변수 i 값이 n + 1이 됨을 확인하자.
#include <stdio.h>

int main()
{
    int i, n;
    int sum;
    sum = 0;

    puts("1부터 n까지의 합을구하며 반복문 종료시 i값을 출력");
    
    printf("n의 값 : "); scanf("%d", &n);
    while(i <= n)
    {
        sum += i;
        i++;
        if ( i > n )
            printf("i is %d + 1 = %d\n", n, i);
    }

    printf("1부터 %d까지의 합 : %d\n", n, sum);

    return 0;
}
Q7
// q7_ n이 7이면 '1+2+3+4+5+6+7 = 28'로 출력하는 프로그램작성.
#include <stdio.h>

int main()
{
    int i, n;
    int sum; // 합
    sum = 0;
    puts("1부터 n까지의 합을 구한다");
    printf("n의 값 : "); scanf("%d", &n);

    for (i = 1; i <= n; i++)
    {
        sum += i;
        if (i == n)
            printf("%d = %d", i, sum);
        else
            printf("%d + ", i);
    }

    // printf("1부터 %d까지의 합은 %d입니다.\n", n, sum);

    return 0;
}
Q8
// q8_ 1부터 10의 합은 (1 + 10) * 5와 같은 방법으로 구할 수 있다.
// 가우스의 덧셈이라는 방법을 이용하여 1부터 n까지의 합을 구하는 프로그램
#include <stdio.h>

int main()
{
    int i, n, sum;
    sum = 0;
    puts("가우스 덧셈");
    
    printf("n을 입력하세요 : "); scanf("%d", &n);

    if (n % 2 == 0)
        sum += (1 + n) * ((1 + n) / 2);
    else
        sum += (1 + n) * ((1 + n) / 2) - ((1 + n) / 2);
    
    printf("가우스 덧셈결과 1 ~ %d까지의 합은 %d입니다.", n, sum);

    return 0;
}
Q9
// Q9_ 정수 a,b를 포함하여
// 그 사이의 모든 정수의 합을 구하는 아래 함수.

#include <stdio.h>

int sumof(int a, int b)
{
    int i, sum;
    sum = 0;
    if (a > b)
    {
        for(i = b; i <= a; i++)
        {
            sum += i;
        }
    }
    else
    {
        for(i = a; i <= b; i++)
        {
            sum += i;
        }
    }
    return sum;
}

int main()
{
    int x, y;

    puts("정수 x와 y를 포함한 그 사이의 모든 정수의 합");
    printf("x와 y를 입력하세요 : "); scanf("%d %d", &x, &y);

    printf("%d부터 %d사이의 합은 %d입니다.", x, y, sumof(x,y));


    return 0;
}
Q10
// q10_ 아래와같이. 
// a 의 값 6
// b 의 값 6
// a보다 큰값을 입력하세요!
// b 의 값 8
// b - a 는 2입니다. 를 출력하는 프로그램을 작성하라.

#include <stdio.h>

int main()
{
    int a, b;
    puts("b-a를 구합니다.");
    printf("a 값 : "); scanf("%d", &a);
    do
    {
        printf("b 값 : "); scanf("%d", &b);
        if (b <= a)
            printf("a보다 큰 값을 입력하세요!\n");
    } while(b <= a); // b가 a보다 크거나 같을때까지 반복한다.

    
    printf("%d - %d는 %d입니다.\n", b, a, b-a);

    return 0;
}
Q11
// 양의 정수를 입력하고. 자릿수를 출력하는 프로그램을 작성하라.

#include <stdio.h>

int main()
{
    int a, i;

    puts("자릿수를 출력하는 프로그램");
    
    do
    {
        printf("양의 정수를 입력하세요 : "); scanf("%d", &a);
    }while(a <= 0);

    i = 0;
    
    while(a > 0)
    {
        a /= 10;
        i++;
    }
    
    printf("그 수는 %d자리입니다.", i);

    return 0;
}
Q12
// q12_ 위쪽과 왼쪽에 곱하는 수가 있는 곱셈표를 출력하는 프로그램
// 곱셈표를 출력합니다.
#include <stdio.h>

int main()
{
    int i, j;
    printf("  | ");
    for( i = 1; i <= 9; i++)
        printf("% 2d ", i);
    printf("\n--+----------------------------\n");
    for (i = 1; i <= 9; i++)
    {
        printf("%d |", i);
        for (j = 1; j <= 9; j++)
        {
            printf("% 3d", i * j);
        }
        putchar('\n');
    }

    return 0;
}
Q13
// q13_ 위쪽과 왼쪽에 더하는 수가 있는 덧셈표를 출력하는 프로그램
// 덧셈표를 출력합니다.
#include <stdio.h>

int main()
{
    int i, j;
    printf("  | ");
    for( i = 1; i <= 9; i++)
        printf("% 2d ", i);
    printf("\n--+----------------------------\n");
    for (i = 1; i <= 9; i++)
    {
        printf("%d |", i);
        for (j = 1; j <= 9; j++)
        {
            printf("% 3d", i + j);
        }
        putchar('\n');
    }

    return 0;
}
Q14
// Q14_입력한 수를 한 변으로 하는 정사각형을
// * 기호로 출력하는 프로그램을 작성하시오.

#include <stdio.h>

int main()
{
    int i, j, n;
    puts("사각형을 출력합니다.");
    printf("입력할 수 : "); scanf("%d", &n);

    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n; j++)
        {
            putchar('*');
        }
        putchar('\n');
    }
}
Q15
// Q15_입력한 높이와 너비에 맞는 직사각형을
// * 기호로 출력하는 프로그램을 작성하시오.

#include <stdio.h>

int main()
{
    int i, j, h, w;
    puts("직사각형을 출력합니다.");
    printf("높이 : "); scanf("%d", &h);
    printf("너비 : "); scanf("%d", &w);

    for (i = 1; i <= h; i++)
    {
        for (j = 1; j <= w; j++)
        {
            putchar('*');
        }
        putchar('\n');
    }
}
Q16
// Q16_ 직각 이등변 삼각형을 출력하는 부분을 아래와 같은 함수로 작성하시오.
// void triangleLB (int n);
// 또 왼쪽 위, 오른쪽 위, 오른쪽 아래가 직각인 이등변 삼각형을 출력하는 함수도
// 작성하시오.
#include <stdio.h>

void triangleLB (int n)
{
    int i ,j;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= i; j++)
        {
            putchar('*');
        }
        putchar('\n');
    }
}

void triangleLU (int n) // 왼쪽 위가 직각인 이등변 삼각형.
{
    int i, j;
    for (i = 1; i <= n; i++)
    {
        for (j = n; j >= i; j--)
        {
            putchar('*');
        }
        putchar('\n');
    }
}

void triangleRU (int n) // 오른쪽 위가 직각인 이등변 삼각형.
{
    int i, j;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j < i; j++)
        {
            putchar(' ');
        }
        for (j = n; j >= i; j--)
        {
            putchar('*');
        }
        putchar('\n');
    }
}
void triangleRB (int n) // 오른쪽 아래가 직각인 이등변 삼각형.
{
    int i, j;
    for (i = 1; i <= n; i++)
    {
        for (j = n - 1; j >= i; j--)
        {
            putchar(' ');
        }
        for (j = 1; j <= i; j++)
        {
            putchar('*');
        }
        putchar('\n');
    }
}


int main()
{
    int n;
    do
    {
        printf("몇 단 삼각형입니까? : "); scanf("%d", &n);
    }while(n <= 0);

    puts("왼쪽 아래가 직각인 이등변 삼각형");
    triangleLB(n);
    puts("왼쪽 위가 직각인 이등변 삼각형");
    triangleLU(n);
    puts("오른쪽 위가 직각인 이등변 삼각형");
    triangleRU(n);
    puts("오른쪽 아래가 직각인 이등변 삼각형");
    triangleRB(n);    
    return 0;
}
Q17
// Q17_ n단의 피라미드를 출력하는 함수.

#include <stdio.h>

void spira(int n)
{
    int i, j;
    for (i = 1; i <= n; i++)
    {
        for (j = n; j >= i; j--)
        {
            putchar(' ');
        }
        for (j = 1; j <= (i - 1) * 2 + 1; j++)
        {
            putchar('*');
        }
        putchar('\n');
    }
}

int main()
{
    int n;
    puts("n단의 피라미드를 출력하는 프로그램.");
    do
    {
        printf("몇단의 피라미드? : "); scanf("%d", &n);
    }while (n <= 0);

    spira(n);

    return 0;
}
Q18
// Q18_오른쪽과 같이 아래를 향한 n단의 피라미드를 출력하는 함수를 작성하시오
// 1111111
//  22222
//   333
//    4

#include <stdio.h>

void nrpira(int n)
{
    int i, j;
    int nx;
    nx = n;
    for (i = 1; i <= nx; i++)
    {
        for (j = 1; j <= i; j++)
        {
            putchar(' ');
        }
        for (j = (n - 1) * 2 + 1; j > 0; j--)
        {
            printf("%d", i % 10);
        }
        putchar('\n');
        --n;
    }
}

int main()
{
    int n;
    puts("n단의 역피라미드를 출력하는 프로그램.");
    do
    {
        printf("몇단의 역피라미드? : "); scanf("%d", &n);
    }while (n <= 0);

    nrpira(n);

    return 0;
}
アルゴリズムとは?
問題を解決するために、有限条によって明確に定義され、秩序化された規則からなる集合.
ちくじず
アルゴリズム問題愛の定義.ぶんせき解法のシーケンス図(FlowChart)を図で示す
リンクテキストここで描くのは快適で良いです
複文
いくつかの条件が成立すると、繰返し実行処理(プログラム文または命令セット)は繰返し構造と呼ばれ、通常は「ループ」と呼ばれます.
ドア
実行前に繰り返し続けるかどうかを判断します.これを「予断繰返し構造」と呼ぶ.
制御式のフラットカバー値が0でない場合、プログラム文は繰り返されます.
文脈
「最初の評価制御式の結果が0の場合、ループ本文は実行そのものではありません.」「事前判断繰返し構造」
構造化プログラミング
1つのエントリと1つの出口のみのコンポーネントを階層的に配置し,プログラムを構成する方法を構造化プログラミングと呼ぶ.
構造化プログラミングでは、シーケンス-選択-繰り返しの3つの制御フローが使用されます.
デモールの法則
「各条件を否定し、論理積(&&)を論理積(||)に変換し、論理積(|)を論理積に変換し、再び条件全体を否定すると、元の条件と同じになります.」
  • x&&yわあ!(!x|!y)同じです.
  • x|yわぁ!(!x&&!y)は同じです.