C语言小区居民查询系统


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>

 typedef struct member//成员结构体
 {
 char name[30];//姓名

 char born[10];//出生日

 int relation;//与户主关系
 int sex;//姓别
 struct member  *next;
 }mem;

 


 typedef struct house//住房结构体
 {
 char addres[50];//小区名
 char num[20];//小区门牌号,唯一


 mem  *mhead;//家庭成员结构体头指针
 mem  *mi;//家庭成员结构体尾指针
 struct house  *next;
 }hou;
 
 

 

hou *hhead=NULL;//全局户主结构体头指针
hou *hi=NULL;//全局户主结构体尾指针


void initial()
{

FILE *fp;
fp=fopen("house.txt","r");
if(fp)//1  if
{
fseek(fp,0,SEEK_END);
int n;
n=ftell(fp)/sizeof(hou);//计算用户结构体个数

rewind(fp);//复位

    hou *p;
    int i=0;
    for(;i<n;i++)//1  for
 {
 p=(hou*)calloc(1,sizeof(hou));//或者(hou*)malloc(sizeof(hou))
 fread(p,sizeof(hou),1,fp);
 p->mhead=p->mi=NULL;
    p->next=NULL;
   if(hhead==NULL)hhead=hi=p;
   else  { hi->next=p;    hi=p; }
  

   
//下面初始化成员信息
      FILE *fp1;
   int n1;
      fp1=fopen(p->num,"r");// 家庭门牌号是唯一的,所以用以作 文件名
      if(fp1)//2  if
   {
      fseek(fp1,0,2);
      
      n1=ftell(fp1)/sizeof(mem);//计算用户结构体个数

      rewind(fp1);//复位

      mem *p1;
      int j=0;
       for(;j<n1;j++)
    {//2 for
      p1=(mem*)calloc(1,sizeof(mem));//或者(res*)malloc(sizeof(res))
   fread(p1,sizeof(mem),1,fp1);
   p1->next=NULL;
      if(p->mhead==NULL)p->mhead=p->mi=p1;
      else  {p->mi->next=p1;    p->mi=p1; }
 
    }//2  for
      // printf("/n/n初始化%s小区%s号%d个家庭成员信息成功!",p->addres,p->num,n1);
       
    fclose(fp1);

   }//2  if

  // else   printf("/n/n提示:%s小区%s号楼未售出!",p->addres,p->num);
//初始化成员信息

 }//1  for

   


   // printf("/n/n初始化%d个小区居民信息成功!",n);
    fclose(fp);

}//1  if

else printf("/n/n/n数据库无该文件信息!");

 

}

 

 


void newh()
{

    hou *p;
 p=(hou *)malloc(sizeof(hou));
 printf("/n/n/n█创建新单元█/n");
 printf("/n请输入新单元小区名:");
 scanf("%s",p->addres);
loop:

 printf("/n请输入新单元门牌号:");
 scanf("%s",p->num);

//检验是否重复
hou *p1=hhead;
while(p1)
{
 if(strcmp(p->num,p1->num)==0)
 {  printf("/n错误,该门牌号已经存在!"); 
 
 char  c;
 printf("/n/n您想  重新输入(A)----退出新建(N),请选择!/n");
     c=getch();
    if(c=='A'||c=='a')goto  loop;  else return;
 }

p1=p1->next;

}//检验是否重复

 

p->next=NULL;
p->mhead=p->mi=NULL;

if(hhead==NULL)hhead=hi=p;
else  {hi->next=p;hi=p;}

 

    printf("/n  |-----------------------|");
     printf("/n   █新单元楼信息█      ");
     printf("/n |-----------------------|");
  printf("/n   小区名称:%s                  ",p->addres);
     printf("/n |-----------------------|");
     printf("/n   门牌号码:%s                 ",p->num);
  printf("/n |-----------------------|");
 
printf("/n新单元楼创建成功/n/n");

}

 

 

