【C语言项目】通讯录与可视化界面实现

news/2024/11/30 11:29:51/

目录

一、编译环境

1、VS2022

2、Easyx库

二、功能结构

 三、遇到的问题

1、增加模块输入InputBox函数如何录入数据

 2、

四、头文件(准备工作)

1、代码

 

2、头文件(库)

3、预处理

4、联系人信息结构体

5、函数声明

五、主界面绘制(main函数)

1、展示

2、主要模块

1.main函数

2.test函数

 3.init函数

 六、ADD

1、代码+展示

​编辑

2、功能实现 

1.绘图

2.实现窗口

3.输入联系人信息与信息录入数组实现

3、录入后信息去向

七、其他模块

1、查找(sea函数)

 1.代码

2.功能

 2、删除(del)

1.代码

2.功能

3、其他模块

1.输出函数(print)

 2.录入文件(Writetxt)


一、编译环境

1、VS2022

2、Easyx库

二、功能结构

实现基本的增删改查更改,通过文件的形式存储录入的数据,在启动程序时从文件里录入

学生信息采用结构体表示

数据结构:由于是简陋版2天搞完,所以我使用了数组,也可以使用动态数组或链表,后续加实现模块即可、主界面的实现(main.c)

 三、遇到的问题

1、增加模块输入InputBox函数如何录入到数组中

解决办法:1.查找资料,直接将字符串定义为wchar_t数组,然后使用memcpy函数拷贝。2.大lao指点博客名:JFL1224

 2、

四、头文件(准备工作)

1、代码

#pragma once
#include<stdio.h>
#include<easyx.h>
#include<graphics.h>
#include<string>
#include<string.h>#pragma warning(disable:4996)#define Namenum 10
#define Callnum 12
#define Sexnum 5
#define Addrnum 20
#define Agenum 5struct S
{wchar_t name[Namenum];wchar_t num[Callnum];wchar_t sex[Sexnum];wchar_t addr[Addrnum];wchar_t age[Agenum];};struct M
{struct S stu[100];int count;
};void Add(M* s);void print(M* s);void search(M* s);void del(M* s);void Writetxt(M* s);

2、头文件(库)

 主要包含以下头文件


#include<stdio.h>
#include<easyx.h>
#include<graphics.h>
#include<string>
#include<string.h>

3、预处理

定义各数组长度,姓名数组,年龄数组,地址数组等

由于使用编译环境是VS2022一些函数不能直接使用所以预编译时加入 

#pragma warning(disable:4996)

4、联系人信息结构体

联系人信息主要包含姓名、年龄、住址、电话、性别等信息

struct S
{wchar_t name[Namenum];wchar_t num[Callnum];wchar_t sex[Sexnum];wchar_t addr[Addrnum];wchar_t age[Agenum];};

 再定义一个结构体方便存储联系人人数及联系人数组

struct M
{struct S stu[100];int count;
};

5、函数声明

接下来是一些基本模块函数的声明 

void Add(M* s);        增加联系人void print(M* s);      输出联系人void search(M* s);     查找联系人void del(M* s);        删除联系人void mod(M* s);        修改联系人void Writetxt(M* s);   保存数据到文件

五、主界面绘制(main函数)

1、展示

2、主要模块

1.main函数

主函数主要实习了主界面绘图的调用

int main()
{test();return 0;
}

2.test函数

该函数先实现了,数据结构的定义,并调用函数对其进行初始化与加载

然后开始绘制主界面这里使用了easyx库里的库函数

easyx库:EasyX Graphics Library for C++https://easyx.cn/

