C:电话簿(动态增长+本地存储)

  • 因为之前版本的电话簿简易电话簿(大小固定)是设定好容量的,如果联系人满了,就不得不删除旧的添加新的,所以这次的电话簿采用了动态增长的方式,可以在添加联系人的时候检测是否已经满了,如果满了再扩增一定的空间,并且还可以将这些信息保存在本地文档中每次运行时进行读写;
  • 在整体结构上并没有太大改动,只是增加了三个函数以及改变了结构体内存的开辟方式
1.CheckFull()

这个函数是每次添加联系人时,检测联系人是否已经满了,如果满了就使用realloc函数进行扩容:这里为了节省空间。每次扩容1个联系人的空间:

void CheckFull(PhoneBook* PhoneBook)
{
	if (PhoneBook->Size == PhoneBook->Capacity)
	{
		printf("联系人已达上限:%d/%d!\n",PhoneBook->Size, PhoneBook->Capacity);
		PersonInfr*tmp=(PersonInfr*)realloc(PhoneBook->Book,sizeof(PersonInfr)*(PhoneBook->Capacity+1));
		if (tmp != NULL)
		{
			PhoneBook->Book = tmp;
			PhoneBook->Capacity = PhoneBook->Capacity + 1;
			printf("扩容成功!\n");
		}
		else
		{
			printf("扩容失败!\n");
			exit(1);
		}
	}
}
Load()

这里是每次程序运行时,加载储存在本地txt文档里的联系人信息,如果没有找到这个文档,就在当前目录下创建一个txt记事本:

void Load(PhoneBook* data)
{
	FILE* fp = fopen("../PhoneBook.txt", "r");
	PersonInfr temp = { 0 };
	printf("加载联系人的信息中\n");
	if (fp == NULL)
	{
		printf("文件打开失败!\n");
	}
	if (fread(&temp, sizeof(PersonInfr), 1, fp))
	{
		CheckFull(data);
		data->Book[data->Size] = temp;
		data->Size++;
	}
	fclose(fp);
	printf("数据读取成功,加载了%d条信息\n",data->Size);
}
Save()

这个函数是在程序即将结束前,将修改变动的联系人信息的操作,储存在本地文档中:

void Save(PhoneBook* data)
{
	FILE* fp = fopen("../PhoneBook.txt", "w");
	if (fp == NULL)
	{
		printf("文件打开失败!\n");
	}
	else
	{
		for (int i = 0; i < data->Size; i++)
		{
			fwrite(&data->Book[i], sizeof(PersonInfr), 1, fp);
		}
	}
	fclose(fp);
	printf("保存成功\n");
}

以下是整体代码:

  1. Contact.h
#ifndef  __CONTACT_H__
#define __CONTACT_H__

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

#define  NAMELONGTH 1024
#define  TELELONGTH     1024
//#define  BOOKSIZE         200
#define  DEFAULTCAY     1

typedef struct PersonInfr//每个人需要存储姓名和电话
{
	char name[NAMELONGTH];
	char tele[TELELONGTH];
}PersonInfr;

typedef struct PhoneBook//一个电话本至少需要200个联系人
{
	PersonInfr * Book ;  //test
	unsigned int Size;
	unsigned int Capacity;
}PhoneBook;

typedef void(*fun)(PhoneBook*);


int menu();
void Load();
void Save();
void PrintAll(PhoneBook* PhoneBook);
void CleanAll(PhoneBook* PhoneBook);
void InitBook(PhoneBook* PhoneBook);
void AddContact(PhoneBook* PhoneBook);
void FindContact(PhoneBook* PhoneBook);
void SortbyName(PhoneBook* PhoneBook);
void DeletContact(PhoneBook* PhoneBook);
void ChangeContact(PhoneBook* PhoneBook);


#endif
  1. Contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"

int menu()
{
	int input = 0;
	printf("\n");
	printf("***1,增加联系人***\n");
	printf("***2,删除联系人***\n");
	printf("***3,修改联系人***\n");
	printf("***4,查找联系人***\n");
	printf("***5,打印全部人***\n");
	printf("***6,按姓名排序***\n");
	printf("***7,清空联系人***\n");
	printf("***0,退出**********\n\n");
	while (1)
	{
		printf("请输入你的选择\n");
		scanf("%d", &input);
		if (input < 8 && input >= 0)
			return input;
		else
			printf("出入非法,重新输入!\n");
	}
}

