通讯录(带保存功能)

#pragma once
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<string>

#define NAME_MAX 10
#define SEX_MAX 2
#define TELNUM_MAX 11
#define DATE_MAX   100
#define AGE_MAX    10
using namespace std;

typedef struct Messenge {               //用于存放个人信息 
	char name[NAME_MAX];
	char sex[SEX_MAX];
	char a;                          /*无用的,主要是发现在输出sex和age是,
	两个数据容易交叉在一起,怀疑是分配内存是两块的地址连一次了,哪位大神懂的话指出下*/
	char age[AGE_MAX];
	char tel[TELNUM_MAX];
}Messenge;
typedef struct book {                  //定义一个通讯录
	Messenge date[DATE_MAX];
	int num;
}book;

void push_date(book *b);
void delete_date(book *b, string name);
int locat_date(book *b, string name);
void change_date(book *b, string name);
void traverse_book(book *b);
int choice1();
int choice2();
void Read_file(book *b);
void Save_file(book *b);

void push_date(book *b) {           //往通讯录中添加新成员
	string name;
	cout << "请输入名字:";
	cin >> b->date[b->num].name;
	cout << "请输入性别:";
	scanf("%s", b->date[b->num].sex);
	cout << "请输入年龄:";
	scanf("%s", &b->date[b->num].age);
	cout << "请输入号码:";
	scanf("%s", b->date[b->num].tel);
	b->num++;
}

int locat_date(book *b, string name) {          //查询成员,并返回地址
	Messenge *p;
	int pos = 0;
	p = b->date;
	while ((!operator==(p->name, name))&&pos<b->num) { ++p; ++pos; }
	if (operator==(p->name, name))   return pos+1;
	else return 0;
}

void delete_date(book *b, string name) {      //删除成员
	int pos = locat_date(b, name);
	if (pos == 0)  cout << "在通讯录里找不到此人!" << endl;
	else {
		int i = 0;
		int p = pos;
		while (i < (b->num - pos)) {
			b->date[p - 1] = b->date[p];
			++p;
			++i;
		}
		--b->num;
	}
}

void change_date(book *b, string name) {      //修改数据
	int pos = locat_date(b, name);
	if (pos == 0)  cout << "在通讯录里找不到此人!" << endl;
	else {
		while (1) {
			int choice = choice1();
			switch (choice) {
			case 0:return;
			case 1: {
				cout << "输入更改数据:";
				cin >> b->date[pos-1].name;
				cout << "修改成功" << endl;
			}break;
			case 2: {
				cout << "输入更改数据:";
				cin >> b->date[pos-1].sex;
				cout << "修改成功" << endl;
			}break;
			case 3: {
				cout << "输入更改数据:";
				cin >> b->date[pos - 1].age;
				cout << "修改成功" << endl;
			}break;
			case 4: {
				cout << "输入更改数据:";
				cin >> b->date[pos-1].tel;
				cout << "修改成功" << endl;
			}break;
			default:return;
			}
		}
	}
}

void traverse_book(book *b) {            //遍历通讯录
	if (!b->num) cout << "这是一个空的通讯录" << endl;
	else {
		int i = 0;
		while (i < b->num) {
			cout << "---------------" << endl;
			cout << "姓名:" << b->date[i].name << endl;
			cout << "性别:" << b->date[i].sex << endl;
			cout << "年龄:" << b->date[i].age << endl;
			cout << "号码:" << b->date[i].tel << endl;
			++i;
		}
	}
}

int choice1(){                    //修改要修改的信息
	int choice;
	cout << "---------------------------" << endl;
	cout << "请输入你需要修改的数据:" << endl;
	cout << "0.退出" << endl;
	cout << "1.改名字" << endl;
	cout << "2.改性别" << endl;
	cout << "3.改年龄" << endl;
	cout << "4.改号码" << endl;
	cout << "---------------------------" << endl;
	cout << "您的选择:";
	cin >> choice;
	return choice;
}

int choice2() {                  //选择对通讯录进行的操作
	int choice;
	cout << "---------------------------" << endl;
	cout << "请输入你需要对通讯录进行的操作:" << endl;
	cout << "0.退出" << endl;
	cout << "1.插入" << endl;
	cout << "2.查找" << endl;
	cout << "3.修改" << endl;
	cout << "4.删除" << endl;
	cout << "5.显示整个通讯录" << endl;
	cout << "---------------------------" << endl;
	cout << "您的选择:";
	cin >> choice;
	return choice;
}

void Read_file(book *b) {                  //读取存储在文件里面的信息
	char line[1024];
	int len;
	FILE *f;
	f = fopen("你好.txt", "r");
	int i = 0;
	int j = 0;
	while (fgets(line,1024,f)) {
		len = strlen(line);
		line[len - 1] = 0;
		if (i == 0)    strcpy(b->date[j].name, line);
		else if (i == 1)  strcpy(b->date[j].sex, line);
		else if (i == 2)  strcpy(b->date[j].age, line);
		else if (i == 3) strcpy(b->date[j].tel, line);
		++i;
		if (!(i % 4)) { ++b->num, ++j; }
		i = i % 4;
	}
	fclose(f);
}

void Save_file(book *b) {              //保持信息
	FILE *f;
	f = fopen("你好.txt", "w");
	int i = 0;
	while (i < b->num) {
		fputs(b->date[i].name, f);
		fputs("\n", f);
		fputs(b->date[i].sex, f);
		fputs("\n", f);
		fputs(b->date[i].age, f);
		fputs("\n", f);
		fputs(b->date[i].tel, f);
		if(i!=b->num)fputs("\n", f);
		++i;
	}
	fclose(f);
}

void test() {                       //测试
	book *b;
	if(!(b = (book *)malloc(sizeof(book)))) cout << "初始化失败" <<endl;
	b->num = 0;
	Read_file(b);
	while (1) {
		int choice = choice2();
		switch (choice) {
		case 0:{
			Save_file(b);
			return;
		}
		case 1: {
			push_date(b);
			cout << "成功" << endl;
		}break;
		case 2: {
			int pos;
			char name[NAME_MAX];
			cout << "请输入你要查找人的名字:";
			cin >> name;
			pos=locat_date( b, name);
			cout << "---------------" << endl;
			cout << "姓名:" << b->date[pos-1].name << endl;
			cout << "性别:" << b->date[pos-1].sex << endl;
			cout << "年龄:" << b->date[pos-1].age << endl;
			cout << "号码:" << b->date[pos-1].tel << endl;
		}break;
		case 3: {
			char name[NAME_MAX];
			cout << "请输入你要修改人的名字:";
			cin >> name;
			change_date(b, name);
			cout << "修改成功" << endl;
		}break;
		case 4: {
			char name[NAME_MAX];
			cout << "请输入你要删除人的名字:";
			cin >> name;
			delete_date(b,name);
		}break;
		case 5: {
			traverse_book(b);
		}break;
		}
	}
}


#include"numbook.h"

void main() {
    test();
    system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值