学生通讯录 课程设计

通讯录管理

需求分析:

改程序具有一个菜单,便于用户完成如下操作:

A. 向文件中增加记录;

B  显示文件中所有记录;

C  修改任意一个记录;

D 按照姓名查找一个同学的记录

E 删除某个同学的记录;


编写代码如下:

//*********************************************************************************************
// 建立一个学生通讯录管理系统
// 主要功能包括:能建立、修改和增删学生通讯录,能够按多种方式进行查询。
//*********************************************************************************************

#include <iostream>
#include <winsock2.h>
#include <fstream>
#include <conio.h>
#include <cstdlib>
#include <string>
using namespace std;
const char filename[]="address.dat";    // 存储同学通讯录的文件
struct addresslist
{
	char name[21];      //存储姓名
	char address[51];   //存储地址
	char phone[14];     //存储电话
	char email[51];     //存储电子邮箱
	int  age;           //存储年龄
}
    //函数声明
bool openfile(fstream & );   //打开同学录文件
int menu();                  //显示主菜单
void add(fstream & );        //添加记录信息
void modify(fstream & );     //修改记录信息
void del(fstream & );        //删除记录信息
void find(fstream & );       //查找记录信息
void display(fstream & );    //显示记录信息
int findrecord(fstream &,const char*);  // 按姓名查找一条记录
int getamount(fstream & );   //获取记录数量
int main()                   
{
	bool exit=false           //判断用户是否想退出程序
	fstream listfile          //流对象

	lsitfile.open(filename,ios::in|ios::out|ios::binary|ios::trunc);
	if (listfile.fail())      //无法打开文件
	{
		cout<<"打开文件错误,无法打开文件!"<<endl;
		exit(1);
	}
	while(!exit)
	{
		switch(menu())
		{
		case 1:
			add(listfile);
			break;
		case 2:
			modify(listfile);
			break;
		case 3:
			del(listfile);
			break;
		case 4:
			find(listfile);
			break;
		case 5:
			display(listfile);
			break;
		case 6:
			exit=true;
			break;
		}
	}
	listfile.close();
	return 0;
}
    //打开通讯录文件
    //返回值:如果文件打开成功则返回值为true,否则返回false。

bool openfile(fstream &listfile)
{
	listfile.open(filename,ios::in|ios::out|ios::binary);
	if (listfile.fail())
		return false;
	else
		return true;
}
     //显示主菜单函数,返回用户的选项

int menu()
{
	int selection=0;        //存储用户选项
	while(true)             //检验用户的输入是否正确
	{
		cout<<"[1]增减记录"<<endl;
		cout<<"[2]修改记录"<<endl;
		cout<<"[3]删除记录"<<endl;
		cout<<"[4]查找记录"<<endl;
		cout<<"[5]显示记录"<<endl;
		cout<<"[6]退出程序"<<endl;
		cout<<"请选择:";
		selection=getche()-'0'
		if (selection>=1&&selection<=6)
			break;
		esle
			cout<<"输入选项错误!请重新输入";
	}
		return(selection);
}
      //添加记录信息

void add(fstream &listfile)
{
	addresslist temp        //临时存储记录信息
	cout<<"\n 姓名:";
	while(true)
	{
		cin.getline(temp.name,21,'\n');
		if (strlen(temp.name)==0)
			cout<<"您还没输入姓名!请输入姓名:";
		else
			break;
	}
	cout<<"年龄:";
	while(true)
	{
		cin>>temp.age;
		cin.ignore();
		if(temp.age>=0 && temp.age<=200)
			break;
		else
			cout<<"数据输入错误 请重新输入:";
	}
	cout<<"地址:";
	cin.getline(temp.address,51,'\n');
	cout<<"电话:";
	cin.getline(temp.phone,21,'\n');
	cout<<"电子邮箱:";
	cin.getline(temp.email,51,'\n');
	listfile.seekp(0l,ios::end);
	listfile.write((char*)&temp,sizeof(addresslist));
	listfile.flush();
	cout<<"添加成功!\n 按任意键继续 ...\n";
	getch();
}
    //修改记录

