Quiz 03
===
# [A] Tablelize
[Quiz02 [C] Tablelize](https://hackmd.io/@nnyjan02426/cp2_quiz02#C-Tablelize)
# [B] Pets
## Notes
## Code
```c=1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 25
enum datatype{
ORIGIN, TYPE, BODY, COAT, BREED
};
struct price{
char name[50];
int price;
};
struct cat{
char *datatype[5];
int price;
};
int str_to_int(char *str);
int in_str(char *str, char *to_find);
int has_num(char *str);
int has_comma(char *str);
int main(){
struct price Price[5][SIZE];
int idx[5] = {0};
char input[150];
enum datatype datatype;
struct cat Cat;
int printed = 0;
while(gets(input)){
if(input[0] == 0){
break;
}
else if(has_num(input)){
strcpy(Price[datatype][idx[datatype]].name, strtok(input, ","));
Price[datatype][idx[datatype]].price = str_to_int(strtok(NULL, ","));
idx[datatype]++;
}
else{
if(in_str(input, "Origin")){
datatype = ORIGIN;
}
else if(in_str(input, "Type")){
datatype = TYPE;
}
else if(in_str(input, "Body")){
datatype = BODY;
}
else if(in_str(input, "Coat")){
datatype = COAT;
}
}
}
printf("====================================================================================\n");
printf("Breed Origin Type Body Coat Price\n");
printf("------------------------------------------------------------------------------------\n");
while(gets(input)){
if(!has_comma(input)){
if(printed){
printf("====================================================================================\n\n");
break;
}
}
else{
printed = 1;
Cat.price = 0;
Cat.datatype[BREED] = strtok(input, ",");
for(enum datatype t=ORIGIN; t<=COAT; t++){
Cat.datatype[t] = strtok(NULL, ",");
for(size_t i=0; i<idx[t]; i++){
if(in_str(Price[t][i].name, Cat.datatype[t])){
Cat.price += Price[t][i].price;
break;
}
}
}
printf("%-25s%-22s %-6c%-12s%-12s%5d\n", Cat.datatype[BREED], Cat.datatype[ORIGIN], Cat.datatype[TYPE][0], Cat.datatype[BODY], Cat.datatype[COAT], Cat.price);
}
}
printf("====================================================================================\n");
}
int str_to_int(char *str){
int result = 0;
for(int i=0; i<strlen(str); i++){
result *= 10;
result += (int)str[i] - (int)'0';
}
return result;
}
int in_str(char *str, char *to_find){
int found;
if(strlen(str) < strlen(to_find)){
return 0;
}
for(size_t i=0; i<strlen(str); i++){
if(str[i] == to_find[0]){
found = 1;
for(size_t j=0; j<strlen(to_find); j++){
if(str[i+j] != to_find[j]){
found = 0;
break;
}
}
if(found){
return 1;
}
}
}
return 0;
}
int has_num(char *str){
for(size_t i=0; i<strlen(str); i++){
if(str[i] == ',' && (str[i+1] >= '0') && (str[i+1] <= '9')){
return 1;
}
}
return 0;
}
int has_comma(char *str){
for(size_t i=0; i<strlen(str); i++){
if(str[i] == ','){
return 1;
}
}
return 0;
}
```
# [C] Subnetwork
## Notes
## Code
```c=
#include <stdio.h>
#include <stdlib.h>
unsigned int arr_to_int(int arr[]);
unsigned int create_mask(int n);
int main(){
int n, host[4], prefix, ip[4];
unsigned int host_int, ip_int, mask;
int printed = 0;
while(scanf("%d", &n)){
if(n == 0){
break;
}
scanf("%d.%d.%d.%d/%d", &host[0], &host[1], &host[2], &host[3], &prefix);
if(printed){
puts("");
}
else{
printed = 1;
}
printf("--------------------------------------------------------------------------------\n");
printf("The following addresses are within the subnetwork %d.%d.%d.%d/%d:\n", host[0], host[1], host[2], host[3], prefix);
host_int = arr_to_int(host);
mask = create_mask(prefix);
for(int i=0; i<n; i++){
scanf("%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3]);
ip_int = arr_to_int(ip);
if((host_int & mask) == (ip_int & mask)){
printf("%d.%d.%d.%d\n", ip[0], ip[1], ip[2], ip[3]);
}
}
printf("--------------------------------------------------------------------------------\n");
}
}
unsigned int arr_to_int(int arr[]){
unsigned int result = 0;
for(size_t i=0; i<4; i++){
result <<= 8;
result |= arr[i];
}
return result;
}
unsigned int create_mask(int n){
unsigned int mask = 0;
for(int i=0; i<n; i++){
mask |= 1;
mask <<= 1;
}
mask <<= (32 - n - 1);
return mask;
}
```
###### tags: `程設二quiz`