[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언어 프로젝트 안기수 저
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 3.5장 연습문제 (1) | 2017.06.22 |
---|---|
명품 C언어 프로젝트 3.4장 연습문제 (0) | 2017.06.18 |
명품 C언어 프로젝트 3.2장 연습문제 (0) | 2017.06.09 |
명품 C언어 프로젝트 3.1장 연습문제 (0) | 2017.06.07 |
명품 C언어 프로젝트 2.3장 연습문제 (0) | 2017.06.02 |