#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");
}
通讯录(带保存功能)
最新推荐文章于 2023-01-14 02:34:42 发布