void newm()
{

 printf("/n/n█注册住户资料█/n");
loop:
   char nn[30];
   char  c;
  

 printf("/n请输入住单元的门牌号码:");
 scanf("%s",nn);

//检验是否有
hou *p=hhead;
int  i=1;

while(p)
{
 if(strcmp(p->num,nn)==0)
 {  i=0;break;}

p=p->next;

}//检验

if(i){
printf("/n错误,该门牌号不存在!"); 
 printf("/n/n您想  重新输入(A)----退出注册(N),请选择!/n");
     c=getch();
    if(c=='A'||c=='a')goto  loop;  else return;
}

 

loop1:

    mem  *p1;
 p1=(mem  *)malloc(sizeof(mem));
 p1->next=NULL;

 printf("/n请输入姓名:");
 scanf("%s",p1->name);
 printf("/n请输入性别,男(1)女(2)./n请填1或2:");
 scanf("%d",&p1->sex);
    printf("/n请输入出生日期(形式:年/月/日):");
 scanf("%s",&p1->born);
 printf("/n请输入输入与户主关系:户主(1)配偶(2)子女(3)/n请填1或2或3:");
 scanf("%d",&p1->relation);

if(p->mhead==NULL)p->mhead=p->mi=p1;
else  {p->mi->next=p1;p->mi=p1;}

 


printf("/n/n若还有家庭成员,请按A继续注册,退出请按N!");
printf("/n/n(提示 :注册住户的所有家庭成员资料必须在本次完成填写!)/n");

  c=getch();
    if(c=='A'||c=='a')goto  loop1; 

 
printf("/n注册住户资料成功/n/n");

}

 


void showh()
{

hou  *p=hhead;
if(p==NULL){printf("/n/n小区信息数据库为空!");   return;}


printf("/n /n /n  /n            █小区信息数据库█          ");
printf("/n|-------------------------------------------------------------|");
int i=0;
while(p)
{
i++;
printf("/n|[%d ]  小区名称: %s        门牌号码:%s ",i,p->addres,p->num );

if(p->mhead)printf("          已售!");else printf("          未售!");

printf("/n|-------------------------------------------------------------|");

p=p->next;
}

printf("/n█单元楼总数:   %d    ",i);
printf("/n|-------------------------------------------------------------|/n/n/n/n/n/n");


}

 

void showm()
{

hou  *p=hhead;
if(p==NULL){printf("/n/n居民信息数据库为空!");   return;}


printf("/n /n /n  /n            █居民信息数据库█          ");
printf("/n|-------------------------------------------------------------|");
int i=0;
while(p)
{
mem  *p1=p->mhead;
if(!p1)  goto  loop;


while(p1)
{
i++;
printf("/n[%d ]  /t姓名: %s                 /t性别: ",i ,p1->name );
p1->sex-1?puts("女"):puts("男");
printf("      /t出生日期: %s  ",p1->born );
if(p1->relation==1)
printf(" /t与户主关系:户主 " );
if(p1->relation==2)
printf(" /t与户主关系:配偶 " );
if(p1->relation==3)
printf("   /t与户主关系:子女 " );

printf("/n|    /t小区名称: %s              /t门牌号码:%s ",p->addres,p->num );
printf("/n|-------------------------------------------------------------|");
p1=p1->next;
}

loop:  ;

p=p->next;


}

printf("/n█居民信息总数:   %d    ",i);
printf("/n|-------------------------------------------------------------|/n/n/n/n/n/n");


}

 

 


void  lookh()
{


 printf("/n/n█查询单元楼█/n");
loop:
   char nn[30];
   char  c;
  

 printf("/n请输要查询单元楼的门牌号码:");
 scanf("%s",nn);

//检验是否有
hou *p=hhead;
int  i=1;

while(p)
{
 if(strcmp(p->num,nn)==0)
 {  i=0;break;}

p=p->next;

}//检验

 

 


if(i)printf("/n错误,该门牌号不存在!"); 
else{
printf("/n|-------------------------------------------------------------|");
printf("/n| 小区名称: %s           门牌号码:%s ",p->addres,p->num );

if(p->mhead)printf("          已售!");else printf("          未售!");

printf("/n|-------------------------------------------------------------|");

}

 

 printf("/n/n您想  继续查询(A)----退出查询(N),请选择!/n");
     c=getch();
    if(c=='A'||c=='a')goto  loop;  else return;
}

 

 

 

