お友達データベース
/*skadai01-3.c*/
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <stdlib.h>

#define MAXEMPS 100

typedef int x;

x birthmonth(birthday)
int birthday;
{
int month;

if(birthday<200){
month=1;
}
else if(birthday<300){
month=2;
}
else if(birthday<400){
month=3;
}
else if(birthday<500){
month=4;
}
else if(birthday<600){
month=5;
}
else if(birthday<700){
month=6;
}
else if(birthday<800){
month=7;
}
else if(birthday<900){
month=8;
}
else if(birthday<1000){
month=9;
}
else if(birthday<1100){
month=10;
}
else if(birthday<1200)
{
month=11;
}
else{
month=12;
}
return (month);
}

typedef struct friend {
long number;
char *name;
char *bloodtype;
int birthday;
int month;
} FRIEND;

union value{
long i;
double d;
char *s;
};

void
AddEntry(),DeleteEntry(),PrintEntry(),PrintEntries(),SortEntries(),MonthEntry();
FRIEND *lookup(),*lookupmonth(),*find_friend(),
*dont_find_friend(),*find_month();
int getline();
union value *getvalue();
long getlong();
char *getstr();

FRIEND FriendTable[MAXEMPS];
int Friends;

main()
{
printf("♪友達のプロフィールデータベース♪\n");
for(;;){
printf("☆Menu☆\n");
printf(" (1) データの追加\n");
printf(" (2) データの削除\n");
printf(" (3) データの出力\n");
printf(" (4) ○月生まれの人はだ〜ぁれ??\n");
printf(" (0) 終了\n");
switch((int) getlong("実行する機能を選択して下さい。")){
case 0:
PrintEntries();
return 0;
case 1:
AddEntry();
break;
case 2:
DeleteEntry();
break;
case 3:
PrintEntry();
break;
case 4:
MonthEntry();
break;
default:
printf("実行できない選択肢です。\n");
}
}
}

void AddEntry()
{
FRIEND *empptr;
long newnum,birthday,month;

if(Friends == MAXEMPS)printf("データがいっぱいです。あらたにデータを入力したい場合は、既存の友達を削除してくださいね(^皿^)\n");
else{
newnum = getlong("登録番号は?");
if ((empptr = dont_find_friend(newnum)) == NULL) {
empptr = &FriendTable[Friends++];
empptr->number = newnum;
empptr->name = getstr("☆お名前入力☆");
empptr->bloodtype = getstr("☆血液型☆");
empptr->birthday = (int)getlong("☆誕生日☆");
empptr->month = birthmonth(birthday);
}
}
}

void DeleteEntry()
{
FRIEND *empptr;
long newnum;

if (Friends == 0)printf("まだお友達いないですぅ(;_;)\n");
else {
newnum = getlong("削除したいお友達の登録番号を入力してください♪");
if ((empptr = find_friend(newnum)) != NULL){
free(empptr->name);
free(empptr->bloodtype);
*empptr = FriendTable[--Friends];
}
}
}

void PrintEntry()
{
FRIEND *empptr;
long empnum;

if(Friends == 0)printf("まだお友達いないですぅ(;_;)\n");
else{
empnum=getlong("出力する友達の登録番号を入力してください♪");
if ((empptr = find_friend(empnum))!=NULL)
printf("お友達番号 #%li\n\t名前: %s\n\t誕生日: %i\n\t血液型: %s型\n\t誕生月:%i月\n",
empptr->number,empptr->name,empptr->birthday,empptr->bloodtype,empptr->month);
}
}

void PrintEntries()
{
FRIEND *ptr = FriendTable;
FRIEND *endptr = ptr + Friends;

for(;ptr < endptr ; ptr++)
printf("%li, %s, %i, %s\n",
ptr->number,ptr->name,ptr->birthday,ptr->bloodtype);
printf("%i 人のお友達がいるんですね♪%s\n",Friends,Friends == 1 ? "" :"s");

void MonthEntry()
{
FRIEND *empptr;
long birthnum;
if(Friends == 0)printf("まだお友達いないですぅ(;_;)\n");
else{
birthnum=getlong("調べたい月を入力してください♪");
if ((empptr = find_month(birthnum))!=NULL)
printf("お友達番号 #%li\n\t名前: %s\n\t誕生日: %i\n\t血液型: %s型\n\t誕生月:%i\n",
empptr->number,empptr->name,empptr->birthday,empptr->bloodtype);
}
}

FRIEND *lookup(target)
long target;
{
FRIEND *ptr = FriendTable;
FRIEND *endptr = ptr + Friends;

for(;ptr < endptr; ptr++)
if (ptr->number == target)
return ptr;
return (FRIEND *)NULL;
}

FRIEND *find_friend(friend_number)
long friend_number;
{
FRIEND *temp = lookup(friend_number);

if (temp == NULL)
printf("その番号には登録されてないです(;_;)\nほかの番号で探してみてください♪\n");
return (FRIEND *) temp;
}
FRIEND *dont_find_friend(friend_number)
long friend_number;
{
FRIEND *temp = lookup(friend_number);

if (temp != NULL)
printf("その番号にはすでに登録されているお友達いました(^▽^;)ノ\n");
return (FRIEND *) temp;
}

FRIEND *lookupmonth(target)
int target;
{
FRIEND *ptr = FriendTable;
FRIEND *endptr = ptr + Friends;

for(;ptr < endptr; ptr++)
if (ptr->month == target)
return ptr;
return (FRIEND *)NULL;
}

FRIEND *find_month(month_number)
int month_number;
{
FRIEND *temp = lookupmonth(month_number);

if (temp == NULL)
printf("その誕生月のお友達はいないですねー(^_^;)\n");
return (FRIEND *) temp;
}


getline(line,max)
char line[];
int max;
{
int c;
int i=0;

while((c=getchar())!='\n'&&c!=EOF)
if(i<max)
line[i++]=c;
line[i]='\0';
return (c==EOF) ? -1 : i;
}

#define MAXLEN 80
#define LONG 0
#define REAL 1
#define STRING 2

union value *getvalue(prompt,type)
char *prompt;
int type;
{
static union value v;
char line[MAXLEN +1];
int len;

printf("%s",prompt);
if ((len=getline(line,MAXLEN)) == -1)
return (union value*)NULL;
switch(type)
{
case LONG:
if(sscanf(line,"%li",&v.i) != 1)
return (union value*)NULL;
break;
case REAL:
if(sscanf(line,"%lf",&v.d) != 1)
return (union value*)NULL;
break;
case STRING:
if((v.s=malloc(len+1))==NULL)
return (union value*)NULL;
strcpy(v.s,line);
break;
default:
return (union value*)NULL;
}
return &v;
}

long getlong(prompt)
char *prompt;
{
union value *up;
while((up=getvalue(prompt,LONG))==NULL)
printf("ちゃんと半角数字を入力してくださいね(^^;)\n");
return up->i;
}

char *getstr(prompt)
char *prompt;
{
union value *up;
while((up=getvalue(prompt,STRING))==NULL)
printf("ちゃんと文字を入力してくださいね(^^;)\n");
return up->s;
}
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送