【C语言进阶(10)】通讯录管理系统

文章目录

  • Ⅰ 系统功能介绍
  • Ⅱ 系统前期准备
    • ⒈菜单功能
    • ⒉结构体设计
    • ⒊通讯录初始化
  • Ⅲ 系统功能实现
    • ⒈添加联系人
    • ⒉删除联系人
    • ⒊查找联系人
    • ⒋修改联系人
    • ⒌显示联系人
    • ⒍排序联系人
    • ⒎清空联系人
  • Ⅳ 完整代码展示
    • ⒈test.c
    • ⒉contact.h
    • ⒊contact.c

Ⅰ 系统功能介绍

系统中需要实现的功能如下

  • 添加联系人:向通讯录中添加新人。
    • 信息包括(姓名、年龄、性别、电话、住址)最多能添加 100 人。
  • 删除联系人:按照姓名删除指定联系人信息。
  • 查找联系人:按照姓名查看指定联系人信息。
  • 修改联系人:按照姓名修改指定联系人信息。
  • 显示联系人:显示当前通讯录中所有联系人的信息。
  • 排序联系人:将联系人按照指定方式排序。
  • 清空联系人:清空通讯录中的所有信息。
    • 说白了就是将通讯录中得所有内容初始化为全 0.
  • 退出通讯录:退出当前所使用的通讯录。

Ⅱ 系统前期准备

⒈菜单功能

  • 提示用户有哪些功能选项。
void menu()
{printf("|------------------------|\n");printf("|***** 1.添加联系人 *****|\n");printf("|***** 2.删除联系人 *****|\n");printf("|***** 3.查找联系人 *****|\n");printf("|***** 4.修改联系人 *****|\n");printf("|***** 5.显示联系人 *****|\n");printf("|***** 6.排序联系人 *****|\n");printf("|***** 7.清空联系人 *****|\n");printf("|***** 0.退出通讯录 *****|\n");printf("|------------------------|\n");
}

⒉结构体设计

  • 像联系人这种有如此多属性的描述对象,不用犹豫直接用结构体将它定义为一个联系人类型。

1. 设计联系人类型

#define MAX			100		//联系人数组最大容量
#define MAX_NAME	20		//姓名成员的最大范围
#define MAX_SEX		10		//性别成员的最大范围
#define MAX_TELE	12		//电话成员的最大范围
#define MAX_ADDR	30		//住址成员的最大范围typedef struct PeoInfo		//存储联系人的信息
{char name[MAX_NAME];	//姓名int age;				//年龄char sex[MAX_SEX];		//性别char tele[MAX_TELE];	//电话char addr[MAX_ADDR];	//住址
}PeoInfo;					//PeoInfo 为自定义联系人类型
  • 再次重申:自定义的这个联系人类型他就是个类型,和 int、char 等其他类型没什么区别。.

2. 设计通讯录类型

  • 当前构建的通讯录需要存放 100 个联系人的信息,即构建一个拥有 100 个元素的联系人数组(通讯录)即可。
  • 在构建联系人数组(通讯录)时,还需要创建一个变量用来记录当前存储的联系人个数。
  • 不妨直接将(联系人数组和计数器)都归并到一个通讯录类型。
typedef struct Contact		//存储通讯录两个信息
{PeoInfo data[MAX];		//能存储 100 个联系人的联系人数组 (通讯录)int count;				//记录通讯录当前有几个人的信息
}Contact;					//自定义的通讯录类型

⒊通讯录初始化

  • 将通讯录的内的值全部初始化为 0。
  • 这一步非常关键,否则无法添加联系人信息。
  • 初始化通讯录就是清空通讯录

代码实现

void empty_contact(Contact* pc)		//清空通讯录(初始化通讯录)
{//将联系人数组(通讯录)内的所有信息初始化为 0assert(pc);pc->count = 0;memset(pc->data, 0, sizeof(pc->data));
}

Ⅲ 系统功能实现

⒈添加联系人

  • 增加联系人无非就是将信息添加到 con 里去,此时会修改 con 的值,所以需要传 con 的地址。

代码实现