void test()//主界面
{M stus;//初始化init(&stus);
a:;MOUSEMSG m;initgraph(1024, 640);setbkcolor(WHITE);             //设置背景颜色白色cleardevice();                 //清屏清楚黑色image();                      //插入图片setfillcolor(LIGHTBLUE);//设置填充颜色fillrectangle(350, 20, 600, 50);fillrectangle(350, 80, 600, 110);fillrectangle(350, 140, 600, 170);fillrectangle(350, 200, 600, 230);fillrectangle(350, 260, 600, 290);fillrectangle(350, 320, 600, 350);settextstyle(20, 0, L"宋体");   //设置文字形式setbkmode(TRANSPARENT);        //透明文字outtextxy(430, 25, L"退出通讯录");outtextxy(430, 85, L"增加联系人");outtextxy(430, 145, L"查找联系人");outtextxy(430, 205, L"删除联系人");outtextxy(430, 265, L"修改联系人");outtextxy(430, 325, L"查看联系人");settextcolor(WHITE);settextstyle(20, 0, L"宋体");   //设置文字形式setbkmode(TRANSPARENT);        //透明文字outtextxy(450, 400, L"通讯录2.1.0");while (1){m = GetMouseMsg();if (m.x < 600 && m.x>350 && m.y > 20 && m.y < 50){setlinecolor(RED);rectangle(345, 15, 605, 55);if (m.uMsg == WM_LBUTTONDOWN){Writetxt(&stus);return;}}else if (m.x < 600 && m.x>350 && m.y > 80 && m.y < 110){setlinecolor(RED);rectangle(345, 75, 605, 115);if (m.uMsg == WM_LBUTTONDOWN){Add(&stus);goto a;}}else if (m.x < 600 && m.x>350 && m.y > 140 && m.y < 170){setlinecolor(RED);rectangle(345, 135, 605, 175);if (m.uMsg == WM_LBUTTONDOWN){search(&stus);goto a;}}else if (m.x < 600 && m.x>350 && m.y > 200 && m.y < 230){setlinecolor(RED);rectangle(345, 195, 605, 235);if (m.uMsg == WM_LBUTTONDOWN){del(&stus);goto a;}}else if (m.x < 600 && m.x>350 && m.y > 260 && m.y < 290){setlinecolor(RED);rectangle(345, 255, 605, 295);if (m.uMsg == WM_LBUTTONDOWN){mod(stus);goto a;}}else if (m.x < 600 && m.x>350 && m.y > 320 && m.y < 350){setlinecolor(RED);rectangle(345, 315, 605, 355);if (m.uMsg == WM_LBUTTONDOWN){print(&stus);goto a;}}else{setlinecolor(WHITE);rectangle(345, 15, 605, 55);rectangle(345, 75, 605, 115);rectangle(345, 135, 605, 175);rectangle(345, 195, 605, 235);rectangle(345, 255, 605, 295);rectangle(345, 315, 605, 355);}}getchar();
}

 3.init函数

该函数主要实习对数据结构进行初始化与加载,在文件中读取数据存入数组

void init(M* s)
{s->count = 0;memset(s->stu, 0, 100*sizeof(S));FILE* pf = fopen("contact.txt", "rb");if(pf == NULL){perror("fopen");HWND hnd = GetHWnd();SetWindowText(hnd, L"Add");MessageBox(hnd, L"导入失败", L"警告", MB_OKCANCEL);return;}S ss = { 0 };while (fread(&ss, sizeof(S), 1, pf) == 1){s->stu[s->count] = ss;s->count++;}fclose(pf);pf = NULL;
}

 六、ADD

1、代码+展示