void  lookm()
{


printf("/n/n█查询居民█/n");

char c,m[30];
do{//do的开始。

 

printf("/n/n/n         [居民查询菜单]");
printf("/n|-----------------------------------|");
printf("/n|           请选择查询方式:         |");
printf("/n|-----------------------------------|");
printf("/n|           A[ 姓 名 查 询 ]        |");
printf("/n|-----------------------------------|");
printf("/n|           B[ 出生日期查询]        |");   
printf("/n|-----------------------------------|");
printf("/n|           C[ 单 元 号查询]        |");   
printf("/n|-----------------------------------|");
printf("/n|           D[    退出     ]        |");   
printf("/n|-----------------------------------|");

c=getch();


switch (c)
{//switch的开始


case 'A':
case'a':
 { //a
  
  int y=1;
     hou *p=hhead;
  printf("/n/n请输入要查找的姓名/n/n");
     scanf("%s",m);
  
while(p)
{
mem *p1=p->mhead;
  
 while(p1)
 {
 
  if(strcmp(p1->name,m)==0)
 { y=0;
printf("/n|-------------------------------------------------------------|");  
printf("/n  /t姓名: %s                 /t性别: " ,p1->name );
p1->sex-1?puts("女"):puts("男");
printf("      /t出生日期: %s  ",p1->born );
if(p1->relation==1)
printf(" /t与户主关系:户主 " );
if(p1->relation==2)
printf(" /t与户主关系:配偶 " );
if(p1->relation==3)
printf("   /t与户主关系:子女 " );
printf("/n|    /t小区名称: %s              /t门牌号码:%s ",p->addres,p->num );
printf("/n|-------------------------------------------------------------|");  
 }

   p1=p1->next;
 
 }


 p=p->next; 
}

if(y)printf("失败,您查询的居民不存在!/n/n");

}//a
break;

 

case'B':
case'b':
{    //b
 int y=1;
    hou *p=hhead;
 printf("/n/n请输入要查找的出生年月(形式:年/月/日)/n/n");
    scanf("%s",m);
  
 while(p)
{
mem *p1=p->mhead;
  
 while(p1)
 {
 
  if(strcmp(p1->born,m)==0)
 { y=0;
printf("/n|-------------------------------------------------------------|");  
printf("/n  /t姓名: %s                 /t性别: ",p1->name );
p1->sex-1?puts("女"):puts("男");
printf("      /t出生日期: %s  ",p1->born );
if(p1->relation==1)
printf(" /t与户主关系:户主 " );
if(p1->relation==2)
printf(" /t与户主关系:配偶 " );
if(p1->relation==3)
printf("   /t与户主关系:子女 " );
printf("/n|    /t小区名称: %s              /t门牌号码:%s ",p->addres,p->num );
printf("/n|-------------------------------------------------------------|");  
 }

   p1=p1->next;
 
 }
 p=p->next; 
}

if(y) printf("失败,您查询的年月日不存在!/n/n");

}break;//b

 

 

 


case'C':
case'c':
{//c
 int y=1;
    hou *p=hhead;
 printf("/n/n请输入要查找的门牌号码/n/n");
     scanf("%s",m);
  
 while(p)
 { //while  1
  if(strcmp(p->num,m)==0)
 { //if
  y=0;
 
    if(!p->mhead)printf("/n/n未出售,无居民信息!");
    mem *p1=p->mhead;
  while(p1)
  {
       
       printf("/n|-------------------------------------------------------------|");  
       printf("/n  /t姓名: %s                 /t性别: ",p1->name );
       p1->sex-1?puts("女"):puts("男");
       printf("      /t出生日期: %s  ",p1->born );
       if(p1->relation==1)
       printf(" /t与户主关系:户主 " );
       if(p1->relation==2)
       printf(" /t与户主关系:配偶 " );
       if(p1->relation==3)
       printf("   /t与户主关系:子女 " );
       printf("/n|    /t小区名称: %s              /t门牌号码:%s ",p->addres,p->num );
       printf("/n|-------------------------------------------------------------|");  

    p1=p1->next;
  }

       
 }//if
 p=p->next; 
}//while  1

if(y) printf("失败,您查询的门牌号不存在!/n/n");

}break;//c

 

}//switch的结束

 

}while(c!='D'&&c!='d');
//do 的结束

}

 


void delh()
{
printf("/n/n█删除单元楼█/n");

hou  *p=hhead,*p1=hhead;
if(p==NULL){printf("/n/n小区信息数据库为空!");   return;}
char m[30];

loop:

printf("/n/n请输入要删除的门牌号码/n/n");
scanf("%s",m);

 

 
int y=0,i=1;


while(p)
{
y++;

   if(strcmp(p->num,m)==0)
   {
    if(p->mhead!=NULL){
    printf("/n错误,该单元已经售出,无法办理删除!"); 
 printf("/n/n您想  重新输入(A)----退出删除(N),请选择!/n");
 char c;
     c=getch();
    if(c=='A'||c=='a')goto  loop;  else return;
 }

   
   
   
 i=0;
   if(p==hhead)hhead=hhead->next;
   else  p1->next=p->next  ;
   printf("删除%s号楼成功!/n/n",p->num);
        if(p->mhead)//有居民信息
  {FILE  *fp;
        fp=fopen(p->num,"w");//将原有的居民清除,W的方式是存在则删除,不存在则新建
  }
   }

p=p->next;
if(y>1)p1=p1->next;

}

if(i) printf("/n/n/n失败,您输入的门牌号不存在!/n/n");

}

 

 


