通讯录管理系统

 #include <iostream.h>
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <iomanip.h>
 #define M 100
 
 struct record{
        char name[20];        //姓名 
        int age;              //年龄 
        char tele[15];        //电话号码 
        char city[20];        //所在城市 
        char units[30];       //所在单位
        char note[20];        //备注 
        }; 
        
 //用户自定义函数
 void create();                //建立通讯录文件
 void append();                //输入数据函数
 void display();               //显示通讯录文件函数
 void locate();                //查询通讯录信息主控函数
 void modify();                //修改通讯录信息主控函数
 void dele();                  //删除通讯录主控函数
 void disp_arr(record[],int);               //显示数组函数 
 void disp_row(record);                     //显示一个记录函数
 void disp_table();                         //显示一行表头函数
 void modi_seq(record[],int);               //按序号修改通讯录信息
 void disp_str(char,int);                   //输出n个字符函数
 void sort(record[],int);                  //排序主函数
 void sort_name(record[],int);             //按姓名排序函数
 void sort_city(record[],int); 
 void dele_sequ(record info[],int *n);
void dele_name(record info[],int *n);            //按城市排序
// void dele_name(record[],int *);             //按姓名删除函数
 //void dele_sequ(record[],int *);             //按序号删除函数      
 //  [Linker error] undefined reference to `dele_sequ(record*, int)'       
 
 #include "address.h"
 #include <iostream>
 #include <string>
 #include <iomanip>