void add_contact(Contact* pc)				//添加联系人
{assert(pc);if (MAX == pc->count)					//联系人数组存满了{printf("通讯录空间不足,无法录入\n");return;}printf("请输入姓名:");scanf("%s", pc->data[pc->count].name);	//name 是数组名,无需取地址printf("请输入年龄:");scanf("%d", &(pc->data[pc->count].age));printf("请输入性别:");scanf("%s", pc->data[pc->count].sex);printf("请输入电话:");scanf("%s", pc->data[pc->count].tele);printf("请输入住址:");scanf("%s", pc->data[pc->count].addr);pc->count++;							//当前通讯录内联系人个数 + 1printf("录入成功\n");system("pause");						//按任意键继续system("cls");							//清屏
}

⒉删除联系人

实现思路

  • 想要删除联系人首先就需要先找到这个联系人。
  • 所以此模块需要写两个函数。
    1. 找到指定联系人的下标。
    2. 删除指定联系人。

找到指定联系人

  • 该功能在(删除、查找、修改)联系人时都会用到
int find_by_name(const Contact* pc, char name[])
{//该函数在(删除、查找、修改)时需要使用assert(pc);for (int i = 0; i < pc->count; i++){if (!strcmp(pc->data[i].name, name)){return i;	//找到了就返回对应该联系人的对应下标}}return -1;			//找不到指定联系人就返回 -1
}

删除指定联系人

  • 将指定联系人后面的联系人在联系人数组中都往前挪一位即可。
void delete_contact(Contact* pc)			//删除联系人
{assert(pc);if (0 == pc->count)						//通讯录内得有元素可删{printf("通讯录为空\n");system("pause");system("cls");return;}int i = 0;char name[MAX_NAME] = { 0 };printf("请输入要删除的联系人:");scanf("%s", name);int pos = find_by_name(pc, name);		//1.找到指定联系人的下标if (-1 == pos){printf("没有指定联系人\n");system("pause");system("cls");return;}for (i = pos; i < pc->count - 1; i++)	//2.删除指定联系人	{pc->data[i] = pc->data[i + 1];}	pc->count--;							//通讯录当前人数 - 1printf("删除成功\n");system("pause");system("cls");
}

⒊查找联系人

实现思路

  • 根据名字找到指定联系人,然后将指定联系人的所有信息打印出来。

代码实现

void search_contact(const Contact* pc)		//查找联系人
{assert(pc);if (0 == pc->count)						//通讯录内得先有人可被查找{printf("通讯录为空\n");system("pause");system("cls");return;}char name[MAX_NAME] = { 0 };printf("请输入要查找的联系人:");scanf("%s", name);int pos = find_by_name(pc,name);		//找到指定联系人的位置if (-1 == pos){printf("没有指定联系人\n");system("pause");system("cls");return;}printf("姓名\t年龄\t性别\t电话\t住址\n");printf("%s\t%d\t%s\t%s\t%s\n",	pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);system("pause");system("cls");
}

⒋修改联系人

实现思路

  • 找到指定联系人的位置,然后将指定联系人的信息全部重新录入。

代码实现

void modif_contact(Contact* pc)			//修改联系人
{assert(pc);if (0 == pc->count)					//通讯录内得先有人可被修改{printf("通讯录为空\n");system("pause");system("cls");return;}char name[MAX_NAME] = { 0 };printf("请输入要修改的联系人:");scanf("%s", name);int pos = find_by_name(pc, name);	//找到指定联系人的位置if (-1 == pos)						//找不到联系人就结束掉函数{printf("没有指定联系人\n");system("pause");system("cls");return;}printf("请输入姓名:");				//找到了就将联系人的信息重新录入一遍scanf("%s", pc->data[pos].name);printf("请输入年龄:");scanf("%d", &(pc->data[pos].age));printf("请输入性别:");scanf("%s", pc->data[pos].sex);printf("请输入电话:");scanf("%s", pc->data[pos].tele);printf("请输入住址:");scanf("%s", pc->data[pos].addr);printf("修改成功\n");system("pause");system("cls");
}

⒌显示联系人

实现思路

  • 将联系人数组的内容从下标 0 的位置一直遍历到下标为 count 的位置。
  • 打印联系人数组内的联系人的全部信息。

