通讯录------文件存取

设计内容
1、通讯录是一个简易的管理软件,管理所有联系人的通讯纪录(电话,e-mail)。
2、使用文件存取
1)、使用文件存储通讯录
2)、可以不保存新输入的纪录,但需要确认是否保存输入纪录
3)、如果已经有文件,只能在其后追加
3、联系人的分组管理
可以把联系人分为以下几组:亲戚,同学,朋友,工作,普通,其他等类型,存储联系人通讯纪录时需选择适当的分组。
4、通讯录的显示
1)、系统开启后默认显示所有联系人的通讯录
2)、可以按组显示该组内所有联系人的通讯纪录
3)、可以查询某人的通讯录,如无此人则提示“没有此人”

#include <iostream>
#include<stdio.h>
#include<fstream>
#include<sstream>
#include<iomanip>
using namespace std;
//#define MAX 100;
struct node {
	char Name[10];
	char Telephone[20];
	char Email[20];
	char Type[20];
};
class People {
private:
	struct node info[100];
	int m_number;
public:
	void initial();//初始化数组
	int interface();//界面
	void add();//添加
	void search();//查找
	void sort_search();//分组查找
	void dele();//删除
	void change();//修改
	void display();//显示输出
	void save_info();//信息保存
	static int count;//总人数
};
int People::count = 0;
void People::initial()
{
	string line;
	ifstream file;//输入流
	int i = 0;
	file.open("D:\\zly.txt");
	if (!file)
	{
		cout << "文件打开失败" << endl;
	}
	while (getline(file, line))//按行读取数据
	{
		istringstream ss;//字符串流
		ss.str(line);//把按行读取的数据传到字符串流中
		//分隔文件中每一行的数据
	    ss >> info[i].Name;
		ss >> info[i].Telephone;
		ss >> info[i].Email;
		ss >> info[i].Type;
		//
		i++;
	}
	count = i;
}
void People::save_info()
{
	ofstream fs; //输出流
	fs.open("D:\\zly.txt");
	if (!fs)//if(!is_open())
	{
		cout << "文件打开失败" << endl;
		system("pause");
		return;
	}
	for (int i = 0; i<count; i++)//向文件中存入数据
	{
		fs  << info[i].Name << setw(20)
			<< info[i].Telephone << setw(20)
			<< info[i].Email << setw(20)
			<< info[i].Type << endl;
	}
	fs.close();
}

int People::interface()
{
	int number = 0;;
	cout << "              *+=================================================+*" << endl;
	cout << "              *|                                                 |*" << endl;
	cout << "              *|                多功能电子通讯录                 |*" << endl;
	cout << "              *|                                                 |*" << endl;
	cout << "              *|                                                 |*" << endl;
	cout << "              *|                                                 |*" << endl;
	cout << "              *|-------------------------------------------------|*" << endl;
	cout << "              *|      1.添加联系人信息       2.查询联系人信息    |*" << endl;
	cout << "              *|-------------------------------------------------|*" << endl;
	cout << "              *|      3.删除联系人信息       4.修改联系人信息    |*" << endl;
	cout << "              *|-------------------------------------------------|*" << endl;
	cout << "              *|      5.显示所有联系人信息   6.显示分组联系人信息|*" << endl;
	cout << "              *|-------------------------------------------------|*" << endl;
	cout << "              *|                    7.退出                       |*" << endl;
	cout << "              *|-------------------------------------------------|*" << endl;
	cout << "              *+=================================================+*" << endl;
	cout << "                                                     " << endl;
	cout << "请选择你要实现的功能:" << endl;
	cin >> number;
	if (number == 1 || number == 2 || number == 3 || number == 4 || number == 5 || number == 6 || number == 7)
	{
		m_number = number;
		return m_number;
	}
}

void People::add()
{
	char ch = 0;
	int  flag = 0;

	if (count >= 100)
	{
		cout << "通讯录存储已满。" << endl;
	}
	else
	{
		while (1)
		{
			flag = 0;
			cout << "请输入联系人的信息:" << endl;
			cout << "姓名:";
			cin >> info[count].Name;
			cout << "电话:";
			cin >> info[count].Telephone;
			cout << "Email:";
			cin >> info[count].Email;
			cout << "类型:";
			cin >> info[count].Type;
			count++;
			cout << "添加成功。" << endl;
			cout << "是否继续添加联系人? y/n:" << endl;
			cin >> ch;
			while (ch != 'n' && ch != 'y')
			{
				cout << "输入错误!请重新输入 y/n:" << endl;
				cin >> ch;
			}
			if (ch == 'n')
			{
				break;
			}
		}
	}
}

