目录

一.前言

二.改进

三.题外话

四.完整代码


一.前言

忙完了考试周,才有闲情雅致写这篇博客-……-

(20条消息) 可视化图形界面编程(Easyx联合c++的通讯录系统)_Hzq958的博客-CSDN博客_c++可视化界面编程

二.改进

1、总体的架构的更新

还记得上次我们的数据属性保存在一个叫person的类里面吗?

class person {//联系人的的基本信息数据
public:char name[15];char sex[5];char number[20];char diqu[15];
};

从程序实现到正常的使用来看,这样确实没有什么问题。但是从C++的类的设计初心来看,这样的设定确实是不太合理的,数据变量不应放在public里,这样破坏了数据的私密性以及没有应用到类的“封装”。所以我就把person类做了一个调整,那就是把数据通通设置成private,然后定义几个接口来实现对应的调用。

然后我们又回到上次讨论的一个问题,easyx的文本,弹窗函数等都只能支持char*,所以我上次就把所有的string都改成char*,但是我现在因为要写几个接口来调用私有数据,你如果私有数据是char*,那么你的接口来起来会特别的繁琐,所以我这次就把char*又改回起初的string,那么这样string类型的接口写起来就特别的方便(直接 = 就完事了)

//联系人的的基本信息数据
class person {
private:string name;string sex;string number;string diqu;public:person() {}person(string a, string b, string c, string d) {name = a;sex = b;number = c;diqu = d;}string getName() {return name;}string getSex() {return sex;}string getNumber() {return number;}string getDiqu() {return diqu;}void setName(string n) {name = n;}void setSex(string n) {sex = n;}void setNumber(string n) {number = n;}void setDiqu(string n) {diqu = n;}};

但是怎么解决easyx的文本,弹窗函数等都只能支持char*这个问题呢?

这是在我课程老师的指点之下,我使用了string内部提供的强制转换为char* 的功能——(char*)string.data()   可以把 string 转换为 char *。如此一来,这个系统的框架看起来就会更加严谨了。

cout << it->getName() << "  " << it->getSex() << "     " << it->getNumber() << "    " << it->getDiqu() << endl;outtextxy(i, j, (char*)(it->getName()).data());outtextxy(i + 70, j, (char*)(it->getSex()).data());outtextxy(i + 130, j, (char*)(it->getNumber()).data());outtextxy(i + 250, j, (char*)(it->getDiqu()).data());

2、Show(显示联系人)的更新

上次的可视化通讯录的Show功能虽然可以正常的显示出联系人的信息,但是细心的博友会发现一个很大问题——就是只能显示出一页的内容(大概15行的数据),这对于我们真正的使用来说是一个严重的缺陷,所以就涉及到我们要实现一个可以翻页,进而显示出更多的数据的功能,这个想法早在我设计可视化通讯录的时候就有了,但是迟迟没有实现出来。

然后我此次也花费了心思在这个翻页设计上面了。

我另外新建了一个项目,反复的测试,也终于总结出了页面跳转的两个逻辑——函数的return和while循环里面的break;好像在easyx的页面跳转里,有且仅有这两个操作了。

把数据分两页存放,这个是很简单的,只需要两个遍历,再在遍历里设定if(>15)语句。

核心的点在于,你进去第二个页面之后,要有可以返回上一页的按钮以及返回主菜单的按钮,这里就涉及到要有两个while循环,一个是在进入Show功能后自动输入第一页的循环,在这个循环里面要有两个按钮,下一页和返回主菜单,其中进去下一页的按钮之后,又要进入另外一个while循环,包含两个按钮,返回主菜单(return),上一页(break)。

