C语言——自定义数据类型

news2024/7/6 17:34:45

C语言自定义数据类型——结构体、共用体、枚举

目录

  • 一、 结构体的基本用法
    • 1.1 定义
    • 1.2 定义格式
    • 1.3 结构体变量
      • 1.3.1 概念
      • 1.3.2 格式
      • 1.3.3 定义结构体变量
        • (1) 先定义结构体,再定义结构体变量。
        • (2) 定义结构体的同时,定义结构体变量。
      • 1.3.4 结构体变量赋值
        • (1) 定义结构体变量时直接用花括号赋值
        • (2) 定义结构体变量时直接用点等法赋值:
        • (3) 定义结构体变量时未初始化,需要挨个单独赋值:
      • 1.3.5 访问结构体成员变量
      • 1.3.6 重定义 typedef
        • (1) 定义结构体的同时重定义
        • (2) 先定义结构体,再进行重定义
  • 二、结构体数组
    • 2.1 概念
    • 2.2 定义格式
      • (1)定义结构体同时定义结构体数组
      • (2)先定义结构体,再定义结构体数组
    • 2.3 初始化和赋值
      • (1)定义结构体数组的同时赋值
      • (2)先定义结构体数组,再对数组内每个元素分别赋值
    • 2.4 结构体数组输入输出(通过循环)
    • 2.5 结构体大小
  • 三、结构体大小以及对齐原则
    • 3.1 结构体大小用sizeof计算
    • 3.2 字节对齐原则
    • 3.3 节省空间原则
  • 四、结构体指针
    • 4.1 概念
    • 4.2 定义格式
    • 4.3 结构体指针成员变量赋值
  • 五、结构体内包含结构体
    • 结构体总结:
  • 六、共用体
    • 6.1格式
    • 6.2 定义共用体union变量
    • 6.3 特性
    • 6.4 使用共用体测试大小端:🎯
  • 七、枚举
    • 7.1 定义
    • 7.2 格式
  • 八、数据类型总结
  • 八、数据类型总结

一、 结构体的基本用法

1.1 定义

结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义。

1.2 定义格式

struct 结构体名
{
	数据类型 成员变量1;
	数据类型 成员变量2;
	数据类型 成员变量3;
	...
};

举例:构造一个新的数据类型叫student,用来描述学生。

struct student
{
    char name[32];
    int age;
    float score;
};

1.3 结构体变量

1.3.1 概念

通过结构体数据类型定义的变量

1.3.2 格式

struct 结构体名 变量名;

1.3.3 定义结构体变量

(1) 先定义结构体,再定义结构体变量。

struct 结构体名
{
	成员变量;
};

struct 结构体名 变量名;

例如:

struct student
{
    char name[32];
    int age;
    float score;
};
struct student s1;

(2) 定义结构体的同时,定义结构体变量。

struct 结构体名
{
	成员变量;
} 变量名;

例如:

struct person
{
    char name[32];
    int age;
} per1;

也可以缺省结构体名定义结构体变量:

struct
{
	成员变量;
} 变量名;

1.3.4 结构体变量赋值

先定义一个结构体:

struct student
{
	int id;
	char name[32];
	int age;
};

(1) 定义结构体变量时直接用花括号赋值

struct student stu1 ={1,"xiaofang", 18};

(2) 定义结构体变量时直接用点等法赋值:

    struct student stu2 ={
        .id = 2,
        .name = "xiaoming",
        .age = 42
    };

(3) 定义结构体变量时未初始化,需要挨个单独赋值:

struct student stu3;
stu3.id = 3;
stu3.age = 69;
strcpy(stu3.name,"laowang");

1.3.5 访问结构体成员变量

通过.访问: 结构体变量名.结构体成员变量名。

struct student stu4;
scanf("%d %s %d",&stu4.id,stu4.name,&stu4.age);
printf("%d %s %d\n",stu4.id,stu4.name,stu4.age);

练习:创建一个名为student的结构体,包含姓名,学号,班级, 从终端输入学生的信息并打印。

#include <stdio.h>
#include <string.h>
struct student
{
    char name[32];
    int id;
    int class;
};

int main()
{
   struct student stu1;
   scanf("%s %d %d",stu1.name,&stu1.id,&stu1.class);
   printf("%s %d %d\n",stu1.name,stu1.id,stu1.class);
}

