---
# System prepended metadata

title: Untitled

---

```c = 
#include<stdio.h>
#include<stdlib.h>
/*
a. random 10 nodes to a FILE, x, y's range between -10~10  
b. read value from the FILE, choose a sorted method to sort the y value from large to small
  (if y value are the same, sorted x value from small to large)
c. find the MAX/min of x and y and count the area of this 4 nodes 
d. print the whole picture
*/ 
int i, j, temp, temp2;
char pic[31][31]; //-15~15
struct node *top;
struct node
{
	int data; //隨要push & pop 的資料型態改變 
	struct node *ptr;
};

void push(int value)
{
	struct node *new;
	new = malloc(sizeof(struct node));
	new -> ptr = NULL;
	new -> data = value;
	new -> ptr = top;
	top = new;
}

int pop()
{
	int value;
	if(top == NULL)
	{
		printf("Nothing to Pop!\n");
		return -1;
	}
	else
	{
		struct node *temp;
		temp = top;
		value = temp -> data;
		top = top -> ptr; //要轉移top到下一個stack 
		free(temp);
		return value;
	} 
}

int empty()
{
	if(top == NULL)
		return 0;
	else
		return 1;
}

//return top data
int stack_top() //dont set the same name
{
	//need error
	if(top == NULL)
		return 0;
	else
		return top -> data;
}


//Sorting Method//
//swap func
void swap(int *a, int *b)
{
	temp = *a;
	*a = *b;
	*b = temp;
}
//Bubble Sort
void Bubble(int *a, int *b)
{
	for(j = 0; j < 20 - 1; j++)
	{
		for(i = 0; i < 20 - 1 - j; i++)
		{
			if(b[i] < b[i+1])
			{
				swap(&b[i], &b[i+1]); //using address
				swap(&a[i], &a[i+1]); //x follow y to swap
			}
			else if(b[i] == b[i+1] && a[i] > a[i+1])
			{
				swap(&a[i], &a[i+1]); 
			}
		}
	}
}

void Insert(int *a, int *b)
{
	for(j = 1; j < 20; j++)
	{
		temp = a[j];
		temp2 = b[j];
		for(i = j - 1; i >= 0; i--)
		{
			if(b[i] < temp2)
			{
				b[i+1] = b[i];
				a[i+1] = a[i];
			}
			else if(b[i] == temp2 && a[i] > temp)
				a[i+1] = a[i];
			else
				break;
		}
		a[i+1] = temp;
		b[i+1] = temp2;
	}
}

void Select(int *a, int *b)
{
	for(j = 0; j < 20 - 1; j++)
	{
		int m = j;
		for(i = j + 1; i < 20; i++)
		{
			if(b[m] < b[i])
			{
				m = i;
			}
			else if(b[m] == b[i] && a[m] > a[i])
			{
				m = i;
			}
		}
		if(m != j)
		{
			swap(&b[m], &b[j]);
			swap(&a[m], &a[j]);
		}
	}
}

void Binary(int numx, int numy, int *a, int *b)
{
	
}

void print_arr(int *a, int *b)
{
	for(i = 0; i < 20; i++)
	{
		printf("%4d%4d\n", a[i], b[i]);
	}
	printf("\n");
}

int main(void)
{
	for(i = 0; i < 20; i++)
	{
		srand(time(NULL));
		push(rand() % 20 - 10);
		int a = pop();
		printf("%d\n", a);
	}
	//作隨機20個點(x, y) 
	int coodx[20], coody[20], x[20], y[20];
	srand(5);
	for(i = 0; i < 20; i++)
	{
		coodx[i] = rand() % 20 - 10;
		coody[i] = rand() % 20 - 10;
		printf("%4d%4d\n", coodx[i], coody[i]);
	}
	
	//將點寫入檔案txt 
	FILE *fp_w;
	fp_w = fopen("practice.txt","w");
	
	if((fp_w = fopen("practice.txt","w")) == NULL)
		printf("Construct file Error! \n");
	else
	{
		//(check push pop)
		/*
		push('a');
		int x = pop();
		fprintf(fp_w, "%d", x);
		*/
		for(i = 0; i < 20; i++)
		{
			fprintf(fp_w, "%4d%4d\n", coodx[i], coody[i]);
		}	
	}
	fclose(fp_w);
	
	//讀取檔案中的資料到x, y陣列 
	FILE *fp_r;
	fp_r = fopen("practice.txt", "r");
	
	if((fopen("practice.txt", "r")) == NULL)
		printf("Open file Error!\n");
	else
	{
		for(i = 0; i < 20; i++)
		{
			fscanf(fp_r, "%d %d", &x[i], &y[i]); //remember using address
		}
	}
	fclose(fp_r);
	
	//(check success to read the data?)
	print_arr(x, y);
	
	//選擇一排序法 
	int choose;
	printf("請選擇排序法：1.泡沫排序\t2.插入排序\t3.選擇排序\t\n");
	scanf("%d", &choose);
	//選項僅在1~3內 
	while(choose < 1 || choose > 3)
	{
		printf("請選擇排序法：1.泡沫排序\t2.插入排序\t3.選擇排序\t\n");
		scanf("%d", &choose);
	}
	//switch分開狀況 
	switch(choose)
	{
		case 1:
			Bubble(x, y);
			print_arr(x, y);
			break;
		case 2:
			Insert(x, y);
			print_arr(x, y);
			break;
		case 3:
			Select(x, y);
			print_arr(x, y);
			break;
		default:
			//printf("輸入錯誤！請重新輸入！\n");
			break;
	}
	
	//找x, y最大最小值，算出矩形面積 
	//y已排序 
	int ymax = y[0];
	int ymin = y[19];
	int xmax = x[0];
	int xmin = x[0];
	for(i = 0; i < 20; i++)
	{
		if(x[i] > xmax)
		{
			xmax = x[i];
		}
		if(x[i] < xmin)
		{
			xmin = x[i];
		}
	}
	int area = (ymax - ymin) * (xmax - xmin);
	printf("X max = %d\tX min = %d\nY max = %d\t Ymin = %d\nArea = %d", xmax, xmin, ymax, ymin, area);
	
	//set the graphic
	//clear the graph
	//i for row, j for column;
	for(i = 0; i < 31; i++)
	{
		for(j = 0; j < 31; j++)
		{
			pic[i][j] = ' ';
		}
	}
	
	//x axis
	for(i = 0; i < 31; i++)
	{
		pic[15][i] = '-';
	}
	for(i = 0; i < 31; i += 5)
	{
		pic[15][i] = '|';
	}
	pic[15][30] = '>';
	
	//y axis
	for(j = 0; j < 31; j++)
	{
		pic[j][15] = '|';
	} 
	pic[30][15] = '^';
	
	//矩形水平線 
	for(i = xmin; i < xmax; i++)
	{
		pic[ymax+15][i+15] = '-';
		pic[ymin+15][i+15] = '-';
	}
	
	//矩形垂直線
	for(j = ymin; j < ymax; j++)
	{
		pic[j+15][xmax+15] = '|';
		pic[j+15][xmin+15] = '|';
	} 
	
	//畫出所有點 
	for(i = 0; i < 30; i++)
	{
		pic[x[i]+15][y[i]+15] = '*';
	}
	
	//四個對角點 
	pic[xmax+15][ymax+15] = '*';
	pic[xmin+15][ymax+15] = '*';
	pic[xmax+15][ymin+15] = '*';
	pic[xmin+15][ymin+15] = '*';
	
	//print the graphic
	for(i = 15; i >= -15; i--)
	{
		for(j = -15; j < 16; j++)
		{
			//y axis num
			if(i % 5 == 0 && j == 0)
			{
				printf("%d", i);
			}
			//-x axis number
			else if(j % 5 == -1 && i == 1)
			{
				printf("%d", j+1);
			}
			//x axis number
			else if(j % 5 == 4 && i == 1)
			{
				printf("%d", j+1);
			}
			//x axis
			else if(i == -1 && j == 14)
			{
				printf("X軸");
			}
			//y axis
			else if(j == 1 && i == -14)
			{
				printf("Y軸");
			}
			else
			{
				printf("%c", pic[i+15][j+15]);
			}
		}
		printf("\n");
	}
	
	return 0;
}
```