void modify(fstream &listfile)
{
	bool isexit=false;       //判断用户是否想返回主菜单
	char modifyname[21]={'\0'};   //存储用户用户输入的姓名
	cout<<"\n请输入要修改的同学的姓名;";
	cin.getline(modifyname,21,'\n');
	int pos=findrecord(listfile,modifyname);
	if(-1==pos)
		cout<<"对不起,没有"<<modifyname<<"的信息!"endl;
	else
	{
		addresslist temp;          //临时存储记录信息
		listfile.seekg((long)(sizeof(addresslist)*pos),ios::beg);
		listfile.read((char*)&temp,sizeof(addresslist));
		while(!isexit)
		{
			int selection=0;
			cout<<endl;
			cout<<"[1]姓名"<<endl;
			cout<<"[2]年龄"<<endl;
			cout<<"[3]地址"<<endl;
			cout<<"[4]电话"<<endl;
			cout<<"[5]电子邮箱"<<endl;
			cout<<"[6]返回"<<endl;
			cout<<"\n请输入要修改的选项:";
			while(true)
			{
				selection=getche()-48;
				if (selection)>=1 && selection<=6)
					break;
				else
					cout<<"输入选项有误!请重新输入:";
			}
			cout<<endl;
			switch(selection)
			{
			case 1:
				cout<<"原姓名:"<<temp.name<<endl;
				cout<<"新姓名:";
				while(true)
				{
					cin.getline(temp.name,21,'\n');
					if (strlen(temp.name)==0)
						cout<<"您还没输入姓名!请输入姓名";
					else
					break;
				}
				cout<<"修改成功!"<<endl;
				break;

			case 2:
				cout<<"原年龄:"<<temp.age<<endl;
				cout<<"新年龄:";
				while(true)
				{
					cin>>temp.age;
					cin.ignore();
					if (temp.age>=0 && temp.age<=200)
						break;
					else
						cout<<"数据输入错误!请重新输入:";
				}
				cout<<"修改成功!"<<endl;
				break;
			

				
			case 3:
				cout<<"原地址:"<<temp.address<<endl;
				cout<<"新地址:";
				cin.getline(temp.address,51,'\n');
				cout<<"修改成功!"<<endl;
				break;

			case 4:
				cout<<"原电话:"<<temp.phone<<endl;
				cout<<"新电话:";
				cin.getline(temp.phone,14,'\n');
				cout<<"修改成功!"<<endl;
				break;
			case 5:
				cout<<"原电子邮箱:"<<temp.email<<endl;
				cout<<"新电子邮箱:";
				cin.getline(temp.email,51,'\n');
				cout<<"修改成功!"<<endl;
				break;
			case 6:
				isexit=true;
				break;
			}
		}
		listfile.seekg((long)(sizeof(addresslist)*pos),ios::beg);
		listfile.write((char*)&temp,sizeof(addresslist));
		listfile.flush();
	}
	cout<<endl;
}
      //删除记录信息
void del(fstream & listfile)
{
	char delname[21]={'\0'};                 //存储用户输入的姓名

	while(true)
	{
		cout<<"\n请输入要删除的同学的姓名:";
		cin.getline(delname,21,'\n');
		if(strlen(delname)==0)
			cout<<"您未输入姓名!"<<endl;
		else
			break;
	}
	int pos=findrecord(listfile,delname);
	if (-1==pos)
		cout<<"对不起,没有"<<delname<<"的信息!"<<endl;
	else
	{
		char selection;                      //存储用户选项
		cout<<"真的要删除吗?(Y/N):";
		while(true)
		{
			selection=toupper(getch());
			cout<<selection<<endl;
			if(selection=='Y'||selection=='N')
				break;
			esle
				cout<<"请选择 Y 或 N !并重新输入:";
		}
		if(selection=='Y')
		{
			int amount=getamount(listfile)-1;   //存储记录数量
			addresslist temp;                   //临时存储记录信息
			addresslist*list;
			if((ist=new addresslist[amount])==NULL)
			   exit(0);
			//从文件中读入除用户希望删除的记录以外的所有记录
			//然后将读入的记录全部重新写入文件中
			listfile.seekg(0l,ios::beg);
			listfile.read((char*)temp,sizeof(addresslist));
			for (int i=0;!listfile.eof();i++)   //读入记录信息
			{
				if(strcmp(delname,temp.name)==0)
					i--;
				else
					list[i]=temp;
				listfile.read((char*)&temp,sizeof(addresslist));
			}
			listfile.close();                  //关闭当前文件
			listfile.open(filename,ios::out);  //重新打开当前文件,删除原来内容
			listfile.clear();
			if (!listfile)
			{
				cout<<"can not open file for delete!"<<endl;
				exit(0);
			}
			listfile.close();                  //关闭文件,此时原来的文件内容已经删除
			            //再次按照原来的方式打开文件进行操作
			listfile.open(filename,ios::in|ios::out|ios::binary|ios::trunc);
			if(!listfile)
			{
				cout<<"can not open file for write record"<<endl;
				exit(0);
			}
			for(int i=0;i<amount;i++)          //将不删除的写入文件
				listfile.write((char*)&list[i],sizeof(addrseelist));
			    listfile.flush();
			cout<<"删除成功!"<<endl;
			delete []list;
		} else
			cout<<"未删除!"<<endl;
	}             //end of else
	cout<<"\n按任意键继续...\n";
	getch();
}
           //查找记录信息
