数据结构(Day14)

一、学习内容

  1. 结构体

    1. 概念

      1. 引入:定义整数赋值为10 int a=10; 定义小数赋值为3.14 float b=3.14; 定义5个整数并赋值 int arr[5] = {1 , 2 , 3 , 4 ,5}; 定义一个学生并赋值学号姓名成绩 定义一个雪糕并赋值名称产地单价 问题:没有学生、雪糕 数据类型 解决:结构体——存储多个 类型相同或不同的数据 的容器 区别:数组 和 结构体的区别是什么?

    2. 定义结构体的语法

      1. struct 结构体名{ 成员变量1; 成员变量2; 成员变量3; …… };

    3. 结构体变量的定义 初始化 赋值

      1. 结构体变量的定义
        1. 第一种
          1. struct student{ int id; char name[20]; float score; }a; //学生变量a

        2. 第二种
          1. struct student{ int id; char name[20]; float score; }; struct student a; //学生变量a

      2. 结构体变量的初始化和赋值
        1. 第一种
          1. 定义并初始化 struct student{ int id; char name[20]; float score; }a={1001,"孙文雅",90.5};

        2. 第二种
          1. 定义并初始化 struct student{ int id; char name[20]; float score; }; struct student a={1001,"孙文雅",90.5};

        3. 第三种
          1. 先定义、再赋值 struct studen a; //错误赋值 a={1001,"孙文雅",90}; //数组 和 结构体都是构造类型,能再分解,不能整体进行赋值、输入、输出。 //错误赋值 id = 1001; //原因:因为id在复合语句{}中,只能在{}中识别,不能在{}外直接识别 a.id = 1001; strcpy(a.name , "孙文雅"); a.score = 90.5;

        4. 第四种
          1. 先定义、再输入 struct student a; scanf("%d %s %f" , &a.id , a.name , &a.score);

    4. 结构体数组的定义 初始化 赋值

      1. 定义类型

        1. struct student{ int id; char name[20]; float score; };

        2. /struct student a , b , c , d , e; struct student a[3]; 分别是a[0] a[1] a[2] struct student a[3] = {{1001,"HQYJ",90.5},{1001,"HQYJ",90.5},{1001,"HQYJ",90.5}}

    5. typedef和结构体的结合使用

      1. typedef struct student{ int id; char name[20]; float score; }Stu , *Stu_Ptr , Stu_Arr[3]; Stu a = {1001,"HQYJ",90.5}; //定义学生变量a Stu_ptr p = &a; //定义学生指针变量p,指向学生变量a Stu_Arr arr = {{1001,"HQYJ",90.5},{1001,"HQYJ",90.5},{1001,"HQYJ",90.5}} printf("%d %s %.2f\n" , a.id , a.name , a.score); printf("%d %s %.2f\n" , p->id , p->name , p->score); for(int i=0; i<3; i++){ printf("%d %s %.2f\n" , arr[i].id , arr[i].name, arr[i].score); }

    6. 结构体的嵌套
      1. 结构体的嵌套
        1. 定义一个人的信息:姓名,性别,车(品牌,单价) struct CAR{ char brand[20]; float price; }; //定义 车 数据类型 struct people{ char name[20]; char sex; struct CAR car; }; struct people a = {"张三" , 'M' , {"奔驰",19.5}}; printf("姓名:%s 性别%c 车的品牌:%s 车的价格:%.2f万元" , a.name, a.sex, a.car.brand, a.car.price)

      2. 结构体嵌套结构体数组
        1. 定义一个人的信息:姓名,性别,2车(品牌,单价) struct CAR{ char brand[20]; float price; }; //定义 车 数据类型 struct people{ char name[20]; char sex; struct CAR car[2]; }; struct people a = {"张三" , 'M' , {{"奔驰",19.5},{"本田",23.75}}}; printf("姓名:%s 性别%c 车的品牌:%s 车的价格:%.2f万元" , a.name, a.sex, \ a.car[0].brand, a.car[0].price, a.car[1].brand, a.car[1].price)

      3. 结构体内部写动态函数
        1. 在c语言中,结构体中不可以有函数

        2. 在结构体中实现一个功能,则需要借助于函数指针

        3. 定义一个学生:姓名,年纪,分数,爱好(唱歌) void song(){ printf("苍茫的天涯是我的爱……\n"); } int fun(){ return 10086; } struct student{ char name[20]; int age; float score; void (*hobby)(); int (*p)(); }; struct student a={"张三",18,90.5,song}; printf("姓名:%s" , a.name); printf("年龄:%d" , a.age); printf("分数:%.2f" , a.score); a.hobby(); printf("积分:%d" , a.p());

      4. 结构体字节对齐
        1. 结构体各个成员的地址是连续的

        2. 结构体变量的地址是第一个成员的地址

        3. 64位操作系统,8字节对齐,32位操作系统,4字节对齐

        4. 计算步骤

          1. 先找最大步长【int/float 4字节 double/long/指针 8字节】

          2. 按照最大步长分布内存

          3. 在一个步长内就放进去

          4. 若跨步长了,就按照最大步长再开空间

          5. 最后计算总和即可

  2. 脑图

