#include<cstdlib>
#include<cstring>
/************************************************************************/
/**?通訊錄系統*/
/************************************************************************/
#define?name?256?///名字
#define?tele?32?///手機號
#define?birt?32?///生日
#define?stID?32?///學號
typedef?struct?directory
{
char?Name[name];
char?Tele[tele];
char?Birt[birt];
char?StID[stID];
struct?directory?*next,*prior;
}?CONTACTS;
bool?J_T(char?p[])///電話號碼
{
int?len=strlen(p);
if(len!=11||p[0]!='1')?return?0;
for(int?i=1;?i<len;?i++)
{
if(!(p[i]>='0'&&p[i]<='9'))
return?0;
}
return?1;
}
bool?J_L(int?year)?///平/潤年
{
return?(year%4==0&&year%100!=0||year%400==0);
}
bool?J_B(char?p[])?///生日
{
int?len=strlen(p);
if(!(len>=8&&len<=10))?return?0;/**1949/1/1(8)?1949/12/31(10)**/
int?sum=0,Bith[3],k=0;
for(int?i=0;?i<len;?i++)
{
if(!(p[i]>='0'&&p[i]<='9'||p[i]=='/'))///輸入合法
return?0;
}
p[len]='/';
p[len+1]='\0';
for(int?i=0;?i<=len;?i++)
{
if(p[i]!='/')
sum=10*sum+p[i]-'0';
else
{
Bith[k++]=sum;
sum=0;
}
}
p[len]='\0';
if(!(Bith[1]>=1&&Bith[1]<=12))
return?0;
switch(Bith[1])
{
case?1:case?3:case?5:case?7:case?8:case?10:case?12:
if(!(Bith[2]>=1?&&?Bith[2]<=31))?return?0;break;
case?4:case?6:case?9:case?11:
if(!(Bith[2]>=1?&&?Bith[2]<=30))?return?0;break;
case?2:
if(J_L(Bith[0])==1)?{if(!(Bith[2]>=1?&&?Bith[2]<=29))?return?0;}///潤年29天
else?{if(!(Bith[2]>=1?&&?Bith[2]<=28))?return?0;}break;///平年28天
}
return?1;
}
bool?J_I(char?p[])?///學號
{
int?len=strlen(p);
if(len!=11||p[0]==0)?return?0;
for(int?i=1;?i<len;?i++)
{
if(!(p[i]>='0'&&p[i]<='9'))
return?0;
}
return?1;
}
void?Input_(CONTACTS?*head,bool?x)?///1,新錄入;2,添加
{
printf("錄入幾個人?\n");
int?n;
scanf("%d",&n);
getchar();
while(n--)
{
CONTACTS?*p,*pnew=new?CONTACTS;
if(x==0)
p=head->next;
else
p=head->prior;
printf("名字\n");
gets(pnew->Name);
printf("手機號(11位,如果不知道,輸入10000000000)\n");
while(1)
{
gets(pnew->Tele);
if(J_T(pnew->Tele)==1)
break;
else
printf("輸入手機號碼錯誤,請重輸\n");
}
printf("生日(形如,1949/1/1,1949/12/31,如果不知道,輸入0000/1/1)\n");
while(1)
{
gets(pnew->Birt);
if(J_B(pnew->Birt)==1)
break;
else
printf("輸入不正確,請檢查\n");
}
printf("學號(如果不知道,輸入10000000000)\n");
while(1)
{
gets(pnew->StID);
if(J_I(pnew->StID)==1)
break;
else
printf("輸入學號錯誤,請檢查後重新輸入\n");
}
p->next=pnew;
pnew->prior=p;
pnew->next=head;
head->prior=pnew;
}
return?;
}
void?Output_(CONTACTS?*head)///輸出
{
CONTACTS?*p=head->next;
printf("------------------------\n");
while(p!=head)
{
printf("%-8s:%s\n%-8s:%s\n%-8s:%s\n%-8s:%s\n","|?姓名",p->Name,"|?學號",p->StID,"|手機號碼",p->Tele,"|?生日",p->Birt);
if(p->next!=head)
putchar('\n');
p=p->next;
}
printf("------------------------\n");
return?;
}
void?Open_files(CONTACTS?*pHead)///外部倒入數據
{
CONTACTS?*pNew,*pNext;
FILE?*fp;
char?filename[name];
puts("請輸入妳要打開文件的地址");
scanf("%s",filename);
if((fp=fopen(filename,"r"))==NULL)
{
puts("無法打開文件");
fflush(stdin);
}
else
{
pNext=(CONTACTS?*)malloc(sizeof(CONTACTS));
pHead->next=pNext;
pNext->prior=pHead;
fscanf(fp,"%s%s%s%s",pNext->Name,pNext->StID,pNext->Tele,pNext->Birt);
while(!feof(fp))
{
pNew=(CONTACTS?*)malloc(sizeof(CONTACTS));
pNext->next=pNew;
pNew->prior=pNext;
pNext=pNew;
fscanf(fp,"%s%s%s%s",pNext->Name,pNext->StID,pNext->Tele,pNext->Birt);
}
pNext->next=pHead;
pHead->prior=pNext;
puts("導入數據成功!");
fclose(fp);
}
return?;
}
void?Save_files(CONTACTS?*pHead)///保存數據
{
CONTACTS?*p=pHead->next;
FILE?*fp;
char?filename[name];
if(p==pHead)
{
puts("無學生信息,請先錄入學生信息");
}
else
{
while(1)
{
puts("請輸入妳要保存文件的地址");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
puts("無法打開文件");
else
{
while(p->next!=pHead)
{
fprintf(fp,"%s\t%s\t%s\t%s\n",p->Name,p->StID,p->Tele,p->Birt);
p=p->next;
}
fprintf(fp,"%s\t%s\t%s\t%s\n",p->Name,p->StID,p->Tele,p->Birt);
puts("保存文件成功!");
fclose(fp);
break;
}
}
}
return?;
}
int?Menu()
{
system("cls");
printf("-----------------------通訊錄-----------------------\n");
printf("|*******\t?1.錄入|\n");
printf("|*******\t?2.添加|\n");
printf("|*******\t?3.查看|\n");
printf("|*******\t?4.保存|\n");
printf("|*******\t?5.打開|\n");
printf("|*******\t?0.退出|\n");
printf("----------------------------------------------------\n");
int?i;
do
{
printf("輸入選項:_\b");
scanf("%d",&i);
}
while(i<0||i>5);
return?i;
}
bool?Loading(int?time)
{
char?admin[20]=?{"1"},passw[20]=?{"1"};
printf("\t\t\t用戶:______\b\b\b\b\b\b");
char?admi[20],pass[20];
scanf("%s",admi);
if(strcmp(admi,admin)==0)
{
printf("\t\t\t密碼:______\b\b\b\b\b\b");
scanf("%s",pass);
if(strcmp(pass,passw)==0)
return?1;
else
{
printf("密碼錯誤\n");
return?0;
}
}
else
{
printf("管理員錯誤\n");
return?0;
}
}
int?main()
{
CONTACTS?*head=(CONTACTS?*)malloc(sizeof(CONTACTS));
head->next=head->prior=head;
int?times=5;
printf("\t?----------------------------------------------------------------\n");
printf("\t|*******?通訊錄系統?*******|\n");
printf("\t|*******?註意:妳有%d次機會登陸本系統?*******|\n",times);
printf("\t?----------------------------------------------------------------\n");
while(1)
{
int?sign=Loading(times);
if(sign==1||times==1)
break;
times--;
printf("還有%d次機會\n",times);
}
if(times>1)
{
while(1)
{
switch(Menu())
{
case?1:?Input_(head,0);break;
case?2:?Input_(head,1);break;
case?3:?Output_(head);getchar();break;
case?4:?Save_files(head);getchar();break;
case?5:?Open_files(head);getchar();break;
case?0:?exit(0);break;
}
printf("按任意鍵繼續\n");
getchar();
}
}
else
{
printf("退出系統\n");
}
return?0;
}