void delm()
{
printf("/n/n█删除居民█/n");

hou  *p=hhead;
if(p==NULL){printf("/n/n小区信息数据库为空!");   return;}
char m[30];

loop:
printf("/n/n请输入要删除居民的门牌号码/n/n");
scanf("%s",m);

while(p)
{

 if(strcmp(p->num,m)==0)
 {
  if(p->mhead==NULL)
  {  printf( "/n该单元未售出,无居民可删除!");
       printf("/n/n您想  重新输入(A)----退出删除(N),请选择!/n");
         char c;
          c=getch();
          if(c=='A'||c=='a')goto  loop;  else return;}
 }
p=p->next;

}
 
int i=1;

p=hhead;

while(p)
{//while 1


   if(strcmp(p->num,m)==0)
   {//if 1
    i=0;
    printf("/n/n请输入要删除居民的姓名:/n");
    scanf("%s",m);
    mem  *p1=p->mhead,*p2=p->mhead;
    int y1=0,y2=1;

     while(p1)
  {//while 2
  y1++;
  
   if(strcmp(p1->name,m)==0)
   {//if 2
    y2=0;
    if(p1==p->mhead)   p->mhead=p->mhead->next;
          else  p2->next=p1->next  ;

          printf("删除%s号楼的居民%s成功!/n/n",p->num,p1->name);
   }// if 2
    p1=p1->next;
    if(y1>1)p2=p2->next;
 
  }//while 2
     if(y2) printf("/n/n/n失败,您输入的姓名不存在!/n/n");
     
   }//if 1

p=p->next;

}//while 1

if(i) printf("/n/n/n失败,您输入的门牌号不存在!/n/n");

}

 

 


void modifyh()
{
 printf("/n/n/n█修改单元█/n");

int y=1 ;
 char m[30];
loop:
 printf("/n/n/n请输入要修改单元门牌号码:");
 scanf("%s",m);

//检验是否有
hou *p=hhead;
while(p)
{
 if(strcmp(p->num,m)==0)
 {  //if
  y=0;
         loop1:

  printf("/n/n请输入新门牌号码/n/n");
  scanf("%s",m);
   
      //检验是否重复
       hou *p1=hhead;
       while(p1)
    {
         if(strcmp(m,p1->num)==0)
  {  printf("/n错误,该门牌号已经存在,请重新输入!"); 

        goto  loop1; 
     }
   
       p1=p1->next;

    }//检验是否重复 
  
  strcpy(p->num,m);
 }//if 
  
  
p=p->next; 
}  
  
if(y)printf("/n错误,该门牌号不存在!"); 

else printf("/n新单元楼修改成功/n/n"); 

 char  c;
 printf("/n/n您想  重新输入(A)----退出新建(N),请选择!/n");
     c=getch();
    if(c=='A'||c=='a')goto  loop;  else return;

 

}


 

 

 

 

 


void  save()
{

FILE  *fp;
fp=fopen("house.txt","w");

hou  *p=hhead;
int i=0;
while(p)
{
i++;

fwrite(p,sizeof(hou),1,fp);

//保存家族成员
if(p->mhead)
{

FILE  *fp1;
fp1=fopen(p->num,"w");
mem  *p1=p->mhead;
int n=0;
while(p1)
{
n++;
fwrite(p1,sizeof(mem),1,fp1);

p1=p1->next;
}
//printf("/n/n保存%d个家庭成员信息成功!",n);
}//保存家族成员

p=p->next;

 

}

 

 //printf("/n/n保存%d个小区居民信息成功!",i);

fclose(fp);

}

 


void release()
{

printf("/n/n/n    [清空菜单]");
printf("/n|---------------------|");
printf("/n|   请选择清空方式:   |");
printf("/n|---------------------|");
printf("/n|     A[ 全部清空]    |");
printf("/n|---------------------|");
printf("/n|     B[ 清空居民]    |");   
printf("/n|---------------------|");
printf("/n|     C[ 退   出]     |");   
printf("/n|---------------------|");
char   c;
c=getch();
if(c=='C'||c=='c') return;


hou  *p=hhead;
while(p)
{
        if(p->mhead)//有居民信息
  {FILE  *fp;
        fp=fopen(p->num,"w");//将原有的居民清除,W的方式是存在则删除,不存在则新建
  }
        p->mhead=p->mi=NULL;

p=p->next;
}

 


if(c=='A'||c=='a')  hhead=hi=NULL;

printf("/n/n/n  清空信息成功!");

}

 

 

 

 