二、作业

  1. 求 sizeof(name1)?(晟安信息)

struct name1{

    char str;

    short x;

    int num;

};

解析:

char str:占 1 字节,起始地址是 0。后面需要对齐到 2 字节(short x 的对齐要求),因此会插入 1 个填充字节。short x:起始地址是 2,占 2 字节。int num:按 4 字节对齐,x 结束的地址是 4,因此不需要额外的填充。num 占用 4 字节。str + 填充字节(1 字节) + x(2 字节)+ num(4 字节) = 8 字节。

解答:

8

  1. (电工时代)

typedef struct _a

{

    char c1;

    long i;

    char c2;

    double f;

}a;

typedef struct _b

{

    char c1;

    char c2;

    long i;

    double f;

}b;

sizeof(a) = _______;

sizeof(b) = _______;

解析:

sizeof(a):

char c1:占 1 字节,起始地址为 0。long i:需要按 8 字节对齐,因此从地址 8 开始,占用 8 字节。char c2:占 1 字节,从 c1 开始的地址为 16。由于 double f 需要 8 字节对齐,所以在 c2 后面将有 7 个填充字节。double f:占 8 字节,从地址 24 开始。

总大小:1 byte (c1) + 7 bytes (填充) + 8 bytes (long i) + 1 byte (c2) + 7 bytes (填充) + 8 bytes (double f) = 32 字节。

sizeof(b):

char c1 和 char c2:各占 1 字节,共 2 字节。为了满足 long i 的 8 字节对齐需求,后面会有 6 个填充字节。

long i:占 8 字节,从地址 8 开始。

double f:占 8 字节,从地址 16 开始。

总大小:1 byte (c1) + 1 byte (c2) + 6 bytes (填充) + 8 bytes (long i) + 8 bytes (double f) = 24 字节。

解答:

32  24

  1. 给了一个结构体,求 sizeof(struct A) = ________。 (鲁科安全,软通动力)

struct A{

    char a;

    char b;

    char c;

    short d;

    int e;

    short f;

}

解析:

char a:占 1 字节,起始地址为 0。

char b:占 1 字节,起始地址为 1。

char c:占 1 字节,起始地址为 2。

short d:占 2 字节,short 类型通常需要 2 字节对齐,所以地址 3 需要对齐到 4,插入 1 个填充字节。d 从地址 4 开始,占用 2 字节。

int e:占 4 字节,int 需要 4 字节对齐。从 d 结束后的地址是 6,需要对齐到 8,插入 2 个填充字节。e 从地址 8 开始,占用 4 字节。

short f:占 2 字节,short 需要 2 字节对齐。e 结束的地址是 12,因此 f 可以直接从地址 12 开始,占用 2 字节。

由于结构体整体对齐规则通常以最大成员对齐(这里 int 是 4 字节对齐),因此为了满足对齐要求,总大小要是 4 字节的倍数。f 结束时的地址是 14,因此需要插入 2 个填充字节,使结构体大小为 16 字节

