通讯录管理系统(黑马程序员C++项目)

#include <iostream>
#include <string>
#define MAX 1000
//联系人结构体
struct Person {
	//姓名
	std::string m_Name;
	//性别
	int m_Sex;
	//年龄
	int m_Age;
	//电话号码
	std::string m_Phone;
	//家庭住址
	std::string m_Addr;

};
struct Addressbooks {
	struct Person personArray[MAX];
	//通讯录中当前的联系人个数
	int m_Size ;
};
//通讯录结构体
using namespace std;
//显示菜单
 void showMenu()
{
	cout << "******************************"<<endl;
	cout << "******* 1、添加联系人  *******"<<endl;
	cout << "******* 2、显示联系人  *******" << endl;
	cout << "******* 3、删除联系人  *******" << endl;
	cout << "******* 4、查找联系人  *******" << endl;
	cout << "******* 5、修改联系人  *******" << endl;
	cout << "******* 6、清空联系人  *******" << endl;
	cout << "******* 0、退出通讯录  *******" << endl;
	cout << "******************************" << endl;

}
 void addPerson(Addressbooks *abs)
 {
	 //结构体指针->成员   用来访问结构体成员
	 //结构体实例 .变量   用来访问变量
	 
	 //判断通讯录是否已满 
	 if (abs->m_Size == MAX) {
		 cout << "通讯录已满 无法添加!" << endl;
		 return;
	 }
	 else
	 {
		 //姓名
		 std::string name;
		 cout << "请输入姓名" << endl;
		 cin >> name;
		 abs->personArray[abs->m_Size].m_Name=name;
		 //性别
		 cout << "请输入性别" << endl;
		 cout << "1---男" << endl;
		 cout << "2---女" << endl;
		 int sex = 0;
		 while (true) {
			 cin >> sex;
			 if (sex == 1 || sex == 2) {
				 abs->personArray[abs->m_Size].m_Sex = sex;
				 break;
			 }else
			 cout << "输入有误,请重新输入" << endl;
		 }
		
		 //年龄
		 int m_Age;
		 cout << "请输入年龄" << endl;
		 int age = 0;
		 while (true) {
			 cin >> age;
			 if (age >= 0 && age < 150) {
				 abs->personArray[abs->m_Size].m_Age = age;
				 break;
			 }
			 cout << "年龄有误,请重新输入!" << endl;
		 }
		 //电话号码
		 std::string phone;
		 cout << "请输入手机号码" << endl;
		 cin >> phone;
		 abs->personArray[abs->m_Size].m_Phone = phone;

		 //家庭住址
		 std::string addr;
		 cout << "请输入家庭住址" << endl;
		 cin >> addr;
		 abs->personArray[abs->m_Size].m_Addr = addr;

		 cout << "信息录入成功!" << endl;
		 abs->m_Size++;
		 system("pause");
		 system("cls");
	 }
 }
 //2、显示所有联系人信息
 void showPerson(Addressbooks* abs)
 {
	 if (abs->m_Size == 0)
	 {
		 cout << "当前记录为空" << endl;
	 }
	 else
	 {
		 for (int i = 0; i < abs->m_Size; i++)
		 {
			 cout << "姓名:" << abs->personArray[i].m_Name << "\t";
			 cout << "性别:" << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";
			 cout << "年龄:" << abs->personArray[i].m_Age << "\t";
			 cout << "电话:" << abs->personArray[i].m_Phone << "\t";
			 cout << "住址:" << abs->personArray[i].m_Addr << endl;
		 }
	 }

	 system("pause");
	 system("cls");

 }

 //判断是否存在查询的人员,存在返回在数组中索引位置,不存在返回-1
 int isExist(Addressbooks* abs, string name)
 {
	 for (int i = 0; i < abs->m_Size; i++)
	 {
		 if (abs->personArray[i].m_Name == name)
		 {
			 return i;
		 }
	 }
	 return -1;
 }

//3、删除指定联系人
void deletePerson(Addressbooks * abs){
	cout<<"请输入您要删除的联系人"<<endl;
	string name;
	cin>>name;
	//ret==-1 查无此人
	//ret!=-1 查到了
	int ret = isExist(abs,name);
	if(ret!=-1){
		//查找到了人 要进行删除操作了
		for(int i=ret;i<abs->m_Size;i++){
			//数据前移
			abs->personArray[i]=abs->personArray[i+1];
		}
		abs->m_Size--;//更新通讯录中成员数
		cout<<"删除成功"<<endl;
		
	}else{
		cout<<"查无此人"<<endl;
	}
	//清屏操作
	system("pause");
	system("cls");
}