void find(fstream & listfile)
{
	char findname[21]={'\0'};                  //存储用户输入的姓名
	{
		cout<<"\n请输入要查找的同学姓名:";
		cin.getline(findname,21,'\n');
		if(strlen(findname)==0)
			cout<<"您未输入姓名!"<<endl;
		else
			break;
	}
	int pos=findrecord(listfile,findname);
	if(-1==pos)
		cout<<"对不起,没有"<<findname<<"的信息!"<<endl;
	else
	{
		addresslist temp;          //临时存储记录信息
		listfile.seekg((long)(sizeof(addresslist)*pos),ios::beg);
		listfile.read((char*)&temp,sizeof(addresslist));
		cout<<"姓名:"<<temp.name<<endl;
		cout<<"年龄:"<<temp.age<<endl;
		cout<<"地址:"<<temp.address<<endl;
		cout<<"电话:"<<temp.phone<<endl;
		cout<<"电子信箱:"<<temp.email<<endl;
	}
	cout<<"\n按任意键继续...\n";
	getch();
}
              //显示记录信息
void display (fstream &listfile)
{
	addresslist temp               //临时存储读入的记录信息
	listfile.clear();
	listfile.seekg(0l,ios::beg);
	listfile.read((char*)temp,sizeof(addresslist));
	cout<<endl;
	if (listfile.eof())
		cout<<"文件中还没有信息!"<<endl;
	else
	{
		while(!listfile.eof())
		{
			cout<<"姓名:"<<temp.name<<endl;
			cout<<"年龄:"<<temp.age<<endl;
			cout<<"地址:"<<temp.address<<endl;
			cout<<"电话:"<<temp.phone<<endl;
			cout<<"电子信箱:"<<temp.email<<endl;
			cout<<endl;
			listfile.read((char*)temp,sizeof(addresslist));
		}
	}
	listfile.clear();
	cout<<"\n按任意键继续...\n";
	getch();
}
//按姓名查找一条记录。如果找到与用户提供的姓名相同的记录
//则返回该记录在文件中的下标位置,否则返回-1

int findrecord (fstream &listfile,const char *pname)
{
	int pos=-1;                    //存储当前记录的下标位置
	addresslist temp               //临时存储读入的记录信息

		listfile.seekg(0l,ios::beg);
	    listfile.read((char*)&temp,sizeof(addresslist));
		while(!listfile.eof())
		{
			pos++;
			if(strcmp(temp.name,pname)==0)
				return (pos);
			listfile.read((char*)temp,sizeof(addresslist));
		}
		listfile.clear();
		return(-1);
}
//返回文件中记录的数量
int getamount(fstream &listfile)
{
	int amount=0;                  //存储记录的数量
	addresslist temp;              //临时存储读入的记录信息
	listfile.seekg(0l,ios::beg);
	listfile.read((char*)&temp,sizeof(addresslist));
	while(!listfile.eof())
	{
		amount++;
		listfile.read((char*)&temp,sizeof(addresslist));
	}
	listfile clear();
	return amount;
}


 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值