ostream& operator <<(ostream& cout, Txl_systeam& x) {//重载<<运算符mytextwin();settextcolor(RGB(0, 119, 220));while (1) {int flag = 0;//记录输出多少个联系人int i = 10, j = 50;//第一页联系人for (vector<person>::iterator it = x.People.begin(); it != x.People.end(); it++){flag++;if (flag <= 15) {cout << it->getName() << "  " << it->getSex() << "     " << it->getNumber() << "    " << it->getDiqu() << endl;outtextxy(i, j, (char*)(it->getName()).data());outtextxy(i + 70, j, (char*)(it->getSex()).data());outtextxy(i + 130, j, (char*)(it->getNumber()).data());outtextxy(i + 250, j, (char*)(it->getDiqu()).data());j = j + 30;}}while (1) {//输出完第一页之后就进入此循环MOUSEMSG mm = GetMouseMsg();//下一页的 触发——if (mm.uMsg == WM_LBUTTONDOWN && mm.y > 520 && mm.y < 560 && mm.x>220 && mm.x < 280) {mytextwin();settextcolor(RGB(74, 0, 149));flag = 0;int i = 10, j = 50;for (vector<person>::iterator it = x.People.begin(); it != x.People.end(); it++)//第二页联系人{flag++;if (flag > 15) {//cout << (*it).name << "  " << (*it).sex << "     " << (*it).number << "    " << (*it).diqu << endl;cout << it->getName() << "  " << it->getSex() << "     " << it->getNumber() << "    " << it->getDiqu() << endl;outtextxy(i, j, (char*)(it->getName()).data());outtextxy(i + 70, j, (char*)(it->getSex()).data());outtextxy(i + 130, j, (char*)(it->getNumber()).data());outtextxy(i + 250, j, (char*)(it->getDiqu()).data());j = j + 30;}}}//上一页的触发if (mm.uMsg == WM_LBUTTONDOWN && mm.y > 520 && mm.y < 560 && mm.x>120 && mm.x < 175) {mytextwin();settextcolor(RGB(0, 119, 220));break;}//返回主界面的 ‘按钮’if (mm.uMsg == WM_LBUTTONDOWN && mm.y > 595 && mm.y < 650 && mm.x>170 && mm.x < 250) {return cout;}}}
}

3、新功能的更新

到了这里,我又给主菜单多加了一个功能——格式化通讯录数据(至于为啥会突然想到多加一个功能,可能是我觉得单纯的增删查改有点过于单调了吧)。

站在用户的角度来想,我不大可能会用到这个功能,但是这个功能应该要有,并且这个功能的使用理应要验证一下是否是用户本人,这样会更加合理。所以我的设定就是在第一次点击这个功能的时候,要用户自己设定一个权限密码,这个密码设置好之后,会保存在某个文件里面,当有人下一次使用这个功能的时候,就需要输入密码,输入的密码会和当初设置的权限密码去匹配,密码正确两次才可以完成格式化。(格式化即清空所有的联系人数据)