#include"easyx.h"void Add(M* s)
{
//ab:;MOUSEMSG m;initgraph(1024, 640);setbkcolor(WHITE);             //设置背景颜色白色cleardevice();IMAGE mm;                     //加载背景loadimage(&mm, L"ooo.jpg", 1024, 640);putimage(0, 0, &mm);setfillcolor(LIGHTBLUE);      //设置填充颜色fillrectangle(100, 20, 250, 50);//姓名fillrectangle(100, 80, 250, 110);//年龄fillrectangle(100, 140, 250, 170);//性别fillrectangle(100, 200, 250, 230);//电话fillrectangle(100, 260, 250, 290);//住址fillrectangle(100, 320, 250, 350);//返回settextstyle(20, 0, L"宋体");   //设置文字形式setbkmode(TRANSPARENT);        //透明文字outtextxy(145, 25, L"姓   名");outtextxy(145, 85, L"年   龄");outtextxy(145, 145, L"性   别");outtextxy(145, 205, L"电   话");outtextxy(145, 265, L"住   址");outtextxy(145, 325, L"返   回");settextcolor(BLACK);settextstyle(20, 0, L"宋体");   //设置文字形式setbkmode(TRANSPARENT);        //透明文字outtextxy(450, 400, L"输入信息");setfillcolor(WHITE);fillrectangle(300, 20, 800, 50);//姓名fillrectangle(300, 80, 800, 110);//年龄fillrectangle(300, 140, 800,170);//性别fillrectangle(300, 200, 800,230);//电话fillrectangle(300, 260, 800,290);//住址int i = 0;while (1){m = GetMouseMsg();if (m.x < 800 && m.x>300 && m.y > 20 && m.y < 50){setlinecolor(RED);rectangle(295, 15, 805, 55);if (m.uMsg == WM_LBUTTONDOWN){//输入姓名wchar_t ss[10];InputBox(ss, 10, L"请输入姓名");outtextxy(500, 25, ss);memcpy(s->stu[s->count].name, ss, 10);i++;//goto ab;}}else if (m.x < 800 && m.x>300 && m.y > 80 && m.y < 110){setlinecolor(RED);rectangle(295, 75, 805, 115);if (m.uMsg == WM_LBUTTONDOWN){//输入wchar_t ss[5];InputBox(ss, 5, L"请输入年龄");outtextxy(500, 85, ss);memcpy(s->stu[s->count].age, ss, 5);//s->stu[s->count].age = r;//goto ab;i++;}}else if (m.x < 800 && m.x>300 && m.y > 140 && m.y < 170){setlinecolor(RED);rectangle(295, 135, 805, 175);if (m.uMsg == WM_LBUTTONDOWN){wchar_t ss[5];InputBox(ss, 5, L"请输入性别");outtextxy(500, 145, ss);memcpy(s->stu[s->count].sex, ss, 5);i++;//goto ab;}}else if (m.x < 800 && m.x>300 && m.y > 200 && m.y < 230){setlinecolor(RED);rectangle(295, 195, 805, 235);if (m.uMsg == WM_LBUTTONDOWN){wchar_t ss[12];InputBox(ss, 12, L"请输入电话");outtextxy(500, 205, ss);memcpy(s->stu[s->count].num, ss, 12);i++;//goto ab;}}else if (m.x < 800 && m.x>300 && m.y > 260 && m.y < 290){setlinecolor(RED);rectangle(295, 255, 805, 295);if (m.uMsg == WM_LBUTTONDOWN){wchar_t ss[20];InputBox(ss, 20, L"请输入住址");outtextxy(500, 265, ss);memcpy(s->stu[s->count].addr, ss, 20);i++;//goto ab;}}else if (m.x < 250 && m.x > 100 && m.y < 350 && m.y>320){setlinecolor(RED);rectangle(95, 315, 255, 355);if (m.uMsg == WM_LBUTTONDOWN){i++;goto abcd;}}else{setlinecolor(WHITE);rectangle(295, 15, 805, 55);rectangle(295, 75, 805, 115);rectangle(295, 135, 805, 175);rectangle(295, 195, 805, 235);rectangle(295, 255, 805, 295);rectangle(95, 315, 255, 355);}}getchar();
abcd:;if (i == 6){s->count++;HWND hnd=GetHWnd();SetWindowText(hnd, L"Add");MessageBox(hnd, L"添加成功",L"提示", MB_OKCANCEL);}else{HWND hnd = GetHWnd();SetWindowText(hnd, L"Add");MessageBox(hnd, L"添加失败", L"提示", MB_OKCANCEL);}}

2、功能实现 

1.绘图

先绘制处窗口与增加联系人信息的对应窗口

2.实现窗口

使用鼠标函数操作,进行条件判断,如果在指定区域有点击就执行相应的功能

如点击姓名后空区域,就执行输入姓名操作,如点击返回后,进行判断是否输

出成功并返回到主界面

3.输入联系人信息与信息录入数组实现

在界面输入信息使用Easyx库里InputBox函数

录入到数组:使用memcpy函数实现拷贝录入

3、录入后信息去向

录入后信息存入数组,在程序结束时会存储到对应文件中