//4、查找联系人
void searchPerson(Addressbooks *abs)
{
	string name;
	cout<<"请输入您要查找的人:\n";
	cin>>name;
	if(isExist(abs,name)==-1)cout<<"查无此人"<<endl;
	else 
	{
		cout<<"您要查询的人是\n";
		int i=isExist(abs,name);
		cout << "姓名:" << abs->personArray[i].m_Name << "\t";
		cout << "性别:" << (abs->personArray[i].m_Sex == 1 ? "男" : "女") << "\t";
		cout << "年龄:" << abs->personArray[i].m_Age << "\t";
		cout << "电话:" << abs->personArray[i].m_Phone << "\t";
		cout << "住址:" << abs->personArray[i].m_Addr << endl;
	}
	//清屏操作
	system("pause");
	system("cls");
}
//5、修改指定联系人信息
void modifyPerson(Addressbooks * abs){
	cout<<"请输入您要修改的联系人:"<<endl;
	string name;
	cin>>name;
	int ret=isExist(abs,name);
	//未找到
	if(ret==-1){
		cout<<"查无此人!"<<endl;
	}//找到指定联系人
	else{
		//姓名
		string name;
		cout<<"请输入姓名:"<<endl;
		cin>>name;
		abs->personArray[ret].m_Name=name;
		//性别
		int gender=0;
		cout<<"请输入性别:"<<endl;
		cout<<"1 --- 男 2 ---女"<<endl;
		while(true){
		cin>>gender;
			if(gender==1||gender==2){
				abs->personArray[ret].m_Sex=gender;
				break;
			}else{
				cout<<"输入错误 请重新输入!"<<endl;
				cout<<"请输入性别:"<<endl;
				cout<<"1 --- 男 2 ---女"<<endl;
			}
		}
		//年龄
		int age;
		cout<<"请输入年龄:"<<endl;
		cin>>age;
		abs->personArray[ret].m_Age=age;
		//电话
		string phone;
		cout<<"请输入电话:"<<endl;
		cin>>phone;
		abs->personArray[ret].m_Phone=phone;
		//住址
		string place;
		cout<<"请输入住址:"<<endl;
		cin>>place;
		abs->personArray[ret].m_Addr=place;
		
		cout<<"修改成功!"<<endl;
	}
	system("pause");
	system("cls");
}
//6、清空联系人
void cleanPerson(Addressbooks* abs){
	abs->m_Size=0;
	cout<<"通讯录已清空!"<<endl;
	system("pause");
	system("cls");
}
int main()
{
	int select=0;
	Addressbooks abs;
	abs.m_Size = 0;
	while (true)
	{
		//初始化通讯录中当前成员个数
		
		showMenu();
		cin >> select;
		switch (select)
		{
		case 1://1、添加联系人
			addPerson(&abs);//利用地址传递
			break;
		case 2://2、显示联系人
			showPerson(&abs);
			break;
		case 3://3、删除联系人
			deletePerson(&abs);
			
			break;
		case 4://4、查找联系人
				searchPerson(&abs);
			break;
		case 5://5、修改联系人
			modifyPerson(&abs);
			break;
		case 6://6、清空联系人
			cleanPerson(&abs);
			break;
		case 0://0、退出通讯录
			cout << "欢迎下次使用……" << endl;
			system("pause");
			return 0;
			break;
		default:
			cout << "请输入正确的选项" << endl;
		}
	}
	system("pause");
	return 0;
}

 

 

