浪漫的通讯录(顺序表篇)

本篇会加入个人的所谓‘鱼式疯言’
❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!
在这里插入图片描述

前言

哈哈哈,有没有被小编的标题所吸引住,那么友子们是否也想做个有意思的通讯录来制造点浪漫氛围呢💕💕💕
想必友友们答案一定是想的吧 ! ! !
在本篇博文中,我们主要讲解

目录

1.静态顺序表和动态顺序表
2.利用动态顺序表实现通讯录
3.通讯录的功能和逻辑框架
4.每个逻辑功能的实现
5.通讯录源文件的展示

一.静态顺序表和动态顺序表

<1>. 顺序表的概念

友友们一定很疑惑顺序表是什么吧 ?
让小编来一一为大家解惑吧 💖 💖 💖

顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口

<2>. 顺序表的种类

而我们的顺序表又分两种:

静态顺序表

动态顺序表

这两个的区别在哪呢 ?
在这里插入图片描述

其实啊,主要看我们怎么给我们数组长度怎么创建 🤔 🤔 🤔
如果是一开始就给定我们的数组长度呢,我们就叫它静态顺序表
如果我们一开不给长度而只是给个指针,需要我们后期来开辟的.这是我们就叫它动态顺序表

那么我们爱提问的小爱同学就抛出问题来了,
我们今天要学的通讯录是用动态还是静态的顺序表呢 😲 😲 😲

很显然我们需要用的是动态顺序表
宝子们可以想想,动态顺序表我们需要用多少空间就可以开辟相对应的空间
在这里插入图片描述

而我们的静态的话,万一空间不足就会造成 数据的丢失 (如果数据丢失很严重的话,是要吃牢饭的) 😣 😣 😣
空间足够就会造成 空间的浪费

在这里插入图片描述

鱼式疯言

本质上我们的顺序表就是一个 “披着羊皮” 伪装成 顺序表数组
怎么样修饰就觉得着是怎么样的顺序表,其他都一样。

二 . 利用动态顺序表实现通讯录

<1>.顺序表的选择

友友们还是会思考如果我们知道动态顺序表
然后呢?
该怎么样去建立之间的架构呢 🤔 🤔 🤔

宝子们都学过,我们数组存放的是一些同类型的数据,那如果把这些数据都比喻成我们的联系人呢,是不是就可以建立我们的联系人的大图谱成为我们的通讯录了 💖 💖 💖
在这里插入图片描述

#define _NAMEMAX_ 50
#define _SEXMAX_  20
#define _PHONEMAX_ 100
#define _POSITMAX_ 300typedef struct PresonInt
{char name[_NAMEMAX_];//名字char sex[_SEXMAX_];//性别int  age;//年龄char phone[_PHONEMAX_];//电话char posit[_POSITMAX_];//地址
}Prt;typedef Prt SLDataType;
// 动态顺序表 -- 按需申请
typedef struct SeqList
{SLDataType* a;int size;     // 有效数据个数int capacity; // 空间容量
}SL;

于是我们就有了以上的这些类型的声明

鱼式疯言

其实友友们可以和我这样看,我们的 a 就是数组,
那么这个数组存的是什么数据呢,我们平常存的 整型字符 一类的

但我们学了结构体之后我们就可以利用就结构体把我们想要存储的各种数据类型打包成一个
那就是我们的 结构体类型

三.通讯录的功能和逻辑框架

<1>.功能简介

1)至少能够存储100个人的通讯信息
2)能够保存用户信息:名字、性别、年龄、电话、地址等
3)增加联系人信息
4)删除指定联系人
5)查找制定联系人
6)修改指定联系人
7)显示联系人信息

case 1:ContastAdd(&con);//添加联系人break;
case 2:ContastFind(&con);//查找联系人break;
case 3:Contastdele(&con);//删除联系人break;	
case 4:ContastSet(&con);//修改联系人break;
case 5:ContastShow(&con);//显示通讯录break;
case 6:PutSLFile(&con);//保存通讯录文档break;
case 7:GetSLFile(&con);//读取通讯录信息break;

在这里插入图片描述