1.3.6 重定义 typedef

重定义的含义就是给语句另起一个名字

例如:

typedef int size_t;

此时int a; 也可以写成 size_t a;

typedef int* int_pointer;

int a;

此时int* p=&a; 可以写成 int_pointer p=&a;

(1) 定义结构体的同时重定义

#include <stdio.h>
#include <string.h>
typedef struct flower
{
    char type[32];
    int size;
    char color[32];
} flo;

int main()
{
    flo f1 = {"rose",10,"red"};
    printf("%s %d %s\n",f1.type,f1.size,f1.color);
}

(2) 先定义结构体,再进行重定义

struct animal
{
    char type[32];
    char class[32];
    int wight;
};
typedef struct animal ANIMAL;
int main()
{
    ANIMAL an1 = {"dog","buru",200};
    printf("%s %s %d\n",an1.type,an1.class,an1.wight);
}

练习:创建一个描述手机的结构体叫phone, 包含品牌,型号,颜色,价格。从终端输入你自己手机的信息并打印。

typedef struct phone
{
    char brand[32];
    char typde[32];
    char color[32];
    int price;
} pho;
int main()
{
    pho ph1;
    scanf("%s %s %s %d", ph1.brand, ph1.typde, ph1.color, &ph1.price);
    printf("%s %s %s %d\n", ph1.brand, ph1.typde, ph1.color, ph1.price);
    return 0;
}

二、结构体数组

2.1 概念

本质是数组,结构体类型相同的变量组成的数组

2.2 定义格式

(1)定义结构体同时定义结构体数组

struct student
{
	int id;
int age;
float score;
} stu[5];

(2)先定义结构体,再定义结构体数组

struct student
{
	int id;
	int age;
	float score;
};

struct student stu[5];

2.3 初始化和赋值

(1)定义结构体数组的同时赋值

方法一:

#include <stdio.h>
#include <string.h>
struct hero
{
    char name[32];
    char postion[32];
    char skill1[32];
    char skill2[32];
    char skill3[32];
    char skill4[32];
    int price;
};
int main()
{
    struct hero h[2] =
        {
            {"ali","fashi","1","2","3","4",4300},
            {"shitou","tanke","1","2","3","4",3150}
        };

    printf("%s %s %s %s %s %s %d\n", h[1].name, h[1].postion, h[1].skill1, h[1].skill2, h[1].skill3, h[1].skill4, h[1].price);
    return 0;
}

方法二:“点等法”

#include <stdio.h>
struct student
{
	int num;
	float score;
	char name[32];
};
int main(int argc, const char *argv[])
{
#if 0
	struct student stu[3] = {1,99.9,"zhangsan",2,88.8,"lisi",3,98.9,"wangwu"};
#endif
#if 0
	struct student stu[3]=
	{
		[0] = {
			.num = 1,
			.score = 99.9,
			.name = "zhangsan",
		},
		[2] = {
			.num = 3,
			.score = 77.7,
			.name = "lisi",
		}
	
	};
	int i;
	for(i = 0; i < sizeof(stu)/sizeof(struct student);i++)
	{
		printf("%d,%f,%s\n",stu[i].num,stu[i].score,stu[i].name);
	}
#endif
	struct student stu = 
	{
		.num = 1,
		.score = 99.9,
		.name = "wangwu",
	};
#if 0
	stu.num = 1;
	stu.score = 99.9;
#endif
	printf("%d,%f,%s\n",stu.num,stu.score,stu.name);
	return 0;
}

(2)先定义结构体数组,再对数组内每个元素分别赋值

#include <stdio.h>
#include <string.h>
struct hero
{
    char name[32];
    char postion[32];
    char skill1[32];
    char skill2[32];
    char skill3[32];
    char skill4[32];
    int price;
};
int main()
{
    struct hero he[2];
    strcpy(he[0].name,"namei");
    strcpy(he[0].postion,"fashi");
    he[0].price = 6300;
    printf("%s %s %d\n", he[0].name, he[0].postion,he[0].price);
    return 0;
}

这里要注意📢,结构体成员变量为字符串类型,要为其单个赋值时,要用strcpy函数。

2.4 结构体数组输入输出(通过循环)