代码实现

void show_contact(const Contact* pc)		//显示联系人
{assert(pc);if (0 == pc->count)						//通讯录内得先由东西可以展示{printf("通讯录为空\n");system("pause");					//按任意键继续system("cls");						//清屏return;}int i = 0;printf("姓名\t年龄\t性别\t电话\t住址\n");for (i = 0; i < pc->count; i++){printf("%s\t%d\t%s\t%s\t%s\n",	pc->data[i].name,pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);}system("pause");system("cls");	
}

⒍排序联系人

  • 可选择的排序方式有很多中,这里就选择按照名字的方式来排序。
  • 使用 qsort 函数来实现通讯录的排序。

比较函数

  • 这里就选择按照名字来比较了。
int cmp_by_name(const void* e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}

排序函数

void soft_contact(Contact* pc)		//排序联系人
{assert(pc);if (0 == pc->count)				//通讯录内得先有人可被排序{printf("通讯录为空\n");system("pause");system("cls");return;}qsort(pc->data, pc->count, sizeof(pc->data[0]), cmp_by_name);printf("排序成功\n");system("pause");system("cls");
}

⒎清空联系人

  • 将通讯录数组里面的信息全部初始化为 0 即可。
  • 说白了就是写一个初始化函数
void empty_contact(Contact* pc)		//清空联系人
{assert(pc);if (0 == pc->count)				//通讯录内得先有人可被清空{printf("通讯录已为空\n");system("pause");system("cls");return;}pc->count = 0;memset(pc->data, 0, sizeof(pc->data));system("pause");			//按任意键继续system("cls");				//清屏
}

Ⅳ 完整代码展示

⒈test.c

#include "contact.h"void menu()
{printf("|------------------------|\n");printf("|***** 1.添加联系人 *****|\n");printf("|***** 2.删除联系人 *****|\n");printf("|***** 3.查找联系人 *****|\n");printf("|***** 4.修改联系人 *****|\n");printf("|***** 5.显示联系人 *****|\n");printf("|***** 6.排序联系人 *****|\n");printf("|***** 7.清空联系人 *****|\n");printf("|***** 0.退出通讯录 *****|\n");printf("|------------------------|\n");
}int main()
{int input = 0;Contact con;		//通讯录init_contact(&con);	//初始化通讯录do {menu();printf("请选择要进行的操作:");scanf("%d", &input);switch (input){case 1:add_contact(&con); break;case 2:delete_contact(&con); break;case 3:search_contact(&con); break;case 4:modif_contact(&con); break;case 5:show_contact(&con); break;case 6:soft_contact(&con); break;case 7:empty_contact(&con); break;case 0:printf("已退出通讯录\n"); break;default:printf("选择错误,请重新输入\n"); break;}} while (input);return 0;
}

⒉contact.h

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>#define MAX			100		//联系人数组最大容量
#define MAX_NAME	20		//姓名成员的最大范围
#define MAX_SEX		10		//性别成员的最大范围
#define MAX_TELE	12		//电话成员的最大范围
#define MAX_ADDR	30		//住址成员的最大范围typedef struct PeoInfo		//自定义的联系人类型
{char name[MAX_NAME];	//姓名int age;				//年龄char sex[MAX_SEX];		//性别char tele[MAX_TELE];	//电话char addr[MAX_ADDR];	//住址
}PeoInfo;	typedef struct Contact		//存储通讯录两个信息
{PeoInfo data[MAX];		//能存储 100 个联系人信息的联系人数组 (通讯录)int count;				//记录通讯录当前有几个人的信息
}Contact;					//自定义的通讯录类型void init_contact(Contact* pc);			//初始化通讯录void add_contact(Contact* pc);			//添加联系人void delete_contact(Contact* pc);		//删除联系人void show_contact(const Contact* pc);	//显示联系人void search_contact(const Contact* pc);	//查找联系人void modif_contact(Contact* pc);		//修改联系人void soft_contact(Contact* pc);			//排序联系人void empty_contact(Contact* pc);		//清空联系人

⒊contact.c

