C/명품 C언어 프로젝트(안기수 저)

명품 C언어 프로젝트 3.3장 연습문제

꾸준함. 2017. 6. 16. 10:00

[1번 문제]

/*

[예제 3.3.2]에 대해 화면 좌표상의 점을 구조체(struct)로 정의하여 표현하도록 프로그램을 수정하시오

*/

#include <stdio.h>

#include <Windows.h>

 

void gotoxy(int x, int y);

void axis(void);

void draw_xy_line02(int a, int b);

 

typedef struct

{

        int xpos;

        int ypos;

}Point;

 

int main(void)

{

        int a, b;

        printf("y=ax+b의 직선 식을 좌표에 출력\n");

        printf("기울기 입력>");

        scanf("%d", &a);

        printf("절편 입력>");

        scanf("%d", &b);

        system("cls");

        axis();

        draw_xy_line02(a, b);

        gotoxy(1, 23);

        printf("\n");

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void axis(void)

{

        int i;

        for (i = 1; i <= 24; i++)

        {

               gotoxy(39, i);

               printf("|");

        }

        for (i = 1; i <= 79; i++)

        {

               gotoxy(i, 12);

               printf("-");

        }

        gotoxy(39, 12);

        printf("+");

}

 

void draw_xy_line02(int a, int b)

{

        int x, y;

        Point pos; //구조체

        gotoxy(1, 1);

        printf("y=%dx+%d\n", a, b);

        for (x = -5; x <= 5; x++)

        {

               y = a*x + b;

               pos.xpos = 39 + 2 * x;

               pos.ypos = 12 - y;

               if ((1 <= pos.ypos) && (pos.ypos <= 23))

               {

                       gotoxy(pos.xpos, pos.ypos);

                       printf("*");

               }

        }

}

 


[2번 문제]

/*

[예제 3.3.2]에 대해 x축의 절편과 y축의 절편을 출력하도록 프로그램을 수정하시오

*/

#include <stdio.h>

#include <Windows.h>

 

void gotoxy(int x, int y);

void axis(void);

void draw_xy_line02(int a, int b);

 

int main(void)

{

        int a, b;

        printf("y=ax+b의 직선 식을 좌표에 출력\n");

        printf("기울기 입력>");

        scanf("%d", &a);

        printf("절편 입력>");

        scanf("%d", &b);

        system("cls");

        axis();

        draw_xy_line02(a, b);

        gotoxy(1, 23);

        printf("\n");

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void axis(void)

{

        int i;

        for (i = 1; i <= 24; i++)

        {

               gotoxy(39, i);

               printf("|");

        }

        for (i = 1; i <= 79; i++)

        {

               gotoxy(i, 12);

               printf("-");

        }

        gotoxy(39, 12);

        printf("+");

}

 

void draw_xy_line02(int a, int b)

{

        int x, y, xt, yt;

        gotoxy(1, 1);

        printf("y=%dx+%d\n", a, b);

        for (x = -5; x <= 5; x++)

        {

               y = a*x + b;

               xt = 39 + 2 * x;

               yt = 12 - y;

               if (x == 0 && y == 0)//원점

               {

                       gotoxy(xt + 2, yt + 1);

                       printf("%d", 0);

               }

               else if (x == 0) //y절편

               {

                       gotoxy(xt + 2, yt);

                       printf("%d", y);

               }

               else if (y == 0) //x절편

               {

                       gotoxy(xt, y - 1);

                       printf("%d", x);

               }

               if ((1 <= yt) && (yt <= 23))

               {

                       gotoxy(xt, yt);

                       printf("*");

               }

        }

}

 


[3번 문제]

/*

[함수 3.3.3]에서 축과 원점을 표시하기 위해 사용한 기호들을 다음의 확장완성코드로 바꿔서 출력하도록 프로그램을 수정하시오

(3.5.3절 바둑판 모양의 표현 참고)

*/

#include <stdio.h>

#include <Windows.h>

 

void gotoxy(int x, int y);

void axis(void);

void draw_xy_line02(int a, int b);

 

int main(void)

{

        int a, b;

        printf("y=ax+b의 직선 식을 좌표에 출력\n");

        printf("기울기 입력>");

        scanf("%d", &a);

        printf("절편 입력>");

        scanf("%d", &b);

        system("cls");

        axis();

        draw_xy_line02(a, b);

        gotoxy(1, 23);

        printf("\n");

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void axis(void)

{

        int i;

        unsigned char a = 0xa6;

        unsigned char b[12];

        for (int i = 1; i < 12; i++)

               b[i] = 0xa0 + i;

        for (i = 1; i <= 24; i++)

        {

               gotoxy(39, i);

               printf("%c%c", a, b[2]);

        }

        for (i = 1; i <= 79; i+=2) //x축은 두배

        {

               gotoxy(i, 12);

               printf("%c%c", a, b[1]);

        }

        gotoxy(39, 12);

        printf("%c%c", a, b[11]);

}

 

void draw_xy_line02(int a, int b)

{

        int x, y, xt, yt;

        gotoxy(1, 1);

        printf("y=%dx+%d\n", a, b);

        for (x = -5; x <= 5; x++)

        {

               y = a*x + b;

               xt = 39 + 2 * x;

               yt = 12 - y;

               if ((1 <= yt) && (yt <= 23))

               {

                       gotoxy(xt, yt);

                       printf("*");

               }

        }

}

 


[4번 문제]

/*

임의의 1차 함수식에 대해 직선을 표시하고, x축 방향 또는 y축 방향으로 회전한 직선의 결과를 출력할 수 있도록 프로그램을 수정하시오

*/

#include <stdio.h>

#include <Windows.h>

 

void gotoxy(int x, int y);

void axis(void);

void draw_xy_line02(int a, int b);

 

int main(void)

{

        int a, b;

        printf("y=ax+b의 직선 식을 좌표에 출력\n");

        printf("기울기 입력>");

        scanf("%d", &a);

        printf("절편 입력>");

        scanf("%d", &b);

        system("cls");

        axis();

        draw_xy_line02(a, b);

        gotoxy(1, 23);

        printf("3초 후 y축 방향으로 회전한 직선 출력\n");

        Sleep(3000);

        system("cls");

        axis();

        gotoxy(20, 1);

        printf("%dx+%d y축 회전한 직선", a, b);

        draw_xy_line02(-a, b);

        gotoxy(1, 23);

        printf("3초 후 x축 방향으로 회전한 직선 출력\n");

        Sleep(3000);

        system("cls");

        axis();

        gotoxy(20, 1);

        printf("%dx+%d x축 회전한 직선", a, b);

        draw_xy_line02(a, -b);

        gotoxy(1, 23);

        printf("\n");

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void axis(void)

{

        int i;

        for (i = 1; i <= 24; i++)

        {

               gotoxy(39, i);

               printf("|");

        }

        for (i = 1; i <= 79; i++)

        {

               gotoxy(i, 12);

               printf("-");

        }

        gotoxy(39, 12);

        printf("+");

}

 

void draw_xy_line02(int a, int b)

{

        int x, y, xt, yt;

        gotoxy(1, 1);

        printf("y=%dx+%d\n", a, b);

        for (x = -5; x <= 5; x++)

        {

               y = a*x + b;

               xt = 39 + 2 * x;

               yt = 12 - y;

               if ((1 <= yt) && (yt <= 23))

               {

                       gotoxy(xt, yt);

                       printf("*");

               }

        }

}

 




[5번 문제]

/*

데카르트 좌표상의 임의의 두점에 대한 순서쌍 (x1, y1), (x2, y2)를 입력받아

이 두점을 잇는 직선과 함수식을 출력하는 프로그램을 작성하시오

*/

#include <stdio.h>

#include <Windows.h>

 

void gotoxy(int x, int y);

void axis(void);

void draw_xy_line02(int a, int b);

 

int main(void)

{

        int x1, y1, x2, y2;

        int a, b; //기울기와 y 절편

        printf("첫 번째 좌표 입력: ");

        scanf("%d %d", &x1, &y1);

        printf("두 번째 좌표 입력: ");

        scanf("%d %d", &x2, &y2);

        a = (y2 - y1) / (x2 - x1);

        b = y1 - a + x1;

        system("cls");

        axis();

        draw_xy_line02(a, b);

        gotoxy(1, 23);

        printf("\n");

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void axis(void)

{

        int i;

        for (i = 1; i <= 24; i++)

        {

               gotoxy(39, i);

               printf("|");

        }

        for (i = 1; i <= 79; i++)

        {

               gotoxy(i, 12);

               printf("-");

        }

        gotoxy(39, 12);

        printf("+");

}

 

void draw_xy_line02(int a, int b)

{

        int x, y, xt, yt;

        gotoxy(1, 1);

        printf("y=%dx+%d\n", a, b);

        for (x = -5; x <= 5; x++)

        {

               y = a*x + b;

               xt = 39 + 2 * x;

               yt = 12 - y;

               if ((1 <= yt) && (yt <= 23))

               {

                       gotoxy(xt, yt);

                       printf("*");

               }

        }

}

 



[6번 문제]

/*

두 개의 1차 함수식을 입력받아 두 직선의 교차점이 존재할 경우, 교차점의 데카르트 좌표를 출력하도록 프로그램을 수정하시오

*/

#include <stdio.h>

#include <Windows.h>

 

void gotoxy(int x, int y);

void axis(void);

void draw_xy_line02(int a, int b);

void intersect(int x1, int y1, int x2, int y2);

 

int main(void)

{

        int a1, b1, a2, b2;

        printf("첫 번째 함수의 기울기와 y 절편을 입력:");

        scanf("%d %d", &a1, &b1);

        axis();

        draw_xy_line02(a1, b1);

        Sleep(1000);

        system("cls");

        printf("두 번째 함수의 기울기와 y 절편을 입력:");

        scanf("%d %d", &a2, &b2);

        axis();

        draw_xy_line02(a2, b2);

        Sleep(1000);

        system("cls");

        axis();

        intersect(a1, b1, a2, b2);

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void axis(void)

{

        int i;

        for (i = 1; i <= 24; i++)

        {

               gotoxy(39, i);

               printf("|");

        }

        for (i = 1; i <= 79; i++)

        {

               gotoxy(i, 12);

               printf("-");

        }

        gotoxy(39, 12);

        printf("+");

}

 

void draw_xy_line02(int a, int b)

{

        int x, y, xt, yt;

        gotoxy(1, 1);

        printf("y=%dx+%d\n", a, b);

        for (x = -5; x <= 5; x++)

        {

               y = a*x + b;

               xt = 39 + 2 * x;

               yt = 12 - y;

               if ((1 <= yt) && (yt <= 23))

               {

                       gotoxy(xt, yt);

                       printf("*");

               }

        }

}

 

void intersect(int x1, int y1, int x2, int y2)

{

        int x, y, xt, yt;

        x = (y2 - y1) / (x2 - x1); //기울기

 

        if (x1*x + y1 == x2*x + y2) //그냥 대입

        {

               y = x1*x + y1;

               xt = 39 + 2 * x;

               yt = 12 - y;

               if ((1 <= yt) && (yt <= 23))

               {

                       gotoxy(xt, yt);

                       printf("*");

                       gotoxy(xt + 2, yt + 1);

                       printf("[%d, %d]", x, y);

                       gotoxy(1, 23);

                       printf("\n");

               }

        }

        else

        {

               gotoxy(1, 23);

               printf("교차점이 없다");

        }

}




[7번 문제]

/*

[예제 3.3.2]는 기울기와 절편 값을 정수형으로 입력받아 처리하는데 이를 실수형으로 입력받아 함수식의 결과를 출력하는 프로그램으로 수정하시오

*/

#include <stdio.h>

#include <Windows.h>

 

void gotoxy(int x, int y);

void axis(void);

void draw_xy_line02(double a, double b);

 

int main(void)

{

        double a, b;

        printf("y=ax+b의 직선 식을 좌표에 출력\n");

        printf("기울기 입력>");

        scanf("%lf", &a);

        printf("절편 입력>");

        scanf("%lf", &b);

        system("cls");

        axis();

        draw_xy_line02(a, b);

        gotoxy(1, 23);

        printf("\n");

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void axis(void)

{

        int i;

        for (i = 1; i <= 24; i++)

        {

               gotoxy(39, i);

               printf("|");

        }

        for (i = 1; i <= 79; i++)

        {

               gotoxy(i, 12);

               printf("-");

        }

        gotoxy(39, 12);

        printf("+");

}

 

void draw_xy_line02(double a, double b)

{

        int x, y, xt, yt;

        //실수형으로 입력한다해도 gotoxy문은 int형이므로 소숫점이 반영이 안되어 똑같은 높이를 출력할 가능성이 높다. 따라서 이럴 경우 출력을 안하도록 설정

        int copy=1000;//가능한 초기의 yt와 안 겹치는 숫자로

        gotoxy(1, 1);

        printf("y=%fx+%f\n", a, b);

        for (x = -5; x <= 5; x++)

        {

               y = a*x + b;

               xt = 39 + 2 * x;

               yt = 12 - y;

 

               if ((1 <= yt) && (yt <= 23) && yt!=copy)

               {

                       gotoxy(xt, yt);

                       printf("*");

               }

               copy = yt;

        }

}

 


[8번 문제]

/*

[예제 3.3.1] [예제 3.3.2]는 직선으로 표현되는 1차 함수식을 가정하고 있지만

2차 함수식 이상을 표현할 수 있도록 프로그램을 수정하시오

 

*tip:텍스트 화면에 표시할 수 있는 범위에 제한이 있으므로 화면에 맞게 출력하려면

x축과 y축에 대한 scale을 다시 조정해야합니다

*/

#include <stdio.h>

#include <Windows.h>

 

void gotoxy(int x, int y);

void axis(void);

void draw_xy_line02(int a, int b, int c);

 

int main(void)

{

        int a, b, c;

        printf("y=ax^2+bx+c의 이차방정식을 좌표에 출력\n");

        printf("a, b, c 입력>");

        scanf("%d %d %d", &a, &b, &c);

        system("cls");

        axis();

        draw_xy_line02(a, b, c);

        gotoxy(1, 23);

        printf("\n");

        return 0;

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void axis(void)

{

        int i;

        for (i = 1; i <= 24; i++)

        {

               gotoxy(39, i);

               printf("|");

        }

        for (i = 1; i <= 79; i++)

        {

               gotoxy(i, 12);

               printf("-");

        }

        gotoxy(39, 12);

        printf("+");

}

 

void draw_xy_line02(int a, int b, int c)

{

        int x, y, xt, yt;

        gotoxy(1, 1);

        printf("y=%dx^2+%dx+%d\n", a, b, c);

        for (x = -5; x <= 5; x++)

        {

               y = a*x*x + b*x + c;

               xt = 39 + 2 * x;

               yt = 12 - y;

               if ((1 <= yt) && (yt <= 23)&&(xt>=1)&&(xt<=79)) //이제는 x축도 신경써야한다

               {

                       gotoxy(xt, yt);

                       printf("*");

               }

        }

}

 



개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 명품 C언어 프로젝트 안기수 저

반응형