#include <stdio.h>
#include <string.h>
struct hero
{
    char name[32];
    char postion[32];
    int life;
    int magic;
    float speed;
    int price;
};
int main()
{
    struct hero h[5] =
        {
            {"ali", "magicer", 596, 481, 53.04, 6300},
            {"gailun", "tank", 700, 0, 55.04, 450},
            {"jee", "ad", 596, 200, 55.04, 6300},
            {"cat", "helfer", 400, 400, 45, 6300},
            {"ez", "adc", 550, 450, 53.04, 6300},
        };
    for (int i = 0; i < 5; i++)
    {
        printf("%s %s %d %d %f %d\n",h[i].name,h[i].postion,h[i].life,h[i].magic,h[i].speed
,h[i].price);
    }
    return 0;
}

2.5 结构体大小

(1)= 结构体类型大小 × 元素个数

(2)用sizeof(struct 结构体名) 或者sizeof(结构体变量名)

例如接着上面的练习:

printf("struct hero:%d %d\n",sizeof(struct hero),sizeof(h));//80 400

三、结构体大小以及对齐原则

3.1 结构体大小用sizeof计算

#include <stdio.h>
#include <string.h>

struct st
{
    char a;
    char b;
    int c;
};

struct s
{
    char a;
    int b;
    char c;
};
int main()
{
    printf("%d\n",sizeof(struct st)); //8
    printf("%d\n",sizeof(struct s));  //12
    return 0;
}

3.2 字节对齐原则

(1)第一个成员在相对于结构体变量起始位置偏移量为0的地址处。通俗点来说,就是第一个成员变量的地址与结构体起始位置的地址是相同的。如下图所示:

p9TyFeA.png

(2)用结构体成员里面最大的数据类型的大小和字节进行比较,然后按照字节数小的为单位开辟空间。例如上图例子,每个成员都要给他以4字节为单位开辟空间。

3.3 节省空间原则

为了减少空间浪费,把占用空间小的成员集中到一起

p9Ts4iV.png

四、结构体指针

4.1 概念

指向结构体变量的指针

4.2 定义格式

*struct 结构体名 结构体指针名;

例如:

struct student
{
    int id;
    char name[32];
}s1,s2;

struct work
{
    int id;
    int age;
}w1,w2;

struct student *sp = &s1;
//struct student *p=&w1; //错误,结构体类型不同

4.3 结构体指针成员变量赋值

格式:指针变量名->成员变量名 或者:*(指针变量名).成员变量名

#include <stdio.h>
#include <string.h>
struct student
{
    int id;
    char name[32];
}s1,s2;
int main()
{
    struct student *sp = &s1;
    strcpy(sp->name,"xiaoming");
    sp->id=123;
    printf("%s %d\n",s1.name,s1.id);
    printf("%s %d\n",sp->name,sp->id);

    return 0;
}

注:结构体指针大小:4字节,因为本质还是指针。

五、结构体内包含结构体

如果结构体内成员本身属于另一种结构体,得用若干个成员运算符一级级找到最低级的成员变量。

#include <stdio.h>
#include <string.h>

struct work
{
    int ip;
};

struct student
{
    int id;
    int age;
    struct work w1;
} stu1, stu2;

int main()
{
    stu1.w1.ip = 2;
    stu1.id = 1;
    stu1.age = 20;
    printf("%d %d %d\n", stu1.w1.ip, stu1.id, stu1.age);
    return 0;
}

结构体总结:

  1. 不能把结构体类型变量作为整体引用,只能对结构体内变量中的各个成员分别引用。
  2. 如果成员本身属于另一种结构体类型,要用若干个成员运算符.一级级找到最低级成员变量。
  3. 可以把成员变量当成普通变量运算
  4. 数组中,成员之间不能彼此赋值,但是结构体变量可以互相赋值。

练习1:
创建一个结构体数组,数组名为book,结构体成员包含编号,书名,售价(数据类型自己设定)。写一个函数,包含两个形参,分别接收结构体数组的首地址和一个指定的售价,函数的功能为打印结构体数组中售价大于指定售价的书的信息。

#include <stdio.h>
#include <string.h>

