C++通讯录管理系统
目录
系统需求
1、 创建项目
2、 菜单功能设计
3、 退出功能设计
4、 添加联系人功能设计
4.1 设计联系人结构体
4.2 设计通讯录结构体
4.3 在main函数中创建通讯录
4.4 封装添加联系人函数
4.5 添加联系人功能测试
5、 显示联系人功能设计
5.1 封装显示联系人函数
5.2 测试显示联系人功能
6、 删除联系人功能设计
6.1 封装检测联系人
6.2 联系人删除功能测试
7、 查找联系人功能设计
7.1 封装查找联系人函数
7.2 查找联系人功能测试
8、 修改联系人功能设计
8.1 封装修改联系人函数
8.2 修改联系人功能测试
9、 清空联系人
9.1 封装清空联系人函数
9.2 清空联系人功能测试
小结
系统需求
系统中需要实现的功能如下:
添加联系人:向通讯录中添加新人,信息包括(姓名、性别,年龄、联系电话、家庭住址)最多记录1000人
显示联系人:显示通讯录中所有联系人信息
删除联系人:按照姓名进行删除指定联系人
查找联系人:按照姓名查看指定联系人信息
修改联系人:按照姓名重新修改指定联系人
清空联系人:清空通讯录中所有信息
退出通讯录:退出当前使用的通讯录
1、 创建项目
创建一个“通信录管理系统.cpp”的项目文件,如下:
2、 菜单功能设计
封装函数显示菜单界面,如:void showMenu();
在main函数中调用封装好的函数
showMenu.h文件
#include<iostream>
using namespace std;void showMenu();
showMenu.cpp文件
#include"showMenu.h"//菜单界面
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;
}
运行结果:
3、 退出功能设计
功能描述:退出通讯录系统
通过switch语句进行菜单模式的选择,本步骤只完成退出功能的设计。
通过while()循环语句,进行菜单操作,只有当输入0时,执行退出操作。
main函数部分代码:
//创建用户输入的变量int select = 0;while (true){//菜单showMenu();cin >> select;switch (select){//添加联系人case 1:break;//显示联系人case 2:break;//删除联系人case 3:break;//查找联系人case 4:break;//修改联系人 case 5:break;//清空联系人case 6:break;//退出当前使用的通讯录case 0:cout << "欢迎下次使用" << endl;system("pause");return 0;break;}}
此时运行结果:
4、 添加联系人功能设计
功能描述:向通讯录中添加新人,信息包括(姓名、性别,年龄、联系电话、家庭住址)最多记录1000人
4.1 设计联系人结构体
//设计联系人结构体
struct Person
{//姓名string m_Name;//性别 1男 2女int m_Sex;//年龄int m_Age;//电话string m_Phone;//住址string m_Addr;
};
4.2 设计通讯录结构体
//设计通讯录结构体
struct Addressbooks
{//通讯录中保存的联系人struct Person personArray[MAX];//通讯录当前记录联系人个数int m_Size;
};
4.3 在main函数中创建通讯录
//添加联系人case 1:addPerson(&abs);
//创建通讯录的结构体变量Addressbooks abs;
//初始化通讯录当前人员个数abs.m_Size = 0;
//创建用户输入的变量int select = 0;
4.4 封装添加联系人函数
addPerson.cpp:
#include"addPerson.h"void addPerson(Addressbooks* abs)
{if (abs->m_Size == MAX){cout << "通讯录已满,无法添加!" << endl;return;}else{//姓名string name;cout << "请输入姓名:" << endl;cin >> name;abs->personArray[abs->m_Size].m_Name = name;//性别 1男 2女cout << "请输入性别:" << endl;cout << "1---男" << endl;cout << "2---女" << endl;int sex = 0;while (true){//当输入1或者2退出循环//如果输入错误,重新输入cin >> sex;if (sex == 1 || sex == 2){abs->personArray[abs->m_Size].m_Sex = sex;break;}cout << "输入有误,请重新输入" << endl;}//年龄cout << "请输入年龄" << endl;int age = 0;cin >> age;abs->personArray[abs->m_Size].m_Age = age;//电话cout << "请输入联系电话" << endl;string phone = "";cin >> phone;abs->personArray[abs->m_Size].m_Phone = phone;//住址cout << "请输入家庭住址" << endl;string address;cin >> address;abs->personArray[abs->m_Size].m_Addr = address;//更新通讯录的人数abs->m_Size++;cout << "该联系人添加成功" << endl;}
}
addPerson.h:
#include<iostream>
using namespace std;
#include<string>
#include<stdlib.h>
#define MAX 1000//设计联系人结构体
struct Person
{//姓名string m_Name;//性别 1男 2女int m_Sex;//年龄int m_Age;//电话string m_Phone;//住址string m_Addr;
};//设计通讯录结构体
struct Addressbooks
{//通讯录中保存的联系人struct Person personArray[MAX];//通讯录当前记录联系人个数int m_Size;
};void addPerson(Addressbooks* abs);
4.5 添加联系人功能测试
运行结果:
5、 显示联系人功能设计
功能描述:显示通讯录中已有联系人信息
5.1 封装显示联系人函数
判断当前通讯录中有无添加联系人,若联系人未0,则提醒添加联系人,若不为零,则显示通讯录的信息。
main函数部分代码:
//显示联系人case 2:showPerson(&abs);break;
addPerson.h中添加的代码:
void showPerson(Addressbooks* abs);
showPerson.cpp:
#include"addPerson.h"void showPerson(Addressbooks* abs)
{//判断通讯录人数是否为0,如果为0,提示记录为空//如果不为0,显示记录的联系人信息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");//清屏
}
5.2 测试显示联系人功能
运行结果:
6、 删除联系人功能设计
功能描述:按照姓名进行删除指定联系人
6.1 封装检测联系人
在进行联系人删除前,我们应当先检测到所要删除的联系人是否存在,若存在则删除,不存在提示用户没有要删除的联系人。
main函数部分代码:
//删除联系人 case 3:deletePerson(&abs);break;
addPerson.h中添加的代码:
void deletePerson(Addressbooks* abs);
deletePerson.cpp:
#include"addPerson.h"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;//如果遍历结束都没有找到。返回-1
}void deletePerson(Addressbooks* abs)
{cout << "请输入您要删除的联系人" << endl;string name;cin >> name;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");
}
6.2 联系人删除功能测试
添加一个联系人,对其进行显示:
对查找的联系人,进行删除操作:
在此删除显示:
7、 查找联系人功能设计
功能描述:按照姓名查找制定联系人姓名
7.1 封装查找联系人函数
思路:判断用户联系人是否存在。如果存在显示信息,不存在提示查无此人。
main函数部分代码:
//查找联系人case 4:findPerson(&abs);break;
addPerson.h中添加的代码:
void findPerson(Addressbooks* abs);
findPerson.cpp:
#include"addPerson.h"//查找联系人
int isExist2(Addressbooks* abs, string name)
{for (int i = 0; i < abs->m_Size; i++){if (abs->personArray[i].m_Name == name){return i;}}return -1;//如果遍历结束都没有找到。返回-1
}void findPerson(Addressbooks* abs)
{cout << "请输入您要查找的联系人" << endl;string name;cin >> name;int ret = isExist2(abs, name);if (ret != -1){cout << "姓名:" << abs->personArray[ret].m_Name << "\t";cout << "性别:" << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";cout << "年龄:" << abs->personArray[ret].m_Age << "\t";cout << "电话:" << abs->personArray[ret].m_Phone << "\t";cout << "住址:" << abs->personArray[ret].m_Addr << endl;}else{cout << "查无此人" << endl;}system("pause");system("cls");}
7.2 查找联系人功能测试
代码示例:
需要注意一点是,查找和显示不相同,查找功能是对所输入的姓名进行显示,而显示功能是对所有联系人信息进行显示,如下:
8、 修改联系人功能设计
功能描述:按照姓名重新修改联系人
8.1 封装修改联系人函数
实现思路:查找用户输入的联系人,如果查找成功进行修改操作,查找失败提示查无此人。
main函数部分代码:
//修改联系人 case 5:modifyPerson(&abs);break;
addPerson.h中添加的代码:
//修改联系人
int modifyPerson(Addressbooks* abs);
findPerson.cpp:
#include"addPerson.h"int isExist3(Addressbooks* abs, string name)
{for (int i = 0; i < abs->m_Size; i++){if (abs->personArray[i].m_Name == name){return i;}}return -1;//如果遍历结束都没有找到。返回-1
}//修改联系人
int modifyPerson(Addressbooks* abs)
{cout << "请输入您要修改的联系人" << endl;string name;cin >> name;int ret = isExist3(abs, name);if (ret != -1){int cz = 0;while (true){cout << "姓名:" << abs->personArray[ret].m_Name << "\t";cout << "性别:" << (abs->personArray[ret].m_Sex == 1 ? "男" : "女") << "\t";cout << "年龄:" << abs->personArray[ret].m_Age << "\t";cout << "电话:" << abs->personArray[ret].m_Phone << "\t";cout << "住址:" << abs->personArray[ret].m_Addr << endl;cout << "请输入您要修改的内容:" << endl<< "1代表姓名" << endl<< "2代表性别" << endl<< "3代表年龄" << endl<< "4代表电话" << endl<< "5代表住址" << endl<< "0代表退出" << endl;cin >> cz;switch (cz){case 1:{//姓名string nam;cout << "请输入姓名:" << endl;cin >> nam;abs->personArray[ret].m_Name = nam;break;}case 2:{cout << "请输入性别:" << endl;cout << "1 -- 男" << endl;cout << "2 -- 女" << endl;//性别int sex = 0;while (true){cin >> sex;if (sex == 1 || sex == 2){abs->personArray[ret].m_Sex = sex;break;}cout << "输入有误,请重新输入";}break;}case 3://删除联系人{//年龄cout << "请输入年龄:" << endl;int age = 0;cin >> age;abs->personArray[ret].m_Age = age;break;}case 4://查找联系人{//联系电话cout << "请输入联系电话:" << endl;string phone = "";cin >> phone;abs->personArray[ret].m_Phone = phone;break;}case 5:{//家庭住址cout << "请输入家庭住址:" << endl;string address;cin >> address;abs->personArray[ret].m_Addr = address;break;}case 0:cout << "退出修改" << endl;system("pause");system("cls");return 0;break;default:break;}}}else{cout << "查无此人" << endl;}system("pause");system("cls");
}
8.2 修改联系人功能测试
运行结果:
先添加一个联系人,进行显示,如下:
对其进行修改,本次修改的为性别,修改后“张三”性别已经修改,如下:
9、 清空联系人
功能描述:清空通讯录中所有信息
9.1 封装清空联系人函数
只要将通讯录记录的联系人数量置为0,即可。
main函数部分代码:
//清空联系人case 6:cleanPerson(&abs);break;
addPerson.h中添加的代码:
//清空联系人信息
void cleanPerson(Addressbooks* abs);
cleanPerson.cpp:
#include"addPerson.h"//清空联系人信息
void cleanPerson(Addressbooks* abs)
{abs->m_Size = 0;//将通讯录中数量大小直接置为0,我们便无法访问,//不用繁琐的挨个删除,也方便恢复数据cout << "通讯录已清空" << endl;system("pause");system("cls");}
9.2 清空联系人功能测试
运行结果:
先创建两个联系人,如下:
对其进行删除:
在此查看:
小结
终于做完了,上面由于一步步添加main.cpp函数和addPerson.h函数,所以都是代码片段,下面把main.cpp函数和addPerson.h函数,完整版代码发出来。
main.cpp:
#include<iostream>
using namespace std;
#include"showMenu.h"
#include<string>
#include"addPerson.h"int main()
{//创建通讯录的结构体变量Addressbooks abs;//初始化通讯录当前人员个数abs.m_Size = 0;//创建用户输入的变量int select = 0;while (true){//菜单showMenu();cin >> select;switch (select){//添加联系人case 1:addPerson(&abs);break;//显示联系人case 2:showPerson(&abs);break; //删除联系人 case 3:deletePerson(&abs);break;//查找联系人case 4:findPerson(&abs);break;//修改联系人 case 5:modifyPerson(&abs);break;//清空联系人case 6:cleanPerson(&abs);break;//退出当前使用的通讯录case 0:cout << "欢迎下次使用" << endl;system("pause");return 0;break;}} system("pause");return 0;
}
addPerson.h:
#include<iostream>
using namespace std;
#include<string>
#include<stdlib.h>
#define MAX 1000//设计联系人结构体
struct Person
{//姓名string m_Name;//性别 1男 2女int m_Sex;//年龄int m_Age;//电话string m_Phone;//住址string m_Addr;
};//设计通讯录结构体
struct Addressbooks
{//通讯录中保存的联系人struct Person personArray[MAX];//通讯录当前记录联系人个数int m_Size;
};//添加联系人信息
void addPerson(Addressbooks* abs);//添加联系人
void showPerson(Addressbooks* abs);//删除联系人
void deletePerson(Addressbooks* abs);//查找联系人
void findPerson(Addressbooks* abs);//修改联系人
int modifyPerson(Addressbooks* abs);//清空联系人信息
void cleanPerson(Addressbooks* abs);
运行结果就是每一步的运行结果,在这里就不进行重复演示了。
整个压缩包放在最下面了
C++通讯录管理系统设计资源-CSDN文库
相关文章:

C++通讯录管理系统
目录 系统需求 1、 创建项目 2、 菜单功能设计 3、 退出功能设计 4、 添加联系人功能设计 4.1 设计联系人结构体 4.2 设计通讯录结构体 4.3 在main函数中创建通讯录 4.4 封装添加联系人函数 4.5 添加联系人功能测试 5、 显示联系人功能设计 5.1 封装显示…...

Windows安装Python环境(V3.6)
文章目录 一:进入网址:https://www.python.org/downloads/ 二:执行安装包 默认C盘,选择自定义安装目录 记得勾选add python path 下面文件夹最好不要有 . 等特殊符号 可以创建 python36 如果安装失败Option可以选默认的&#x…...
python 如何调用GPT系列的api接口,实现想要的功能
目录 问题描述: 问题解决: 问题描述: 随着各种LLMs (Large Language Models)的出现,如何调用各种LLMs的api成为了经常会遇见的问题。 问题解决: 下面仅以生成给定sentence的复述句为例,说明…...
JS动态参数arguments与剩余参数
arguments是函数内部内置的伪数组变量,它包含了调用函数时传入的所以实参 让我为大家介绍一下arguments吧 平时我们获取实参: function fun(a, b) {console.log(a) //1console.log(b) //2}fun(1, 2)接下来我们来使用一下arguments动态获取实参 function …...
使用ListenableFuture进行异步任务执行并进行线程切换
文章目录 一、前言二、关键代码三、参考链接 一、前言 在程序中会经常需要做一些异步任务,但是由于部分操作其实很简单,仅仅是短暂的进行异步操作,然后在结果成功或失败的时候切换回主线程进行下一步处理,这期间不能阻塞主线程。…...

C#,数值计算——插值和外推,RBF_fn 与 RBF_gauss 的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { public interface RBF_fn { double rbf(double r); } } ---------------------------------------------- using System; namespace Legalsoft.Truffer { public class RBF_gauss : RBF…...

Java8实战-总结49
Java8实战-总结49 CompletableFuture:组合式异步编程对多个异步任务进行流水线操作构造同步和异步操作将两个 CompletableFuture 对象整合起来,无论它们是否存在依赖 CompletableFuture:组合式异步编程 对多个异步任务进行流水线操作 构造同…...

云匣子 FastJson反序列化RCE漏洞复现
0x01 产品简介 云匣子是租户连接云资源的安全管理工具,帮助云租户更加安全、精细的管理云上的虚拟机、数据库等资源。 云安宝结合多年的运维和安全实践,将云上的运维和安全有机结合,实现对运维过程的事前规划、事中控制和 事后审计。在此之上…...

全程云OA SQL注入漏洞复现
0x01 产品简介 全程云OA为企业提供日常办公管理、公文管理、工作请示、汇报、档案、知识体系、预算控制等26个功能,超过100多个子模块。为企业内部提供高效、畅通的信息渠道,同时也能大力推动公司信息系统发展,提高企业的办公自动化程度和综合…...

IDEA DeBug
文章目录 01_Debug简介和意义02_IDEA中的Debug步骤03_跳转到当前代码执行的行04_步过调试的使用05_步入调试的使用06_强制步入调试的使用07_步出调试的使用08_回退断点调试的使用09_运行到光标处10_计算表达式11_条件断点12_多线程调试 01_Debug简介和意义 什么是程序DeBug&am…...

本地部署 ComfyUI
本地部署 ComfyUI ComfyUI 介绍ComfyUI Github 地址部署 ComfyUI配置模型地址 or 下载模型启动 ComfyUI访问 ComfyUI使用技巧页面底部显示图片预览改变连接线的格式配置 prompt 自动补全 安装 ComfyUI-Manager安装 AIGODLIKE-COMFYUI-TRANSLATION安装 ComfyUI-Custom-Scripts安…...

RHCE---给openlab搭建web网站
作业:请给openlab搭建web网站 网站需求: 1.基于域名 www.openlab.com 可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站, 1、基于 www.openlab.com/student 网站访问学生信…...

[BJDCTF2020]The mystery of ip1
提示 ssti模板注入head头x-forwarded-for 每一次做题的最开始流程都大致因该是 信息收集找可以操控的地方 查看hint页面的源代码又发现它提示说 ####你知道为什么会知道你的ip吗 查看flag页面 从刚才给我的提示以及他这里显示的我的ip,大概找到了我可操作的可控点 …...

常见树种(贵州省):021冬青、连香树、白辛树、香合欢、云贵鹅耳枥、肥牛树、杜英、格木、黄连木、圆果化香树、南天竹
摘要:本专栏树种介绍图片来源于PPBC中国植物图像库(下附网址),本文整理仅做交流学习使用,同时便于查找,如有侵权请联系删除。 图片网址:PPBC中国植物图像库——最大的植物分类图片库 一、冬青 …...

[论文阅读]CBAM——代码实现和讲解
CBAM 论文网址:CBAM 论文代码:CBAM 本文提出了一种卷积块注意力模块(CBAM),它是卷积神经网络(CNN)的一种轻量级、高效的注意力模块。该模块沿着通道和空间两个独立维度依次推导注意力图&#x…...

蓝桥杯第2119题 特殊时间 C++ 思维暴力
题目 思路和解题方法 1110 代表 1110年11月10号11点10分1110 4*4*4 有0111 1011 1101 1110 可以符合年 月日 时分秒的都有4种例如 1113有1113 1131 1311 3111 年份符合月日只有11 13 时分秒 只有11 13 11 31 13 11 无31 11 c 代码 #include <bits/stdc.h> using…...

Modbus RTU协议及modbus库函数使用
一、与Modbus TCP的区别 在一般工业场景使用modbus RTU的场景还是更多一些,modbus RTU基于串行协议进行收发数据,包括RS232/485等工业总线协议。 与modbus TCP不同的是RTU没有报文头MBAP字段,但是在尾部增加了两个CRC检验字节(CRC…...

Linuxfork,写时拷贝
1.prinf隐藏的缓冲区 1.思考:为什么会有缓冲区的存在? 2.演示及思考? 1).演示缓存区没有存在感 那为什么我们感觉不到缓冲区的存在呢?我们要打印东西直接就打印了呢? 我们用代码演示一下: 比如打开一个main.c,输入内容如下: #include <stdio.h> int main() { …...
Android控件全解手册 - 自定义实现水波进度
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列...

Halcon Solution Guide I basics(4.1): Blob Analysis 自主练习
文章目录 文章专栏前言自主练习题目输出电路板焊点个数解决方案:正确率:90 文章专栏 我的Halcon开发 CSDN 专栏 Halcon学习 练习项目gitee仓库 CSDN Major 博主Halcon文章推荐 随笔分类 - Halcon入门学习教程 前言 为了更加熟练的掌握Halcon的练习,我之…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...