七、其他模块

1、查找(sea函数)

 1.代码

#include"easyx.h"void search(M* s)
{MOUSEMSG m;initgraph(1024, 640);setbkcolor(WHITE);             //设置背景颜色白色cleardevice();IMAGE mm;                     //加载背景loadimage(&mm, L"ooo.jpg", 1024, 640);putimage(0, 0, &mm);setfillcolor(LIGHTBLUE);      //设置填充颜色fillrectangle(100, 30, 300, 60);//姓名fillrectangle(100, 500, 200, 530);//返回fillrectangle(100, 90, 300, 120);//年龄fillrectangle(100, 150, 300, 180);//电话查找fillrectangle(100, 210, 300, 240);//地址fillrectangle(330, 30, 430, 60);//姓名fillrectangle(450, 30, 550, 60);//年龄fillrectangle(600, 30, 700, 60);//性别fillrectangle(750, 30, 850, 60);//电话fillrectangle(900, 30, 1000, 60);//住址settextstyle(20, 0, L"宋体");   //设置文字形式setbkmode(TRANSPARENT);        //透明文字outtextxy(150, 35, L"按姓名查找");outtextxy(150, 95, L"按年龄查找");outtextxy(150, 155, L"按电话查找");outtextxy(150, 215, L"按地址查找");outtextxy(120, 510, L"返   回");outtextxy(340, 34, L"姓   名");outtextxy(470, 34, L"年   龄");outtextxy(620, 34, L"性   别");outtextxy(770, 34, L"电   话");outtextxy(920, 34, L"住   址");while (1){m = GetMouseMsg();if (m.x < 300 && m.x>100 && m.y > 500 && m.y < 530){setlinecolor(RED);rectangle(95, 495, 205, 535);if (m.uMsg == WM_LBUTTONDOWN){goto ff;}}else if (m.x>100&&m.x<300&&m.y>30&&m.y<60){setlinecolor(RED);rectangle(95, 25, 305, 65);if (m.uMsg == WM_LBUTTONDOWN){//按姓名查找wchar_t ss[Namenum];InputBox(ss, Namenum, L"请输入姓名");int x = 65;int f = 0;for (int i = 0; i < s->count; i++){if (memcmp(ss, s->stu[i].name, Namenum)==0){settextcolor(RED);settextstyle(20, 0, L"宋体");   //设置文字形式setbkmode(TRANSPARENT);outtextxy(335, x, s->stu[i].name);outtextxy(455, x, s->stu[i].age);outtextxy(605, x, s->stu[i].sex);outtextxy(755, x, s->stu[i].num);outtextxy(905, x, s->stu[i].addr);f = 1;x += 10;}}if (f == 0){HWND hnd = GetHWnd();SetWindowText(hnd, L"Add");MessageBox(hnd, L"查无此人", L"警告", MB_OKCANCEL);}}}else if (m.x>100&&m.x<300&&m.y>90&&m.y<2*60){setlinecolor(RED);rectangle(95, 85, 305, 125);if (m.uMsg == WM_LBUTTONDOWN){//按年龄查找wchar_t ss[Agenum];InputBox(ss, Agenum, L"请输入年龄");int x = 65;int f = 0;for (int i = 0; i < s->count; i++){if (memcmp(ss, s->stu[i].age, Agenum) == 0){settextcolor(RED);settextstyle(20, 0, L"宋体");   //设置文字形式setbkmode(TRANSPARENT);outtextxy(335, x, s->stu[i].name);outtextxy(455, x, s->stu[i].age);outtextxy(605, x, s->stu[i].sex);outtextxy(755, x, s->stu[i].num);outtextxy(905, x, s->stu[i].addr);f = 1;x += 10;}}if (f == 0){HWND hnd = GetHWnd();SetWindowText(hnd, L"Add");MessageBox(hnd, L"查无此人", L"警告", MB_OKCANCEL);}}}else if (m.x > 100 && m.x < 300 && m.y>150 && m.y < 180){setlinecolor(RED);rectangle(95, 145, 305, 185);if (m.uMsg == WM_LBUTTONDOWN){//按电话查找wchar_t ss[Callnum];InputBox(ss, Callnum, L"请输入电话");int x = 65;int f = 0;for (int i = 0; i < s->count; i++){if (memcmp(ss, s->stu[i].num, Callnum) == 0){settextcolor(RED);settextstyle(20, 0, L"宋体");   //设置文字形式setbkmode(TRANSPARENT);outtextxy(335, x, s->stu[i].name);outtextxy(455, x, s->stu[i].age);outtextxy(605, x, s->stu[i].sex);outtextxy(755, x, s->stu[i].num);outtextxy(905, x, s->stu[i].addr);f = 2;x += 10;}}if (f == 0){HWND hnd = GetHWnd();SetWindowText(hnd, L"Add");MessageBox(hnd, L"查无此人", L"警告", MB_OKCANCEL);}}}else if (m.x > 100 && m.x < 300 && m.y>210 && m.y < 240){setlinecolor(RED);rectangle(95, 205, 305, 245);if (m.uMsg == WM_LBUTTONDOWN){//按地址查找wchar_t ss[Addrnum];InputBox(ss, Addrnum, L"请输入地址");int x = 65;int f = 0;for (int i = 0; i < s->count; i++){if (memcmp(ss, s->stu[i].addr, Addrnum) == 0){settextcolor(RED);settextstyle(20, 0, L"宋体");   //设置文字形式setbkmode(TRANSPARENT);outtextxy(335, x, s->stu[i].name);outtextxy(455, x, s->stu[i].age);outtextxy(605, x, s->stu[i].sex);outtextxy(755, x, s->stu[i].num);outtextxy(905, x, s->stu[i].addr);x += 10;}}if (f == 0){HWND hnd = GetHWnd();SetWindowText(hnd, L"Add");MessageBox(hnd, L"查无此人", L"警告", MB_OKCANCEL);}}}else{setlinecolor(WHITE);rectangle(95, 495, 205, 535);rectangle(95, 25, 305, 65);rectangle(95, 85, 305, 125);rectangle(95, 145, 305, 185);rectangle(95, 205, 305, 245);}}getchar();
ff:;
}