typedef struct book
{
    int number;
    char name[32];
    int price;
} BOOK;
BOOK b[5]={
    {1,"santi",25},
    {2,"hongloumeng",45},
    {3,"jinpingmei",50},
    {4,"xiyouji",87},
    {5,"sanguo",67}
};

void book_Pri(BOOK *p, int n)
{
    for(int i=0;i<5;i++)
    {
        if(p->price >= n)
            printf("%d %s %d\n",p->number,p->name,p->price);
        p++;
    }
}
int main()
{
    book_Pri(b,50);
    return 0;
}

练习2:创建一个名为student的结构体数组,包含学号,姓名,分数,(数据类型自己定义),从终端输入学生的信息并打印分数及格的学生信息(输入3人即可)。封装函数实现把其中第几个学生信息清零。

#include <stdio.h>
#include <string.h>

typedef struct student
{
    int id;
	char name[32];
	float score;
} STU;
STU s[3];

void delStudent(STU *p, int n)
{
    n--;
    /*第一种清零方式 */
    // (p+n)->id=0;
    // strcpy((p+n)->name,"\0");
    // (p+n)->score=0;

    /*第二种清零方式 */
    //memset((p+n),0,sizeof(struct student));

    /*第三种清零方式*/
    STU stu2 ={0,"\0",0};
    p[n] =  stu2;
}

int main()
{
    printf("pls input student information:\n");
	for(int i=0;i<3;i++)
		scanf("%d %s %f",&s[i].id,s[i].name,&s[i].score);
    for(int i=0;i<3;i++)
    {
        if(s[i].score >= 60)
            printf("%d %s %f\n",s[i].id,s[i].name,s[i].score);
    }
    delStudent(s,2);
	printf("student information:\n");
    for(int j=0;j<3;j++)
		printf("%d %s %f\n",s[j].id,s[j].name,s[j].score);
	return 0;
}

练习3:创建一个结构体数组,数组名为lolHero,成员包含名称, 位置, 血量和价格。给出每个lol英雄信息,封装函数实现按价格从低到高打印英雄信息。(用冒泡排序)

#include <stdio.h>
#define N 5
typedef struct hero
{
    char *name;
    char *position;
    int blood;
    int price;
} HERO;

void sort(HERO *p, int n) 
{
    HERO temp;
    for (int i = 1; i < N ; i++)
    {
        for (int j = 0; j < N - i; j++)
        {
            if (p[j].price > p[j + 1].price)
            {
                temp = p[j];
                p[j] = p[j + 1];
                p[j + 1] = temp;
            }
        }
    }
}

int main(void)
{
    HERO lolHero[N] = {
        {"ali", "ap", 596, 6300},
        {"gailun", "tank", 700, 450},
        {"jee", "ad", 596, 6000},
        {"cat", "helfer", 400, 6300},
        {"ez", "adc", 550, 6500}
    };

    sort(lolHero, N);
    for (int i = 0; i < N; i++)
        printf("%d. %8s %8s %8d %8d\n",i+1, lolHero[i].name, lolHero[i].position, lolHero[i].blood, lolHero[i].price);
}

练习4:已知字符数组a[10]和b[10]中元素的值递增有序,封装函数并用指针实现将两个数组中元素按照递增顺序输出。

如:char a[10]=”acdgjmno” ; char b[10]=”befhil”;->”abcdefghijlmno”

思路:利用指针比较两字符数组中的元素,若a中的小,打印a中字符,然后a的指针移动到下一个元素继续比较,反之打印b然后移动b指针到下一个元素继续比较。最后判断字符串是否结束,打印没有结束的字符串剩下部分

#include <stdio.h>
void fun(char *p1, char *p2)
{
    while (*p1 != '\0' && *p2 != '\0')  //判断是否到两个数组的结尾
    {
        if (*p1 < *p2)                  //进行比较,把小的数据打印出来
        {
            printf("%c", *p1);
            p1++;
        }
        else
        {
            printf("%c", *p2);
            p2++;
        }
    }
    if (*p1 == '\0')                    //把其中剩下的数据打印出来
        printf("%s\n", p2);
    else if (*p2 == '\0')
        printf("%s\n", p1);
}
int main(int argc, char const *argv[])
{
    char a[10] = "acegijkm";
    char b[10] = "bdfh";
    fun(a, b);
    return 0;
}

六、共用体