解答:

16

  1. 有一个如下的结构体,请问在64位编译器下用 sizeof(struct A) 计算出的大小是多少?( ) (鲁科安全)

struct A{

    long a1;

    short a2;

    int a3;

    int *a4;

}

A. 24               B. 28            C. 16            D. 18

解析:

long a1:占 8 字节,从地址 0 开始。short a2:占 2 字节,从地址 8 开始。short 类型通常要求 2 字节对齐,但是后面的 int a3 需要 4 字节对齐。填充字节:由于 int a3 需要 4 字节对齐,a2 结束后地址是 10,因此需要 2 个填充字节,使得 a3 从地址 12 开始。int a3:占 4 字节,从地址 12 开始。int *a4:占 8 字节,指针类型在 64 位系统中是 8 字节,要求 8 字节对齐。由于 a3 结束后的地址是 16,符合 8 字节对齐的要求,因此 a4 从地址 16 开始,占 8 字节。

总大小:long a1(8 字节) + short a2(2 字节) + 2 个填充字节 + int a3(4 字节)+ int *a4(8 字节)= 24 字节。

解答:

A

  1. 有以下说明语句,则下列错误的引用 是( )。(山大华天)

struct stu

{

    int no;

    char name[21];

};

stu w, *p = &w;

A. w.no           B*p.no         C. p->no              D. (*p).no

解析:

A. w.no

w 是结构体变量,可以直接使用点运算符 . 访问结构体成员 no。这是正确的引用方式。

B. *p.no

这是错误的语法,*p 是指针解引用,表示指向 w 的结构体,但是这里缺少括号。p.no 会被理解为 p 是结构体,试图访问其成员 no,这是不正确的,因为 p 是指针,而不是结构体。因此这个表达式应该写成 (*p).no。

C. p->no

p 是指向结构体的指针,箭头运算符 -> 用于通过指针访问结构体的成员。这是正确的引用方式。

D. (*p).no

通过 *p 解引用指针 p,访问结构体 w,再使用点运算符 . 来访问成员 no。这是正确的引用方式。

解答:

B

  1. 写出下述程序结果: (中维世纪)

typedef struct test

{

    char x1;

    short x2;

    float x3;

    char x4;

}TEST_T;

printf("%d", sizeof(TEST_T));

解析:

char x1:占 1 字节,起始地址是 0。short x2short 类型通常需要 2 字节对齐,因此在 x1 后面插入 1 个填充字节,使得 x2 从地址 2 开始,占 2 字节。float x3float 类型需要 4 字节对齐,x2 结束后的地址是 4,符合 float 的对齐要求,因此 x3 从地址 4 开始,占 4 字节。char x4:占 1 字节,x3 结束的地址是 8。由于 char 不需要对齐,x4 可以直接从地址 8 开始,占 1 字节。

总大小:为了满足结构体整体对齐,编译器通常会以最大的成员(这里是 float,即 4 字节)的对齐方式对齐整个结构体。因此,结构体的大小必须是 4 的倍数。x4 结束时的地址是 9,需要插入 3 个填充字节 以保证整体大小是 4 的倍数。

解答:

12

  1. 下面的代码输出是什么,为什么?(64位环境) (信雅达)

struct {

    char *a1;

    long a2;

    short a3;

}A;

int main(void)

{

    printf("%d", sizeof(A));

}

解析:

char *a1:指针类型在 64 位系统中占用 8 字节,起始地址是 0。long a2:long 类型在 64 位系统中占 8 字节,需要 8 字节对齐,所以 a2 可以从地址 8 开始,占 8 字节。short a3:short 类型占 2 字节,需要 2 字节对齐,a2 结束后的地址是 16,a3 可以从地址 16 开始,占用 2 字节。

填充字节:为了满足结构体整体对齐的要求,编译器通常以结构体中 最大对齐要求的成员 进行对齐。在这个例子中,最大的成员是 char *a1 和 long a2,它们的对齐要求是 8 字节。因此,为了保持结构体整体对齐,a3 后面需要插入 6 个填充字节,使得结构体的总大小是 8 字节的倍数。