using namespace std;
int main()
{
    char choice;
    while(1)
    {
       cout<<endl<<endl;
       disp_str(' ',18);
       cout<<"通讯录管理程序\n";
       disp_str('*',50);
       cout<<endl;
       disp_str(' ',16); //显示空格串
       cout<<"1.通讯录信息输入\n";
       disp_str(' ',16); 
       cout<<"2.显示通讯录信息\n";
       disp_str(' ',16); 
       cout<<"3.通讯录记录查询\n"; 
       disp_str(' ',16); 
       cout<<"4.修改通讯录信息\n";
       disp_str(' ',16); 
       cout<<"5.通讯录信息删除\n";
       disp_str(' ',16);
       cout<<"6.建立通讯录文件\n";
       disp_str(' ',16); 
       cout<<"7.退出通讯录程序\n";
       disp_str('*',50);
       cout<<endl;    //以上代码显示功能菜单
       disp_str(' ',14);
       cout<<"请输入代码选择(1~7)"<<endl;
       disp_str(' ',25);
       cin>>choice;
       
       switch(choice)
       {
             case '1':  append();  break;    //调用通讯录数据输入函数 
             case '2':  display();  break;   //调用通讯录信息主控函数 
             case '3':  locate();  break;    //调用通讯录记录函数 
             case '4':  modify();  break;    //调用通讯录修改函数 
             case '5':  dele();  break;      //调用通讯录删除函数 
             case '6':  create();  break;    //建立通讯录文件 
             case '7':  return 0;              //退出通讯录程序 
             default: continue;              //输入1~7之外,继续循环显示菜单
       }
    }
system("pause"); 
return 0;
}
/*void disp_arr(record info[],int n);
void disp_table();
void disp_row(record row);
void dele_sequ(record info[],int *n);
void dele_name(record info[],int *n);*/
//dis_str()函数代码
void disp_str(char ch, int n)
{
     int i;
     for(i=1; i<=n; i++)
     cout<<ch;
     return;
}
void append()
{
     record info;        //定义通讯录类型的结构体变量 
     FILE * fp;
     char ask;
     if((fp=fopen("address.txl","ab"))==NULL)//打开通讯录
     {
        cout<<"can't open file!\n";
     }
     
while(1)
{                              //输入通讯录信息 
        cout<<endl<<endl; 
        //fflush(stdin);
        cout<<"输入通讯录记录\n";
        cout<<"姓名:"; //输入姓名信息 
        cin>>info.name; 
        cout<<"\n年龄:";//输入年龄信息 
        cin>>info.age;
        cout<<"\n电话:";//输入电话信息 
        cin>>info.tele;
        cout<<"\n所在城市:";//输入居住信息 
        cin>>info.city;
        cout<<"\n所在单位:";//输入单位信息 
        cin>>info.units;
        cout<<"\n备注:";//输入备注信息 
        cin>>info.note;
        fwrite(&info,sizeof(record),1,fp);
        cout<<"\n继续输入记录吗(y/n)?";
        cin>>ask;
        if(ask!='y'&&ask!='Y')
        break;                  //结束本次输入 
}
fclose(fp);  //关闭通讯录文件 
return;      //返回调用函数 
}
//显示函数初始代码
void display()
{
     record info[M];
     FILE *fp;
     char ask;
     int i=0;
     if((fp=fopen("address.txl","rb"))==NULL)
     {
          cout<<"can't open file!\n";
          return;
     }
     
     while(!feof(fp))
     {
           //
           fread(&info[i++],sizeof(record),1,fp);
     }
     
     i-=1;
     
     while(1)
     {
             cout<<endl<<endl;
             disp_str(' ',10);
             cout<<"显示通讯录信息(共有"<<i<<"条记录)\n";
             disp_str('*',50);
             cout<<endl;
             disp_str(' ',17);
             cout<<"1.按自然顺序显示\n";
             disp_str(' ',17);
             cout<<"2.按排列顺序显示\n";
             disp_str(' ',17);
             cout<<"3.退出显示程序\n";
             disp_str('*',50);
             cout<<endl;
             disp_str(' ',16);
             cout<<"请输入代码选择(1~3)\n"; 
             
             cin>>ask;
             if(ask=='3')
             {
                fclose(fp);
                return;
             }
             else if(ask=='1')
             {
                disp_arr(info,i);
             }
             else if(ask=='2')
             {
                sort(info,i);
             }
     }               
     return; 
}
//显示结构体数组通用函数
void disp_arr(record info[],int n)
{
     char press;
     int i;
     for(i=0;i<n;i++)
     {
        if(i%20==0)//每显示20行数据记录后重新显示一下表头
        {
           cout<<endl<<endl;
           disp_str(' ',25);
           cout<<"我的通讯录";
           cout<<endl;
           disp_str('*',78);
           cout<<endl;
           cout<<"序号";
           disp_table();//调用显示表头函数 
        }
        cout<<setw(1)<<(i+1);
        disp_row(info[i]);//调用显示一个数组元素的函数
        if((i+1)%20==0)//满20行则显示下一屏
        {
           disp_str('*',78);
           cout<<endl;
           cout<<"按回车键继续显示下屏,按其他键结束向屏";
           cout<<endl;
           cout<<"请按键......";
           cin>>press;
           if(press!='\n')
              break;
        }
     }
     disp_str('*',78);
     cout<<endl;
     getchar();
     return;
}
//disp_row代码
void disp_row(record row)
{
     cout<<setw(6)<<row.name<<setw(12)<<row.tele
         <<setw(12)<<row.city<<setw(12)<<row.units
         <<setw(12)<<row.age<<setw(10)<<row.note<<endl;
     return;
}
//排序函数源代码
void sort(record info[],int n)
{
     char ask;
     while(1)
     {
          cout<<endl<<endl;
          disp_str(' ',16);
          cout<<"通讯录排序\n";
          disp_str('*',50);
          cout<<endl;
          disp_str(' ',17);
          cout<<"1.按姓名排序\n"; 
          disp_str(' ',17);
          cout<<"2.按城市排序\n";  
          disp_str(' ',17);
          cout<<"3.返回上一层\n";  
          disp_str('*',50);
          cout<<endl; 
          disp_str(' ',16);
          cout<<"请输入号码选择(1~3)";
          cin>>ask;
          if(ask=='3')
          {
             break;
          }
          else if(ask=='1')
          {
               sort_name(info,n);//按姓名排序
          }
          else if(ask=='2')
          {
               sort_city(info,n);//按城市排序
          }
     }
          return;
}      
 
//姓名排序函数
void sort_name(record info[],int n)
{
     int i,j;
     record info_t[M],temp;
     for(i=0; i<n; i++)
     {
        info_t[i]=info[i];//将info数组读到info_t数组中
     }
     for(i=0; i<n; i++){
     for(j=0; j<n-i; j++)
     {
        if(strcmp(info_t[j].name, info_t[j+1].name)>0)//使用字符串比较函数
        {
           temp=info_t[j];
           info_t[j]=info_t[j+1];
           info_t[j+1]=temp;
        } 
     }
     }
     disp_arr(info_t,n);//调用显示函数对已排序数组列表显示 
     return;
     } 
     