void People::search()
{
	while (1)
	{
		char name[20];
		int i = 0;
		char ch = 0;
		int flag = 0;
		cout << "通过姓名查找:" << endl;
		cin >> name;

		for (i = 0; i < count; i++)
		{
			if (strcmp(name, info[i].Name) == 0)
			{
				flag = 1;
				cout << "姓名:" << info[i].Name << endl;
				cout << "电话:" << info[i].Telephone << endl;
				cout << "Email:" << info[i].Email << endl;
				cout << "类型:" << info[i].Type << endl;
				cout << "***************************************" << endl;
			}
		}
		if (flag == 0)
		{
			cout << "查无此人!" << endl;
		}
		cout << "是否继续? y/n:" << endl;
		getchar();
		cin >> ch;
		while (ch != 'n' && ch != 'y')
		{
			while (getchar() != '\n');
			cout << "输入错误!请重新输入 y/n:" << endl;
			cin >> ch;
		}
		if (ch == 'n')
		{
			break;
		}
	}
}
void People::sort_search()
{
	while (1)
	{
		char type[20];
		int i = 0;
		char ch = 0;
		int flag = 0;
		cout << "请输入需要查找联系人的类别是" << endl;
		cin >> type;

		for (i = 0; i < count; i++)
		{
			if (strcmp(type, info[i].Type) == 0)
			{
				flag = 1;
				cout << "姓名:" << info[i].Name << endl;
				cout << "电话:" << info[i].Telephone << endl;
				cout << "Email:" << info[i].Email << endl;
				cout << "类型:" << info[i].Type << endl;
				cout << "***************************************" << endl;
			}
		}
		if (flag == 0)
		{
			cout << "暂无该类型的联系人!" << endl;
		}
		cout << "是否继续? y/n:" << endl;
		getchar();
		cin >> ch;
		while (ch != 'n' && ch != 'y')
		{
			while (getchar() != '\n');
			cout << "输入错误!请重新输入 y/n:" << endl;
			cin >> ch;
		}
		if (ch == 'n')
		{
			break;
		}
	}
}
void People::dele()
{
	char name[20] = { 0 };
	int i = 0;
	int j = 0;
	int num = 0;
	char ch = 0;
	int name_count[20] = { 0 };
	int number = 0;                           //删除的联系人的编号

	while (1)
	{
		num = 0;

		cout << "请输入要删除的联系人的姓名:" << endl;
		cin >> name;
		for (i = 0; i < count; i++)
		{
			if (strcmp(name, info[i].Name) == 0)
			{
				name_count[num] = i;//记录每一个要删除人的编号
				num++;
			}
		}
		if (num == 0)
		{
			cout << "查无此人!" << endl;
		}
		else
		{
			for (i = 0; i < num; i++)
			{
				cout << "编号:" << i << endl;
				cout << "姓名:" << info[name_count[i]].Name << endl;
				cout << "电话:" << info[name_count[i]].Telephone << endl;
				cout << "Email:" << info[name_count[i]].Email << endl;
				cout << "类型:" << info[name_count[i]].Type << endl;
				cout << "***************************************" << endl;
			}
			cout << "请输入你要删除联系人信息的编号" << endl;
			cin >> number;
			while (number < 0 || number >= num)
			{
				while (getchar() != '\n');
				cout << "输入错误! 请重新输入!" << endl;
				cin >> number;
			}

			while (name_count[number] < count)//把后面的联系人全部往前挪一个位置,覆盖掉被删除的人的信息
			{
				strcpy(info[name_count[number]].Name, info[name_count[number] + 1].Name);
				strcpy(info[name_count[number]].Telephone, info[name_count[number] + 1].Telephone);
				strcpy(info[name_count[number]].Email, info[name_count[number] + 1].Email);
				strcpy(info[name_count[number]].Type, info[name_count[number] + 1].Type);
				name_count[number]++;
			}

			count--;
			cout << "删除成功!" << endl;
		}
		cout << "是否继续? y/n:" << endl;
		getchar();
		cin >> ch;
		while (ch != 'n' && ch != 'y')
		{
			while (getchar() != '\n');
			cout << "输入错误!请重新输入 y/n:" << endl;
			cin >> ch;
		}
		if (ch == 'n')
		{
			break;
		}
	}
}