总大小:8 bytes (a1) + 8 bytes (a2) + 2 bytes (a3) + 6 bytes (填充) = 24 字节

解答:

24

  1. 设有如下结构定义: struct student { int num; char name[20]; char sex; int age; char addr[30];} stud; 若用printf("%s\n", .....)访问该结构中name值的正确方法是 ( ) (杭州快越科技)

A. stud -> name            B. &stud.name

C. stud.&name             D. stud.name

解析:

A. stud -> name

-> 运算符用于指针访问结构体成员,stud 是结构体变量,不是指针。因此,这个选项是错误的。

B. &stud.name

&stud.name 获取的是 name 数组的地址,虽然它和 stud.name 表示的内容类似,但 &stud.name 实际上是指向整个数组的地址,不适合直接用作字符串指针。这个选项虽然编译器可能接受,但语义不太合适。

C. stud.&name

这是语法错误,不能在结构体变量名后直接使用 &name,因此这个选项是错误的。

D. stud.name

这是正确的方式。stud.name 是字符数组名,在需要时会自动转换为指向数组第一个元素的指针,因此可以正确用于 printf("%s", stud.name) 语句。

解答:

D

  1. 则sizeof(cs)的值是( ) (苏州特点电子科技)
    struct

{

       short a; char b; float c;

}cs;

A.4               B.5               C.7               D.8

解析:

short a:占 2 字节,起始地址为 0。short 类型需要 2 字节对齐,因此无需填充字节。char b:占 1 字节,从地址 2 开始。由于 float c 需要 4 字节对齐,因此需要插入 1 个填充字节,使得接下来的 float c 从 4 字节对齐的地址开始。float c:占 4 字节,从地址 4 开始,符合 4 字节对齐要求。总大小:2 bytes (a) + 1 byte (b) + 1 byte (填充) + 4 bytes (c) = 8 字节。

结论:

sizeof(cs) 的值是 8 字节。解答:

D

  1. 如下函数的输出结果是:【 】

struct node

{

   char a; short b; char c; int d;

};

struct node s = { 3, 5, 6, 99 };

struct node *pt = &s;

printf("%X\n", *(int*)pt);

解析:

char a:1 字节short b:2 字节,起始地址在 a 后面,所以实际地址为 2填充字节:由于 int d 需要 4 字节对齐,在 short b 后面需要 1 个填充字节,使 d 从地址 4 开始char c:1 字节,实际地址为 4int d:4 字节,从地址 8 开始

假设结构体在内存中的布局如下(假设按小端字节序):

a = 0x03 (1 byte)

b = 0x05 (2 bytes)

c = 0x06 (1 byte)

d = 0x63 (4 bytes)

解引用指针

pt 是指向 struct node 的指针。(int*)pt 将指针转换为指向 int 的指针,实际上指向的是 d 成员,因为 d 是第一个 int 类型成员。*(int*)pt 读取 d 的值,即 99。

结果

d 的值是 99,按十六进制表示是 0x63。

解答:

63

  1. 编程题:定义学生结构体,存储学生的学号、姓名、分数,定义长度为5的结构体数组,实现:

①输入学生信息

②输出学生信息

③计算学生的成绩总分、平均分

④按照学生的分数进行排序

⑤输出排序后的数组

代码解答 :