2.功能

该模块实现了按姓名查找,按年龄查找等如果没有查找到就会弹出查无此人如果有就输出

 2、删除(del)

1.代码

#include"easyx.h"void del(M* s)
{MOUSEMSG m;initgraph(1024, 640);setbkcolor(WHITE);             //设置背景颜色白色cleardevice();IMAGE mm;                     //加载背景loadimage(&mm, L"ooo.jpg", 1024, 640);putimage(0, 0, &mm);setfillcolor(LIGHTBLUE);      //设置填充颜色fillrectangle(100, 30, 300, 60);//姓名fillrectangle(100, 500, 200, 530);//返回settextstyle(20, 0, L"宋体");   //设置文字形式setbkmode(TRANSPARENT);        //透明文字outtextxy(120, 510, L"返   回");outtextxy(150, 35, L"删除人姓名");while (1){m = GetMouseMsg();if (m.x < 300 && m.x>100 && m.y > 500 && m.y < 530){setlinecolor(RED);rectangle(95, 495, 205, 535);if (m.uMsg == WM_LBUTTONDOWN){goto ff1;}}else if (m.x > 100 && m.x < 300 && m.y>30 && m.y < 60){setlinecolor(RED);rectangle(95, 25, 305, 65);if (m.uMsg == WM_LBUTTONDOWN){wchar_t ss[Namenum];InputBox(ss, Namenum, L"请输入姓名");int f = 0,k=0;for (int i = 0; i < s->count; i++){if (memcmp(ss, s->stu[i].name, Namenum) == 0){k = i;f = 1;}}if (f == 0){HWND hnd = GetHWnd();SetWindowText(hnd, L"Add");MessageBox(hnd, L"查无此人", L"警告", MB_OKCANCEL);}else{for (int i = k; i < s->count-1; i++){s->stu[i] = s->stu[i + 1];}s->count--;HWND hnd = GetHWnd();SetWindowText(hnd, L"Add");MessageBox(hnd, L"删除成功", L"提示", MB_OKCANCEL);}}}else{setlinecolor(WHITE);rectangle(95, 495, 205, 535);rectangle(95, 25, 305, 65);}}getchar();
ff1:;
}