<2>.逻辑框架

1.通讯录的初始化过程

3,.联系人数据的保存和通讯录的销毁过程

void PutSLFile(SL* ps);
//保存联系人文件
void GetSLFile(SL* ps);
//读取通讯录文档void SLInit(SL* ps);
void SLDestroy(SL* ps);
//顺序表初始化和销毁void ContastInit(SL* ps);
//通讯录初始化
void ContastDestory(SL* ps);
//销毁通讯录

2.通讯录与顺序表功能连接与维护过程

void SLCheckCapacity(SL* ps);
//顺序表扩容void ContastAdd(SL* ps);
//添加联系人void ContastShow(SL* ps);
//显示通讯录void ContastFind(SL* ps);
//查找联系人void ContastSet(SL* ps);
//修改指定联系人信息void SLErase(SL* ps, int pos);
//指定位置删除数据void Contastdele(SL* ps);
//删除指定联系人

在这里插入图片描述

四.每个逻辑功能的实现

<1> 菜单打印和通讯录的初始化

 void Meau()
//菜单功能介绍
{printf("------------------ 通讯录 -------------------\n");printf("--------- 1.添加联系人 2.查找联系人 ---------\n");	printf("--------- 3.删除联系人 4.修改联系人 ---------\n");printf("--------- 5.显示通讯录 6.保存通讯录 ---------\n");printf("----------7.读取已存通讯录 0. 退出 ----------\n");}
void ContastInit(SL*ps)
//通讯录初始化
{SLInit(ps);
}void SLInit(SL*ps)
//对顺序表进行初始化
{ps->a = NULL;//数组元素为0ps->capacity = 0;//最大容量放置为0ps->size = 0;//有效数据为0
}

<2>.顺序表的扩容(如果数组长度不够)