#include <stdio.h>
#include <string.h>// 定义学生结构体
typedef struct {int id;        // 学号char name[50]; // 姓名float score;   // 分数
} Student;// 函数声明
void inputStudents(Student students[], int count);
void printStudents(const Student students[], int count);
float calculateTotalScore(const Student students[], int count);
float calculateAverageScore(const Student students[], int count);
void sortStudentsByScore(Student students[], int count);int main() {const int numStudents = 5; // 学生数量Student students[numStudents];// 输入学生信息printf("输入学生信息:\n");inputStudents(students, numStudents);// 输出学生信息printf("\n学生信息:\n");printStudents(students, numStudents);// 计算并输出成绩总分和平均分float totalScore = calculateTotalScore(students, numStudents);float averageScore = calculateAverageScore(students, numStudents);printf("\n成绩总分: %.2f\n", totalScore);printf("平均分: %.2f\n", averageScore);// 按分数排序sortStudentsByScore(students, numStudents);// 输出排序后的学生信息printf("\n按分数排序后的学生信息:\n");printStudents(students, numStudents);return 0;
}// 输入学生信息
void inputStudents(Student students[], int count) {for (int i = 0; i < count; i++) {printf("输入第 %d 位学生的信息:\n", i + 1);printf("学号: ");scanf("%d", &students[i].id);printf("姓名: ");scanf("%s", students[i].name);printf("分数: ");scanf("%f", &students[i].score);}
}// 输出学生信息
void printStudents(const Student students[], int count) {for (int i = 0; i < count; i++) {printf("学号: %d, 姓名: %s, 分数: %.2f\n", students[i].id, students[i].name, students[i].score);}
}// 计算总分
float calculateTotalScore(const Student students[], int count) {float total = 0;for (int i = 0; i < count; i++) {total += students[i].score;}return total;
}// 计算平均分
float calculateAverageScore(const Student students[], int count) {float total = calculateTotalScore(students, count);return total / count;
}// 按分数排序(升序)
void sortStudentsByScore(Student students[], int count) {for (int i = 0; i < count - 1; i++) {for (int j = i + 1; j < count; j++) {if (students[i].score > students[j].score) {// 交换Student temp = students[i];students[i] = students[j];students[j] = temp;}}}
}

三、总结

1. 学习内容概述

结构体定义与使用

了解了如何定义结构体,并通过实际例子学习了如何在结构体中使用各种数据类型。

学习了结构体变量的初始化方法,以及如何通过多种方式定义结构体数组。

学习了如何通过指针访问结构体成员,使用 `typedef` 简化结构体的声明和操作。

嵌套结构体

结构体内可以包含其他结构体,学习了如何定义一个嵌套结构体并初始化其成员变量。

结构体与函数结合

学习了如何将结构体与函数结合,通过函数传递结构体并返回结果。包括将结构体作为函数参数和返回值。

位字段的使用

位字段允许在结构体中节省内存空间,通过指定位数来定义变量的存储空间。

2. 学习难点

结构体指针的使用

结构体指针的使用较为复杂,尤其是在处理嵌套结构体时。理解如何通过指针访问和修改结构体成员是本次学习的难点。

结构体数组的初始化与访问

在结构体数组中,初始化每一个结构体成员以及使用指针遍历整个结构体数组需要较多练习,特别是对于较为复杂的结构体。

嵌套结构体的访问

嵌套结构体的成员访问更为复杂,需要通过多层次的点运算符和指针运算符。

3. 主要事项

结构体的内存对齐

结构体成员在内存中是按一定的对齐方式排列的,不同的机器和编译器可能会有不同的内存对齐策略,导致存储空间的浪费或性能下降。

结构体与动态内存分配

结构体中的数组成员如果长度不确定,可以通过动态内存分配来解决。在使用动态内存时,需要确保合理分配和释放内存。

结构体的拷贝与传递

结构体传递给函数时通常是按值传递的,可能会造成大量的内存拷贝,因此在函数中传递结构体指针更为高效。

位字段的限制

位字段可以节省空间,但由于其实现依赖于硬件和编译器,不同平台可能存在兼容性问题。

4. 未来学习的重点

深入理解结构体与内存的关系

未来应更加深入研究结构体的内存对齐方式,以及如何在不同平台下优化结构体的内存占用。

结构体与复杂数据结构结合

进一步学习如何使用结构体构建链表、树、图等复杂数据结构,并理解这些数据结构中的内存管理问题。

结构体与文件输入输出

研究如何将结构体与文件操作结合起来,例如将结构体数据写入文件或从文件读取结构体数据,确保文件读写的高效性和数据一致性。

提高结构体的性能优化

理解结构体优化对程序性能的影响,特别是在大型程序中如何通过优化结构体来减少内存占用和提高访问效率。

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

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

相关文章

Python语言学习-pandas库学习

一、什么是Pandas库 Pandas是python的第三方库&#xff0c;他用于灵活的数据操作&#xff0c;数据可视化&#xff0c;数据清洗&#xff0c;数据的聚合和转换&#xff0c;数据的可视化 二、安装pandas库 在终端中运行 pip install pandas 导入Pandas库并重命名为pd import …

2024年9月第3周AI资讯

阅读时间&#xff1a;3-4min 更新时间&#xff1a;2024.9.16-2024.9.20 目录 OpenAI 推出 o1&#xff1a;一种新的“推理”人工智能模型 微软为 Excel 和 Word 添加了更快的 Copilot World Labs 利用 AI 创建 3D 世界 AI 利用文本创建开放世界视频游戏 OpenAI 推出 o1&#x…

【vue element-ui】关于删除按钮的提示框,可一键复制

实现效果&#xff1a; Delete: function (id) {this.$confirm(此操作将永久删除该文件, 是否继续?, 提示, {confirmButtonText: 确定,cancelButtonText: 取消,type: warning,center: true,}).then(() > {Delete(id).then(() > {this.$message({type: success,message: 删…

工业交换机如何保证数据的访问安全

在现代工业自动化环境中&#xff0c;工业交换机作为关键的网络设备&#xff0c;扮演着数据传输和信息交互的重要角色。为了确保数据的访问安全&#xff0c;工业交换机不仅具备高效的转发性能&#xff0c;还集成了多层次的安全防护机制&#xff0c;以抵御各种潜在的网络威胁。 首…

传输大咖44 | 云计算企业大数据迁移如何更安全高效?

在云计算时代&#xff0c;数据已成为企业最宝贵的资产之一。对于依赖云服务的企业和组织来说&#xff0c;大数据迁移是实现业务扩展和优化的关键步骤。然而&#xff0c;这一过程并非没有挑战。传统的文件传输方式在安全性、稳定性和速度上往往无法满足云计算企业的需求。本文将…

C++(Qt)软件调试---断点高级用法(20)

C(Qt)软件调试—断点高级用法&#xff08;20&#xff09; 文章目录 C(Qt)软件调试---断点高级用法&#xff08;20&#xff09;[toc]1、概述2、断点高级用法1.1 条件断点1.2 日志断点/记录点/消息追踪点1.3 函数断点1.4 命中次数断点1.5 异常断点1.6 等待断点/触发断点1.7 临时断…

掌握数据中心虚拟化:关键挑战与解决方案

数据中心虚拟化是使用云软件平台将物理数据中心转变为数字数据中心的过程&#xff0c;使企业能够远程访问信息和应用程序。它包括在数据中心内创建物理基础设施的多个虚拟版本&#xff0c;通过将服务器、存储和网络等资源划分为虚拟实体来实现资源的高效利用。 虚拟化环境中的关…

Tomcat CVE-2017-12615 靶场攻略

漏洞描述 当 Tomcat运⾏在Windows操作系统时&#xff0c;且启⽤了HTTP PUT请求⽅法&#xff08;例如&#xff0c;将 readonly初始化参数由默认值设置为false&#xff09;&#xff0c;攻击者将有可能可通过精⼼构造的攻击请求数据包向服务器上传包含任意代 的 JSP ⽂件&#xf…

MySQL —— 索引

索引的概念 MySQL的索引是⼀种数据结构&#xff0c;它可以帮助数据库高效地查询、更新数据表中的数据。索引通过 ⼀定的规则排列数据表中的记录&#xff0c;使得对表的查询可以通过对索引的搜索来加快速度。 MySQL索引类似于书籍的目录&#xff0c;通过指向数据行的位置&…

Docker + Win 10 学习记录

下载Docker Release notes | Docker Docs 推荐使用4.33版本&#xff0c;最新的Docker版本在win10 22H2无法安装。需要升级到win11. 查看Win10版本是否与最新版的Docker兼容 运行 win R&#xff0c; 然后输入winver 如果你的Docker版本无法在当前的win10安装&#xff0c;请更…

基于云计算的虚拟电厂负荷预测

基于云计算的虚拟电厂负荷预测 随着电网规模的扩大及新能源的不断应用&#xff0c;并网电网的安全性和经济性备受关注。 电网调度不再是单一或局部控制&#xff0c;而是采用智能网络集成方式调度 。 智能电网应具有以下特点&#xff1a;坚强自愈&#xff0c;可以抵御外来干扰甚…

如何删除EXCELL文件中的空行?

1&#xff0c;选择某一列 2&#xff0c;点击《开始》《查找和选择》>《定位条件》&#xff0c;调出《定位条件》的选择框&#xff1b; 3&#xff0c;在定位条件选项框&#xff0c;选择《空值》&#xff1b; 4&#xff0c;找到变灰被选中的某一行&#xff0c;右击《删除》 5&…

Qt 构建版本

Qt提供了三种不同的构建版本&#xff1a;Debug版本&#xff08;调试版本&#xff09;、Release版本&#xff08;发布版本&#xff09;和Profile版本&#xff08;概述版本&#xff09;&#xff0c;每种版本都有其特定的用途和编译设置。 Debug版本&#xff08;调试版本&#x…

基于 SpringBoot 的在线考试系统

专业团队&#xff0c;咨询就送开题报告&#xff0c;欢迎大家私信留言&#xff0c;联系方式在文章底部 摘 要 网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合&#xff0c;利用java技术建设在线考试系统&#xff0c;实现在线考试的信息化管理。则对…

Python类及元类的创建流程

Python类及元类的创建流程 代码运行结果再看type和object的关系和约定type和object具有的方法不一样看代码和运行结果&#xff0c;可以完全理解python的执行过程。再补充几点&#xff0c; 代码 class MetaCls(type):print(0>>>, MetaCls, 0)def __init__(self, name,…

uniapp vue3 梯形选项卡组件

实现的效果图&#xff1a; 切换选项卡显示不同的内容&#xff0c;把这个选项卡做成了一个组件&#xff0c;需要的自取。 // 组件名为 trapezoidalTab <template> <view class"pd24"><view class"nav"><!-- 左侧 --><view cla…

idea启动oom了解决

解决 Error:java: java.lang.OutOfMemoryError: WrappedJavaFileObject[org.jetbrains.jps.javac.InputFileObject[file:///D:/mingan/pb/backend/src/main/java/com/cy/backend/service/impl/StorageServiceImpl.java]]pos36199: WrappedJavaFileObject[org.jetbrains.jps.j…

你是不是分不清哪些字体是商用,哪些非商用?快来看,免得莫名其妙负债。

前言 最近发现有好多小伙伴在做PPT的时候&#xff0c;都有一个很不好的习惯&#xff1a;没有调整好字体。 这里说的没有调整好字体的意思是&#xff1a;在一些公开发布的内容上使用一些可能造成侵权的字体。 字体侵权‌的后果相当严重。轻者可能面临法律纠纷&#xff0c;重者…

consul服务注册发现与配置中心

目录 1 consul安装与运行 1.1 下载方式 1.2 安装 1.3 启动 1.4 访问方式 2 consul 实现服务注册与发现 2.1 引入 2.2 服务注册 2.3 服务发现 3 consul配置中心 3.1 基础配置 Eureka已经停止更新了&#xff0c;consul是独立且和微服务功能解耦的注册中心&#xff0c;…

Nginx配置虚拟主机

基于域名的虚拟主机 修改配置 进入nginx里的conf目录 修改nginx配置文件nginx.conf vi nginx.conf worker_processes auto;(自动识别CPU数) worker_rlimit_nofile 20480;&#xff08;指定 worker 子进程可以打开的最大文件句柄数&#xff0c;默认为1024&#xff09; use …