#include "contact.h"//初始化通讯录
void init_contact(Contact* pc)		
{//将联系人数组(通讯录)内的所有信息初始化为 0assert(pc);pc->count = 0;memset(pc->data, 0, sizeof(pc->data));
}//添加联系人
void add_contact(Contact* pc)				
{assert(pc);if (MAX == pc->count)					//联系人数组存满了{printf("通讯录空间不足,无法录入\n");system("pause");system("cls");return;}printf("请输入姓名:");scanf("%s", pc->data[pc->count].name);	//name 是数组名,无需取地址printf("请输入年龄:");scanf("%d", &(pc->data[pc->count].age));printf("请输入性别:");scanf("%s", pc->data[pc->count].sex);printf("请输入电话:");scanf("%s", pc->data[pc->count].tele);printf("请输入住址:");scanf("%s", pc->data[pc->count].addr);pc->count++;							//当前通讯录内联系人个数 + 1printf("录入成功\n");system("pause");						//按任意键继续system("cls");							//清屏
}//显示联系人
void show_contact(const Contact* pc)		
{assert(pc);if (0 == pc->count)						//通讯录内得先由东西可以展示{printf("通讯录为空\n");system("pause");system("cls");return;}int i = 0;printf("姓名\t年龄\t性别\t电话\t住址\n");for (i = 0; i < pc->count; i++){printf("%s\t%d\t%s\t%s\t%s\n",	pc->data[i].name,pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);}system("pause");		//按任意键继续system("cls");			//清屏
}//寻找指定联系人的位置
int find_by_name(const Contact* pc, char name[])
{//该函数在(删除、查找、修改)时需要使用assert(pc);for (int i = 0; i < pc->count; i++){if (!strcmp(pc->data[i].name, name)){return i;//找到了就返回对应联系人的数组下标}}return -1;
}//删除联系人
void delete_contact(Contact* pc)			
{assert(pc);if (0 == pc->count)						//通讯录内得有元素可删{printf("通讯录为空\n");system("pause");system("cls");return;}int i = 0;char name[MAX_NAME] = { 0 };printf("请输入要删除的联系人:");scanf("%s", name);int pos = find_by_name(pc, name);		//1.找到指定联系人的下标if (-1 == pos){printf("没有指定联系人\n");system("pause");system("cls");return;}for (i = pos; i < pc->count - 1; i++)	//2.删除指定联系人	{pc->data[i] = pc->data[i + 1];}	pc->count--;							//通讯录当前人数 - 1printf("删除成功\n");system("pause");system("cls");
}//查找联系人
void search_contact(const Contact* pc)		
{assert(pc);if (0 == pc->count)						//通讯录内得先有人可被查找{printf("通讯录为空\n");system("pause");system("cls");return;}char name[MAX_NAME] = { 0 };printf("请输入要查找的联系人:");scanf("%s", name);int pos = find_by_name(pc,name);		//找到指定联系人的位置if (-1 == pos){printf("没有指定联系人\n");system("pause");system("cls");return;}printf("姓名\t年龄\t性别\t电话\t住址\n");printf("%s\t%d\t%s\t%s\t%s\n",	pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);system("pause");system("cls");
}//修改联系人
void modif_contact(Contact* pc)			
{assert(pc);if (0 == pc->count)					//通讯录内得先有人可被修改{printf("通讯录为空\n");system("pause");system("cls");return;}char name[MAX_NAME] = { 0 };printf("请输入要修改的联系人:");scanf("%s", name);int pos = find_by_name(pc, name);	//找到指定联系人的位置if (-1 == pos)						//找不到联系人就结束掉函数{printf("没有指定联系人\n");system("pause");system("cls");return;}printf("请输入姓名:");				//找到了就将联系人的信息重新录入一遍scanf("%s", pc->data[pos].name);printf("请输入年龄:");scanf("%d", &(pc->data[pos].age));printf("请输入性别:");scanf("%s", pc->data[pos].sex);printf("请输入电话:");scanf("%s", pc->data[pos].tele);printf("请输入住址:");scanf("%s", pc->data[pos].addr);printf("修改成功\n");system("pause");system("cls");
}int cmp_by_name(const void* e1, const void* e2)
{//按照名字来比较return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}//排序联系人
void soft_contact(Contact* pc)		
{assert(pc);if (0 == pc->count)				//通讯录内得先有人可被排序{printf("通讯录为空\n");system("pause");system("cls");return;}qsort(pc->data, pc->count, sizeof(pc->data[0]), cmp_by_name);printf("排序成功\n");system("pause");system("cls");
}//清空联系人
void empty_contact(Contact* pc)		
{assert(pc);if (0 == pc->count)				//通讯录内得先有人可被清空{printf("通讯录已为空\n");system("pause");system("cls");return;}pc->count = 0;memset(pc->data, 0, sizeof(pc->data));system("pause");			//按任意键继续system("cls");				//清屏
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/61985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab 计算点云协方差矩阵

目录 一、概述1、算法概述2、主要函数二、代码示例三、结果展示四、参数解析输入参数输出参数五、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述

java 可变参数

基本语法 可变参数的语法很简单&#xff0c;基本格式如下&#xff1a; 方法名(参数类型 ...)举例 public void printName(String... names) {int count names.length;for (int i 0; i < names.length; i) {System.out.println(names[i]);} }

气传导蓝牙耳机好不好?推荐几款不错的气传导耳机

​在众多的气传导耳机中&#xff0c;如何选择一款适合自己的气传导耳机呢&#xff1f;这需要考虑到自己的需求和预算&#xff0c;同时也需要了解不同品牌和型号的产品特点和优缺点。下面我来推荐几款非常不错的气传导耳机给大家参考&#xff0c;希望大家都能寻找到心仪那款。 …

【线性代数】矩阵求导的本质与分子布局、分母布局的本质(矩阵求导——本质篇)

矩阵求导的本质与分子布局、分母布局的本质&#xff08;矩阵求导——本质篇&#xff09; 说在前面一. 函数与标量、向量、矩阵二. 矩阵求导的本质三. 矩阵求导结果的布局四. 分子布局、分母布局的本质五. 向量变元的实值标量函数 说在前面 我将严谨地说明矩阵求导的本质与分子布…

centos下配置SFTP且限制用户访问目录

一、SFTP使用场景 ftp是大多数网站的文件传输选择工具,但ftp并不是非常安全,并且在centos上搭建的vsftpd也非常的不稳定,偶尔会出现权限问题,例如500、或是账号密码不正确等等。 而SFTP是基于默认的22端口,是ssh内含的协议,只要启动了sshd就可以使用。 建议:更高的效率…

[ES]mac安装es、kibana、ik分词器

一、安装es和kibana 1、创建一个网络&#xff0c;网络内的框架(eskibana)互联 docker network create es-net 2、下载es和kibana docker pull elasticsearch:7.12.1 docker pull kibana:7.12.1 3、运行docker命令部署单点eskibana&#xff08;用来操作es&#xff09; doc…

leetcode分类刷题:字符串及单词翻转

1、本文此次总结的题型“leetcode分类刷题&#xff1a;字符串及单词翻转”较为简单&#xff0c;是双指针法在字符串及单词翻转类题型中的应用 2、如果单词翻转类题型加了O(1)空间复杂度的要求&#xff0c;算法思路会变得稍微复杂一点 344. 反转字符串 该题为字符串翻转的基础题…

ConsoleApplication17_2项目免杀(Fiber+VEH Hook Load)

加载方式FiberVEH Hook Load Fiber是纤程免杀&#xff0c;VEH是异常报错&#xff0c;hook使用detours来hook VirtualAlloc和sleep&#xff0c;通过异常报错调用实现主动hook 纤程Fiber的概念&#xff1a;纤程是比线程的更小的一个运行单位。可以把一个线程拆分成多个纤程&#…

InVEST模型+SolVES模型教程

详情点击公众号链接&#xff1a;基于当量因子法、InVEST、SolVES模型等多技术融合在生态系统服务功能社会价值评估中的应用及论文写作、拓展分析 前言 生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xf…

基于Ubuntu坏境下的Suricata坏境搭建

目录 Suricata环境安装 第一步、在 Ubuntu 端点安装 Suricata 1、加入Suricata源 2、更新安装包 3、下载SuricataSuricata 第二步、下载并提取新兴威胁 Suricata 规则集 1、在tmp文件夹下载 Suricata 规则集 如果发现未安装curl&#xff0c;使用apt安装即可&#xff1a…

打造高权重店铺的秘密,详解Shopee平台权重评估机制(测评补单)

很多虾皮卖家经常提到的"权重"是指商品或店铺在Shopee平台上的重要性程度。权重评估了商品或店铺是否符合用户需求&#xff0c;并且能否促进订单转化率&#xff0c;为平台带来收益。说白了权重就是给商品和店铺打分的机制&#xff0c;得分越高&#xff0c;权重越高&a…

简单shell脚本的编写

文章目录 简单使用shell脚本参数判断整数的比较运算符字符串的比较运算shell脚本流程控制shell脚本循环for循环批量添加用户批量ping IP地址检测同一局域网&#xff0c;多台主机存活情况检测同一局域网&#xff0c;多台主机存活情况多线程检测主机存活情况 while循环case选择语…

Python中处理Excel文件的常见问题与技巧

在数据分析和办公自动化领域&#xff0c;Excel是一种广泛使用的工具。本文将介绍如何利用Python来处理Excel文件时可能遇到的常见问题&#xff0c;并分享一些实用技巧。 1. 安装必要库 - 使用pip或conda安装openpyxl、pandas等第三方库&#xff1b; – 确保所选版本兼容性以及…

Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】

一、Sentinel整合openfeign 1、复制一下order-openfeign项目&#xff08;创建order-openfeign-sentinel&#xff09; 然后在stock-nacos当中编写对应的接口 RequestMapping("/reduct2")public String reduct2(){int a 1/0;System.out.println("扣减库存"…

单片机学习-什么是Flash?什么是RAM?什么是ROM?

什么是Flash&#xff1f; Flash 存储器&#xff08;FLASH EEPROM&#xff09;又称闪存&#xff0c;快闪。 它是EEPROM的一种。它结合了ROM和RAM的长处。不仅具备电子可擦除可编辑&#xff08;EEPROM&#xff09;的性能&#xff0c;还不会断电丢失数据同时可以快速读取数据。它于…

说说Lambda架构

分析&回答 Lambda架构是由Storm的作者Nathan Marz提出的一个实时大数据处理框架。Marz在Twitter工作期间开发了著名的实时大数据处理框架Storm&#xff0c;Lambda架构是其根据多年进行分布式大数据系统的经验总结提炼而成。Lambda架构的目标是设计出一个能满足实时大数据系…

python读取图像小工具

一、和图像交互获得图像的坐标和像素值 import cv2 import numpy as np import signal import threading import timeif __name__ __main__:img cv2.imread(XXX,0)#读取图片font_face,font_scale,thicknesscv2.FONT_HERSHEY_SIMPLEX,0.5,1#鼠标交互def mouseHandler(event,x…

【校招VIP】前端算法考点之大数据相关

考点介绍&#xff1a; 大数据的关键技术分为分析技术和处理技术&#xff0c;可用于大数据分析的关键技术主要包括A/B测试&#xff0c;关联规则挖掘&#xff0c;数据挖掘&#xff0c;集成学习&#xff0c;遗传算法&#xff0c;机器学习&#xff0c;自然语言处理&#xff0c;模式…

Oracle中LEFT JOIN后AND与WHERE的异同

1、AND 过滤之后再连接 2、WHERE 连接之后再过滤 下面以具体例子来说明&#xff1a; (1)、建表及插入测试数据 --建测试表 create table FACT_TAB ( ID INTEGER,STATUS VARCHAR2(8) ); create table DIM_STATUS ( STSTUS_CLASS VARCHAR2(8),STATUS_CODE VARCHAR2(8),S…

Spring框架知识点汇总

01.Spring框架的基本理解 关键字&#xff1a;核心思想IOC/AOP&#xff0c;作用&#xff08;解耦&#xff0c;简化&#xff09;&#xff0c;简单描述框架组成&#xff1b; Spring框架是一款轻量级的开发框架&#xff0c;核心思想是IOC&#xff08;反转控制&#xff09;和AOP&a…