⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpp1.cpp

📁 这是一个通信录管理系统
💻 CPP
字号:
//通讯录系统管理源程序

#include"stdio.h"
#include"stdlib.h" 
#include"string.h"
#include"conio.h"
#include"ctype.h"  

//字符操作函数
#define M 50  //最大人数

typedef struct
{
 char name[20];  //姓名
 char units[30];  //单位
 char tele[10];  //电话
}ADDRESS;

//以下是函数原型
int input(ADDRESS t[]);   //输入记录
void list(ADDRESS t[],int n);   //显示记录
void search(ADDRESS t[],int n);   //按姓名查找显示记录
int deleted(ADDRESS t[],int n);    //删除记录
int add(ADDRESS t[],int n);      //插入记录
void save(ADDRESS t[],int n);   //记录保存为文件
int load(ADDRESS t[]);     //从文件中读记录
void display(ADDRESS t[]);     //按序号查找显示记录
void sort(ADDRESS t[],int n);    //按姓名排序
void qseek(ADDRESS t[],int n);    //快速查找记录
void copy();                    //文件复制
void print(ADDRESS temp);       //显示单条记录
int find(ADDRESS t[],int n,char *s);     //查找函数
int menu_select();           //主菜单函数
//主函数开始
void main()
{
 ADDRESS adr[M];
 int length;
 system("cls");
 for(;;)
 {
	 switch(menu_select())
	 {
	     case 0:length=input(adr);break;     //输入记录
      case 1:list(adr,length);break;      //显示全部记录
      case 2:search(adr,length);break;    //查找记录
      case 3:length=deleted(adr,length);break;     //删除记录
      case 4:length=add(adr,length);break;       //插入记录
      case 5:save(adr,length);break;           //保存文件
      case 6:length=load(adr);break;          //读文件
      case 7:display(adr);break;              //按序列号显示记录
      case 8:sort(adr,length);break;          //按姓名排序
      case 9:qseek(adr,length);break;         //快速查找记录
      case 10:copy();break;                 //复制文件
      case 11:exit(0);break;          //如果返回值11则程序结束
	 }
 }
}
//菜单函数,函数返回值为整数,代表所选的菜单项
menu_select()
{
  char s[80];
  int c;
  printf("press any key enter menu......\n");//提示按任意键继续
  getch();//读入任意字符
  system("cls"); //清屏

  printf("*******************************************\n");
  printf("     您好!欢迎使用通讯录管理服务系统!!!    \n");
  printf("******************MENU*********************\n\n");
  printf("     0.Enter record\n");
  printf("     1.List the file\n");
  printf("     2.Search record on name\n");
  printf("     3.Delete a record\n");
  printf("     4.add record\n");
  printf("     5.Save the file\n");
  printf("     6.Load the file\n");
  printf("     7.display record on order\n");
  printf("     8.sort to make new file\n");
  printf("     9.Quick seek record\n");
  printf("     10.copy the file to new\n");
  printf("     11.Quit\n");
  printf("*****************************************\n");
  do
  { printf("\n Enter you choice(0-11):");//提示输入选项
	 scanf("%s",s);//输入选择项
	 c=atoi(s);//将输入的字符串比较转化为整型数
  }while(c<0||c>11);//选择项不在0-11之间重输
  return c;//返回选择项,主程序根据该数调用相应的函数
}
//***输入记录,形参为结构体数组,函数值返回类型为整型,表示记录长度
int input(ADDRESS t[])
{
	int i, n;
	system("cls");//清屏
	system("cls");
	printf("\nplease input num \n");//提示信息
	scanf("%d",&n);//;输入记录数
	printf("please input record \n");//提示输入记录
	printf("name        unit           telephone\n");
	printf("------------------------------------\n");
	for(i=0;i<n;i++)
	{
		scanf("%s%s%s",t[i].name,t[i].units,t[i].tele);
		printf("----------------------------------\n");
	}
	return n;//返回记录数
}
//显示记录,参数为记录数组和记录条数
void list(ADDRESS t[],int n)
{
  int i;
	system("cls");
	printf("\n\n*****************ADDRESS***************\n");
	printf("name            unit             telephone\n");
	printf("-------------------------------------------\n");
	for(i=0;i<n;i++)
	printf("%-20s%-30s%-10s\n",t[i].name,t[i].units,t[i].tele);
    if((i+1)%10==0)    //判断输出是否达到10条记录
 	{
		printf("Press any key continue...\n");   //提示信息
		getch();      //按任意键继续
	}
	printf("********************end************************\n");
}
//查找记录
void search(ADDRESS t[],int n)
{
	char s[20];//保存待查找的姓名字符串
	int i;//保存查找到结点的序号
	system("cls");//清屏
	printf("please search name\n");
	scanf("%s",s);//输入待查找姓名
	i=find(t,n,s);//调用find函数,得到一个整数
	if(i>n-1)//如果整数i值大于n-1,说明没有找到
		printf("not found\n");
	else
		print(t[i]);//找到,调用显示函数显示记录
}
//显示指定的一条记录
void print(ADDRESS temp)
{
	system("cls");
	printf("\n\n**********************************\n");
	printf("name        unit                 telephone\n");
	printf("----------------------------------------\n");
	printf("%-20s%-30s%-10s\n",temp.name,temp.units,temp.tele);
	printf("******************end******************\n");
}
//查找函数,参数为记录数组、记录条数以及姓名s
int find(ADDRESS t[],int n,char *s)
{
	int i;
    for(i=0;i<n;i++)//从第一条记录开始,直到最后一条
	{
	    if(strcmp(s,t[i].name)==0)//记录中的姓名和待比较的姓名是否相等
		return i;//相等,则返回该记录的下标号,程序提前结束
	}
 return i;//返回i值


}
//删除函数,参数为记录数组和记录条数
int deleted(ADDRESS t[],int n)
{
	char s[20];//要删除记录的姓名
    int ch=0;
    int i,j;
    printf("please deleted name\n");//提示信息
    scanf("%s",s);//输入姓名
    
	i=find(t,n,s);//调用find函数
    if(i>n-1)//如果i>n-1超过了数组的长度
       printf("no found not deleted\n");//显示没有找到要删除的记录
    else
	{
	   print(t[i]);//调用输出函数显示该条记录信息
	   printf("Are you sure delete it(1/0)\n");//确认是否要删除
	   scanf("%d",&ch);//输入一个整数0或1
	   if(ch==1)//如果确认删除整数为1
	   {
		 for(j=i+1;j<n;j++)//删除该记录,实际后续记录前移
		 {
			strcpy(t[j-1].name,t[j].name);
			strcpy(t[j-1].units,t[j].units);
			strcpy(t[j-1].tele,t[j].tele);
		 }
		n--;//记录数减1
	   }
	}
    return n;//返回记录数
}
//插入记录函数,参数为结构体数组和记录数
int add(ADDRESS t[],int n)//插入函数,参数为结构体数组和记录数
{
	ADDRESS temp;//插入记录信息
	int i,j ;
	char s[20];//确定插入在哪个记录之前
	printf("plsease input record\n");
	printf("*****************************************\n");
	printf("name        unit           telephone     \n");
    printf("-----------------------------------------\n");
	scanf("%s%s%s",temp.name,temp.units,temp.tele);
	printf("-----------------------------------------\n");
	printf("please input locate name  \n");
	scanf("%s",s);//输入插入位置的姓名
	i=find(t,n,s);//调用find,确定插入位置
	for(j=n-1;j>=i;j--)//从最后一个结点开始向后移动一条
    {
		strcpy(t[j+1].name,t[j].name);
		strcpy(t[j+1].units,t[j].units);
		strcpy(t[j+1].tele,t[j].tele);
	}
	   strcpy(t[i].name,temp.name);//将新插入记录拷贝到第i个位置
	   strcpy(t[i].units,temp.units);
	   strcpy(t[i].tele,temp.tele);
	   n++;//记录数加1
	   return n;//返回记录数
}
//保存函数,参数为结构体数组和记录数
void save(ADDRESS t[],int n)
{
	int i;
	FILE*fp;//指向文件的指针
	if((fp=fopen("record.txt","wb"))==NULL)
	{
		printf("can not open file\n");//不能打开文件
		exit(1);//退出
	}
	printf("\nSaving file\n");//输出提示信息
	fprintf(fp,"%d",n);//将记录数写入文件
	fprintf(fp,"\r\n");//将换行符号写入文件
	for(i=0;i<n;i++)
	{
     fprintf(fp,"%-20s%-30s%-10s",t[i].name,t[i].units,t[i].tele);//格式写入记录
	 fprintf(fp,"\r\n");//将换行符号写入文件
	}
	fclose(fp);//关闭文件
	printf("***save success***********\n");//显示保存成功
}
//读入函数,参数为结构体数组
int load(ADDRESS t[])
{
    int i,n; 
	FILE*fp;//指向文件的指针
	if((fp=fopen("record.txt","rb"))==NULL)//打开文件
	{
		printf("can not open file\n");//不能打开
		exit(1);
	}
	fscanf(fp,"%d",&n);//读入记录数
	for(i=0;i<n;i++)
	fscanf(fp,"%20s%30s%10s",t[i].name,t[i].units,t[i].tele);//按格式读入记录
    fclose(fp);//关闭文件
	printf("You have success read data from file!!!\n");//显示保存成功
	return n;//返回记录数
}
//按序号显示记录函数
void display(ADDRESS t[])
{
	int id,n;
	FILE*fp;//指向文件的指针
    if((fp=fopen("record.txt","rb"))==NULL)
	{
		printf("can not open file\n");
		exit(1);
	}
	printf("Enter order number...\n");//显示信息
	scanf("%d",&id);//输入序号
	fscanf(fp,"%d",&n);//从文件读入记录数
	if(id>=0&&id<n)//判断序号是否在记录范围内
	{
		fseek(fp,(id-1)*sizeof(ADDRESS),1);//移动文件指针到该记录位置
		print(t[id]);// 调用输出函数显示该记录
		printf("\r\n");
	}
	else
		printf("no %d number record!!!\n",id);//如果序号不合理显示的信息
	    fclose(fp);
}
//排序函数,参数为结构体数组和记录数
void sort(ADDRESS t[],int n)
{
	int i,j,flag;
	ADDRESS temp;//临时变量做交换数据用
    for(i=0;i<n;i++)
	{
		flag=0;//设标志,判断是否发生过交换
		for(j=0;j<n-1;j++)
		if(strcmp(t[j].name,t[j+1].name)>0)//比较大小
		{
			flag=1;
			strcpy(temp.name,t[j].name);//交换记录
	    strcpy(temp.units,t[j].units);
		strcpy(temp.tele,t[j].tele);
	    strcpy(t[j].name,t[j+1].name);
	    strcpy(t[j].units,t[j+1].units);
	    strcpy(t[j].tele,t[j+1].tele);
	    strcpy(t[j+1].name,temp.name);
			strcpy(t[j+1].units,temp.units);
	    strcpy(t[j+1].tele,temp.tele);
		}
		if(flag==0)break;//如果标志为0,说明没有发生过交换,循环结束
	}
	printf("sort sucess!!!\n");//显示排序成功
}
//快速查找,参数为结构体数组和记录数
void qseek(ADDRESS t[],int n)
{
	char s[20];
	int l,r,m;
	printf("\nPlease sort before qseek!\n");//提示确认在查找之前,记录是否已排序
    printf("\nPlease enter name for qseek\n");//提示输入
    scanf("%s",s);//输入待查找的姓名
    l=0;r=n-1;//设置左边界与右边界的初值
	while(l<=r)//当左边界<=右边界时
	{
		m=(l+r)/2;//计算中间位置
		if(strcmp(t[m].name,s)==0)//与中间结点的姓名字段进行比较,判断是否相等
		{
			print(t[m]);//如果相等,则调用printf函数显示记录信息
			return;//返回
		}

     if(strcmp(t[m].name,s)<0)//如果中间结点小

	   l=m+1;//修改左边界
	else
			r=m-1;//否则,中间结点大,修改右边界
	}
	if(l>r)//如果左边界大于右边界时
		 printf("not found\n");//显示没找到
}
//复制文件
void copy()
{
	char outfile[20];//目标文件名
	int i,n;
	ADDRESS temp[M];//定义临时变量
	FILE *sfp,*tfp;//定义指向文件的指针
	system("cls");
	if((sfp=fopen("record.txt","rb"))==NULL)//打开记录文件
	{
		printf("can not open file\n");//显示不能打开文件信息
		exit(1);
	}
	printf("Enter outfile name,for example c:\\f1\\te.txt:\n");//提示信息
	scanf("%s",outfile);//输入目标文件名
	if((tfp=fopen(outfile,"wb"))==NULL)//打开目标文件
	{
		printf("can not open file\n");//显示不能打开文件信息
		exit(1);
	}
	fscanf(sfp,"%d",&n);//读出文件记录数
	fprintf(tfp,"%d",n);//写入目标文件数
	fprintf(tfp,"\r\n");//写入换行符
	for(i=0;i<n;i++)
	{
		fscanf(sfp,"%20s%30s%10s\n",temp[i].name,
     temp[i].units,temp[i].tele);//读入记录
		fprintf(tfp,"%-20s%-30s%-10s\n",temp[i].name,
     temp[i].units,temp[i].tele);//写入记录
		fprintf(tfp,"\r\n");//写入换行符
	}
	fclose(sfp);//关闭源文件
	fclose(tfp);//关闭目标文件
	printf("You have success copy file!!!\n");//显示复制
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -