当前位置: 首页 > news >正文

没有她的通讯录(C语言实现)

在这里插入图片描述

🚀write in front🚀
📝个人主页:认真写博客的夏目浅石.
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:夏目的C语言宝藏
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
✉️如果无聊的话,就来逛逛我的博客栈吧stack-frame.cn

文章目录

  • 前言
  • 一、通讯录前期准备
    • 1.1菜单函数的实现
    • 1.2菜单的功能
    • 1.3关于联系人结构体的创建
    • 1.4全局变量的定义
  • 二、通讯录的功能实现
    • 2.1初始化通讯录
    • 2.2添加联系人
    • 2.3联系人
    • 2.4删除联系人
    • 2.5查找联系人
    • 2.6修改联系人
    • 2.7对通讯录中联系人的信息进行排序
  • 三、实现通讯录的所有文件展现
    • 3.1通讯录函数绘总
    • 3.2通讯录函数的实现
    • 3.3通讯录测试代码
  • 总结


前言

本篇博客夏目浅石带着大家学习大一期末大作业—通讯录的实现,说真的,完成通讯录之前,夏目已经完成了三子棋游戏,扫雷,猜数字游戏这样类似的大作业类型的任务,所以这里会更加熟练的写出来我完成通讯录的逻辑以及C语言代码实现过程。


一、通讯录前期准备

1.1菜单函数的实现

1.先实现菜单函数,能够实现与用户的交互

代码如下:

void menu()
{printf("*****************************************\n");printf("*********  1.add    2. del    ***********\n");printf("*********  3.search 4. modify ***********\n");printf("*********  5.show   6. sort   ***********\n");printf("*********  0.exit             ***********\n");printf("*****************************************\n");
}

1.2菜单的功能

1.用switch选择语句do——while循环语句来实现各自的功能

代码如下:

int main()
{int input;//创建通讯录 Contact con;//初始化通讯录InitContact(&con);do{menu();printf("请选择:>");scanf("%d", &input);switch(input){case 1:AddContact(&con);break;case 2:DelContact(&con);break;case 3:SearchContact(&con);break;case 4:ModifyContact(&con);break;case 5:ShowContact(&con);break;case 6:SortContact(&con);case 0:printf("退出通讯录\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}

1.3关于联系人结构体的创建

结构体的创建
第一个结构体peoInfo是是用来存放人的信息,第二个结构体Contact通讯录的信息data是以第一个结构体为类型的数组sz用来记录当前通讯录中实际的人数。

代码如下:

//人的信息
typedef struct peoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char addr[ADDR_MAX];char tele[TELE_MAX];
}peoInfo;typedef struct Contact
{peoInfo data[MAX];int sz;
}Contact;

1.4全局变量的定义

利用宏定义处理

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12

二、通讯录的功能实现

2.1初始化通讯录

代码如下:

//初始化 
void InitContact(Contact* pc)
{pc->sz=0;memset(pc->data,0,sizeof(pc->data));
}

2.2添加联系人

代码如下:

//增加联系人
void AddContact(Contact* pc)
{if(pc->sz==MAX){printf("已满\n");return;}printf("请输入名字:>");scanf("%s",pc->data[pc->sz].name);printf("请输入年龄:>");scanf("%d",&(pc->data[pc->sz].age));printf("请输入性别:>");scanf("%s",pc->data[pc->sz].sex);printf("请输入地址:>");scanf("%s",pc->data[pc->sz].addr);printf("请输入电话:>");scanf("%s",pc->data[pc->sz].tele);sz++;
}

2.3联系人

代码如下:

//显示联系人 
void ShowContact(const Contact* pc)
{int i=0;printf("%-20s\t%4s\t%-5s\t%-20s\t%-12s\n","名字","年龄","性别","地址","电话");for(i=0;i<pc->sz;i++){printf("%-20s\t%4d\t%-5s\t%-20s\t%-12s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].tele);}
}

2.4删除联系人

先查找,再删除

代码如下:


int FindByName(Contact* pc,char names[])
{for(int i=0;i<pc->sz;++i){if(strcmp(pc->data[i].name,names)==0){return i;}	}return -1;
}//删除联系人 
void DelContact(Contact* pc)
{char names[NAME_MAX]={0};if(pc->sz==0) {printf("通讯录为空,无法删除\n");return;}//删除//找到要删除的人printf("请输入要删除的人的名字:>");scanf("%s",names);int ret = FindByName(pc,names);if(-1==ret){printf("要删除的人不存在\n");return; }//删除int j=0;for(j=ret;j<pc->sz-1;++j){pc->data[j]=pc->data[j+1];}pc->sz--;printf("删除成功\n");
}

2.5查找联系人

代码如下:


//查找指定联系人 
SearchContact(const Contact* pc)
{char names[NAME_MAX];printf("请输入要查找人的名字:>");scanf("%s",names);int ret = FindByName(pc,names);if(-1==ret){printf("要查找的人不存在\n");return; }//打印信息printf("%-20s\t%4s\t%-5s\t%-20s\t%-12s\n","名字","年龄","性别","地址","电话");for(i=0;i<pc->sz;i++){printf("%-20s\t%4d\t%-5s\t%-20s\t%-12s\n",pc->data[ret].name,pc->data[ret].age,pc->data[ret].sex,pc->data[ret].addr,pc->data[ret].tele);}
}

2.6修改联系人

代码如下:


//修改指定联系人 
void ModifyContact(Contact* pc)
{//要修改就要先查找到char names[NAME_MAX];printf("请输入要查找人的名字:>");scanf("%s",names);int ret = FindByName(pc,names);if(-1==ret){printf("要查找的人不存在\n");return; }//修改,从新录入一遍printf("请输入名字:>");scanf("%s",pc->data[ret].name);printf("请输入年龄:>");scanf("%d",&(pc->data[ret].age));printf("请输入性别:>");scanf("%s",pc->data[ret].sex);printf("请输入地址:>");scanf("%s",pc->data[ret].addr);printf("请输入电话:>");scanf("%s",pc->data[ret].tele);printf("修改完成\n");}

2.7对通讯录中联系人的信息进行排序

代码如下:

void SortContact(Contact* pc)
{if (pc->count == 0){printf("通讯录中没有联系人");}else{													for (int i = 0; i < pc->count - 1; i++){for (int j = 0; j < pc->count-i-1; j++){if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0){PeoInfo tmp = pc->data[j];pc->data[j] = pc->data[j+1];pc->data[j + 1] = tmp;}}}printf("排序成功\n");}
}

三、实现通讯录的所有文件展现

3.1通讯录函数绘总

#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12
//人的信息
typedef struct peoInfo
{char name[20];int age;char sex[5];char addr[30];char tele[12];
}peoInfo;typedef struct Contact
{peoInfo data[100];int sz;
}Contact;//初始化 
void InitContact(Contact* pc);//增加联系人 
void AddContact(Contact* pc);//显示联系人 
void ShowContact(const Contact* pc);//删除联系人 
void DelContact(const Contact* pc);//查找指定联系人 
void Se0archContact(Contact* pc);//修改指定联系人 
void ModifyContact(Contact* pc);//排序联系人 
void SortContact(Contact* pc);

3.2通讯录函数的实现

//函数实现
#define MAX 100
#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12
//初始化 
void InitContact(Contact* pc)
{pc->sz=0;memset(pc->data,0,sizeof(pc->data));
}//增加联系人
void AddContact(Contact* pc)
{if(pc->sz==MAX){printf("已满\n");return;}printf("请输入名字:>");scanf("%s",pc->data[pc->sz].name);printf("请输入年龄:>");scanf("%d",&(pc->data[pc->sz].age));printf("请输入性别:>");scanf("%s",pc->data[pc->sz].sex);printf("请输入地址:>");scanf("%s",pc->data[pc->sz].addr);printf("请输入电话:>");scanf("%s",pc->data[pc->sz].tele);sz++;
}//显示联系人 
void ShowContact(const Contact* pc)
{int i=0;printf("%-20s\t%4s\t%-5s\t%-20s\t%-12s\n","名字","年龄","性别","地址","电话");for(i=0;i<pc->sz;i++){printf("%-20s\t%4d\t%-5s\t%-20s\t%-12s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].tele);}
}int FindByName(Contact* pc,char names[])
{for(int i=0;i<pc->sz;++i){if(strcmp(pc->data[i].name,names)==0){return i;}	}return -1;
}//删除联系人 
void DelContact(Contact* pc)
{char names[NAME_MAX]={0};if(pc->sz==0) {printf("通讯录为空,无法删除\n");return;}//删除//找到要删除的人printf("请输入要删除的人的名字:>");scanf("%s",names);int ret = FindByName(pc,names);if(-1==ret){printf("要删除的人不存在\n");return; }//删除int j=0;for(j=ret;j<pc->sz-1;++j){pc->data[j]=pc->data[j+1];}pc->sz--;printf("删除成功\n");
}//查找指定联系人 
SearchContact(const Contact* pc)
{char names[NAME_MAX];printf("请输入要查找人的名字:>");scanf("%s",names);int ret = FindByName(pc,names);if(-1==ret){printf("要查找的人不存在\n");return; }//打印信息printf("%-20s\t%4s\t%-5s\t%-20s\t%-12s\n","名字","年龄","性别","地址","电话");for(i=0;i<pc->sz;i++){printf("%-20s\t%4d\t%-5s\t%-20s\t%-12s\n",pc->data[ret].name,pc->data[ret].age,pc->data[ret].sex,pc->data[ret].addr,pc->data[ret].tele);}
}//修改指定联系人 
void ModifyContact(Contact* pc)
{//要修改就要先查找到char names[NAME_MAX];printf("请输入要查找人的名字:>");scanf("%s",names);int ret = FindByName(pc,names);if(-1==ret){printf("要查找的人不存在\n");return; }//修改,从新录入一遍printf("请输入名字:>");scanf("%s",pc->data[ret].name);printf("请输入年龄:>");scanf("%d",&(pc->data[ret].age));printf("请输入性别:>");scanf("%s",pc->data[ret].sex);printf("请输入地址:>");scanf("%s",pc->data[ret].addr);printf("请输入电话:>");scanf("%s",pc->data[ret].tele);printf("修改完成\n");}void SortContact(Contact* pc)
{if (pc->count == 0){printf("通讯录中没有联系人");}else{													for (int i = 0; i < pc->count - 1; i++){for (int j = 0; j < pc->count-i-1; j++){if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0){PeoInfo tmp = pc->data[j];pc->data[j] = pc->data[j+1];pc->data[j + 1] = tmp;}}}printf("排序成功\n");}
}

3.3通讯录测试代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12//人的信息
typedef struct peoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char addr[ADDR_MAX];char tele[TELE_MAX];
}peoInfo;typedef struct Contact
{peoInfo data[MAX];int sz;
}Contact;//初始化通讯录 
void InitContact(Contact* pc)
{pc->sz=0;memset(pc->data,0,sizeof(pc->data));
}//增加联系人
void AddContact(Contact* pc)
{if(pc->sz==MAX){printf("已满\n");return;}printf("请输入名字:>");scanf("%s",pc->data[pc->sz].name);printf("请输入年龄:>");scanf("%d",&(pc->data[pc->sz].age));printf("请输入性别:>");scanf("%s",pc->data[pc->sz].sex);printf("请输入地址:>");scanf("%s",pc->data[pc->sz].addr);printf("请输入电话:>");scanf("%s",pc->data[pc->sz].tele);pc->sz++;
}//显示联系人 
void ShowContact(const Contact* pc)
{int i=0;printf("%-20s\t%4s\t%-5s\t%-20s\t%-12s\n","名字","年龄","性别","地址","电话");for(i=0;i<pc->sz;i++){printf("%-20s\t%4d\t%-5s\t%-20s\t%-12s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].tele);}
}删除联系人 
//void DelContact(Contact* pc)
//{
//	char names[NAME_MAX]={0};
//	
//	if(pc->sz==0) 
//	{
//		printf("通讯录为空,无法删除\n");
//		return;
//	}
//	//删除
//	//找到要删除的人
//	printf("请输入要删除的人的名字:>");
//	scanf("%s",names);
//	int del=0;
//	for(int i=0;i<pc->sz;++i)
//	{
//		if(strcmp(pc->data[i].name,names)==0)
//		{
//			del=i;
//			break;
//		}	
//	}
//	//删除
//	int j=0;
//	for(j=del;j<pc->sz-1;++j)
//	{
//		pc->data[j]=pc->data[j+1];
//	}
//	pc->sz--;
//	printf("删除成功\n");
//}int FindByName(Contact* pc,char names[])
{for(int i=0;i<pc->sz;++i){if(strcmp(pc->data[i].name,names)==0){return i;}	}return -1;
}//删除联系人 
void DelContact(Contact* pc)
{char names[NAME_MAX]={0};if(pc->sz==0) {printf("通讯录为空,无法删除\n");return;}//删除//找到要删除的人printf("请输入要删除的人的名字:>");scanf("%s",names);int ret = FindByName(pc,names);if(-1==ret){printf("要删除的人不存在\n");return; }//删除int j=0;for(j=ret;j<pc->sz-1;++j){pc->data[j]=pc->data[j+1];}pc->sz--;printf("删除成功\n");
}//查找指定联系人 
void SearchContact(Contact* pc)
{char names[NAME_MAX];printf("请输入要查找人的名字:>");scanf("%s",names);int ret = FindByName(pc,names);if(-1==ret){printf("要查找的人不存在\n");return; }//打印信息printf("%-20s\t%4s\t%-5s\t%-20s\t%-12s\n","名字","年龄","性别","地址","电话");for(int i=0;i<pc->sz;i++){printf("%-20s\t%4d\t%-5s\t%-20s\t%-12s\n",pc->data[ret].name,pc->data[ret].age,pc->data[ret].sex,pc->data[ret].addr,pc->data[ret].tele);}
}//修改指定联系人 
void ModifyContact(Contact* pc)
{//要修改就要先查找到char names[NAME_MAX];printf("请输入要查找人的名字:>");scanf("%s",names);int ret = FindByName(pc,names);if(-1==ret){printf("要查找的人不存在\n");return; }//修改,从新录入一遍printf("请输入名字:>");scanf("%s",pc->data[ret].name);printf("请输入年龄:>");scanf("%d",&(pc->data[ret].age));printf("请输入性别:>");scanf("%s",pc->data[ret].sex);printf("请输入地址:>");scanf("%s",pc->data[ret].addr);printf("请输入电话:>");scanf("%s",pc->data[ret].tele);printf("修改完成\n");	
}void SortContact(Contact* pc)
{if (pc->sz == 0){printf("通讯录中没有联系人");}else{													for (int i = 0; i < pc->sz - 1; i++){for (int j = 0; j < pc->sz-i-1; j++){if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0){peoInfo tmp = pc->data[j];pc->data[j] = pc->data[j+1];pc->data[j + 1] = tmp;}}}printf("排序成功\n");}
}void menu()
{printf("*****************************************\n");printf("*********  1.add    2. del    ***********\n");printf("*********  3.search 4. modify ***********\n");printf("*********  5.show   6. sort   ***********\n");printf("*********  0.exit             ***********\n");printf("*****************************************\n");
}int main()
{int input;//创建通讯录 Contact con;//初始化通讯录InitContact(&con);do{menu();printf("请选择:>");scanf("%d", &input);switch(input){case 1:AddContact(&con);break;case 2:DelContact(&con);break;case 3:SearchContact(&con);break;case 4:ModifyContact(&con);break;case 5:ShowContact(&con);break;case 6:SortContact(&con);case 0:printf("退出通讯录\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}

总结

我是夏目浅石,希望和你一起学习进步,刷题无数!!!希望各位大佬能一键三连支持一下博主,hhhh~我们下期见喽

在这里插入图片描述
如果无聊的话,就来逛逛我的博客栈吧stack-frame.cn

原创不易,还希望各位大佬支持一下\textcolor{blue}{原创不易,还希望各位大佬支持一下}原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力!\textcolor{9c81c1}{点赞,你的认可是我创作的动力!}点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!\textcolor{ed7976}{收藏,你的青睐是我努力的方向!}收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!\textcolor{98c091}{评论,你的意见是我进步的财富!}评论,你的意见是我进步的财富!

相关文章:

没有她的通讯录(C语言实现)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;夏目的C语言宝藏 &#x1f4ac;总结&#xff1a;希望你看完之…...

Spring Security 从入门到精通

前言 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多&#xff0c;因为相比与Spr…...

微信小程序Springboot vue停车场车位管理系统

系统分为用户和管理员两个角色 用户的主要功能有&#xff1a; 1.用户注册和登陆系统 2.用户查看系统的公告信息 3.用户查看车位信息&#xff0c;在线预约车位 4.用户交流论坛&#xff0c;发布交流信息&#xff0c;在线评论 5.用户查看地图信息&#xff0c;在线导航 6.用户查看个…...

看完这篇 教你玩转渗透测试靶机vulnhub——Hack Me Please: 1

Vulnhub靶机Hack Me Please: 1渗透测试详解Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;漏洞利用③&#xff1a;获取反弹shell&#xff1a;④&#x…...

nodejs+vue地铁站自动售票系统-火车票售票系统vscode

地铁站自动售票系统主要包括个人中心、地铁线路管理、站点管理、购票信息管理、乘坐管理、用户信息管理等多个模块。它使用的是前端技术&#xff1a;nodejsvueelementui 前后端通讯一般都是采取标准的JSON格式来交互。前端技术&#xff1a;nodejsvueelementui,视图层其实质就是…...

Spring Security in Action 第十二章 OAuth 2是如何工作的?

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;以实战为线索&#xff0c;逐步深入SpringSecurity相关知识相关知识&#xff0c;打造完整的SpringSecurity学习步骤&#xff0c;提升工程化编码能力和思维能力&#xff0c;写出高质量代码。希望大家都能够从中有所收获&#…...

天工开物 #5 我的 Linux 开发机

首先说一下结论&#xff1a;最终我选择了基于 Arch Linux[1] 的 Garuda Linux[2] 发行版作为基础来搭建自己的 Linux 开发机。Neofetch 时刻发行版的选择在上周末的这次折腾里&#xff0c;我一共尝试了 Garuda Linux 发行版&#xff0c;原教旨的 Arch Linux 发行版&#xff0c;…...

【沁恒WCH CH32V307V-R1开发板输出DAC实验】

【沁恒WCH CH32V307V-R1开发板输出DAC实验】1. 前言2. 软件配置2.1 安装MounRiver Studio3. DAC项目测试3.1 打开DAC工程3.2 编译项目4. 下载验证4.1 接线4.2 演示效果5. 小结1. 前言 数字/模拟转换模块&#xff08;DAC&#xff09;&#xff0c;包含 2 个可配置 8/12 位数字输入…...

Linux进程控制详解

目录前言一、进程创建1.1 fork函数初识1.2 写时拷贝1.3 fork常规用法1.4 fork调用失败的原因二、进程终止2.1 进程终止时&#xff0c;操作系统做了什么&#xff1f;&#xff1f;2.2 进程终止的常见方式有哪些&#xff1f;&#xff1f;2.3 如何用代码终止一个进程三、进程等待3.…...

C语言深度剖析之程序环境和预处理

1.程序的翻译环境和执行环境 第一种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令 第二种是执行环境&#xff0c;它用于实际执行代码 2.翻译环境 分为四个阶段 预编译阶段 &#xff0c;编译&#xff0c;汇编&#xff0c;链接 程序编译过程&#xff1a;多个…...

【Spark分布式内存计算框架——Spark Core】9. Spark 内核调度(上)

第八章 Spark 内核调度 Spark的核心是根据RDD来实现的&#xff0c;Spark Scheduler则为Spark核心实现的重要一环&#xff0c;其作用就是任务调度。Spark的任务调度就是如何组织任务去处理RDD中每个分区的数据&#xff0c;根据RDD的依赖关系构建DAG&#xff0c;基于DAG划分Stag…...

Vulkan教程(15): Graphics pipeline之Render passes(渲染通道)

Vulkan官方英文原文&#xff1a; https://vulkan-tutorial.com/Drawing_a_triangle/Graphics_pipeline_basics/Render_passes对应的Vulkan技术规格说明书版本&#xff1a; Vulkan 1.3.2Setup设置Before we can finish creating the pipeline, we need to tell Vulkan about the…...

乐观锁、雪花算法、MyBatis-Plus多数据源

乐观锁、雪花算法、MyBatis-Plus多数据源e>雪花算法2、乐观锁a>场景b>乐观锁与悲观锁c>模拟修改冲突d>乐观锁实现流程e>Mybatis-Plus实现乐观锁七、通用枚举a>数据库表添加字段sexb>创建通用枚举类型c>配置扫描通用枚举d>测试九、多数据源1、创建…...

详解Redisson分布式限流的实现原理

我们目前在工作中遇到一个性能问题&#xff0c;我们有个定时任务需要处理大量的数据&#xff0c;为了提升吞吐量&#xff0c;所以部署了很多台机器&#xff0c;但这个任务在运行前需要从别的服务那拉取大量的数据&#xff0c;随着数据量的增大&#xff0c;如果同时多台机器并发…...

[python入门㊹] - python测试类

目录 ❤ 断言方法 assertEqual 和 assertNotEqual assertTrue 和 assertFalse assertIsNone 和 assertIsNotNone ❤ 一个要测试的类 ❤ 测试AnonymousSurvey类 ❤ setUp() 和 teardown() 方法 ❤ 断言方法 常用的断言方法: 方法 用途 assertEqual(a, b) 核实a …...

Web 框架 Flask 快速入门(二)表单

课程地址&#xff1a;Python Web 框架 Flask 快速入门 文章目录&#x1f334; 表单1、表单介绍2、表单的简单实现1. 代码2. 代码的执行逻辑3、使用wtf扩展实现4、bug记录&#xff1a;表单验证总是失败&#x1f334; 表单 1、表单介绍 当我们在网页上填写账号密码进行登录的时…...

C++基础(5) - 复合类型(上)

文章目录数组1、什么是数组2、数组的声明3、数组的初始化4、数组的访问5、二维数组6、memset —— 给数组中每一个元素赋同样的值字符串&#xff08;字符数组&#xff09;1、string.h 头文件1.1 strlen()1.2 strcmp()1.3 strcpy()1.4 strcat()string 类简介1、C11 字符串初始化…...

java重写(@Override)介绍及实例说明

1.概述方法的重写&#xff08;override&#xff09;是封装的特性之一。在子类中可以根据需要对基类中继承来的方法进行重写。重载和重写没有任何关系。作用&#xff1a;通过重写&#xff0c;子类既可以继承父类的东西&#xff0c;又可以灵活的扩充。1.override注解是告诉编译器…...

基于STM32的虚拟示波器

仓库地址 https://github.com/shuai132/ScopeMCU ScopeMCU Oscilloscope for MCU MCU: STM32F103C8Tx 需配合ScopeGUI使用 截图说明见wiki 最新版Releases Introduction 用最少的硬件成本&#xff0c;做一个实用的虚拟示波器。 这是硬件部分&#xff0c;基于STM32最小…...

搭建云端vscode-server,使用web ide进行远程开发

使用乌班图系统&#xff0c;搭建自己的网页vs code开发环境github地址&#xff1a;GitHub - coder/code-server: VS Code in the browser安装脚本curl -fsSL https://code-server.dev/install.sh | sh出现deb package has been installed.表示已经正确安装。测试启动2.1修改配置…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...