#include <stdio.h>
#include <string.h>
#define DATA_MAX 5 /*あんまり大きいのはだめよ*/
#define bit(n) (1<<(n))
#define mask(n) ((1<<(n))-1)
char name[DATA_MAX][256]={{0}};
char phone[DATA_MAX][16]={{0}};
int number[DATA_MAX]={0};
unsigned int use_map=0;
/* 公開関数 */
void add(char *, char *, int);
void delByName(char *);
void delByPhone(char *);
void delByNumber(int);
void findByName(char *);
void findByPhone(char *);
void findByNumber(int);
void printAll(void);
/* サブ関数 */
static unsigned int findName(char *);
static unsigned int findPhone(char *);
static unsigned int findNumber(int);
static void del(unsigned int);
static void print(unsigned int);
void add(char *newname, char *newphone, int newnumber){
int i;
for(i=0;(i<DATA_MAX)&&((use_map&bit(i))!=0);i++);
if(i>=DATA_MAX){
printf("faild...list is full\n");
return;
}
if(strlen(newname)>255){
printf("faild...name is too long\n");
return;
}
if(strlen(newphone)>15){
printf("faild...phone is too long\n");
return;
}
strcpy(name[i],newname);
strcpy(phone[i],newphone);
number[i]=newnumber;
use_map |= bit(i);
printf("success.\n");
return;
}
void delByName(char *d){
unsigned int map;
if((map = findName(d))==0){
printf("faild...not found\n");
}else{
del(map);
printf("success.\n");
}
return;
}
void delByPhone(char *d){
unsigned int map;
if((map = findPhone(d))==0){
printf("faild...not found\n");
}else{
del(map);
printf("success.\n");
}
return;
}
void delByNumber(int d){
unsigned int map;
if((map = findNumber(d))==0){
printf("faild...not found\n");
}else{
del(map);
printf("success.\n");
}
return;
}
void findByName(char *f){
unsigned int map;
if((map = findName(f))==0){
printf("faild...not found\n");
}else{
print(map);
}
return;
}
void findByPhone(char *f){
unsigned int map;
if((map = findPhone(f))==0){
printf("faild...not found\n");
}else{
print(map);
}
return;
}
void findByNumber(int f){
unsigned int map;
if((map = findNumber(f))==0){
printf("faild...not found\n");
}else{
print(map);
}
return;
}
void printAll(void){
print(mask(DATA_MAX));
return;
}
static unsigned int findName(char *f){
unsigned int i,ret=0;
for(i=0;i<DATA_MAX;i++)if(strcmp(name[i],f)==0)ret|=bit(i);
return ret;
}
static unsigned int findPhone(char *f){
unsigned int i,ret=0;
for(i=0;i<DATA_MAX;i++)if(strcmp(phone[i],f)==0)ret|=bit(i);
return ret;
}
static unsigned int findNumber(int f){
unsigned int i,ret=0;
for(i=0;i<DATA_MAX;i++)if(number[i]==f)ret|=bit(i);
return ret;
}
static void del(unsigned int dmap){
int i;
for(i=0;i<DATA_MAX;i++){
if(dmap&bit(i)){
name[i][0]='\0';
phone[i][0]='\0';
number[i]=0;
}
}
use_map &= ~dmap;
return;
}
static void print(unsigned int pmap){
int i;
for(i=0;i<DATA_MAX;i++){
if(pmap&bit(i)){
printf("\tname:%s, phone:%s, number:%d\n",name[i],phone[i],number[i]);
}
}
return;
}
int main(){
int cmd=0;
char buf[256];
char buf2[16];
int num=0;
while(cmd!=9){
printf("command:\n"
"\t1:add\n"
"\t2:delByName\n"
"\t3:delByPhone\n"
"\t4:delByNumber\n"
"\t5:findByName\n"
"\t6:findByPhone\n"
"\t7:findByNumber\n"
"\t8:printAll\n"
"\t9:exit\n"
"? ");
cmd=0;
scanf("%d",&cmd);
switch(cmd){
case 1:
printf("name? ");
scanf("%[^\n]%*c",buf);
printf("phone? ");
scanf("%[^\n]%*c",buf2);
num=0;
printf("number? ");
scanf("%d",&num);
while(num==0){
scanf("%*s");
printf("number? ");
scanf("%d",&num);
}
add(buf,buf2,num);
break;
case 2:
printf("name? ");
scanf("%[^\n]%*c",buf);
delByName(buf);
break;
case 3:
printf("phone? ");
scanf("%[^\n]%*c",buf);
delByPhone(buf);
break;
case 4:
num=0;
printf("number? ");
scanf("%d",&num);
while(num==0){
scanf("%*s");
printf("number? ");
scanf("%d",&num);
}
delByNumber(num);
break;
case 5:
printf("name? ");
scanf("%[^\n]%*c",buf);
findByName(buf);
break;
case 6:
printf("phone? ");
scanf("%[^\n]%*c",buf);
findByPhone(buf);
break;
case 7:
num=0;
printf("number? ");
scanf("%d",&num);
while(num==0){
scanf("%*s");
printf("number? ");
scanf("%d",&num);
}
findByNumber(num);
break;
case 8:
printAll();
break;
case 9:
break;
case 0:
scanf("%*s");
/* fall through */
default:
printf("invalid command\n");
break;
}
}
return 0;
}