void InitBook(PhoneBook* PhoneBook)
{
	PhoneBook->Size = 0;
	PhoneBook->Book= (PersonInfr *)malloc(sizeof(PersonInfr)* DEFAULTCAY);
	PhoneBook->Capacity = DEFAULTCAY;
}

void CheckFull(PhoneBook* PhoneBook)
{
	if (PhoneBook->Size == PhoneBook->Capacity)
	{
		printf("联系人已达上限:%d/%d!\n",PhoneBook->Size, PhoneBook->Capacity);
		PersonInfr*tmp=(PersonInfr*)realloc(PhoneBook->Book,sizeof(PersonInfr)*(PhoneBook->Capacity+1));
		if (tmp != NULL)
		{
			PhoneBook->Book = tmp;
			PhoneBook->Capacity = PhoneBook->Capacity + 1;
			printf("扩容成功!\n");
		}
		else
		{
			printf("扩容失败!\n");
			exit(1);
		}
	}
}

static int FindTarget(PhoneBook* PhoneBook, char*target)
{
	for (int i = 0; i < PhoneBook->Size; i++)
	{
		if (!(strcmp(PhoneBook->Book[i].name, target)))
		{
			return i;
		}
	}
	return -1;
}

void AddContact( PhoneBook* PhoneBook)
{
    CheckFull(PhoneBook);
	printf("请输入你要添加的联系人\n");
	printf("姓名:\n");
	scanf("%s", PhoneBook->Book[PhoneBook->Size].name);
	printf("电话:\n");
	scanf("%s", PhoneBook->Book[PhoneBook->Size].tele);
	PhoneBook->Size++;
}

void DeletContact(PhoneBook* PhoneBook)
{
	char target[NAMELONGTH] = { 0 };
	printf("请输入你要删除的联系人\n");
	printf("姓名:\n");
	scanf("%s", &target);
	int FindResult = FindTarget(PhoneBook, target);
	if (FindResult != -1)
	{
		printf("删除成功!");
		for (int i = FindResult; i < PhoneBook->Size; i++)
		{
			if (i < (PhoneBook->Size - 1))
			{
				PhoneBook->Book[i] = PhoneBook->Book[i + 1];
			}
		}
		PhoneBook->Size--;
	}
	else
	{
		printf("你输入的名字我找不到==\n");
	}
}

void ChangeContact(PhoneBook* PhoneBook)
{
	char target[NAMELONGTH] = { 0 };
	int choice = 0;
	printf("请输入你要修改的联系人\n");
	printf("姓名:\n");
	scanf("%s", &target);
	int FindResult = FindTarget(PhoneBook, target);
	if (FindResult != -1)
	{
		printf("1.重命名 2.修改联系方式\n");
		scanf("%d", &choice);
		if (choice == 2)
		{
			printf("修改电话:\n");
			scanf("%s", PhoneBook->Book[FindResult].tele);
		}
		else if (choice == 1)
		{
			printf("重命名:\n");
			scanf("%s", PhoneBook->Book[FindResult].name);
		}
		else
		{
			printf("非法输入!\n");
		}
	}
	else
	{
		printf("你输入的名字我找不到==\n");
	}
}

void FindContact(PhoneBook* PhoneBook)
{
	char target[NAMELONGTH] = { 0 };
	printf("请输入你要查找的联系人\n");
	printf("姓名:\n");
	scanf("%s", &target);
	int FindResult = FindTarget(PhoneBook, target);
	if (FindResult != -1)
	{
		printf("%s:", PhoneBook->Book[FindResult].name);
		printf("%s\n", PhoneBook->Book[FindResult].tele);
	}
	else
	{
		printf("你输入的名字我找不到==\n");
	}
}

void PrintAll(PhoneBook* PhoneBook)
{
	for (int i = 0; i < PhoneBook->Size; i++)
	{
		printf("%s:",PhoneBook->Book[i].name);
		printf("%s\n",PhoneBook->Book[i].tele);
	}
}

