# 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 ![](https://i.imgur.com/yUH1oKp.jpg) ```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 ) ); ``` ![](https://i.imgur.com/5ASQR6e.jpg) ```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 ); ``` ![](https://i.imgur.com/sLkPaeR.jpg) ### Author : ```c= ``` ## hw0602 ![](https://i.imgur.com/zgLn1lx.jpg) ```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 ![](https://i.imgur.com/1vekQj4.jpg) ```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 ![](https://i.imgur.com/kmMcRme.jpg) ```c= void multiplication( uint8_t **result, uint8_t *size, uint8_t *x, uint8_t size_x, uint8_t *y, uint8_t size_y ); ``` ![](https://i.imgur.com/ZwYlIj3.jpg) ```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 ![](https://i.imgur.com/F02iSbt.jpg) ```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 ); ``` ![](https://i.imgur.com/r9UXNFM.jpg) ### 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 ![](https://i.imgur.com/zr4qghD.jpg) ```c= #include <stdio.h> #include <unistd.h> int main() { printf( "Hello World" ); sleep( 10 ); return 0; } ```