void deletedata() {//格式化通讯录数据char myprivate[20];ifstream du("权限密码.txt", ios::in | ios::binary);//只读if (du.is_open()) {//打开成功的话du >> myprivate; //读取行字符串,直到读到空就停止du.close();}else {//打开失败的话MessageBox(NULL, "当前未设置权限密码,请输入权限密码", "Tip", MB_SYSTEMMODAL);ofstream xie("权限密码.txt", ios::out | ios::binary);//只写InputBox(myprivate, 20, "请设置您的通讯录管理权限密码", NULL, "不多于20个字符", 0, 0, true);xie << myprivate;MessageBox(NULL, "权限密码设置成功", "OK", MB_SYSTEMMODAL);xie.close();return;}char in1[20];MessageBox(NULL, "格式化之后无法恢复哦!", "警告!", MB_SYSTEMMODAL);InputBox(in1, 20, "请输入您的通讯录管理权限密码", NULL, NULL, 0, 0, false);if (strcmp(in1, myprivate) == 0) {char in2[20];InputBox(in2, 20, "请再次输入密码进行最后的确定", NULL, NULL, 0, 0, true); {if (strcmp(in2, myprivate) == 0) {People.clear();MessageBox(NULL, "格式化成功", "提示", MB_SYSTEMMODAL);return;}else {MessageBox(NULL, "密码错误!", "False", MB_SYSTEMMODAL);return;}}}else {MessageBox(NULL, "密码错误!", "False", MB_SYSTEMMODAL);return;}}

4、查找功能的更新

其实主要就是修改了显示出该联系人信息的方式,上一版是查找成功后连续弹出四个窗口,显示该联系人的四项信息,这次的话我就把四项信息整合到一个变量里面,一次弹窗输出。

除此之外,我多设定了一步查找完之后询问用户是否修改的操作·······~~~~~(这个也没啥好说的)我们看代码就好吧。

bool Find() { //查找指定联系人信息char z[200];//string z;InputBox(z, 200, "请输入要查找的联系人姓名", NULL, NULL, 0, 0, false);vector<person>::iterator it = People.begin();for (; it != People.end(); ){// if ( mystrcmp(z, (*it).name) == 1 ) {if (z == it->getName()) {string data;//整合四个 char[] 到一个 char[]里data += "姓名:";data += it->getName();data += "\n";data += "性别:";data += it->getSex();data += "\n";data += "号码:";data += it->getNumber();data += "\n";data += "地区:";data += it->getDiqu();MessageBox(NULL, (char*)data.data(), "详细信息为", MB_SYSTEMMODAL);if (MessageBox(NULL, (char*)data.data(), "是否修改此联系人信息", MB_YESNO) == IDYES) {Updata(z);}return true;}else {++it;}}MessageBox(NULL, "无此联系人", "错误!", MB_SYSTEMMODAL);return false;}

三.题外话

上次发布之后断断续续有几个哥们来问我为啥我的代码在他那边运行不了(前段也是我们学校的考试周,所以没有给予一一回复),其实关于这个问题csdn有很多回答的,这里的话我就简要的说明一下,首先我推荐你是使用visual studio系列编译器(vs2019,2022什么的都可以),然后去easyx的官网下载easyx的图形库,你下载安装完之后,就可以看到系统弹窗说是否嵌入到vs里面,你点击确定然后就彻底安装成功了。进去vs之后,你要更改一个属性,点击工具栏的项目->xxx属性->高级->字符集->改为使用多字节字符集。这样就OK了。

四.完整代码

#include<iostream>
#include<string>
#include<fstream>
#include<vector>#include<graphics.h>//easyx库头文件using namespace std;//主菜单界面
void mymainmeau() {//closegraph();IMAGE photo;//定义图片变量loadimage(&photo, "通讯录主界面4.jpg", 400, 650);//导入图片putimage(0, 0, &photo);//把图片贴出来
}//副界面的界面 以及文字格式
void mytextwin() {//initgraph(400, 650);IMAGE photo;loadimage(&photo, "展示联系人.jpg", 400, 650);putimage(0, 0, &photo);//cleardevice();settextstyle(20, 0, "宋体"); settextcolor(BLACK); setbkmode(TRANSPARENT); //设置文字的大小,形式,颜色,透明outtextxy(8, 8, "|姓名||性别| |电话号码|  |地区|   ");//输出文字到窗口   outtextxy(坐标,字符串)settextstyle(20, 0, "楷体");
}//联系人的的基本信息数据
class person {
private:string name;string sex;string number;string diqu;public:person() {}person(string a, string b, string c, string d) {name = a;sex = b;number = c;diqu = d;}string getName() {return name;}string getSex() {return sex;}string getNumber() {return number;}string getDiqu() {return diqu;}void setName(string n) {name = n;}void setSex(string n) {sex = n;}void setNumber(string n) {number = n;}void setDiqu(string n) {diqu = n;}};//通讯录系统
class Txl_systeam {
private:vector<person> People;//用vector容器来存储数据public:Txl_systeam() {MessageBox(NULL, "“右击”任意区域可保存通讯录", "TIP", MB_SYSTEMMODAL);//读取文件操作ifstream du("通讯录数据.txt", ios::in);//只读if (du.is_open()) {// 打开成功的话string name_;string sex_;string number_;string diqu_;while (du >> name_ >> sex_ >> number_ >> diqu_) { //依次读取每一行的四个字符串,直到读到空就停止person temp_(name_, sex_, number_, diqu_);People.push_back(temp_); //传入容器 People}du.close();}else {MessageBox(NULL, "当前通讯录数据为空,请添加联系人", "Tip", MB_SYSTEMMODAL);}}void SaveTxl_systeam() {//保存数据ofstream xie("通讯录数据.txt", ios::out);//只写vector<person>::iterator it = People.begin();for (; it != People.end(); it++) //vector 的遍历方法,用迭代器{xie << it->getName() << "  " << it->getSex() << "     " << it->getNumber() << "    " << it->getDiqu() << endl;}xie.close();MessageBox(NULL, "保存成功!", "TIP", MB_SYSTEMMODAL);}bool Delete() { //删除指定联系人char z[20];InputBox(z, 20, "请输入要删除的联系人姓名", NULL, NULL, 0, 0, false);for (vector<person>::iterator it = People.begin(); it != People.end(); ){// if ( mystrcmp(z, (*it).name) == 1 ) {if (z == it->getName()) {if (MessageBox(NULL, "再次确定是否删除此联系人信息", "匹配成功", MB_YESNO) == IDYES) {it = People.erase(it);MessageBox(NULL, "删除成功", "OK", MB_TASKMODAL);MessageBox(NULL, "右击任意区域可保存通讯录", "TIP", MB_SYSTEMMODAL);return true;}else return true;}else {++it;}}MessageBox(NULL, "无此联系人", "错误!", MB_SYSTEMMODAL);return false;}bool Find() { //查找指定联系人信息char z[200];//string z;InputBox(z, 200, "请输入要查找的联系人姓名", NULL, NULL, 0, 0, false);vector<person>::iterator it = People.begin();for (; it != People.end(); ){// if ( mystrcmp(z, (*it).name) == 1 ) {if (z == it->getName()) {string data;//整合四个 char[] 到一个 char[]里data += "姓名:";data += it->getName();data += "\n";data += "性别:";data += it->getSex();data += "\n";data += "号码:";data += it->getNumber();data += "\n";data += "地区:";data += it->getDiqu();MessageBox(NULL, (char*)data.data(), "详细信息为", MB_SYSTEMMODAL);if (MessageBox(NULL, (char*)data.data(), "是否修改此联系人信息", MB_YESNO) == IDYES) {Updata(z);}return true;}else {++it;}}MessageBox(NULL, "无此联系人", "错误!", MB_SYSTEMMODAL);return false;}bool Updata(char ming[]) {//更新指定联系人信息for (vector<person>::iterator it = People.begin(); it != People.end(); ){if (ming == it->getName()) {char name_[20], sex_[5], number_[20], diqu_[10];InputBox(name_, 20, "请重新输入联系人姓名", NULL, NULL, 0, 0, true);InputBox(sex_, 20, "请重新输入联系人性别", NULL, NULL, 0, 0, true);InputBox(number_, 20, "请重新输入联系人号码", NULL, NULL, 0, 0, true);InputBox(diqu_, 20, "请重新输入联系人地区", NULL, NULL, 0, 0, true);if (strlen(name_) == 0 || strlen(sex_) == 0 || strlen(number_) == 0 || strlen(diqu_) == 0) {MessageBox(NULL, "错误的空输入", "False", MB_SYSTEMMODAL);return false;}it->setName(name_);it->setSex(sex_);it->setNumber(number_);it->setDiqu(diqu_);MessageBox(NULL, "修改成功", "OK", MB_SYSTEMMODAL);return true;}else {++it;}}MessageBox(NULL, "无此联系人", "错误!", MB_SYSTEMMODAL);return false;}void deletedata() {//格式化通讯录数据char myprivate[20];ifstream du("权限密码.txt", ios::in | ios::binary);//只读if (du.is_open()) {//打开成功的话du >> myprivate; //读取行字符串,直到读到空就停止du.close();}else {//打开失败的话MessageBox(NULL, "当前未设置权限密码,请输入权限密码", "Tip", MB_SYSTEMMODAL);ofstream xie("权限密码.txt", ios::out | ios::binary);//只写InputBox(myprivate, 20, "请设置您的通讯录管理权限密码", NULL, "不多于20个字符", 0, 0, true);xie << myprivate;MessageBox(NULL, "权限密码设置成功", "OK", MB_SYSTEMMODAL);xie.close();return;}char in1[20];MessageBox(NULL, "格式化之后无法恢复哦!", "警告!", MB_SYSTEMMODAL);InputBox(in1, 20, "请输入您的通讯录管理权限密码", NULL, NULL, 0, 0, false);if (strcmp(in1, myprivate) == 0) {char in2[20];InputBox(in2, 20, "请再次输入密码进行最后的确定", NULL, NULL, 0, 0, true); {if (strcmp(in2, myprivate) == 0) {People.clear();MessageBox(NULL, "格式化成功", "提示", MB_SYSTEMMODAL);return;}else {MessageBox(NULL, "密码错误!", "False", MB_SYSTEMMODAL);return;}}}else {MessageBox(NULL, "密码错误!", "False", MB_SYSTEMMODAL);return;}}friend ostream& operator <<(ostream& cout, Txl_systeam& x);friend istream& operator >>(istream& cout, Txl_systeam& x);
};istream& operator >>(istream& cin, Txl_systeam& x) {if (x.People.size() == 30) {MessageBox(NULL, "通讯录已经满了!", "False ", MB_SYSTEMMODAL);return cin;}char name_[20], sex_[5], number_[20], diqu_[10];InputBox(name_, 20, "请输入联系人姓名", NULL, NULL, 0, 0, true);// EaxyX的 InputBox()函数 弹出一个窗口来用于获取用户的输入InputBox(sex_, 5, "请输入联系人性别", NULL, NULL, 0, 0, true);//InputBox(字符串,最大字符长度,标题,窗口标题,编辑框提示串,弹窗的宽度,高度,确定的形式【true,false】)InputBox(number_, 20, "请输入联系人号码", NULL, NULL, 0, 0, true);for (vector<person>::iterator it = x.People.begin(); it != x.People.end(); )//判断是否通讯录中已经有重复的号码{if (number_ == it->getNumber()) {MessageBox(NULL, "通讯录中已经有该号码!!", "False Input", MB_SYSTEMMODAL);return cin;}else {++it;}}InputBox(diqu_, 20, "请输入联系人地区", NULL, NULL, 0, 0, true);if (strlen(name_) == 0 || strlen(sex_) == 0 || strlen(number_) == 0 || strlen(diqu_) == 0) {//提高程序的健壮性——1.输入空串MessageBox(NULL, "错误的空输入", "False", MB_SYSTEMMODAL);//EasyX 的MessageBox()函数 弹出一个窗口用于提醒用户return cin;                                           // MessageBox(窗口的变量,正文字符串,标题字符串,弹出的形式【 MB_APPLMODA,MB_SYSTEMMODAL, MB_TASKMODAL】)}person temp_(name_, sex_, number_, diqu_);x.People.push_back(temp_);MessageBox(NULL, "添加成功", "OK", MB_SYSTEMMODAL);MessageBox(NULL, "右击任意区域可保存通讯录", "TIP", MB_SYSTEMMODAL);return cin;
}ostream& operator <<(ostream& cout, Txl_systeam& x) {//重载<<运算符mytextwin();settextcolor(RGB(0, 119, 220));while (1) {int flag = 0;//记录输出多少个联系人int i = 10, j = 50;//第一页联系人for (vector<person>::iterator it = x.People.begin(); it != x.People.end(); it++){flag++;if (flag <= 15) {cout << it->getName() << "  " << it->getSex() << "     " << it->getNumber() << "    " << it->getDiqu() << endl;outtextxy(i, j, (char*)(it->getName()).data());outtextxy(i + 70, j, (char*)(it->getSex()).data());outtextxy(i + 130, j, (char*)(it->getNumber()).data());outtextxy(i + 250, j, (char*)(it->getDiqu()).data());j = j + 30;}}while (1) {//输出完第一页之后就进入此循环MOUSEMSG mm = GetMouseMsg();//下一页的 触发——if (mm.uMsg == WM_LBUTTONDOWN && mm.y > 520 && mm.y < 560 && mm.x>220 && mm.x < 280) {mytextwin();settextcolor(RGB(74, 0, 149));flag = 0;int i = 10, j = 50;for (vector<person>::iterator it = x.People.begin(); it != x.People.end(); it++)//第二页联系人{flag++;if (flag > 15) {//cout << (*it).name << "  " << (*it).sex << "     " << (*it).number << "    " << (*it).diqu << endl;cout << it->getName() << "  " << it->getSex() << "     " << it->getNumber() << "    " << it->getDiqu() << endl;outtextxy(i, j, (char*)(it->getName()).data());outtextxy(i + 70, j, (char*)(it->getSex()).data());outtextxy(i + 130, j, (char*)(it->getNumber()).data());outtextxy(i + 250, j, (char*)(it->getDiqu()).data());j = j + 30;}}}//上一页的触发if (mm.uMsg == WM_LBUTTONDOWN && mm.y > 520 && mm.y < 560 && mm.x>120 && mm.x < 175) {mytextwin();settextcolor(RGB(0, 119, 220));break;}//返回主界面的 ‘按钮’if (mm.uMsg == WM_LBUTTONDOWN && mm.y > 595 && mm.y < 650 && mm.x>170 && mm.x < 250) {return cout;}}}
}int main() {initgraph(400, 650);//画一个宽400,高650的窗口mymainmeau();Txl_systeam user;while (1) {//进入无限循环,不然这个界面点击一次就失效了MOUSEMSG m = GetMouseMsg();//定义鼠标变量switch (m.uMsg) {//分配鼠标的消息————比如  鼠标移动,左击,右击,左双击,右双击等等case WM_LBUTTONDOWN: {//左击鼠标操作if (m.x > 0 && m.x < 100 && m.y>0 && m.y < 100) {//  SHOW  的坐标位置cout << user;//closegraph();mymainmeau();break;}if (m.x > 325 && m.x < 400 && m.y>100 && m.y < 175) {//  +  的位置cin >> user;break;}if (m.x > 325 && m.x < 400 && m.y>230 && m.y < 290) {//  - 的位置user.Delete();break;}if (m.x > 325 && m.x < 400 && m.y>330 && m.y < 400) {//  chazhao 的位置user.Find();break;}if (m.x > 325 && m.x < 400 && m.y>450 && m.y < 515) {//  xiugai  的位置char ming[20];InputBox(ming, 20, "请输入要修改的联系人姓名", NULL, NULL, 0, 0, false);user.Updata(ming);break;}if (m.x > 320 && m.x < 400 && m.y>630 && m.y < 650) {//  xiugai  的位置user.deletedata();break;}}case WM_MOUSEMOVE: {//鼠标移动操作                    制造鼠标停留在按钮上会有提示文字的效果,鼠标移开,文字效果消失settextstyle(15, 0, "宋体");setbkmode(TRANSPARENT);if (m.x > 0 && m.x < 100 && m.y>0 && m.y < 100) {//  SHOW  的位置settextcolor(BLACK);outtextxy(100, 50, "显示所有联系人");}else {//如果 离开 SHOW 的位置settextcolor(WHITE);outtextxy(100, 50, "显示所有联系人");}if (m.x > 325 && m.x < 400 && m.y>100 && m.y < 175) {//  +  的位置settextcolor(BLACK);outtextxy(240, 150, "添加联系人");}else {settextcolor(WHITE);outtextxy(240, 150, "添加联系人");}if (m.x > 325 && m.x < 400 && m.y>230 && m.y < 290) {//  - 的位置settextcolor(BLACK);outtextxy(240, 260, "删除联系人");}else {settextcolor(WHITE);outtextxy(240, 260, "删除联系人");}if (m.x > 325 && m.x < 400 && m.y>330 && m.y < 400) {//  chazhao 的位置settextcolor(BLACK);outtextxy(240, 368, "查找联系人");}else {settextcolor(WHITE);outtextxy(240, 368, "查找联系人");}if (m.x > 325 && m.x < 400 && m.y>450 && m.y < 515) {//  xiugai  的位置settextcolor(BLACK);outtextxy(240, 480, "修改联系人");}else {settextcolor(WHITE);outtextxy(240, 480, "修改联系人");}if (m.x > 325 && m.x < 400 && m.y>620 && m.y < 650) {//  格式化  的位置settextcolor(BLACK);outtextxy(275, 590, "格式化通讯录数据");}else {settextcolor(WHITE);outtextxy(275, 590, "格式化通讯录数据");}break;}case WM_RBUTTONUP: {//右击鼠标保存if (m.x > 0 && m.x < 400 && m.y>0 && m.y < 650) {user.SaveTxl_systeam();}}}}system("pause");return 0;
}

(Easyx联合c++的通讯录系统)续相关推荐

  1. 可视化图形界面编程(Easyx联合c++的通讯录系统)

    一.初想 1.QT? 学了快两年的编程了,一直都是在黑窗口控制台进行操作,于是我突发奇想,想要做出一个带界面的,可以用鼠标进行人机交互的通讯录程序作为实训的内容,于是我开始了在网上搜索'如何用c++做 ...

  2. ios开发基础之通讯录系统实战-20

    ios开发基础之通讯录系统实战 基础知识 OC 基础 segue 的使用.delegate 代理的使用 自定义代理.面向对象思想 沙盒容器的数据持久化方案, controller 之间的跳转 ,登录方 ...

  3. C语言课程设计:通讯录系统

    C语言课程设计:通讯录系统 [题目4]通讯录程序设计 设计一个实用的小型通讯录程序,具有添加,查询和删除功能.由姓名,籍贯,电话号码1,电话号码2,电子邮箱组成,姓名可以由字符和数字混合编码.电话号码 ...

  4. C++ MFC 学习笔记+小型通讯录系统实现

    MFC 最详细入门教程 [MFC常用函数总结](https://www.cnblogs.com/jiu0821/p/4606639.html) [C++ & MFC]https://www.c ...

  5. C语言手机通讯录系统

    C语言手机通讯录系统 任务3 题目:手机通讯录系统 任务描述 (1)设计一个对手机通讯录信息进行查询.编辑.添加.删除等操作的管理程序. (2)通讯录的基本信息包括姓名.年龄.联系电话.类别(朋友.家 ...

  6. IDEA+MySQL+JavaFX之通讯录系统

    IDEA+MySQL+JavaFX 软件 项目创建 设计界面 Controller代码编写 按钮响应 数据库 主要代码 欢迎打扰 刚刚结束了小学期,在这里我想借助我的一个小项目--班级通讯录管理系统, ...

  7. C语言通讯录系统程序设计

    文章目录 1.前言 2.设计步骤 前言 利用链表增.删.改.查功能以及文件来完成通讯录系统.通讯录中包含联系人的基本信息:姓名.联系电话.家庭住址以及电子邮件. 以下是设计该系统的步骤: 1.导出通讯 ...

  8. java学生通讯录_简单实现Java通讯录系统

    本文实例为大家分享了Java通讯录系统的具体代码,供大家参考,具体内容如下 import java.util.Scanner; class Person { String name; String n ...

  9. Java~通讯录系统

    Java~通讯录欢迎各位 1.需求分析 2.概要设计 2.1功能模块结构图 2.2业务流程图 3 运行环境 4 开发工具和编程语言 5 详细设计 5.1 数据库设计 5.2 类的设计 5.3登录 5. ...

最新文章

  1. 2021年广东省高考英语听说成绩查询,广东2021年高考准考证今起自行打印 成绩及分数线6月24日左右公布...
  2. mysql8.0取消授权_mysql8创建用户、删除用户、授权、取消授权
  3. 关于 MyBatis 我总结了 10 种通用的写法
  4. 0基础玩转CV的利器绝了,还送万元礼金,机不可失!
  5. 风云编程python-Python中*args 和**kwargs的用法
  6. ad09机械层说明_悉数PCB上的各种层
  7. 【Python】pycharm去掉代码下的波浪线
  8. C# WinForm 添加Windows Media Player 控件调试出现未能加载文件或程序集Interop.WMPLib,该怎么解决...
  9. 剑指offer和LeetCode题目笔记
  10. [消息]C++ Connections 在拉斯维加斯召开年会
  11. Mysql中natural join和inner join的区别
  12. python中set index_python中set基础应用
  13. JavaSE基础——IO流详解(2)其他常用的流和Properties 集合
  14. Java语言程序设计课程设计
  15. 【017】【毕业设计】基于51单片机的频率计设计的Proteus仿真与实物设计
  16. 知识点九:散列表(中)
  17. 4种Word文档解除密码保护的方法
  18. 房天下搜房网二手房_【杭州二手房|杭州二手房出售】 - 杭州房天下
  19. js、css基础总结
  20. 【程序源代码】小电影小程序

热门文章

  1. 兴趣爱好选择程序java+Swing界面
  2. 关于数据库的操作语句
  3. 学编程的人那么多,到底编程的出路在哪?
  4. Unity Direct3D 和 OpenGL
  5. Spark Mllib 下的决策树二元分类 —— 网站分类(1)
  6. html布局间距,CSS Grid布局:列和间距
  7. 1234组成无重复三位数
  8. blackjack java gui_求助一个java的题,blackjack, class 分为Card 和Deck,求大神帮我做一个程序...
  9. ec200t 拨号_Quectel EC200T驱动以及ppp拨号移植
  10. 网线标准以及国内外大牌