2.功能

由于灭有优化,比较简陋,所以此模块仅有输入姓名删除,如果删除成功则弹窗删除成功,如果没有就弹出查无此人

3、其他模块

1.输出函数(print)

该模块后期可加入按不同的信息排序打印的按钮,目前界面只黑色,可换成表格

 2.录入文件(Writetxt)

void Writetxt(M* s)
{FILE* pf = fopen("contact.txt", "wb");if (pf == NULL){perror("fopen");HWND hnd = GetHWnd();SetWindowText(hnd, L"Add");MessageBox(hnd, L"导入失败", L"警告", MB_OKCANCEL);return;}for (int i = 0; i < s->count; i++){fwrite(s->stu+i, sizeof(S), 1, pf);}fclose(pf);pf = NULL;
}

在退出文件时将数组中所有的联系人信息存入文件 


http://www.ppmy.cn/news/307496.html

相关文章

AIX 7.1查看硬件配置信息 查看端口IBM POWER 750 P750

查看CPU 型号 host01:/home/oracle$lsattr -El proc0 frequency 3500000000 Processor Speed False smt_enabled true Processor SMT enabled False smt_threads 4 Processor SMT threads False state enable Processor sta…

K-Means聚类实验报告实例

1.实验背景与问题提出 PS&#xff1a;寒假接高数辅导&#xff0c;操作系统辅导&#xff0c;数据结构辅导&#xff0c;有需要者评论或私信 聚类&#xff08;clustering&#xff09;是无监督学习&#xff08;unsuperviserd learning&#xff09;中研究和应用最多的一类学习算法&a…

数据挖掘十大算法(二):K-means聚类算法原理与实现

参考&#xff1a; 1.机器学习-KMeans聚类 K值以及初始类簇中心点的选取 2.K-Means算法的研究分析及改进 一、K-means算法原理 K-means算法是最常用的一种聚类算法。算法的输入为一个样本集&#xff08;或者称为点集&#xff09;&#xff0c;通过该算法可以将样本进行聚类&am…

C10K问题

是时候让 Web 服务器同时处理一万客户端了&#xff0c;你不觉得吗&#xff1f;毕竟&#xff0c;现在的 Web 是一个大地盘了。 并且&#xff0c;计算机也是一样的大。 你可以花 $1200 左右购买一台 1000MHz&#xff0c;2Gb RAM 和一块 1000Mbit/s 以太网卡的机器。我们来看看—…

MicroPython移植到STM32H750

Micropython移植到STM32H750 tb上买了块stm32h750vbt6的核心板&#xff0c;想折腾一下&#xff0c;正好最近在学python&#xff0c;于是尝试在这块板子上移植一下micropython。然而官方貌似还没支持H750系列&#xff0c;那就自己整。话不多说&#xff0c;开始干活。 首先板子…

k-means 聚类算法

文章目录 k-means 聚类算法一、原理二、python实现聚类分析三、sklearn实现聚类分析四、 K-means算法优缺点 参考&#xff1a; 数据挖掘十大算法&#xff08;二&#xff09;&#xff1a;K-means聚类算法原理与实现 K-means聚类分析算法原理、改进及实现 k-means 聚类算法 一…

Git、Github、Gitee的区别

⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;Git 目录 1、Git2、Gitee3、GitHub 什么是版本管理&#xff1f;   版本管理是管理各个不同的版本&#xff0c;出了问题可以及时回滚。 1、Git Git是一个分布式版本控制系统&#xff0c;用于跟踪和管理代码的变化。它是…

【Python】Python进阶系列教程-- Python3 网络编程(五)

文章目录 前言什么是 Socket?socket()函数参数 Socket 对象(内建)方法服务器端套接字客户端套接字公共用途的套接字函数 简单实例服务端客户端 Python Internet 模块 前言 往期回顾&#xff1a; Python进阶系列教程-- Python3 正则表达式&#xff08;一&#xff09;Python进…