# Sample Code HW06
#### [Back to Computer Programming (I)](https://hackmd.io/9tPBK8QATpCD5UQ0uvAZ-g?both)
###### tags: `NTNU` `CSIE` `必修` `Programming(I)`
* [hw06.zip](https://drive.google.com/file/d/125zLpRIVN2OahyqayVGpAkCXLuCyBpJp/view)
## hw0601

```c=
void print_card( const uint8_t player[13] );
int32_t sort_card( uint8_t player[13], int32_t ( * compare)( int32_t a, int32_t b ) );
```

```c=
uint8_t player1[13] = {0};
uint8_t player2[13] = {0};
uint8_t player3[13] = {0};
uint8_t player4[13] = {0};
shuffle( player1, player2, player3, player4 );
printf( "Before:\n" );
print_card( player1 );
print_card( player2 );
print_card( player3 );
print_card( player4 );
printf( "Type 01:\n" );
sort_card( player1, func01 );
sort_card( player2, func01 );
sort_card( player3, func01 );
sort_card( player4, func01 );
print_card( player1 );
print_card( player2 );
print_card( player3 );
print_card( player4 );
printf( "Type 02:\n" );
sort_card( player1, func02 );
sort_card( player2, func02 );
sort_card( player3, func02 );
sort_card( player4, func02 );
print_card( player1 );
print_card( player2 );
print_card( player3 );
print_card( player4 );
printf( "Type 03:\n" );
sort_card( player1, func03 );
sort_card( player2, func03 );
sort_card( player3, func03 );
sort_card( player4, func03 );
print_card( player1 );
print_card( player2 );
print_card( player3 );
print_card( player4 );
```

### Author :
```c=
```
## hw0602

```c=
void state_start(int *state, int input);
void state_s01 (int *state, int input);
...
int main()
{
int (*dfa[8])( int *, int );
dfa[0] = state_start;
dfa[1] = state_s01;
...
}
```
The behavior of your program should be as follows.
```bash=
$ ./hw0602
Please enter an integer (0-255, -1: stop): 35
Please enter an integer (0-255, -1: stop): 19
Please enter an integer (0-255, -1: stop): 43
Please enter an integer (0-255, -1: stop): 99
Please enter an integer (0-255, -1: stop): 10
Please enter an integer (0-255, -1: stop): -1
The user is in the final state.
```
### Author : 芮芮
```c=
#include <stdio.h>
#include <stdint.h>
void state_start(int32_t *state, int32_t input);
void state_s01(int32_t *state, int32_t input);
void state_s02(int32_t *state, int32_t input);
void state_s03(int32_t *state, int32_t input);
void state_s04(int32_t *state, int32_t input);
void state_s05(int32_t *state, int32_t input);
void state_s06(int32_t *state, int32_t input);
void state_final(int32_t *state, int32_t input);
void printstate(int32_t state);
int main(){
void (*a[8])(int32_t *, int32_t);
a[0] = state_start;
a[1] = state_s01;
a[2] = state_s02;
a[3] = state_s03;
a[4] = state_s04;
a[5] = state_s05;
a[6] = state_s06;
a[7] = state_final;
int32_t state = 0;
while(1){
int32_t input;
printf("Please enter an integer (0-255, -1: stop): ");
scanf("%d", &input);
if(input < -1 || input > 255){
printf("Invalid input.\n");
continue;
}
else if(input == -1){
printstate(state);
break;
}
else
a[state](&state, input);
}
return 0;
}
void state_start(int32_t *state, int32_t input){
if(input == 11)
*state = 3;
else if(input == 10 || input == 35)
*state = 1;
else if(input == 20 || input == 78)
*state = 5;
return;
}
void state_s01(int32_t *state, int32_t input){
if(input == 19)
*state = 2;
else if(input == 12 || input == 36)
*state = 6;
return;
}
void state_s02(int32_t *state, int32_t input){
if(input == 43);
else if(input == 99)
*state = 7;
else
*state = 0;
return;
}
void state_s03(int32_t *state, int32_t input){
*state = 4;
return;
}
void state_s04(int32_t *state, int32_t input){
*state = 6;
return;
}
void state_s05(int32_t *state, int32_t input){
if(input == 1)
*state = 4;
else if(input == 2)
*state = 6;
else
*state = 0;
return;
}
void state_s06(int32_t *state, int32_t input){
if(input == 108)
*state = 7;
else
*state = 5;
return;
}
void state_final(int32_t *state, int32_t input){
return;
}
void printstate(int32_t state){
printf("The user is in the ");
if(state == 0)
printf("start state.\n");
else if(state == 1)
printf("S1 state.\n");
else if(state == 2)
printf("S2 state.\n");
else if(state == 3)
printf("S3 state.\n");
else if(state == 4)
printf("S4 state.\n");
else if(state == 5)
printf("S5 state.\n");
else if(state == 6)
printf("S6 state.\n");
else if(state == 7)
printf("final state.\n");
return;
}
```
## hw0603

```c=
void rotate( double *x, double *y, double theta );
```
The behavior of your program should be as follows.
```bash=
$ ./hw0603
Please enter a point: 0 1
Please enter theta (0-360): 90
1 0
```
Again, precision is not the concern in this class.
### Author : 芮芮
```c=
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#define pi acos(-1)
int main(){
printf("Please enter a point: ");
double point[2];
scanf("%lf %lf", &point[0], &point[1]);
printf("Please enter theta (0-360): ");
double theta;
scanf("%lf", &theta);
while(theta > 360 || theta < 0){
printf("Please enter the correct theta (0-360): ");
scanf("%lf", &theta);
}
theta = pi * theta / 180;
double spin[2][2]={cos(theta), sin(theta), -1 * sin(theta), cos(theta)};
double ans[2] = {0};
for(int32_t i = 0; i < 2; i++){
for(int32_t j = 0; j < 2; j++){
ans[i] += spin[i][j] * point[j];
}
}
printf("%lf %lf\n", ans[0], ans[1]);
}
```
## hw0604

```c=
void multiplication( uint8_t **result, uint8_t *size,
uint8_t *x, uint8_t size_x,
uint8_t *y, uint8_t size_y );
```

```bash=
$ ./hw0604
121
```
### Author : 芮芮
```c=
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#include "hw0604test.h"
void multiplication(uint8_t **result, uint8_t *size, uint8_t *x, uint8_t size_x, int8_t *y, uint8_t size_y);
int main(){
bool correct = true;
for(int32_t i = 0; i < size_x; i++){
if(x[i] > 9)
correct = false;
}
for(int32_t i = 0; i < size_y; i++){
if(y[i] > 9)
correct = false;
}
if(correct){
uint8_t *ans = calloc(size_x + size_y, sizeof(uint8_t)), size = size_x + size_y;
multiplication(&ans, &size, x, size_x, y, size_y);
for(int32_t i = size - 1; i > -1; i--){
printf("%d", ans[i]);
}
printf("\n");
}
else{
printf("The input is wrong.\n");
}
}
void multiplication(uint8_t **result, uint8_t *size, uint8_t *x, uint8_t size_x, int8_t *y, uint8_t size_y){
int8_t a[size_x], b[size_y];
for(int32_t i = 0; i < size_x; i++)
a[i] = x[size_x - i - 1];
for(int32_t i = 0; i < size_y; i++)
b[i] = y[size_y - i - 1];
for(int32_t i = 0; i < size_x; i++){
for(int32_t j = 0; j < size_y; j++){
*(*result + i + j) += a[i] * b[j];
while(*(*result + i + j) > 9){
*(*result + i + j) -= 10;
*(*result + i + j + 1) += 1;
}
}
}
while(*(*result + *size - 1) == 0)
*size -= 1;
return;
}
```
## hw0605

```c=
// x / y
void division( uint8_t **quotient, uint8_t *quotient_size,
uint8_t **remainder, uint8_t *remainder_size,
uint8_t *x, uint8_t size_x,
uint8_t *y, uint8_t size_y );
```

### Author : 芮芮
```c=
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
#include "hw0605test.h"
void division(uint8_t **quotient, uint8_t *quotient_size, uint8_t **remainder, uint8_t *remainder_size, uint8_t *x, uint8_t size_x, uint8_t *y, uint8_t size_y);
bool cmp(uint8_t *a, uint8_t *b, uint8_t size);
void minus(uint8_t *a);
int main(){
bool correct = true, zero = true;
for(int32_t i = 0; i < size_x; i++){
if(x[i] > 9)
correct = false;
}
int32_t cnt = 0;
for(int32_t i = 0; i < size_y; i++){
if(y[i])
zero = false;
if(y[i] > 9)
correct = false;
if(zero)
cnt ++;
}
uint8_t *dy = y + cnt;
size_y -= cnt;
if(zero)
correct = false;
if(correct){
uint8_t *q = calloc(size_x - size_y + 1, sizeof(uint8_t)), qsize = size_x - size_y + 1;
uint8_t *r, rsize = size_y;
division(&q, &qsize, &r, &rsize, x, size_x, dy, size_y);
printf("quotient : ");
for(int32_t i = 0; i < qsize; i++){
if(q[i])
zero = true;
if(zero)
printf("%d", q[i]);
}
if(qsize == 0)
printf("0");
printf("\n");
printf("remainder : ");
for(int32_t i = 0; i < rsize; i++){
printf("%d", r[i]);
}
if(rsize == 0)
printf("0");
printf("\n");
}
else{
printf("The input is wrong.\n");
}
}
void division(uint8_t **quotient, uint8_t *quotient_size, uint8_t **remainder, uint8_t *remainder_size, uint8_t *x, uint8_t size_x, uint8_t *y, uint8_t size_y){
for(int32_t i = 0; i < size_x - size_y + 1; i++){
while(cmp(x + i, y, size_y)){
for(int32_t j = 0; j < size_y; j++){
if(x[i + j] < y[j]){
minus(x + i + j);
}
x[i + j] -= y[j];
}
*(*quotient + i) += 1;
}
/*printf("x:");
for(int32_t k = 0; k < size_x; k ++){
printf("%d ", x[k]);
}
printf("\n");
printf("q:");
for(int32_t k = 0; k < *quotient_size; k ++){
printf("%d ", *(*quotient + k));
}
printf("\n\n");
sleep(1);*/
}
for(int32_t i = *quotient_size - 1; i > -1; i--){
if(*(*quotient + i) != 0)
break;
*quotient_size -= 1;
}
for(int32_t i = size_x - size_y; i < size_x; i++){
if(x[i] != 0){
*remainder = x + i;
break;
}
*remainder_size -= 1;
}
return;
}
bool cmp(uint8_t *a, uint8_t *b, uint8_t size){
bool bigger = true;
for(int32_t i = 0; i < size; i++){
if(i == 0 && a[i - 1] > 0){
break;
}
if(a[i] > b[i])
break;
else if(a[i] < b[i]){
bigger = false;
break;
}
}
return bigger;
}
void minus(uint8_t *a){
if(*(a - 1) == 0)
minus(a - 1);
*(a - 1) -= 1;
*a += 10;
return;
}
```
## hw0606

```c=
#include <stdio.h>
#include <unistd.h>
int main()
{
printf( "Hello World" );
sleep( 10 );
return 0;
}
```