void SLCheckCapacity(SL* ps)
//扩容顺序表空间
{assert(ps);if (ps->capacity == ps->size){int newcapaacity = ps->capacity == 0 ? INIT_CAPACITY : 2 * (ps->capacity);//用三目操作符来判断总容量是否位0SLDataType* p1 = (SLDataType*)realloc(ps->a, newcapaacity * sizeof(SLDataType));//开辟成倍空间大小的空间if (p1 == NULL)//判断是否开辟成功{perror("malloc");return;}ps->a = p1;//开辟成功就放入ps->capacity = newcapaacity;}}

<3>.添加联系人数据(功能一)

void ContastAdd(SL* ps)
//添加联系人
{SLCheckCapacity(ps);//空间不够时puts("亲,请输入你的姓名:");scanf("%s", ps->a[ps->size].name);puts("亲,请输入你的性别:");scanf("%s", ps->a[ps->size].sex);puts("亲,请输入你的年龄:");scanf("%d", &ps->a[ps->size].age);puts("亲,请输入你的电话:");scanf("%s", ps->a[ps->size].phone);puts("亲,请输入你的住址:");scanf("%s", ps->a[ps->size].posit);ps->size++;
}

在这里插入图片描述

<4>.查询联系人(以名字为根据查询)

int Findname(SL*ps, char nm[])
//查找名字
{for (int i = 0; i < ps->size; i++){if (strcmp(ps->a[i].name, nm) == 0){return i;}}return -1;
}

<5>. 查找联系人 (功能二)

void ContastFind(SL*ps)
//查找联系人
{char nm[50] = {0};puts("请输入要查找的联系人姓名");scanf("%s", nm);int m = Findname(ps, nm);if (m>=0){printf("名字\t性别\t年龄\t电话\t地址\n");printf("%s\t", ps->a[m].name);printf("%s\t", ps->a[m].sex);printf("%d\t", ps->a[m].age);printf("%s\t", ps->a[m].phone);printf("%s\n", ps->a[m].posit);return;}printf("未搜索到该联系人,查找错误!\n");}

在这里插入图片描述

如果没有找到就会显示错误

在这里插入图片描述

<6> . 删除联系人 (功能三)

void Contastdele(SL*ps)
//删除指定联系人
{char nm[50] = { 0 };puts("请输入要删除的联系人姓名");scanf("%s", nm);int m = Findname(ps, nm);if (m >= 0){SLErase(ps, m + 1);printf("删除成功!\n");return;}puts("未搜索到该联系人, 删除错误!");
}

在这里插入图片描述

<7>.修改联系人(功能四)

void ContastSet(SL* ps)
//修改指定联系人信息
{char nm[50] = { 0 };puts("请输入要修改的联系人姓名");scanf("%s", nm);int m = Findname(ps, nm);if (m >=0){puts("亲,请输入你修改后的姓名:");scanf("%s", ps->a[m].name);puts("亲,请输入你修改后的性别:");scanf("%s", ps->a[m].sex);puts("亲,请输入你修改后的年龄:");scanf("%d", &ps->a[m].age);puts("亲,请输入你修改后的电话:");scanf("%s", ps->a[m].phone);puts("亲,请输入你修改后的住址:");scanf("%s", ps->a[m].posit);printf("该联系人修改成功!\n");return ;}puts("未搜索到该联系人,修改失败!");
}

在这里插入图片描述

<8>.显示通讯录(功能五)

void ContastShow(SL* ps)
//显示通讯录
{assert(ps && ps->size);printf("名字\t性别\t年龄\t电话\t地址\n");for (int i = 0; i < ps->size; i++){printf("%s\t", ps->a[i].name);printf("%s\t", ps->a[i].sex);printf("%d\t", ps->a[i].age);printf("%s\t", ps->a[i].phone);printf("%s\n", ps->a[i].posit);}
}

在这里插入图片描述

<9>.保存通讯录信息(功能六)

//这个函数接口时保存通讯录文档,就是将通讯录的信息写入到文件
//保存通讯录文档
void PutSLFile(SL* ps)
{//写入文件FILE* pfwrite = fopen("contact.txt","w");//判断 pfwrite 是否为NULLif (fwrite == NULL){perror("fopen->fwrite");return;}for (int i = 0; i < ps->size; i++){//用循环的方式//把每个数据以格式化的方式存入fprintf(pfwrite,"%s\n", ps->a[i].name);fprintf(pfwrite,"%s\n", ps->a[i].sex);fprintf(pfwrite,"%d\n", ps->a[i].age);fprintf(pfwrite,"%s\n", ps->a[i].phone);fprintf(pfwrite,"%s\n", ps->a[i].posit);}printf("保存成功!\n");fclose(pfwrite);pfwrite = NULL;
}

在这里插入图片描述

<10>. 读取已有联系人数据(功能七)

//读取通讯录文档
void GetSLFile(SL* ps)
{FILE* pfread = fopen("contact.txt", "r");//防止NULL出现if (pfread == NULL){perror("fopen->pfread");return;}//先开辟空间//防止野指针的出现SLCheckCapacity(ps);//将数组每个数据进行初始存放while (fscanf(pfread,"%s%s%d%s%s",ps->a[ps->size].name, ps->a[ps->size].sex, &ps->a[ps->size].age, ps->a[ps->size].phone, ps->a[ps->size].posit) != EOF){SLCheckCapacity(ps);ps->size++;}//打印提示信息printf("读取成功!\n");//关闭文件fclose(pfread);//防止野指针pfread = NULL;
}

在这里插入图片描述

<11>.通讯录的销毁

void ContastDestory(SL* ps)
//销毁通讯录
{SLDestroy(ps);
}
void SLDestroy(SL*ps)
//销毁顺序表
{assert(ps);ps->capacity = 0;ps->size = 0;//容量和大小都置为0free(ps->a);//释放空间ps->a = NULL;//a置为空指针
}

在这里插入图片描述

鱼式疯言

上面的十个逻辑功能的实现,都是基于函数来分装的 ❤️ ❤️ ❤️
亲爱的宝子们,小编在写 通讯录 的时候是反复调用功能 相同的函数
函数的意义就在于我们能够反复利用,不要写多余的代码
宝子们也可以利用这一特点来快速实现我们的通讯录哦💕💕💕

五 . 通讯录源代码展示

顺序表和通讯录的头文件

<1>. seqlist.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#define INIT_CAPACITY 4
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>#define _NAMEMAX_ 50
#define _SEXMAX_  20
#define _PHONEMAX_ 100
#define _POSITMAX_ 300typedef struct PresonInt
{char name[_NAMEMAX_];//名字char sex[_SEXMAX_];//性别int  age;//年龄char phone[_PHONEMAX_];//电话char posit[_POSITMAX_];//地址
}Prt;typedef Prt SLDataType;
// 动态顺序表 -- 按需申请
typedef struct SeqList
{SLDataType* a;int size;     // 有效数据个数int capacity; // 空间容量
}SL;//顺序表初始化和销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);void ContastInit(SL* ps);
//通讯录初始化
void ContastDestory(SL* ps);
//销毁通讯录void SLCheckCapacity(SL* ps);
//顺序表扩容void ContastAdd(SL* ps);
//添加联系人void ContastShow(SL* ps);
//显示通讯录void ContastFind(SL* ps);
//查找联系人void ContastSet(SL* ps);
//修改指定联系人信息void SLErase(SL* ps, int pos);
//指定位置删除数据void Contastdele(SL* ps);
//删除指定联系人void PutSLFile(SL* ps);
//保存联系人文件//读取通讯录文档
void GetSLFile(SL* ps);

顺序表测试文件

<2>. seqlist.c

#include "seqlist.h"void SLInit(SL*ps)
//对顺序表进行初始化
{ps->a = NULL;//数组元素为0ps->capacity = 0;//最大容量放置为0ps->size = 0;//有效数据为0
}void SLCheckCapacity(SL* ps)
//扩容顺序表空间
{assert(ps);if (ps->capacity == ps->size){int newcapaacity = ps->capacity == 0 ? INIT_CAPACITY : 2 * (ps->capacity);//用三目操作符来判断总容量是否位0SLDataType* p1 = (SLDataType*)realloc(ps->a, newcapaacity * sizeof(SLDataType));//开辟成倍空间大小的空间if (p1 == NULL)//判断是否开辟成功{perror("malloc");return;}ps->a = p1;//开辟成功就放入ps->capacity = newcapaacity;}}void SLErase(SL* ps, int pos)
//指定位置删除数据
{assert(ps && ps->size&&pos>0&&pos<ps->size+1);//删除后//向左移动for (int u = pos-1; u < ps->size-1; u++){ps->a[u] = ps->a[u + 1];}(ps->size)--;//大小--
}//这个函数接口时保存通讯录文档,就是将通讯录的信息写入到文件
//保存通讯录文档
void PutSLFile(SL* ps)
{//写入文件FILE* pfwrite = fopen("contact.txt","w");//判断 pfwrite 是否为NULLif (fwrite == NULL){perror("fopen->fwrite");return;}for (int i = 0; i < ps->size; i++){//用循环的方式//把每个数据以格式化的方式存入fprintf(pfwrite,"%s\n", ps->a[i].name);fprintf(pfwrite,"%s\n", ps->a[i].sex);fprintf(pfwrite,"%d\n", ps->a[i].age);fprintf(pfwrite,"%s\n", ps->a[i].phone);fprintf(pfwrite,"%s\n", ps->a[i].posit);}printf("保存成功!\n");fclose(pfwrite);pfwrite = NULL;
}//读取通讯录文档
void GetSLFile(SL* ps)
{FILE* pfread = fopen("contact.txt", "r");//防止NULL出现if (pfread == NULL){perror("fopen->pfread");return;}//先开辟空间//防止野指针的出现SLCheckCapacity(ps);//将数组每个数据进行初始存放while (fscanf(pfread,"%s%s%d%s%s",ps->a[ps->size].name, ps->a[ps->size].sex, &ps->a[ps->size].age, ps->a[ps->size].phone, ps->a[ps->size].posit) != EOF){SLCheckCapacity(ps);ps->size++;}//打印提示信息printf("读取成功!\n");//关闭文件fclose(pfread);//防止野指针pfread = NULL;
}void SLDestroy(SL*ps)
//销毁顺序表
{assert(ps);ps->capacity = 0;ps->size = 0;//容量和大小都置为0free(ps->a);//释放空间ps->a = NULL;//a置为空指针
}

通讯录测试文件

<3>. contact.c

#include "seqlist.h"void Meau()
//菜单功能介绍
{printf("------------------ 通讯录 -------------------\n");printf("--------- 1.添加联系人 2.查找联系人 ---------\n");	printf("--------- 3.删除联系人 4.修改联系人 ---------\n");printf("--------- 5.显示通讯录 6.保存通讯录 ---------\n");printf("----------7.读取已存通讯录 0. 退出 ----------\n");}void ContastInit(SL*ps)
//通讯录初始化
{SLInit(ps);
}void ContastDestory(SL* ps)
//销毁通讯录
{SLDestroy(ps);
}void ContastAdd(SL* ps)
//添加联系人
{SLCheckCapacity(ps);//空间不够时puts("亲,请输入你的姓名:");scanf("%s", ps->a[ps->size].name);puts("亲,请输入你的性别:");scanf("%s", ps->a[ps->size].sex);puts("亲,请输入你的年龄:");scanf("%d", &ps->a[ps->size].age);puts("亲,请输入你的电话:");scanf("%s", ps->a[ps->size].phone);puts("亲,请输入你的住址:");scanf("%s", ps->a[ps->size].posit);ps->size++;
}void ContastShow(SL* ps)
//显示通讯录
{assert(ps && ps->size);printf("名字\t性别\t年龄\t电话\t地址\n");for (int i = 0; i < ps->size; i++){printf("%s\t", ps->a[i].name);printf("%s\t", ps->a[i].sex);printf("%d\t", ps->a[i].age);printf("%s\t", ps->a[i].phone);printf("%s\n", ps->a[i].posit);}
}int Findname(SL*ps, char nm[])
//查找名字
{for (int i = 0; i < ps->size; i++){if (strcmp(ps->a[i].name, nm) == 0){return i;}}return -1;
}
void ContastFind(SL*ps)
//查找联系人
{char nm[50] = {0};puts("请输入要查找的联系人姓名");scanf("%s", nm);int m = Findname(ps, nm);if (m>=0){printf("名字\t性别\t年龄\t电话\t地址\n");printf("%s\t", ps->a[m].name);printf("%s\t", ps->a[m].sex);printf("%d\t", ps->a[m].age);printf("%s\t", ps->a[m].phone);printf("%s\n", ps->a[m].posit);return;}printf("未搜索到该联系人,查找错误!\n");}void Contastdele(SL*ps)
//删除指定联系人
{char nm[50] = { 0 };puts("请输入要删除的联系人姓名");scanf("%s", nm);int m = Findname(ps, nm);if (m >= 0){SLErase(ps, m + 1);printf("删除成功!\n");return;}puts("未搜索到该联系人, 删除错误!");
}void ContastSet(SL* ps)
//修改指定联系人信息
{char nm[50] = { 0 };puts("请输入要修改的联系人姓名");scanf("%s", nm);int m = Findname(ps, nm);if (m >=0){puts("亲,请输入你修改后的姓名:");scanf("%s", ps->a[m].name);puts("亲,请输入你修改后的性别:");scanf("%s", ps->a[m].sex);puts("亲,请输入你修改后的年龄:");scanf("%d", &ps->a[m].age);puts("亲,请输入你修改后的电话:");scanf("%s", ps->a[m].phone);puts("亲,请输入你修改后的住址:");scanf("%s", ps->a[m].posit);printf("该联系人修改成功!\n");return ;}puts("未搜索到该联系人,修改失败!");
}

逻辑测试文件

<4>. test.c

#include "seqlist.h"int main()
{int n = 0;SL con;//con就是你存储的通讯录ContastInit(&con);do{Meau();puts("请进行以上操作:");scanf("%d", &n);switch (n){case 1:ContastAdd(&con);//添加联系人break;case 2:ContastFind(&con);//查找联系人break;case 3:Contastdele(&con);//删除联系人break;	case 4:ContastSet(&con);//修改联系人break;case 5:ContastShow(&con);//显示通讯录break;case 6:PutSLFile(&con);//保存通讯录文档break;case 7:GetSLFile(&con);//读取通讯录信息break;case 0://退出通讯录puts("通讯录正在退出中...");break;default:printf("输入错误,请重新操作!!!\n");break;}} while (n);ContastDestory(&con);return 0;
}

总结

这次小编带大家实现了我们的通讯录的小功能,虽不说浪漫,但还是饶有趣味的吧 😊 😊 😊
最后让小编梳理下本篇文章我们收获了什么吧 😍 😍 😍

  • 静态顺序表和动态顺序表:

我们知道了静态和动态顺序表的本质都是 数组 ,不同的在于他们数组 长度大小 的是否固定

  • 利用动态顺序表实现通讯录:

比起固定的静态顺序表,我们更常用 数组长度 灵活多变 的动态顺序表

  • 通讯录的功能和逻辑框架:

首先带着宝子们建立通讯录的大体框架和各部分功能的简介

  • 每个逻辑功能的实现:

小编一步一步带着友友们见证了咱们通讯录的 “出生”“成长”“销毁” 的 全过程

  • 通讯录源代码展示:

展示了本次基于 顺序表 实现的通讯录全部的代码 💕💕💕

如果觉得小编写的还不错的咱可支持三关下,不妥当的咱评论区指正

希望我的文章能给各位家人们带来哪怕一点点的收获就是 小编创作 的最大动力 💖 💖 💖
在这里插入图片描述

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

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

相关文章

代码随想录算法训练营第39天 | 62.不同路径 + 63.不同路径 II

今日任务 62.不同路径 63. 不同路径 II 62.不同路径 - Medium 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只…

flutter如何实现省市区选择器

前言 当我们需要用户填写地址时&#xff0c;稳妥的做法是让用户通过“滚轮”来滑动选择省份&#xff0c;市&#xff0c;区&#xff0c;此文采用flutter的第三方库来实现这一功能&#xff0c;比调用高德地图api简单一些。 流程 选择库 这里我选择了一个最近更新且支持中国的…

Acwing 141 周赛 解题报告 | 珂学家 | 逆序数+奇偶性分析

前言 整体评价 很普通的一场比赛&#xff0c;t2思维题&#xff0c;初做时愣了下&#xff0c;幸好反应过来了。t3猜猜乐&#xff0c;感觉和逆序数有关&#xff0c;和奇偶性有关。不过要注意int溢出。 欢迎关注: 珂朵莉的天空之城 A. 客人数量 题型: 签到 累加和即可 import…

Three.js学习3:第一个Three.js页面

一、一图看懂Three.js 坐标 这个没什么好说的&#xff0c;只是需要注意颜色。在 Three.js 提供的编辑器中&#xff0c;各种物体的坐标也这样的色彩&#xff1a; 红色&#xff1a;x 轴 绿色&#xff1a;y 轴 蓝色&#xff1a;z 轴 Three.js 提供的编辑器可以在本地 Three.js …

常用git指令

一.安装配置git&&利用SSH完成Git与GitHub的绑定 1.参考知乎网址&#xff1a;还不会使用 GitHub &#xff1f; GitHub 教程来了&#xff01;万字图文详解 二.在git上更新仓库步骤 1.在新建文件夹下&#xff0c;右键选择“git bash here” 2.把项目下载到本地&#xf…

AI应用开发-git开源项目的一些问题及镜像解决办法

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

微信小程序(三十一)本地同步存储API

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.存储数据 2.读取数据 3.删除数据 4.清空数据 源码&#xff1a; index.wxml <!-- 列表渲染基础写法&#xff0c;不明白的看上一篇 --> <view class"students"><view class"item…

使用 git 将本地文件上传到 gitee 远程仓库中,推送失败

项目场景&#xff1a; 背景&#xff1a; 使用 git 想要push 本地文件 到 另一个远程仓库&#xff0c;执行 git push origin master后此时报错 问题描述 问题&#xff1a; git push 本地文件 到 另一个远程仓库时&#xff0c;运行 git push origin master ,push文件失败&…

老版本labelme如何不保存imagedata

我的版本是3.16&#xff0c;默认英文且不带取消保存imagedata的选项。 最简单粗暴的方法就是在json文件保存时把传递过来的imagedata数据设定为None&#xff0c;方法如下&#xff1a; 找到labelme的源文件&#xff0c;例如&#xff1a;D:\conda\envs\deeplab\Lib\site-packages…

vue 适配大屏 页面 整体缩放

正常应该放在app.vue 里面。我这里因为用到element-ui 弹框无法缩放&#xff0c;所以加在body上面 (function (doc, win) {var docEl doc.documentElement,resizeEvt orientationchange in window ? orientationchange : resize,recalc function () {var clientWidth docE…

基于协同过滤的个性化电影推荐系统分析设计python+flask

本系统为用户而设计制作个性化电影推荐管理&#xff0c;旨在实现个性化电影推荐智能化、现代化管理。本个性化电影推荐自动化系统的开发和研制的最终目的是将个性化电影推荐的运作模式从手工记录数据转变为网络信息查询管理&#xff0c;从而为现代管理人员的使用提供更多的便利…

PPT录屏功能在哪?一键快速找到它!

在现代办公环境中&#xff0c;ppt的录屏功能日益受到关注&#xff0c;它不仅能帮助我们记录演示文稿的播放过程&#xff0c;还能将操作过程、游戏等内容完美录制下来。可是很多人不知道ppt录屏功能在哪&#xff0c;本文将为您介绍ppt录屏的打开方法&#xff0c;以帮助读者更好地…

如何计算两个指定日期相差几年几月几日

一、题目要求 假定给出两个日期&#xff0c;让你计算两个日期之间相差多少年&#xff0c;多少月&#xff0c;多少天&#xff0c;应该如何操作呢&#xff1f; 本文提供网页、ChatGPT法、VBA法和Python法等四种不同的解法。 二、解决办法 1. 网页计算法 这种方法是利用网站给…

时间回显+选择(年月日时分秒

一、获取某个时间 1、Date获取Date类型 <el-form-item label"时间" name"endTime"><el-date-picker type"datetime" v-model"editForm.endTime"></el-date-picker> </el-form-item> 效果如图&#xff1a; …

Java学习笔记2024/1/29

1. 流程控制语句 笔记地点 1.1 流程控制语句基础概念 package com.angus.processControlStatement.processControlStatement;public class processControlStatementNote {public static void main(String[] args) {// 本章知识点: 流程控制语句// 流程控制语句: 通过一些语句…

基于SpringBoot Vue超市管理系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

Java 数据结构 二叉树(一)二叉查询树

目录 树的种类 二叉树 二叉查找树 满二叉树 ​编辑 完全二叉树 二叉树的数据存储 链式存储 数组存储 寻址方式&#xff1a; 二叉树的遍历&#xff08;了解即可&#xff09; ​编辑 二叉查询树缺点 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满…

人大金仓将在未来产业创新发展中扮演更加重要的角色

1月29日&#xff0c;工信部等七部门联合发布《关于推动未来产业创新发展的实施意见》&#xff0c;指出面向未来制造、未来信息、未来材料、未来能源、未来空间、未来健康等六大重点方向&#xff0c;将发挥新型举国体制优势&#xff0c;引导地方结合产业基础和资源禀赋&#xff…

专业139总分400+南昌大学811信号与系统考研经验电子信息与通信工程集成电路

今年专业课811信号与系统139分&#xff0c;总分400&#xff0c;顺利上岸南昌大学&#xff0c;回首这一年的复习&#xff0c;有很多经验想和大家分享&#xff0c;希望对大家复习会有一些帮助。专业课&#xff1a;139分&#xff0c;811信号与系统 主要参考书&#xff1a;《信号与…

python pygame实现倒计时

实现思路 获取开始时间、当前时间&#xff0c;通过当前时间-开始时间时间差&#xff0c;再通过倒计时的总时长-时间差即可实现&#xff01; 随着时间的流逝&#xff0c;当前时间会变大&#xff0c;也就导致时间差会变大&#xff0c;当使用总时长-时间差的时候&#xff0c;得到…