void People::change()
{
	char name[20] = { 0 };
	int i = 0;
	int j = 0;
	char ch = 0;
	int num = 0;                               // 用来确定删除的人的次序
	int name_count[10] = { 0 };

	while (1)
	{
		j = 0;
		cout << "请输入你要修改联系人的姓名:" << endl;
		cin >> name;
		for (i = 0; i < count; i++)
		{
			if (strcmp(info[i].Name, name) == 0) //判断同名人数
			{
				name_count[j] = i;
				j++;
			}
		}
		if (j == 0)                             //查无此人
		{
			cout << "查无此人!" << endl;
		}
		else if (j == 1)                        //名字唯一,直接修改 
		{
			cout << "修改的信息:" << endl;
			cout << "姓名: ";
			cin >> info[name_count[j - 1]].Name;
			cout << "电话 : ";
			cin >> info[name_count[j - 1]].Telephone;
			cout << "Email : ";
			cin >> info[name_count[j - 1]].Email;
			cout << "类型 : ";
			cin >> info[name_count[j - 1]].Type;
			cout << "修改成功!" << endl;
		}
		else                                    //有同名时,显示全部同名人的信息
		{
			cout << "有 " << j << " 个同名" << endl;
			for (i = 0; i < j; i++)
			{
				cout << "编号:" << i << endl;
				cout << "姓名:" << info[name_count[i]].Name << endl;
				cout << "电话:" << info[name_count[i]].Telephone << endl;
				cout << "Email:" << info[name_count[i]].Email << endl;
				cout << "类型:" << info[name_count[i]].Type << endl;
				cout << "***************************************" << endl;
			}
			cout << "请输入你要修改联系人的编号:" << endl;
			ch = getchar();
			cin >> num;
			while (num < 0 || num >= j)
			{
				while (getchar() != '\n');
				cout << "输入错误! 请重新输入:" << endl;
				cin >> num;
			}
			cout << "请输入修改后联系人的所有信息:" << endl;
			cout << "姓名: ";
			cin >> info[name_count[num]].Name;
			cout << "电话 : ";
			cin >> info[name_count[num]].Telephone;
			cout << "Email : ";
			cin >> info[name_count[num]].Email;
			cout << "备注 : ";
			cin >> info[name_count[num]].Type;
			cout << "修改成功!" << endl;
		}
		cout << "是否继续? y/n:" << endl;
		getchar();
		cin >> ch;
		while (ch != 'n' && ch != 'y')
		{
			while (getchar() != '\n');
			cout << "输入错误!请重新输入 y/n:" << endl;
			cin >> ch;
		}
		if (ch == 'n')
		{
			break;
		}
	}
}
void People::display()
{
	while (1)
	{
		int i = 0;
		char ch = 0;
		for (i = 0; i < count; i++)
		{
			cout << "姓名:" << info[i].Name << endl;
			cout << "电话:" << info[i].Telephone << endl;
			cout << "Email:" << info[i].Email << endl;
			cout << "备注:" << info[i].Type << endl;
			cout << "***************************************" << endl;
		}

		while (ch != 'q')
		{
			cout << "请输入 'q' 退出!" << endl;
			//ch = getchar();
			cin >> ch;
		}
		break;
	}
}
int main()
{
	People peo;
	int number = 0;
	char ch = 0;
	peo.initial();//初始化,读取文件中的数据到数组中
	while (1)
	{
		system("cls");
		number = peo.interface();
		system("cls");//清屏
		switch (number)
		{
		case 1:    //添加
		{
			peo.add();
			cout << "是否保存到文本文件?y/n:" << endl;
			getchar();
			cin >> ch;
			while (ch != 'n' && ch != 'y')
			{
				getchar();
				cout << "输入错误!请重新输入 y/n:" << endl;
				cin >> ch;
			}
			if (ch = 'y')
			{
				peo.save_info();
				cout << "保存成功!" << endl;
			}
			break;
		}
		case 2:    //查看
		{
			peo.search();
			break;
		}
		case 3:    //删除  
		{
			peo.dele();
			cout << "是否保存到文本文件?y/n:" << endl;
			getchar();
			cin >> ch;
			while (ch != 'n' && ch != 'y')
			{
				getchar();
				cout << "输入错误!请重新输入 y/n:" << endl;
				cin >> ch;
			}
			if (ch = 'y')
			{
				peo.save_info();
				cout << "保存成功!" << endl;
			}
			break;
			break;
		}
		case 4:    //修改
		{
			peo.change();
			cout << "是否保存到文本文件?y/n:" << endl;
			getchar();
			cin >> ch;
			while (ch != 'n' && ch != 'y')
			{
				getchar();
				cout << "输入错误!请重新输入 y/n:" << endl;
				cin >> ch;
			}
			if (ch = 'y')
			{
				peo.save_info();
				cout << "保存成功!" << endl;
			}
			break;
			break;
		}
		case 5:
		{
			peo.display();
			break;
		}
		case 6:
		{
			peo.sort_search();
			break;
		}
		case 7:    //退出
		{
			cout << "退出成功!\n" << endl;
			exit(0);
		}
		default:
		{
			printf("Please input right number!\n");
			ch = getchar();
			printf("Please input any key to continue.\n");
			ch = getchar();
			break;
		}
		}
	}
	return 0;
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要安装Flask框架和pandas库(用于文件读写)。 可以使用以下命令安装: ``` pip install flask pandas ``` 接下来,创建一个名为`app.py`的Python文件,并在其中编写以下代码: ```python from flask import Flask, render_template, request import pandas as pd app = Flask(__name__) # 通讯录文件路径 FILE_PATH = 'contacts.csv' # 读取通讯录文件 contacts_df = pd.read_csv(FILE_PATH) # 定义通讯录字段 FIELDS = ['学号', '姓名', '手机号', '电子邮箱'] @app.route('/') def index(): # 渲染主页模板 return render_template('index.html') @app.route('/add', methods=['POST']) def add(): # 获取表单数据 data = request.form.to_dict() # 添加数据到通讯录DataFrame contacts_df.loc[len(contacts_df)] = [data[field] for field in FIELDS] # 保存通讯录文件 contacts_df.to_csv(FILE_PATH, index=False) # 返回成功提示 return '添加成功!' @app.route('/search', methods=['POST']) def search(): # 获取表单数据 keyword = request.form.get('keyword') # 在通讯录DataFrame中查找包含关键字的行 results_df = contacts_df[contacts_df.apply(lambda row: keyword in row.to_string(), axis=1)] # 渲染搜索结果模板 return render_template('results.html', results=results_df.to_dict('records')) if __name__ == '__main__': app.run() ``` 代码中定义了以下几个路由: - `/`:渲染主页模板; - `/add`:处理添加数据的请求; - `/search`:处理搜索数据的请求。 其中,`add`和`search`路由都使用了POST方法,以便从表单中获取数据。 在`add`路由中,获取表单数据后,将数据添加到通讯录DataFrame中,并将DataFrame保存到文件中。 在`search`路由中,获取表单数据后,使用`apply`方法在通讯录DataFrame中查找包含关键字的行,并将结果渲染到结果模板中。 接下来,创建一个名为`index.html`的模板文件,并在其中编写以下代码: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>通讯录</title> </head> <body> <h1>通讯录</h1> <form action="/add" method="post"> {% for field in FIELDS %} <div> <label>{{ field }}:</label> <input type="text" name="{{ field }}"> </div> {% endfor %} <button type="submit">添加</button> </form> <br> <form action="/search" method="post"> <div> <label>关键字:</label> <input type="text" name="keyword"> </div> <button type="submit">搜索</button> </form> </body> </html> ``` 模板文件中定义了一个包含所有字段的表单,以便添加数据,另外还定义了一个用于搜索数据的表单。 最后,创建一个名为`results.html`的模板文件,并在其中编写以下代码: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>搜索结果</title> </head> <body> <h1>搜索结果</h1> {% if results %} <table> <thead> <tr> {% for field in FIELDS %} <th>{{ field }}</th> {% endfor %} </tr> </thead> <tbody> {% for result in results %} <tr> {% for field in FIELDS %} <td>{{ result[field] }}</td> {% endfor %} </tr> {% endfor %} </tbody> </table> {% else %} <p>未找到相关记录。</p> {% endif %} </body> </html> ``` 模板文件中定义了一个表格,用于显示搜索结果。如果没有找到相关记录,则显示一条提示消息。 现在,启动Flask应用程序,并在Web浏览器中访问`http://localhost:5000/`,即可使用Web版通讯录,实现添加、存储和查找功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值