(超详细)基于动态顺序表实现简单的通讯录项目
前言:
我们在上一章节用c语言实现了线性表中的的动态顺序表,那么顺序表就只是顺序表吗?当然不是,使用顺序表结构可以实现很多项目,许多项目的数据结构都会用到顺序表,本章节我们就要使用顺序表实现一个简易的通讯录项目。
准备
由于我们的通讯录是基于动态顺序表实现的,所以我们实现这个项目会用到动态顺序表的底层代码。在动态顺序表中有三个文件,分别是头文件代码SeqList.h文件,包含项目实现代码SeqList文件,和测试文件test.c文件,我们要在此基础上增加两个文件实现通讯录,分别是包含头文件的Contact.h文件,和实现代码的Contact.c文件:
在上一期的顺序表中,我们用一个结构体代表顺序表,而里面的arr数组负责存储数据,但是它内部存储的数据都是内置类型,如int,char类型的数据,所以比较简单。在这一期,我们要使用这个数组存储自定义类型,每个自定义类型都存储了一个联系人的信息,这样我们的顺序表就开始变得复杂了起来:
通讯录实现
我们说顺序表里存储的不再是内置类型,而是自定义类型,那么是怎样实现的呢?我们使用一个结构体,在它内部我们定义一个人的名字,性别,年龄,电话号码,家庭地址等信息使用数组存储,为了方便更改数组的长度,使用#define定义几个常量作为它们的数组长度,这个结构体我们将它命名为ConPeoInfo,为了方便使用,我们用typedef将它改名为Info:
#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100typedef struct ConPeoInfo
{char name[NAME_MAX];char gender[GENDER_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}Info;
定了好了自定义类型后我们只需要将需要实现的方法一一实现即可。
通讯录初始化和销毁
通讯录的初始化和销毁我们可以直接调用我们之前在顺序表的初始化方法,所以它们实现起来非常的简单。
通讯录初始化:
void ContactInit(Contact* con)
{assert(con);SeqInit(con);
}//初始化
通讯录销毁:
void ContactDestroy(Contact* con)
{SeqDestroy(con);
}//销毁
在这里我们提一下Contact类型就是SL类型,也就是顺序表类型。那么为什么要将它改名为Contact呢?contact的中文翻译为联系人,而SL也许放在通讯录代码中多数人都不认识,只会认为它是一个顺序表,所以为了让代码的辨识度更高,我们利用前置声明将SeqList类型改为了Contact类型:
typedef struct SeqList Contact;
//前置声明
添加联系人 :
添加联系人是通讯录中最基本的功能。我们用一个Info类型的变量去接收我们要添加的联系人信息,再使用顺序表中的尾插方法将这个变量插入通讯录中:
void ContactAdd(Contact* con)
{Info cpi;printf("请输入要添加的姓名:\n");scanf("%s", cpi.name);printf("请输入要添加的性别:\n");scanf("%s", cpi.gender);printf("请输入要添加的年龄:\n");scanf("%d", &cpi.age);printf("请输入要添加的电话:\n");scanf("%s", cpi.tel);printf("请输入要添加的地址:\n");scanf("%s", cpi.addr);SeqPushBack(con, cpi);}//添加联系人
当然我们也可以使用其他插入方法,如头插,指定位置插入。
删除联系人与通过姓名查找:
有添加就会有删除,删除联系人我们可以先通过查找联系人姓名来确定有没有这个人的信息,如果没有就输出没有这个联系人,如果有我们就将找到的联系人所在的下标返回,然后将这个下标的信息删除。
通过姓名查找联系人:
int FindByName(Contact* con, char name[])
{int i = 0;for (i = 0; i < con->size; i++){if (strcmp(con->arr[i].name, name) == 0){return i;}}return -1;
}
删除联系人:
void ContactDel(Contact* con)
{char name[NAME_MAX];printf("请输入要删除的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("没有要删除的联系人数据!\n");return;}SLErase(con, find);printf("删除成功!\n");
}//删除
删除联系人我们使用了顺序表中的指定位置删除,因为我们返回的下标就是我们要删除的联系人所在的下标,所以这里我们只能使用指定位置删除这个方法。
修改联系人信息:
修改联系人我们同样采用查找联系人姓名的方法先确定有没有我们要修改的联系人信息,如果没有就无法修改,如果有我们才执行修改操作,而修改操作与添加操作相似:
void ContactMorify(Contact* con)
{char name[NAME_MAX];printf("请输入要修改的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("通讯录中没有要修改的联系人信息!\n");return;}printf("请输入新的姓名:\n");scanf("%s", con->arr[find].name);printf("请输入新的性别:\n");scanf("%s", con->arr[find].gender);printf("请输入新的年龄:\n");scanf("%d", &con->arr[find].age);printf("请输入新的电话:\n");scanf("%s",con->arr[find].tel);printf("请输入新的地址:\n");scanf("%s",con->arr[find].addr);printf("修改成功!\n");}//修改
查找联系人 :
查找联系人则比较简单,我们同样使用查找联系人姓名的方法去确定有没有这个联系人,如果有我们就把这个联系人的信息全部打印出来:
void ContactFind(Contact* con)
{char name[NAME_MAX];printf("请输入要查找的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要查找的联系人的数据不存在!\n");return;}printf("%5s %5s %5s %5s %5s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%s %s %d %s %s\n", con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);
}
展示所有联系人信息:
当我们要查看所有联系人信息时,我们就可以使用这个方法,这个方法也比较简单,我们只需要将整个顺序表遍历一遍并将每个联系人的信息全部打印出来:
void ContactShow(Contact* con)
{int i = 0;printf("%5s %5s %5s %5s %5s\n", "姓名", "性别", "年龄", "电话", "地址");for (i = 0; i < con->size; i++){printf("%s %s %d %s %s\n", con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}//所有联系人
测试通讯录:
当实现了这些方法之后,我们就可以实现通讯录的界面了,创建一个菜单函数,我们可以用指定数字来表示我们要执行的操作,比如我们要添加联系人,我们按数字1就可以开始添加联系人:
void menu()
{printf("*************通讯录************\n");printf("****1.添加联系人 2.删除联系人**\n");printf("****3.查找联系人 4.修改联系人**\n");printf("****5.全部联系人 0.退出********\n");printf("*******************************\n");}
我们来看一下菜单:
菜单里的输入数字执行操作的功能我们使用switch语句实现:
int main()
{Contact con;int op = -1;ContactInit(&con);do{menu();printf("请选择您要进行的操作:\n");scanf("%d", &op);switch (op){case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactFind(&con);break;case 4:ContactMorify(&con);break;case 5:ContactShow(&con);break;default:printf("输入错误,请重新输入!\n");break;}} while (op != 0);ContactDestroy(&con);//ContactTest01();return 0;
}
到这里我们通讯录所有的代码就已经实现完成了,我们来测试一下吧:
通过测试发现我们的方法都没有什么问题,我将代码放在下面 感兴趣的小伙伴可以试一下哦。
Contact.h :
#pragma once
typedef struct SeqList Contact;
//前置声明#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100typedef struct ConPeoInfo
{char name[NAME_MAX];char gender[GENDER_MAX];int age;char tel[TEL_MAX];char addr[ADDR_MAX];
}Info;//初始化
void ContactInit(Contact* con);
void ContactAdd(Contact* con);//添加
void ContactDel(Contact* con);//删除
void ContactMorify(Contact* con);//修改void ContactFind(Contact* con);//查找
void ContactShow(Contact* con);//展示
//销毁
void ContactDestroy(Contact* con);
SeqList.h :
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"Contact.h"typedef struct ConPeoInfo SLDataType;
typedef struct SeqList
{SLDataType* arr;int size;//有效数据int capacity;//空间大小}SL;void SeqInit(SL* ps);//初始化void SeqDestroy(SL* ps);//销毁void SeqPushBack(SL* ps, SLDataType x);//尾插void SeqPushFront(SL* ps, SLDataType x);//头插void SeqPopBack(SL* ps);//尾删void SeqPopBack(SL* ps);//头删void SeqPrint(SL* ps);//打印void SLErase(SL* ps, int pos);//指定删除int SLFind(SL* ps, SLDataType x);//查找数据//指定下标前插入数据
void SLInsert(SL* ps, int pop, SLDataType x);
SeqList.c :
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"void SeqInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}//初始化void SeqCheckcapa(SL* ps)//检查内存够不够,不够则增加
{assert(ps);if (ps->capacity == ps->size){int Newcapecity = ps->capacity == 0 ? 4 : 2 * ps->capacity * sizeof(SLDataType);SLDataType* tem = (SLDataType*)realloc(ps->arr, Newcapecity * sizeof(SLDataType));if (tem != NULL){ps->arr = tem;}}
}void SeqPushBack(SL* ps, SLDataType x)
{assert(ps);SeqCheckcapa(ps);ps->arr[ps->size++] = x;}//尾插void SeqPushFront(SL* ps, SLDataType x)
{assert(ps);SeqCheckcapa(ps);int i = 0;for (i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x;++ps->size;
}//头插void SeqPopBack(SL* ps)
{assert(ps);assert(ps->size >= 0);ps->size--;
}//尾删void SeqPopFront(SL* ps)
{assert(ps);assert(ps->size >= 0);int i = 0;for (i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;}//头删void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SeqCheckcapa(ps);int i = 0;for (i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;++ps->size;}//指定下标前插入数据void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int i = 0;for (i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}//指定下标删除//int SLFind(SL* ps, SLDataType x)
//{
// assert(ps);
// int i = 0;
// for (i = 0; i < ps->size; i++)
// {
// if (ps->arr[i] == x)
// {
// return i;
// }
// }
// return -1;
//}//查找数据
//void SeqPrint(SL* ps)
//{
// assert(ps);
// int i = 0;
//
// for (i = 0; i < ps->size; i++)
// {
// printf("%d ", ps->arr[i]);
// }
// printf("\n");
//}//打印void SeqDestroy(SL* ps)
{assert(ps);free(ps->arr);if (ps->arr != NULL);{ps->arr = NULL;}ps->capacity = ps->size = 0;
}
//销毁
Contact.c :
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
#include"Contact.h"
#include<string.h>void ContactInit(Contact* con)
{assert(con);SeqInit(con);
}//初始化
int FindByName(Contact* con, char name[])
{int i = 0;for (i = 0; i < con->size; i++){if (strcmp(con->arr[i].name, name) == 0){return i;}}return -1;
}void ContactAdd(Contact* con)
{Info cpi;printf("请输入要添加的姓名:\n");scanf("%s", cpi.name);printf("请输入要添加的性别:\n");scanf("%s", cpi.gender);printf("请输入要添加的年龄:\n");scanf("%d", &cpi.age);printf("请输入要添加的电话:\n");scanf("%s", cpi.tel);printf("请输入要添加的地址:\n");scanf("%s", cpi.addr);SeqPushBack(con, cpi);}//添加联系人void ContactDel(Contact* con)
{char name[NAME_MAX];printf("请输入要删除的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("没有要删除的联系人数据!\n");return;}SLErase(con, find);printf("删除成功!\n");
}//删除void ContactMorify(Contact* con)
{char name[NAME_MAX];printf("请输入要修改的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("通讯录中没有要修改的联系人信息!\n");return;}printf("请输入新的姓名:\n");scanf("%s", con->arr[find].name);printf("请输入新的性别:\n");scanf("%s", con->arr[find].gender);printf("请输入新的年龄:\n");scanf("%d", &con->arr[find].age);printf("请输入新的电话:\n");scanf("%s",con->arr[find].tel);printf("请输入新的地址:\n");scanf("%s",con->arr[find].addr);printf("修改成功!\n");}//修改
void ContactFind(Contact* con)
{char name[NAME_MAX];printf("请输入要查找的联系人姓名:\n");scanf("%s", name);int find = FindByName(con, name);if (find < 0){printf("要查找的联系人的数据不存在!\n");return;}printf("%5s %5s %5s %5s %5s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%s %s %d %s %s\n", con->arr[find].name,con->arr[find].gender,con->arr[find].age,con->arr[find].tel,con->arr[find].addr);
}
void ContactShow(Contact* con)
{int i = 0;printf("%5s %5s %5s %5s %5s\n", "姓名", "性别", "年龄", "电话", "地址");for (i = 0; i < con->size; i++){printf("%s %s %d %s %s\n", con->arr[i].name,con->arr[i].gender,con->arr[i].age,con->arr[i].tel,con->arr[i].addr);}
}//所有联系人
void ContactDestroy(Contact* con)
{SeqDestroy(con);
}//销毁
test.c :
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
#include"Contact.h"
void menu()
{printf("*************通讯录************\n");printf("****1.添加联系人 2.删除联系人**\n");printf("****3.查找联系人 4.修改联系人**\n");printf("****5.全部联系人 0.退出********\n");printf("*******************************\n");}
int main()
{Contact con;int op = -1;ContactInit(&con);do{menu();printf("请选择您要进行的操作:\n");scanf("%d", &op);switch (op){case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactFind(&con);break;case 4:ContactMorify(&con);break;case 5:ContactShow(&con);break;default:printf("输入错误,请重新输入!\n");break;}} while (op != 0);ContactDestroy(&con);//ContactTest01();return 0;
}
相关文章:
(超详细)基于动态顺序表实现简单的通讯录项目
前言: 我们在上一章节用c语言实现了线性表中的的动态顺序表,那么顺序表就只是顺序表吗?当然不是,使用顺序表结构可以实现很多项目,许多项目的数据结构都会用到顺序表,本章节我们就要使用顺序表实现一个简易…...
修改SubVI的LabVIEW默认搜索路径
在启动顶级VI后,LabVIEW可能会遇到找不到subVI的情况。这通常是由于subVI的路径发生了变化或没有被正确配置。 LabVIEW默认搜索路径 默认情况下,LabVIEW会按以下顺序搜索文件位置(*表示LabVIEW将搜索子目录): <t…...
基于python深度学习的CNN图像识别鲜花-含数据集+pyqt界面
代码下载: https://download.csdn.net/download/qq_34904125/89383615 本代码是基于python pytorch环境安装的。 下载本代码后,有个requirement.txt文本,里面介绍了如何安装环境,环境需要自行配置。 或可直接参考下面博文进行…...
第九站:Java黑——安全编码的坚固防线(第②篇)
4. 验证和过滤输入数据示例:使用Apache Commons Lang 对输入数据进行验证和过滤是防止多种安全漏洞的关键步骤,包括但不限于SQL注入和命令注入。Apache Commons Lang库提供了一些实用方法来帮助进行字符串操作和验证。以下是一个简单的示例,…...
如何优雅的删除正式环境中的大表
引起 MySQL 数据库性能抖动的原因有很多,比如大事务、定时批量查询等,而这些原因我们一般都会注意到。但是,有一个引起性能抖动的原因却经常被我们忽视,那就是在生产环境删除无用的大表,即 DROP TABLE。 一、为什么要 DROP TABLE? 生产环境中,为什么要 DROP TABLE?相…...
Vulnhub-DC-1,7
靶机IP:192.168.20.141 kaliIP:192.168.20.128 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) 前言 1和7都是Drupal的网站,只写了7,包含1的知识点 信息收集 用nmap扫描端口及版本号 进入主页查看作者给的提示,不是暴力破解的…...
使用MySQL全文索引实现高效搜索功能
MySQL全文索引是MySQL提供的一种高效的搜索功能,可以快速地搜索文本内容。全文索引可以用于搜索大量文本数据,通常应用在文章、博客、论坛等需要搜索的场景中。 什么是MySQL全文索引 MySQL全文索引是一种用于快速搜索文本内容的索引技术。它可以在存储和…...
数据结构学习笔记-图
1.图的存储 (1)邻接矩阵法 #define MaxVertexNum 100 //顶点数目的最大值 typedef struct{char Vex[MaxVertexNum]; //顶点表int Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵表,边表int vexnum,arcnum; //图的当前顶点数和边…...
【归并排序】| 详解归并排序核心代码之合并两个有序数组 力扣88
🎗️ 主页:小夜时雨 🎗️专栏:动态规划 🎗️如何活着,是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/merge-sorted-array/description/ 本道题是归并排序的…...
51单片机STC89C52RC——2.3 两个独立按键模拟控制LED流水灯方向
目的 按下K1键LED流水向左移动 按下K2键LED流水向右移动 一,STC单片机模块 二,独立按键 2.1 独立按键位置 2.2 独立按键电路图 这里要注意一个设计的bug P3_1 引脚对应是K1 P3_0 引脚对应是K2 要实现按一下点亮、再按一下熄灭,我们就需…...
Neo4j连接
终端输入: neo4j console 浏览器访问:http://localhost:7474/ 输入用户名和密码:neo4j, 梦想密码(首次neo4j) 代码连接用新的服务器地址: g Graph(neo4j://localhost:7687, auth(neo4j, ))…...
List 列表
文章目录 一、什么是 List 列表1.1 创建 List 列表的方式1.2 列表的新增函数方法1.3 列表的删除函数方法1.4 修改列表数据的方法1.5 列表的查询函数方法1.6 列表的排序和反序1.7 列表的复制 一、什么是 List 列表 List 列表:该数据类型定义的变量可以理解为是一个数…...
nginx ws长连接配置
nginx ws长连接配置 http根节点下配上 map $http_upgrade $connection_upgrade {default upgrade; close;}如下: server服务节点下,后端接口的代理配置 proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connec…...
Windows下访问wsl的数据
Windows下访问wsl的数据 有些人感受到的是雨,而很多人感受到的只有淋湿。 Windows下的wsl说实话还是挺不错的,对于开发而言,效果相当的可以。 比如在某个文件夹,Windows编辑好代码后,直接右键打开wsl,就可…...
机器学习笔记 - 用于3D数据分类、分割的Point Net简述
一、简述 在本文中,我们将了解Point Net,目前,处理图像数据的方法有很多。从传统的计算机视觉方法到使用卷积神经网络到Transformer方法,几乎任何 2D 图像应用都会有某种现有的方法。然而,当涉及到 3D 数据时,现成的工具和方法并不那么丰富。3D 空间中一个工具就是Point …...
vscode 连接 GitHub
目录 vscode连接github一、解决 github 登录问题二、通过 SSH 连接 github1、只有一个 git 账号2、切换 git 账号3、在两个账号之间切换 vscode 连接 gitee一、通过 HTTPS 连接二、通过 SSH 连接 vscode连接github 在 vscode 中首次使用 git push 命令时会要求输入 github 账户…...
集合java
1.集合 ArrayList 集合和数组的优势对比: 长度可变 添加数据的时候不需要考虑索引,默认将数据添加到末尾 package com.itheima;import java.util.ArrayList;/*public boolean add(要添加的元素) | 将指定的元素追加到此集合的末尾 | | p…...
智能体(Agent)实战——从gpts到auto gen
一.GPTs 智能体以大模型作为大脑,同时配备技能,使其能够完成具体的任务。同时,为了应用于垂直领域,我们需要为大模型定义一个角色,并构建知识库。最后,定义完整的流程,使其完成整个任务。以组会…...
PyTorch 张量数据类型
【数据类型】Python 与 PyTorch 常见数据类型对应: 用 a.type() 获取数据类型,用 isinstance(a, 目标类型) 进行类型合法化检测 >>> import torch >>> a torch.randn(2,3) >>> a tensor([[-1.7818, -0.2472, -2.0684],[ 0.…...
奇思妙想-可以通过图片闻见味道的设计
奇思妙想-可以通过图片闻见味道的设计 偷闲半日享清闲,炭火烧烤乐无边。肉串飘香引客至,笑语欢声绕云间。人生难得几回醉,且把烦恼抛九天。今宵共饮开怀酒,改日再战新篇章。周四的傍晚,难得的闲暇时光让我与几位挚友相…...
装饰者模式(设计模式)
装饰模式就是对一个类进行装饰,增强其方法行为,在装饰模式中,作为原来的这个类使用者还不应该感受到装饰前与装饰后有什么不同,否则就破坏了原有类的结构了,所以装饰器模式要做到对被装饰类的使用者透明,这…...
ADB调试命令大全
目录 前言命令大全1.显示当前运行的全部模拟器:adb devices2.启动ADB: adb start-server3.停止ADB: adb kill-server4.安装应用程序: adb install -r [apk文件]5.卸载应用程序: adb uninstall [packagename]6.将手机设备中的文件copy到本地计…...
查看npm版本异常,更新nvm版本解决问题
首先说说遇见的问题,基本上把nvm,npm的坑都排了一遍 nvm版本导致npm install报错 Unexpected token ‘.‘install和查看node版本都正确,结果查看npm版本时候报错 首先就是降低node版本… 可以说基本没用,如果要降低版本的话&…...
计算机行业
计算机行业环境分析 2022.01.12 计算机行业环境分析 计算机专业就业前景 随着科技的进步和信息事业的发展,尤其是计算机技术的发展与网络应用的逐渐普及。计算机已成为人们工作和生活中不可缺少的东西。IT行业迅猛发展,就业工作岗位也比比皆是。在最近…...
各种机器学习算法的应用场景分别是什么(比如朴素贝叶斯、决策树、K 近邻、SVM、逻辑回归最大熵模型)?
2023简直被人工智能相关话题席卷的一年。关于机器学习算法的热度,也再次飙升,网络上一些分享已经比较老了。那么今天借着查询和学习的机会,我也来浅浅分享下目前各种机器学习算法及其应用场景。 为了方便非专业的朋友阅读,我会从算…...
SQLite JDBC驱动程序
SQLite JDBC驱动程序下载地址: 下载地址...
Postgre 调优工具pgBadger部署
一,简介: pgBadger(日志分析器)类似于oracle的AWR报告(基于1小时,一天,一周,一月的报告),以图形化的方式帮助DBA更方便的找到隐含问题。 pgbadger是为了提高…...
【云原生】Kubernetes----Helm包管理器
目录 引言 一、Helm概述 1.Helm价值概述 2.Helm的基本概念 3.Helm名词介绍 二、安装Helm 1.下载二进制包 2.部署Helm环境 3.添加补全信息 三、使用Helm部署服务 1.创建chart 2.查看文件信息 3.安装chart 4.卸载chart 5.自定义chart服务部署 6.版本升级 7.版本…...
Bootstrap 5 进度条
Bootstrap 5 进度条 引言 Bootstrap 5 是目前最流行的前端框架之一,它提供了一套丰富的组件和工具,帮助开发者快速构建响应式、移动设备优先的网页。在本文中,我们将重点探讨 Bootstrap 5 中的进度条组件,包括其基本用法、定制选…...
MySQL查询数据库中所有表名表结构及注释以及生成数据库文档
MySQL查询数据库中所有表名表结构及注释 生成数据库文档在后面!!! select t.TABLE_COMMENT -- 数据表注释 , c.TABLE_NAME -- 表名称 , c.COLUMN_COMMENT -- 数据项 , c.COLUMN_NAME -- 英文名称 , -- 字段描述 , upper(c.DATA_TYPE) as …...
建设银行手机银行网站登录/网站优化要做哪些
1、模式定义规格模式是组合模式的一种扩展,在框架性开发中使用较多(项目级开发很少使用),这里做一个简单的介绍。规格模式(Specification)可以认为是组合模式的一种扩展。有时项目中某些条件决定了业务逻辑,这些条件就可以抽离出来以某种关系…...
四川省住房和城乡建设厅网站下载/今日头条新闻
前言 某日需要针对某个输入框做自动补全,但是后来发现输入一个汉字输入几个英文字母的时候也会因为敲入每个英文都会触发事件一次,这种方式非常不好,对服务端的压力太大了,于是这里做一下处理。 截图 解决方案 思路,…...
做设计的地图网站/网站怎样优化文章关键词
ZMQ (以下 ZeroMQ 简称 ZMQ)是一个简单好用的传输层,像框架一样的一个 socket library,他使得 Socket 编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ 的明确目标是“成为标准网络协议栈的…...
恋爱ppt模板免费下载网站/seo网站优化外包
http://www.cnblogs.com/sfger/p/3335672.html 原因是安装在有空格的目录下会出现以下错误: 经过头疼的排查后发现问题出现在:set diffexprMyDiff() 原来vim的自带的MyDiff函数有问题, 在_vimrc或.vimrc中找到下面代码: if &am…...
山东建设公司网站/360站长平台链接提交
先需求分析一下---传统的web应用是在线应用,这其实也是web的特色,对于PC时代问题并不大,但到了移动互联网时代,设备终端位置不再固定,依赖无线信号,网络的可靠性变得更低。比如:在火车上&#x…...
广州网站优化公司/关键词排名查询工具
“初入职场什么都不懂,天天追着职场前辈问东问西,还觉得理所应当。直到后来……我也成了公司老人,每一次的崩溃,都让我对曾经带我的师傅又多了一分理解。” 让很多“师傅”气到头秃、急到跳脚的不是“萌新”不萌,而是“…...