共用体有时候也称联合体,用法类似结构体struct,区别在于结构体所占内存大小等于所有成员占用内存总和。而共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新成员赋值,就会把原来成员的值覆盖掉。

6.1格式

union 共用体名
{
	成员列表;
};

6.2 定义共用体union变量

#include <stdio.h>
union val
{
    int a;
    char ch;
};
union val v;

int main(int argc, char const *argv[])
{
    v.a=10;
    v.ch='c';

    printf("%d\n",v.a);
    return 0;
}

得出共用体变量共用一块空间

6.3 特性

  • (1) 共用体成员共同使用一块内存空间

  • (2) 赋值顺序以最后依次赋值为准

  • (3) 共用体的大小为成员中数据类型最大的数据为大小

p9TyL6g.png

6.4 使用共用体测试大小端:🎯

#include <stdio.h>
union val
{
    int a;
    char ch;
};
union val v;

int main(int argc, char const *argv[])
{
    v.a=10;
    if(v.ch == 10)
        printf("small\n");
    else if(v.ch == 0)
        printf("big\n");

    printf("%d\n",v.ch);
    return 0;
}

七、枚举

7.1 定义

用户自定义数据类型,可以用于声明一组常数。

在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都起一个名字。

例如以每周七天为例子,我们可以使用宏定义#define来为每天命名:

#define MON 1

#define TUES 2

虽然能解决问题但是宏名过多导致代码看起来很松散,所以C语言提供了一种枚举enum,能够列出所有可能的取值,并给它们起一个名字。

7.2 格式

enum 枚举名
{
	value 1,
	value 2,
	value 3,
	...
};

未赋初值时,第一个常数会默认为0,然后下面的依次加一。每个元素都可以赋值,如果有元素没有赋值则默认值为上一个元素加一。

例子:

#include <stdio.h>
enum week
{
    MON,
    THES = 2,
    WED,
};
int main(int argc, char const *argv[])
{
    int day = 0;
    scanf("%d", &day);
    switch (day)
    {
    case MON:
        printf("%d\n", MON);
        break;
    case THES:
        printf("%d\n", THES);
        break;
    case WED:
        printf("%d\n", WED);
        break;
    default:
        break;
    }
    printf("MON:%d\n", MON);
    printf("THES:%d\n", THES);
    printf("WED:%d\n", WED);
    return 0;
}

八、数据类型总结

  1. 基本数据类型:基本数据类型主要的特点是其值不可以再分解为其他类型,也就是说,基本数据类型是自我说明的。如: short int long float double signed unsigned
  2. 构造数据类型:构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说一个构造型的值可以分解成若干个“成员”或者“元素”。每个“成员”都是一个基本数据类型或者又是一个构造型。struct结构体、union联合体、enum枚举和数组。
  3. 指针类型:指针是一个特殊的数据类型。其值用来标识某个变量再内存中的地址。虽然指针变量的取值类似于整型,但这两个类型完全不同,不能混淆。定义时要加*。

例子:

#include <stdio.h>
enum week
{
    MON,
    THES = 2,
    WED,
};
int main(int argc, char const *argv[])
{
    int day = 0;
    scanf("%d", &day);
    switch (day)
    {
    case MON:
        printf("%d\n", MON);
        break;
    case THES:
        printf("%d\n", THES);
        break;
    case WED:
        printf("%d\n", WED);
        break;
    default:
        break;
    }
    printf("MON:%d\n", MON);
    printf("THES:%d\n", THES);
    printf("WED:%d\n", WED);
    return 0;
}

八、数据类型总结

  1. 基本数据类型:基本数据类型主要的特点是其值不可以再分解为其他类型,也就是说,基本数据类型是自我说明的。如: short int long float double signed unsigned
  2. 构造数据类型:构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说一个构造型的值可以分解成若干个“成员”或者“元素”。每个“成员”都是一个基本数据类型或者又是一个构造型。struct结构体、union联合体、enum枚举和数组。
  3. 指针类型:指针是一个特殊的数据类型。其值用来标识某个变量再内存中的地址。虽然指针变量的取值类似于整型,但这两个类型完全不同,不能混淆。定义时要加*。
  4. 空类型:空类型void用来定义任意类型的指针和无返回值的函数。

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

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

相关文章

L1L2,范数损失

