#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;
}
通讯录管理系统
最新推荐文章于 2020-08-27 07:10:00 发布