<think> 我们正在查找在Linux系统中使用JavaOFD文件换为PDF文件的方法。根据提供的引用,我们有一些相关的信息: 引用[1]提到了OFD图片的功能,并指出OFD图片可以避免复杂的解析操作,方便在浏览器和app中显示。但用户的需求是OFDPDF,而非图片。不过,我们可以借鉴其中的思路:将OFD换为一种中间格式(例如图片)然后再换为PDF,但这可能不是最直接的方法。 引用[2]是关于Java代码实现WordPDF的,其中提到了在Linux环境下处理字体的问题。这对于处理文档换中的字体问题有参考价值,因为OFDPDF同样可能涉及字体嵌入问题。 用户之前的问题是关于OFDPDF的,而我们的目标是在Linux下用Java实现。 由于没有直接给出OFDPDFJava库,我们可以考虑以下方案: 1. **使用现有库**:寻找支持OFDPDFJava库。目前,开源的OFD处理库有OFD Reader & Writer(https://github.com/Trisia/ofdrw),但它主要提供OFD的读写,并不直接支持PDF。不过,我们可以利用它读取OFD内容,然后使用PDF库(如iText、Apache PDFBox)生成PDF。 2. **中间换(OFD→图片→PDF)**:先将OFD换为图片,再将图片合并为PDF。这种方法在引用[1]中提到了OFD图片的必要性,我们可以用同样的思路。但需要注意,这样换得到的PDF是图片形式的,文字不可选择。 3. **命令行工具**:在Linux系统中安装第三方命令行工具(如LibreOffice)进行换,但需要确认是否支持OFD格式(目前LibreOffice不支持OFD)。或者,使用专门的OFD换工具(如国产的一些商用软件),但可能没有Linux版本。 4. **调用Web服务**:如果本地换困难,可以考虑调用提供OFDPDF服务的Web API,但依赖网络且可能涉及安全隐私问题。 考虑到用户要求使用Java,我们优先考虑方案1和方案2。 ### 方案1: 使用ofdrw库和PDFBox生成文字可选的PDF ofdrw库可以解析OFD文档,我们可以获取页面中的文字、图形和图像,然后用PDFBox重新绘制成PDF。这样生成的PDF可以保留文字信息。 步骤: 1. 使用ofdrw解析OFD文件,获取每一页的内容(文字、图片、图形等)。 2. 使用PDFBox创建一个新PDF文档,并遍历每一页的内容。 3. 将文字、图形等绘制到PDF页面中。 优点:换后的PDF文字可选。 缺点:实现复杂,需要处理各种元素的绘制,且可能无法100%还原原文档(尤其是复杂布局)。 ### 方案2: OFD图片,再将图片PDF(简单但文字不可选) 步骤: 1. 使用OFD库(如ofdrw)将每一页换为图片(BufferedImage)。 2. 使用PDFBox将多张图片合并成一个PDF文件(每张图片一页)。 优点:实现简单,能保证视觉上一致。 缺点:生成的PDF是图片,文字不可选择,且文件体积较大。 ### 具体实现示例(方案2) #### 步骤1:添加依赖 Maven依赖: ```xml <dependencies> <!-- ofdrw 用于读取OFD --> <dependency> <groupId>org.ofdrw</groupId> <artifactId>ofdrw-full</artifactId> <version>2.0.9</version> </dependency> <!-- PDFBox 用于生成PDF --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.27</version> </dependency> </dependencies> ``` #### 步骤2:Java代码 ```java import org.ofdrw.converter.ConvertHelper; import org.ofdrw.converter.FontLoader; import org.ofdrw.reader.OFDReader; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; public class OFD2PDF { public static void main(String[] args) { // 设置字体,避免中文乱码(参考引用[2]中关于字体的处理) // 加载系统字体,特别是中文字体 // 注意:在Linux系统中,需要确保中文字体已安装(如通过yum install安装) FontLoader.getInstance() .scanFontDir(new File("/usr/share/fonts")); // 设置字体目录 Path ofdPath = Paths.get("input.ofd"); Path pdfPath = Paths.get("output.pdf"); try (OFDReader reader = new OFDReader(ofdPath)) { // 将OFD每一页转为BufferedImage List<BufferedImage> images = ConvertHelper.toImage(reader, 300); // 300 DPI // 创建PDF文档 try (PDDocument doc = new PDDocument()) { for (BufferedImage image : images) { // 创建一页,大小与图片一致 PDPage page = new PDPage(new PDRectangle(image.getWidth(), image.getHeight())); doc.addPage(page); // 将图片绘制到PDF页面 PDImageXObject pdImage = LosslessFactory.createFromImage(doc, image); try (PDPageContentStream contents = new PDPageContentStream(doc, page)) { contents.drawImage(pdImage, 0, 0, image.getWidth(), image.getHeight()); } } doc.save(pdfPath.toFile()); } System.out.println("PDF生成成功:" + pdfPath); } catch (IOException e) { e.printStackTrace(); } } } ``` #### Linux系统注意事项 1. **字体安装**:在Linux系统中,需要安装中文字体,否则换时中文可能显示为方框。可以参考引用[2]中的步骤: ```bash yum install -y fontconfig mkfontscale mkfontdir fc-cache ``` 并将Windows中的字体(C:\Windows\Fonts)复制到Linux的`/usr/share/fonts`目录下。 2. **依赖库**:确保Java环境(JDK8+)已安装。 ### 方案1的挑战 如果希望生成文字可选的PDF,需要利用ofdrw解析出文本和图形,然后使用PDFBox的API在PDF中绘制文本和图形。这需要详细了解ofdrw的API和PDFBox的绘制API,实现起来较为复杂。目前ofdrw并没有直接提供PDF的功能。 ### 结论 在Linux系统下,使用JavaOFD换为PDF,推荐采用方案2(先将OFD转为图片,再将图片转为PDF)。这种方法实现简单,但缺点是生成的PDF是图片形式,文字不可选。如果对文字可选有要求,则需要开发更复杂的换程序(方案1),或者寻找其他商业库。 另外,可以关注OFD换相关的开源项目进展,未来可能会有直接换的库。 ### 相关问题 1. 如何提高OFDPDF换质量(特别是保留文字信息)? 2. 在Java中处理OFD文件还有哪些开源库? 3. 如何优化OFD图片的分辨率以平衡清晰度和文件大小? </think> ### Linux系统下使用Java实现OFDPDF的方法 在Linux系统中使用Java完成OFDPDF换,可以通过两种主要技术路径实现: #### 方案1:OFD→图像→PDF(推荐方案) 这是最成熟的实现方式,利用现有开源库分步换: ```java // 添加Maven依赖 <dependency> <groupId>org.ofdrw</groupId> <artifactId>ofdrw-converter</artifactId> <version>2.0.9</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.27</version> </dependency> // 换核心代码 import org.ofdrw.converter.ConvertHelper; import org.apache.pdfbox.pdmodel.PDDocument; public class OfdToPdfConverter { public static void convert(String ofdPath, String pdfPath) throws Exception { // OFD → 图像序列 List<BufferedImage> images = ConvertHelper.toImage(new File(ofdPath), 300); try (PDDocument doc = new PDDocument()) { for (BufferedImage image : images) { PDPage page = new PDPage(new PDRectangle(image.getWidth(), image.getHeight())); doc.addPage(page); try (PDPageContentStream contentStream = new PDPageContentStream(doc, page)) { PDImageXObject pdImage = LosslessFactory.createFromImage(doc, image); contentStream.drawImage(pdImage, 0, 0); } } doc.save(pdfPath); // 输出PDF文件 } } } ``` #### 方案2:直接格式转换(实验性方案) ```java // 使用通用文档换库 <dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>fr.opensagres.poi.xwpf.converter.pdf</artifactId> <version>2.0.4</version> </dependency> public static void directConvert(String input, String output) { FileFormatRegistry registry = FileFormatRegistry.getInstance(); IConverter converter = registry.getConverter(FileFormat.OFD, FileFormat.PDF); converter.convert(new FileInputStream(input), new FileOutputStream(output)); } ``` ### 关键注意事项 1. **字体处理**(解决中文乱码): ```bash # Linux系统字体配置 sudo mkdir -p /usr/share/fonts/custom sudo cp Windows/Fonts/sim*.ttf /usr/share/fonts/custom # 复制中文字体 sudo fc-cache -fv ``` 在Java代码中初始化: ```java FontSettings.setFontsFolder("/usr/share/fonts/custom", true); ``` 2. **环境依赖**: ```bash # 安装基础库 sudo apt install -y libfreetype6 libfontconfig ``` 3. **性能优化建议**: - 设置合适的分辨率(150-300 DPI) - 使用线程池处理批量换 - 启用缓存机制:`ConvertHelper.setCacheEnabled(true)` ### 方案对比 | 特性 | 图像中方案 | 直接换方案 | |--------------------|--------------------|-------------------| | 换质量 | ★★★★★ (矢量保真) | ★★★☆☆ (依赖解析器) | | 中文支持 | 完善 | 需额外配置 | | 执行效率 | 中等 | 较快 | | 实现复杂度 | 简单 | 复杂 | | 推荐指数 | ✅ 首选方案 | ️ 备选方案 | > **重要提示**:由于OFD格式的复杂性,商用环境建议配合专业换器如[永中Office换引擎](https://www.yozosoft.com),可通过JNI集成到Java应用中[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值