目录 1. L2范数&#xff08;欧氏距离&#xff09;2. L2范数损失&#xff0c;这个听的/用的少一些3-1. L2损失&#xff08;均方误差&#xff09;3-2. L1损失&#xff08;平均绝对误差&#xff09;4. L1范数L2范数在机器学习方面的区别5. 为什么L2范数可以防止过拟合? 1. L2范数…

函数式接口入门简介

这里写目录标题 引子四种函数式接口-简单Demo四种函数式接口介绍函数式接口实战-代码对比 引子 只包含一个抽象方法的接口&#xff0c;就称为函数式接口。来源&#xff1a;java.util.function 我想在方法内直接定义方法直接获得结果&#xff0c;主要是也是为了配置lambda表达…

斐波那契数列数列相关简化2

看这篇文章前先看一下第一篇文章&#xff1a; 斐波那契数列数列相关简化1_鱼跃鹰飞的博客-CSDN博客 根据第一篇文章总结如下&#xff1a; 如果某个递归&#xff0c;除了初始项之外&#xff0c;具有如下的形式 F(N) C1 * F(N) C2 * F(N-1) … Ck * F(N-k) ( C1…Ck 和k都…

泛微 E-Office文件上传漏洞复现(CVE-2023-2523、CVE-2023-2648)

0x01 产品简介 泛微E-Office是一款标准化的协同 OA 办公软件&#xff0c;泛微协同办公产品系列成员之一,实行通用化产品设计&#xff0c;充分贴合企业管理需求&#xff0c;本着简洁易用、高效智能的原则&#xff0c;为企业快速打造移动化、无纸化、数字化的办公平台。 0x02 漏…

科普拓视野,逐梦新未来——人工智能研学工作坊

随着科技的发展&#xff0c;人工智能逐渐成为世界热门技术之一&#xff0c;为更好启发服务对象想象力&#xff0c;增强其创新精神和实践能力&#xff0c;让服务对象深入感受科技的发展与魅力&#xff0c;2023年5月20日&#xff0c;在阳泉市未成年人救助保护中心的支持下&#x…

如何使用WordPress作为文档管理和文件管理

您想使用 WordPress 来管理您的文件和文档吗&#xff1f; 您可能有需要与团队其他成员共享的电子表格、图像和其他文档。通过将这些文件上传到 WordPress&#xff0c;您可以轻松地与其他人协作&#xff0c;或者只是将这些文档放在 WordPress 仪表板上&#xff0c;以便轻松访问…

从菜鸟到专家,网络安全工程师必备证书有哪些?

网络空间的竞争&#xff0c;归根结底是人才的竞争。 在2022年网络安全周上&#xff0c;《网络安全人才实战能力白皮书》正式发布。数据显示&#xff0c;到2027年&#xff0c;我国网络安全人员缺口将达327万&#xff0c;而高校人才培养规模仅为3万/年。 那么&#xff0c;如果你…

8.1.0版本ELK搭建,开启xpack认证机制

8.1.0版本ELK搭建&#xff0c;开启xpack认证机制 部署环境安排下载elk安装包服务器环境配置部署elasticsearch配置认证配置客户端加密的http通信修改elastic配置文件 部署kibana部署logstash部署httpd&#xff0c;filebeat配置kibana页面部署grafana配置grafana连接elastic 部署…

C++中的多态,以及多态的实现、以及实现多态的两个特例。

一、 多态是什么&#xff1f; 通俗点说&#xff0c;就是多种形态。具体点就是不同对象完成某种事情&#xff0c;会产生不一样的状态。 举个例子&#xff1a;就好比&#xff1a;买票的时候&#xff0c;普通人、学生、军人等等&#xff0c;他们买票有不同的结果&#xff0c;普通人…

从零搭建完整python自动化测试框架(UI自动化和接口自动化 )

目录 一、总体框架 二、PO模式、DDT数据驱动、关键字驱动 三、框架技术选择 四、框架运行结果 五、各用例对应的定义方式&#xff08;PO/DDT&#xff09; 六、API接口定义方式 七、测试执行结果 从零开始搭建项目 一、开发环境搭建 二、新建项目 三、基础功能实现 …

前两天面了个腾讯28K来的,让我见识到了测试界的天花板

马上又是一年毕业季了&#xff0c;那么去年那一批毕业的应届生怎么样了&#xff1f; 2022年堪称大学生就业最难的一年&#xff0c;应届毕业生人数是1076万。失业率超50%&#xff01; 但是我观察到一个数据&#xff0c;那就是已经就业的毕业生中&#xff0c;计算机通信等行业最…

数据结构(C语言):一元多项式的操作(链表实现)

一、题目 一元多项式的操作 设有两个一元多项式&#xff1a; p(x)p0p1xp2x2pnxn q(x)q0q1xq2x2qmxm 多项式项的系数为实数&#xff0c;指数为整数&#xff0c;设计实现一元多项式操作的程序&#xff1a; ① 多项式链表建立&#xff1a;以&#xff08;系数&#xff0c;指数…

国内最佳的客服系统Tidio替代品是什么?

许多做跨境电商的企业都知道&#xff0c;Tidio是一款不错的为电子商务量身定制的全渠道客服系统支持工具&#xff0c;但还有其他同样不错的选择。 当前许多同类型产品以迎合欧美客户居多&#xff0c;中国用户使用不惯&#xff1b;免费版体验门槛高&#xff1b;只支持海外支付方…

【链路追踪】「Go语言」OpenTelemetry实现[gin, gRPC, log, gorm, redis]的集成

文章目录 一、OpenTelemetry的前世今生OpenTracingOpenCensus大一统 二、OpenTelemetry快速体验go快速体验OpenTelemetry系统架构尾部采样 三、通过http完成span传输函数中传递span的context 四、自定义inject和extract源码五、gRPC集成自用框架集成&#xff08;无视即可&#…

最强chrome、edge的广告拦截插件

最强chrome、edge的广告拦截插件 对于浏览器的广告是非常烦人的&#xff0c;尤其是使用百度搜索引擎时&#xff0c;总会在右侧出现百度热搜这样的东西&#xff0c;有时不经意间就会被某些热搜吸引。本来想搜索一些内容&#xff0c;结果被热搜等耗费了大量时间。 有很多人推荐…

pytorch基础语法学习:数据预处理transforms模块

来源&#xff1a;投稿 作者&#xff1a;阿克西 编辑&#xff1a;学姐 建议搭配视频食用 视频链接&#xff1a;https://ai.deepshare.net/detail/p_5df0ad9a09d37_qYqVmt85/6 系列其他文章传送门&#xff1a; pytorch基础语法学习&#xff1a;数据读取机制Dataloader与Datase…

3D点云数据转为俯瞰图Python实现代码

我主要是参考了英文博客来撰写本篇文章&#xff0c;仅作为个人学习笔记参考使用。 文章目录 一、点云数据二、图像与点云坐标三、创建点云数据的鸟瞰视图3.1 鸟瞰图的相关坐标轴3.2 限制点云数据范围3.3 将点位置映射到像素位置3.4 切换到新的零点3.5 像素值3.6 创建图像矩阵3.…

IOS最新版开通GPT-PLUS方法

前提&#xff0c;美国IP魔法 不多说了 1.拥有一个美区apple id账号 可以买&#xff0c;也可以自己申请 自己申请就打开魔法到apple官网注册&#xff0c;用gmail邮箱&#xff0c;然后地址用美国地址生成器&#xff0c;记得选免税州 2.充值礼品卡 支付宝可以充值礼品卡&…

大模型总是「胡说八道」怎么办?手把手教你如何应对!

随着 ChatGPT 的出现&#xff0c;「AI 幻觉」一词被频繁提及。那么&#xff0c;什么是 AI 幻觉&#xff1f;简单来说&#xff0c;就是大模型在一本正经地胡说八道。 不止 ChatGPT&#xff0c;其他大语言模型也经常如此&#xff0c;究其根本是大语言模型在训练的过程中存在数据偏…

驱动开发-----io模型总结(2023-5-23)

1.非阻塞模型 在我们使用open函数时&#xff0c;将打开的驱动设置为O_NONBLOCK时&#xff0c;当我们用read函数去读取硬件数据时&#xff0c;无论硬件是否有数据&#xff0c;都会往下执行&#xff0c;不会被阻塞在这里 2.阻塞模型 在我们使用open函数时&#xff0c;没有设置…