//城市排序函数
void sort_city(record info[],int n)
{
     int i,j;
     record info_t[M],temp;
     for(i=0; i<n; i++)
     {
        info_t[i]=info[i];//将info数组读到info_t数组中
     }
     for(i=0; i<n; i++)
     {
       for(j=0; j<n-i; j++)
       {
          if(strcmp(info_t[j].city, info_t[j+1].city)>0)//使用字符串比较函数
          {
              temp=info_t[j];
              info_t[j]=info_t[j+1];
              info_t[j+1]=temp;
          } 
       }
     }
     disp_arr(info_t,n);//调用显示函数对已排序数组列表显示 
     return;
     }              
//显示一行表头函数
void disp_table()
{
     cout<<"姓名";
     disp_str(' ',6); 
     cout<<"电话";
     disp_str(' ',6);
     cout<<"城市";
     disp_str(' ',9);
     cout<<"单位";
     disp_str(' ',8);
     cout<<"年龄";
     disp_str(' ',2);
     cout<<"备注\n";
     return;
     }   
         
//查询函数初始源代码
void locate()
{
     record temp,info[M];
     char ask, name[20],city[20];
     int n=0, i, flag; 
     FILE * fp;
     if((fp=fopen("address.txl","wb"))==NULL)
     {
         cout<<"can't open file!\n";
         return;
     }
     while(fread(&temp,sizeof(record),1,fp)==1)//度通讯录文件 
     {
        info[n++]=temp;
     }
     while(1)
     {
        flag=0;//查找标志,查找成功flag=1
        disp_str(' ',20);
        cout<<endl<<"查找通讯录"<<endl;
        disp_str('*',50);
        cout<<endl;
        disp_str(' ',17);
        cout<<"1.按姓名查询\n";
        disp_str(' ',17);
        cout<<"2.按城市查询\n"; 
        disp_str(' ',17);
        cout<<"3.返回上一层\n";
        disp_str('*',50);
        cout<<endl;
        disp_str(' ',16);
        cout<<"请输入号码选择(1~3)"; 
        cin>>ask;
        if(ask==1)//按姓名查找
        {
             cout<<"请输入要查询的姓名:";
             cin>>name;
             for(i=0; i<n; i++)
             {
                if(strcmp(name, info[i].name)==0) 
                {
                   flag=1;
                   disp_row(info[i]);
                }
             }
             if(!flag)
             cout<<"没有找到符合条件的记录!"<<endl;
             cout<<"按任意键返回......"; 
        }
        else if(ask==2)
        {
             cout<<"请输入要查询的城市:";
             cin>>city;
             for(i=0; i<n; i++)
             {
                if(strcmp(city, info[i].city)==0) 
                {
                   flag=1;
                   disp_row(info[i]);
                }
             }
             if(!flag)
             cout<<"没有找到符合条件的记录!"<<endl;
             cout<<"按任意键返回......"; 
        }
        else if(ask==3)
        {
             fclose(fp);
             return;
        }
     }
     
    // cout<<"locate!\n";
     return; 
}
//修改函数初始源代码
void modify()
{
     char ask;
     record temp,info[M];
     FILE *fp;
     int i=0;
     if((fp=fopen("address.txl","rb"))==NULL)
     {
        cout<<"can't open file!"<<endl;
        return;
     }
     while(fread(&temp, sizeof(record),1,fp)==1)//读通讯录
     {
          info[i++]=temp;
     }
     while(1)
     {
          disp_str(' ',20);
          cout<<"编辑修改通讯录"<<endl;
          disp_str('*',50);
          cout<<endl;
          disp_str(' ',17);
          cout<<"1.浏览显示通讯录"<<endl;  
          disp_str(' ',17);
          cout<<"2.编辑修改通讯录"<<endl; 
          disp_str(' ',17);
          cout<<"3.返回上一层"<<endl; 
          disp_str('*',50);
          cout<<endl;
          disp_str(' ',16);
          cout<<"请输入号码选择(1~3)";
          cin>>ask;
          if(ask=='3')
          {
             break;
          }
          else if(ask=='1')
          {
               disp_arr(info,i);//调用显示数组函数
          }
          else if(ask=='2')
          {
               modi_seq(info,i);//调用按序号编辑修改函数
          }
     }
     fclose(fp);
     fp=fopen("address.txl","wb");
     fwrite(info,sizeof(record),i,fp);//将修改后的数据写回通讯录文件
     fclose(fp);
      
     //cout<<"modify!\n";
     return; 
}
//modi_seq源代码
void modi_seq(record info[],int n)
{
     int sequence;
     char ask;
     while(1)
     {
          cout<<"请输入序号:";
          cin>>sequence;
          if(sequence<1||sequence>n)
          {
             cout<<"序列号超出范围,请重新输入!"<<endl;
             continue;
          }
          cout<<"当前要修改的记录信息:\n";
          disp_table();
          disp_row(info[sequence-1]);
          cout<<"请输入一下信息:\n";
          cout<<"姓名:";
          cin>>info[sequence-1].name;
          cout<<"年龄:";
          cin>>info[sequence-1].age;
          cout<<"电话:";
          cin>>info[sequence-1].tele;
          cout<<"所在城市:";
          cin>>info[sequence-1].city;
          cout<<"所在单位:";
          cin>>info[sequence-1].units;
          cout<<"备注:";
          cin>>info[sequence-1].note;
          cout<<"继续修改请安y键,否则按其他键......";
          cin>>ask;
          if(ask!='y'&&ask!='Y')
             break;
     } 
     return;
}
// 5.删除函数初始源代码
void dele()
{
     record temp,info[M];
     char ask;
     int i=0, length;
     FILE *fp;
     if((fp=fopen("address.txl","rb"))==NULL)
     {
        cout<<"can't open file!"<<endl;
        return;
     }
     while(fread(&temp,sizeof(record),1,fp)==1)//读取通讯录
     {
          info[i++]=temp;
     }
     while(1)
     {
             disp_str(' ',18);
             cout<<"记录的删除\n";
             disp_str('*',50);
             cout<<endl;
             disp_str(' ',17);
             cout<<"1.按姓名删除\n"; 
             disp_str(' ',17);
             cout<<"2.按序号删除\n";
             disp_str(' ',17);
             cout<<"3.返回上一层\n";
             disp_str('*',50);
             cout<<endl;
             disp_str(' ',13);
             cout<<"请输入号码选择(1~3)";
             cin>>ask;
             if(ask=='3')
             {
                break;
             }
             else if(ask=='1')
             {
                  dele_name(info,&i);//调用按姓名删除函数 
             }
             else if(ask=='2')
             {
                  dele_sequ(info,&i);//调用按序号删除函数 
             }
             if(length>i)
             {
                fclose(fp);//关闭文件,准备以新文件的方式打开文件 
                fp=fopen("address.txl","wb");
                fwrite(info,sizeof(record),length-1,fp);
                fclose(fp);
                fp=fopen("address.txl","rb");
             }
     }
     fclose(fp);
     return;
}   
void dele_name(record info[],int *n)
{
     char d_name[20],sure;
     int i;
     cout<<"请输入姓名:";
     cin>>d_name;
     for(i=0; i<*n; i++)
     {
         if(strcmp(info[i].name,d_name)==0)
            break;//找到删除的记录
     }
     if(i!=*n)
     {
        cout<<"要删除的记录如下:\n";
        disp_table();
        disp_row(info[i]);
        cout<<"确定删除---y,否则按其他键......";
        cin>>sure;
        if(sure!='y'&&sure!='Y')
        return;
        for(; i<*n-1; i++)//自删除位置开始,其后记录一次迁移
        info[i]=info[i+1];
        *n=*n-1;
     }
     else
     {
         cout<<"要删除的记录没有找到,请按任意键返回......";
     }
     return;
}
void dele_sequ(record info[],int *n)
{
     char d_sequence;
     int i;
     char sure;
     cout<<"请输入序列号:";
     cin>>d_sequence;
     if(d_sequence<1||d_sequence>*n)
     {
        cout<<"序列号超出范围,按任意键返回......";
     }
     else
     {
         cout<<"要删除的记录如下:\n";
         disp_table();
         disp_row(info[d_sequence-1]);
         cout<<"确定删除---y,否则按任意键......";
         cin>>sure;
         if(sure!='y'&&sure!='Y')
            return;
         for(i=d_sequence-1;i<*n-1;i++)//自删除位置开始,其后记录依次迁移
            info[i]=info[i+1];
            *n=*n-1;//数组总记录减1
     }
     return;
}
//6.建立新文件函数初始代码
void create()
{
     FILE *fp;
     if((fp=fopen("address.txl","wb"))==NULL)
     {
         cout<<"can't open file!\n";
         return;
     }
     fclose(fp);
     cout<<"\n\n文件成功建立,请使用通讯录信息输入功能输入信息!";
     return;
}

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值