void show()

 

printf("/n |----------------------------------------|");
printf("/n |          █主      菜      单 █       |");             
printf("/n |----------------------------------------|");
printf("/n |          A  小   区   信   息          |"); 
printf("/n |----------------------------------------|");
printf("/n |          B  新   建   单   元          |"); 
printf("/n |----------------------------------------|");
printf("/n |          C  住   户   注   册          |");
printf("/n |----------------------------------------|");
printf("/n |          D  信   息   查   询          |");
printf("/n |----------------------------------------|");
printf("/n |          E  系   统   管   理          |");
printf("/n |----------------------------------------|");
printf("/n |          F  清   空   数   据          |");             
printf("/n |----------------------------------------|");
printf("/n |          G  退   出   程   序          |");             
printf("/n |----------------------------------------|");
printf("/n |             请您选择一个任务           |");
printf("/n |----------------------------------------|/n/n/n");
}

 


void show1()
{


printf("/n |-------------------------|");
printf("/n |   █小 区 信 息 █      |");             
printf("/n |-------------------------|");
printf("/n |  A  所 有 单 元 信息    |"); 
printf("/n |-------------------------|");
printf("/n |  B  所 有 居 民 信息    |"); 
printf("/n |-------------------------|");
printf("/n |  C  退  出  程  序      |");
printf("/n |-------------------------|");
printf("/n |     请您选择一个任务    |");
printf("/n |-------------------------|/n/n/n");
}

 

void show2()
{


printf("/n |-------------------------|");
printf("/n |   █ 信 息 查 询█      |");             
printf("/n |-------------------------|");
printf("/n |  A  查 询 单 元 信息    |"); 
printf("/n |-------------------------|");
printf("/n |  B  查 询 居 民 信息    |"); 
printf("/n |-------------------------|");
printf("/n |  C  退  出  程  序      |");
printf("/n |-------------------------|");
printf("/n |     请您选择一个任务    |");
printf("/n |-------------------------|/n/n/n");
}

 

void show3()
{


printf("/n |-----------------------------|");
printf("/n |    █管  理  菜   单█      |");             
printf("/n |-----------------------------|");
printf("/n |  A   修  改  单  元         |"); 
printf("/n |-----------------------------|");
printf("/n |  B   删  除  单  元         |"); 
printf("/n |-----------------------------|");
printf("/n |  C   删  除  居  民         |");
printf("/n |-----------------------------|");
printf("/n |  D   退  出  程  序         |");
printf("/n |-----------------------------|");
printf("/n |     请您选择一个任务        |");
printf("/n |-----------------------------|/n/n/n");
}

 

 

 

 


void main()
{


printf("/n/n/n/n/n/n/n/n/n/n");
printf("/n/n        ★欢迎您使用小区查询系统!★");
initial();

char c;
do {

 


show();

c=getch();

 

switch ( c)
{

 


case 'a':
case 'A':{
  char c1;

 do{
  show1();
 
       c1=getch();

switch ( c1)
 
{
case 'a':
case 'A':showh();break;

case 'b':
case 'B':showm();break;

}

 }while(c1!='c'&&c1!='C');

 }break;

 

case 'b':
case 'B':newh();break;
 
 


 
case 'c':
case 'C':newm();break;
  
 

 

 

case 'd':
case 'D':
{
  char c2;

 do{
  show2();
 
       c2=getch();

switch ( c2)
 
{
case 'a':
case 'A':lookh();break;

case 'b':
case 'B':lookm();break;

}

 }while(c2!='c'&&c2!='C');

 }break;

 

 

 


case 'e':
case 'E':
 {
  char c3;

 do{
  show3();
 
       c3=getch();

switch ( c3)
 
{
case 'a':
case 'A':modifyh();break;

case 'b':
case 'B':delh();break;

case 'c':
case 'C':delm();break;

}

 }while(c3!='d'&&c3!='D');

 }break;
 

case 'f':
case 'F':  release();break;

}

save();

}while(c!='g'&&c!='G');


save();

 

 

printf("/n/n  ★ 谢谢您的使用!★");

 

}

 

 

 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号