void SortbyName(PhoneBook* PhoneBook)//快速排序,按从小到大,可英文&中文;
{
	PersonInfr temp;
	for (int i = 1; i < PhoneBook->Size; i++)
	{
		temp=PhoneBook->Book[i];
		int j = i - 1;
		while (j >= 0 && (strcmp(PhoneBook->Book[j].name, temp.name)>0))
		{
			PhoneBook->Book[j + 1] = PhoneBook->Book[j];
			j--;
		}
		PhoneBook->Book[j+1] = temp;
	}
	printf("排序成功!\n");
}

void CleanAll(PhoneBook* PhoneBook)
{
	int del = 0;
	printf("确定要删除全部联系人吗?0,是   1,否\n");
	scanf("%d", &del);
	if (!del)
	{
		PhoneBook->Size = 0;
		printf("电话簿已清空!\n");
	}
}

void Save(PhoneBook* data)
{
	FILE* fp = fopen("../PhoneBook.txt", "w");
	if (fp == NULL)
	{
		printf("文件打开失败!\n");
	}
	else
	{
		for (int i = 0; i < data->Size; i++)
		{
			fwrite(&data->Book[i], sizeof(PersonInfr), 1, fp);
		}
	}
	fclose(fp);
	printf("保存成功\n");
}

void Load(PhoneBook* data)
{
	FILE* fp = fopen("../PhoneBook.txt", "r");
	PersonInfr temp = { 0 };
	printf("加载联系人的信息中\n");
	if (fp == NULL)
	{
		printf("文件打开失败!\n");
	}
	if (fread(&temp, sizeof(PersonInfr), 1, fp))
	{
		CheckFull(data);
		data->Book[data->Size] = temp;
		data->Size++;
	}
	fclose(fp);
	printf("数据读取成功,加载了%d条信息\n",data->Size);
}

3.main.c

//实现一个电话本,使得,增加,删除,修改,查找,打印全部,按姓名排序,清空所有记录
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"

int main()
{
	printf("%s","通话录:\n");
	PhoneBook FirstBook;
	InitBook(&FirstBook);
	Load(&FirstBook);
	fun ChooseFun[10] = { AddContact,DeletContact,ChangeContact,FindContact,PrintAll,SortbyName,CleanAll};
	int choice = 0;
	do
	{
		choice = menu();
		if (choice)
		{
			ChooseFun[choice - 1](&FirstBook);
			printf("\n");
			ChooseFun[4](&FirstBook);
		}
	} while (choice);
	Save(&FirstBook);
	free(FirstBook.Book);
	system("pause");
	return 0;
}

import java.awt.BorderLayout; import java.awt.Button; import java.awt.Color; import java.awt.GridLayout; import java.awt.Label; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JOptionPane; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class Address extends JFrame { private String name; private String Phone_Number; private String address; private String id; private String habit; public static void main(String[] args) { Address a = new Address(); } public Address() { setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); BorderLayout b = new BorderLayout(); setTitle(" Address"); setSize(700, 700); add(new Button("Choose Your Information"), BorderLayout.NORTH); add(new Button(" <<= "), BorderLayout.WEST); JPanel p = new JPanel(); p.setBackground(Color.RED); this.add(p,BorderLayout.CENTER); p.setLayout(new GridLayout(3, 1, 10, 10)); for (int i = 0; i < 1; i++) { JButton x=new JButton("Information 1"); JButton y=new JButton("Information 2"); JButton z=new JButton("Information 3"); p.add(x); p.add(y); p.add(z); x.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String str1 =name; String str2 =Phone_Number; String str3 =address; String str4 =id; String str5 =habit; JOptionPane.showMessageDialog(x, "Your Name is:"+str1+" Your Phone_Number is:"+str2+" Your address is:"+str3+" Your id is:"+str4+" Your habit is:"+str5); } }); y.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String str1 =name; String str2 =Phone_Number; String str3 =address; String str4 =id; String str5 =habit; JOptionPane.showMessageDialog(y, "Your Name is:"+str1+" Your Phone_Number is:"+str2+" Your address is:"+str3+" Your id is:"+str4+" Your habit is
最新发布
05-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值