数据结构(Day16)

news2024/11/13 9:48:48

一、学习内容

1、有关顺序表的操作(功能函数)

1、创建顺序表

Plist create_list(){
	Plist L = malloc(sizeof(list));  // 为顺序表分配内存空间
	if(NULL == L){
		printf("申请空间失败\n");
		return NULL;  // 如果内存分配失败,返回 NULL
	}
	L->len = 0;  // 初始化表的长度为0
	printf("创建成功\n");
	return L;  // 返回顺序表的指针
}

2、顺序表的判满

int full(Plist L){
	if(L->len == MAX){  // 如果学生数量等于最大容量,返回1表示已满
		return 1;
	}
	return 0;
}

3、顺序表的判空

int empty(Plist L){
	if(L->len == 0){  // 如果表长为0,表示顺序表为空
		return 1;
	}
	return 0;
}

4、顺序表增加数据

int input_list(Plist L){
	int n;
	printf("要输入学生的个数:\n");
	scanf("%d",&n);  // 输入学生数量
	for(int i=0; i<n; i++){
		printf("请输入第%d个学生信息:", i+1);
		printf("请输入学号:");
		scanf("%d",&L->data[i].id);  // 输入学号
		printf("请输入姓名:");
		scanf("%s",L->data[i].name);  // 输入姓名
		printf("请输入专业:");
		scanf("%s",L->data[i].major);  // 输入专业
		printf("请输入年龄:");
		scanf("%d",&L->data[i].age);  // 输入年龄
		L->len++;  // 学生数量增加
	}
	return 0;
}

5、顺序表的遍历

int output_list(Plist L){
	for(int i=0; i<L->len; i++){
		// 按格式输出每个学生的信息
		printf("学号:%d\t姓名:%s\t专业:%s\t年龄:%d\n",L->data[i].id,L->data[i].name,L->data[i].major,L->data[i].age);
	}
	return 0;
}

6、顺序表任意位置插入数据

int insert_stu(Plist L, int pos, student e){
	int sub = pos -1;  // 转换为数组下标
	if(sub<0 || sub>L->len || L==NULL || full(L)){  // 检查插入位置合法性和顺序表是否已满
		printf("插入失败\n");
		return -1;
	}
	for(int i=L->len-1; i>=sub; i--){  // 将元素后移,给插入新学生腾出位置
		L->data[i+1] = L->data[i];
	}
	L->data[sub] = e;  // 插入新学生信息
	L->len++;  // 学生数量增加
	printf("插入成功\n");
	return 0;
}

7、 顺序表任意位置删除操作

int delete_stu(Plist L, int pos){
	int sub = pos - 1;  // 转换为数组下标
	if(sub < 0 || sub > L->len-1 || L == NULL || empty(L)){  // 检查删除位置合法性和是否为空表
		printf("删除失败\n");
		return -1;
	}
	for(int i=sub; i<L->len; i++){  // 将后面的元素前移,覆盖要删除的元素
		L->data[i] = L->data[i+1];
	}
	L->len--;  // 学生数量减少
	printf("删除成功\n");
	return 0;
}

8、按位置修改函数

int change_stu(Plist L, int pos, student e){
	int sub = pos - 1;  // 转换为数组下标
	if(sub < 0 || sub > L->len-1 || L == NULL || empty(L)){  // 检查修改位置合法性和是否为空表
		printf("查找失败\n");
		return -1;
	}else{
		// 修改学生信息
		L->data[sub] = e;
		printf("修改成功\n");
		return 0;
	}
}

9、按值修改函数

int delete_stu(Plist L, int pos){
	int sub = pos - 1;  // 转换为数组下标
	if(sub < 0 || sub > L->len-1 || L == NULL || empty(L)){  // 检查删除位置合法性和是否为空表
		printf("删除失败\n");
		return -1;
	}
	for(int i=sub; i<L->len; i++){  // 将后面的元素前移,覆盖要删除的元素
		L->data[i] = L->data[i+1];
	}
	L->len--;  // 学生数量减少
	printf("删除成功\n");
	return 0;
}

10、 按值查找返回位置

int find_stu_all(Plist L, char key[20]){
	int i, sub = -1;
	for(i=0; i<L->len; i++){
		// 输出所有符合条件的学生信息
		if(strcmp(L->data[i].name, key) == 0){
			printf("位置:%d\t是%s\n",i+1,L->data[i].name);
			sub = i;
		}
	}
	if(sub == -1){
		return -1;  // 没有找到则返回 -1
	}
	return sub + 1;
}

11、查找指定位置上的元素

int find_stu(Plist L, char key[20]){
	int i, sub = -1;
	for(i=0; i<L->len; i++){
		// 找到符合条件的学生
		if(strcmp(L->data[i].name, key) == 0){
			sub = i;  // 记录找到的位置
		}
	}
	if(sub == -1){
		return -1;  // 没有找到则返回 -1
	}
	return sub + 1;  // 返回学生在表中的位置,位置从1开始计数
}

12、顺序表去重

nt delete_repeat(Plist L){
	int i, j;
	for(i=0; i<L->len; i++){
		for(j=i+1; j<L->len; j++){
			// 如果发现两个学生姓名相同,则删除后者
			if(strcmp(L->data[i].name, L->data[j].name) == 0){
				delete_stu(L, j+1);  // 删除重复的学生信息
				j--;  // 调整索引,继续检查下一个
			}
		}
	}
	return 0;
}

 

二、作业

制作部分学生管理系统

实现的功能有:

1、输入学生信息
2、任意位置插入一个学生
3、任意位置删除一个学生
4、任意位置查找一个学生
5、任意位置修改一个学生
6、表头插入一个学生
7、表尾插入一个学生
8、表头删除一个学生
t9、表尾删除一个学生
10、去除重复的学生
11、按照姓名查找返回位置
12、查找输出所有的学生

代码解答 :

头文件:
#ifndef LIST_H_  // 防止头文件被重复包含,定义预处理宏 LIST_H_
#define LIST_H_

#include <myhead.h>  // 包含自定义头文件 "myhead.h"

#define MAX 30  // 定义顺序表的最大容量为 30,表示最多可以存储 30 个学生信息

// 定义学生信息的结构体
typedef struct {
    int id;             // 学号,用整数表示
    char name[20];      // 姓名,最多存储 20 个字符
    char major[20];     // 专业,最多存储 20 个字符
    int age;            // 年龄,用整数表示
} student;  // 结构体类型 student,用于表示单个学生的信息

// 定义顺序表的结构体
typedef struct {
    student data[MAX];  // 存储学生信息的数组,最多包含 MAX 个 student 结构体
    int len;            // 统计学生个数,表示顺序表中当前已存储的学生数量
} list, *Plist;  // 定义顺序表类型 list,并定义 Plist 为指向 list 结构体的指针类型

// 函数声明区域

// 创建一个顺序表并返回指向该表的指针
Plist create_list();

// 输入学生信息并存储到顺序表中
int input_list(Plist);

// 输出顺序表中的所有学生信息
int output_list(Plist);

// 判断顺序表是否已满(即学生数量是否达到 MAX)
int full(Plist);

// 在顺序表的指定位置插入一个学生信息
int insert_stu(Plist, int, student);

// 判断顺序表是否为空
int empty(Plist);

// 删除顺序表中指定位置的学生
int delete_stu(Plist, int);

// 查找顺序表中指定位置的学生
int inserach_stu(Plist, int);

// 修改顺序表中指定位置的学生信息
int change_stu(Plist, int, student);

// 在顺序表的表头插入一个学生
int insert_front(Plist, student);

// 在顺序表的表尾插入一个学生
int insert_rear(Plist, student);

// 删除顺序表的表头学生
int delete_front(Plist);

// 删除顺序表的表尾学生
int delete_rear(Plist);

// 删除顺序表中重复的学生信息
int delete_repeat(Plist);

// 根据学生姓名查找并返回其在顺序表中的位置
int find_stu(Plist, char *);

// 根据学生姓名查找并输出所有符合条件的学生信息
int find_stu_all(Plist, char *);

#endif  // 结束宏定义 LIST_H_
函数文件:
#include "list.h"

// 创建顺序表,分配内存并初始化表长为0
Plist create_list(){
	Plist L = malloc(sizeof(list));  // 为顺序表分配内存空间
	if(NULL == L){
		printf("申请空间失败\n");
		return NULL;  // 如果内存分配失败,返回 NULL
	}
	L->len = 0;  // 初始化表的长度为0
	printf("创建成功\n");
	return L;  // 返回顺序表的指针
}

// 输入学生信息并存储到顺序表中
int input_list(Plist L){
	int n;
	printf("要输入学生的个数:\n");
	scanf("%d",&n);  // 输入学生数量
	for(int i=0; i<n; i++){
		printf("请输入第%d个学生信息:", i+1);
		printf("请输入学号:");
		scanf("%d",&L->data[i].id);  // 输入学号
		printf("请输入姓名:");
		scanf("%s",L->data[i].name);  // 输入姓名
		printf("请输入专业:");
		scanf("%s",L->data[i].major);  // 输入专业
		printf("请输入年龄:");
		scanf("%d",&L->data[i].age);  // 输入年龄
		L->len++;  // 学生数量增加
	}
	return 0;
}

// 输出顺序表中的所有学生信息
int output_list(Plist L){
	for(int i=0; i<L->len; i++){
		// 按格式输出每个学生的信息
		printf("学号:%d\t姓名:%s\t专业:%s\t年龄:%d\n",L->data[i].id,L->data[i].name,L->data[i].major,L->data[i].age);
	}
	return 0;
}

// 判断顺序表是否已满
int full(Plist L){
	if(L->len == MAX){  // 如果学生数量等于最大容量,返回1表示已满
		return 1;
	}
	return 0;
}

// 在顺序表的指定位置插入一个学生信息
int insert_stu(Plist L, int pos, student e){
	int sub = pos -1;  // 转换为数组下标
	if(sub<0 || sub>L->len || L==NULL || full(L)){  // 检查插入位置合法性和顺序表是否已满
		printf("插入失败\n");
		return -1;
	}
	for(int i=L->len-1; i>=sub; i--){  // 将元素后移,给插入新学生腾出位置
		L->data[i+1] = L->data[i];
	}
	L->data[sub] = e;  // 插入新学生信息
	L->len++;  // 学生数量增加
	printf("插入成功\n");
	return 0;
}

// 判断顺序表是否为空
int empty(Plist L){
	if(L->len == 0){  // 如果表长为0,表示顺序表为空
		return 1;
	}
	return 0;
}

// 删除顺序表中指定位置的学生信息
int delete_stu(Plist L, int pos){
	int sub = pos - 1;  // 转换为数组下标
	if(sub < 0 || sub > L->len-1 || L == NULL || empty(L)){  // 检查删除位置合法性和是否为空表
		printf("删除失败\n");
		return -1;
	}
	for(int i=sub; i<L->len; i++){  // 将后面的元素前移,覆盖要删除的元素
		L->data[i] = L->data[i+1];
	}
	L->len--;  // 学生数量减少
	printf("删除成功\n");
	return 0;
}

// 查找顺序表中指定位置的学生信息
int inserach_stu(Plist L, int pos){
	int sub = pos - 1;  // 转换为数组下标
	if(sub < 0 || sub > L->len-1 || L == NULL || empty(L)){  // 检查查找位置合法性和是否为空表
		printf("查找失败\n");
		return -1;
	}else{
		// 输出找到的学生信息
		printf("该学生存在\n");
		printf("学号:%d\t姓名:%s\t专业:%s\t年龄:%d\n",L->data[sub].id,L->data[sub].name,L->data[sub].major,L->data[sub].age);
		return 0;
	}
}

// 修改顺序表中指定位置的学生信息
int change_stu(Plist L, int pos, student e){
	int sub = pos - 1;  // 转换为数组下标
	if(sub < 0 || sub > L->len-1 || L == NULL || empty(L)){  // 检查修改位置合法性和是否为空表
		printf("查找失败\n");
		return -1;
	}else{
		// 修改学生信息
		L->data[sub] = e;
		printf("修改成功\n");
		return 0;
	}
}

// 在顺序表的表头插入一个学生信息
int insert_front(Plist L, student e){
	if(L == NULL || full(L)){  // 检查表是否已满或顺序表为空
		printf("表头插入失败\n");
		return -1;
	}
	for(int i=L->len-1; i>=0; i--){  // 将所有学生信息后移
		L->data[i+1] = L->data[i];
	}
	L->data[0] = e;  // 将新学生信息插入表头
	L->len++;  // 学生数量增加
	printf("表头插入成功\n");
	return 0;
}

// 在顺序表的表尾插入一个学生信息
int insert_rear(Plist L, student e){
	if(L == NULL || full(L)){  // 检查表是否已满或顺序表为空
		printf("表尾插入失败\n");
		return -1;
	}
	L->data[L->len] = e;  // 将新学生信息插入表尾
	L->len++;  // 学生数量增加
	printf("表尾插入成功\n");
	return 0;
}

// 删除顺序表的表头学生信息
int delete_front(Plist L){
	if(L == NULL || empty(L)){  // 检查是否为空表
		printf("表头删除失败\n");
		return -1;
	}
	for(int i=0; i<L->len; i++){  // 将表中的学生信息前移
		L->data[i] = L->data[i+1];
	}
	L->len--;  // 学生数量减少
	printf("表头删除成功\n");
	return 0;
}

// 删除顺序表的表尾学生信息
int delete_rear(Plist L){
	if(L == NULL || empty(L)){  // 检查是否为空表
		printf("表尾删除失败\n");
		return -1;
	}
	L->len--;  // 表尾元素直接被忽略,相当于删除最后一个元素
	printf("表尾删除成功\n");
	return 0;
}

// 删除顺序表中重复的学生信息
int delete_repeat(Plist L){
	int i, j;
	for(i=0; i<L->len; i++){
		for(j=i+1; j<L->len; j++){
			// 如果发现两个学生姓名相同,则删除后者
			if(strcmp(L->data[i].name, L->data[j].name) == 0){
				delete_stu(L, j+1);  // 删除重复的学生信息
				j--;  // 调整索引,继续检查下一个
			}
		}
	}
	return 0;
}

// 根据学生姓名查找并返回其在顺序表中的位置
int find_stu(Plist L, char key[20]){
	int i, sub = -1;
	for(i=0; i<L->len; i++){
		// 找到符合条件的学生
		if(strcmp(L->data[i].name, key) == 0){
			sub = i;  // 记录找到的位置
		}
	}
	if(sub == -1){
		return -1;  // 没有找到则返回 -1
	}
	return sub + 1;  // 返回学生在表中的位置,位置从1开始计数
}

// 根据学生姓名查找并输出所有符合条件的学生信息
int find_stu_all(Plist L, char key[20]){
	int i, sub = -1;
	for(i=0; i<L->len; i++){
		// 输出所有符合条件的学生信息
		if(strcmp(L->data[i].name, key) == 0){
			printf("位置:%d\t是%s\n",i+1,L->data[i].name);
			sub = i;
		}
	}
	if(sub == -1){
		return -1;  // 没有找到则返回 -1
	}
	return sub + 1;
}
主函数文件:
#include <myhead.h>
#include "list.h"

int main(int argc, const char *argv[])
{
    // 创建一个顺序表,并将其地址存储在指针 L 中
    Plist L = create_list();  
    int ch;         // 用于存储用户的选择
    student e;      // 用于插入或修改的学生信息
    int pos;        // 用于指定操作的位置
    char name[20];  // 用于存储查找时输入的学生姓名

    // 无限循环,直到用户选择退出(或通过外部手段中断)
    while(1) {
        // 提示用户选择要执行的操作
        printf("\t\t1、输入学生信息\n");
        printf("\t\t2、任意位置插入一个学生\n");
        printf("\t\t3、任意位置删除一个学生\n");
        printf("\t\t4、任意位置查找一个学生\n");
        printf("\t\t5、任意位置修改一个学生\n");
        printf("\t\t6、表头插入一个学生\n");
        printf("\t\t7、表尾插入一个学生\n");
        printf("\t\t8、表头删除一个学生\n");
        printf("\t\t9、表尾删除一个学生\n");
        printf("\t\t10、去除重复的学生\n");
        printf("\t\t11、按照姓名查找返回位置\n");
        printf("\t\t12、查找输出所有的学生\n");
        printf("\t\t请输入你的选择:\n");

        // 读取用户输入的选择
        scanf("%d", &ch);

        // 根据用户的选择执行相应的操作
        switch(ch) {
            case 1:
                // 输入学生信息并输出整个学生列表
                input_list(L);
                output_list(L);
                break;

            case 2:
                // 在指定位置插入一个学生
                printf("请输入要插入的学生位置:\n");
                scanf("%d", &pos); // 读取要插入的学生位置
                printf("请输入学生ID、姓名、专业、年龄:\n");
                scanf("%d %s %s %d", &e.id, e.name, e.major, &e.age); // 读取学生信息
                insert_stu(L, pos, e);  // 在指定位置插入学生
                output_list(L);         // 输出更新后的学生列表
                break;

            case 3:
                // 在指定位置删除一个学生
                printf("请输入要删除的学生位置:\n");
                scanf("%d", &pos); // 读取要删除的学生位置
                delete_stu(L, pos); // 删除指定位置的学生
                output_list(L);     // 输出更新后的学生列表
                break;

            case 4:
                // 在指定位置查找一个学生
                printf("请输入要查找的学生位置:\n");
                scanf("%d", &pos); // 读取要查找的学生位置
                inserach_stu(L, pos); // 查找并输出指定位置的学生信息
                break;

            case 5:
                // 修改指定位置的学生信息
                printf("请输入要修改的学生位置:\n");
                scanf("%d", &pos); // 读取要修改的学生位置
                printf("请输入新的学生ID、姓名、专业、年龄:\n");
                scanf("%d %s %s %d", &e.id, e.name, e.major, &e.age); // 读取新的学生信息
                change_stu(L, pos, e); // 修改指定位置的学生信息
                output_list(L);        // 输出更新后的学生列表
                break;

            case 6:
                // 在表头插入一个学生
                printf("请输入学生ID、姓名、专业、年龄:\n");
                scanf("%d %s %s %d", &e.id, e.name, e.major, &e.age); // 读取学生信息
                insert_front(L, e); // 将学生插入表头
                output_list(L);     // 输出更新后的学生列表
                break;

            case 7:
                // 在表尾插入一个学生
                printf("请输入学生ID、姓名、专业、年龄:\n");
                scanf("%d %s %s %d", &e.id, e.name, e.major, &e.age); // 读取学生信息
                insert_rear(L, e); // 将学生插入表尾
                output_list(L);    // 输出更新后的学生列表
                break;

            case 8:
                // 删除表头的学生
                delete_front(L); // 删除表头学生
                output_list(L);  // 输出更新后的学生列表
                break;

            case 9:
                // 删除表尾的学生
                delete_rear(L);  // 删除表尾学生
                output_list(L);  // 输出更新后的学生列表
                break;

            case 10:
                // 删除重复的学生
                delete_repeat(L); // 删除学生列表中重复的学生
                output_list(L);   // 输出更新后的学生列表
                break;

            case 11:
                // 按照姓名查找学生,并返回位置
                printf("请输入要查找的学生姓名:\n");
                scanf("%s", name); // 读取要查找的学生姓名
                pos = find_stu(L, name); // 查找学生
                if(pos == -1) {  // 如果找不到学生
                    printf("查找失败\n");
                } else {         // 如果找到学生
                    printf("查找成功,该学生位于第%d个位置\n", pos);
                }
                break;

            case 12:
                // 查找并输出所有匹配的学生
                printf("请输入要查找的学生姓名:\n");
                scanf("%s", name); // 读取要查找的学生姓名
                find_stu_all(L, name); // 查找并输出所有符合条件的学生
                break;

            default:
                // 输入无效的选择时提示用户重新输入
                printf("无效的选择,请重新输入。\n");
                break;
        }
    }

    return 0;
}

成果展现:

        

三、总结

学习内容概述

编写了一个基于顺序表管理学生信息的项目。项目包括以下功能:创建顺序表、检查顺序表是否满或空、增加学生信息、遍历顺序表、在任意位置插入或删除学生、按位置或按值修改学生信息、按值查找学生、删除重复学生信息。代码实现了顺序表的基础操作,采用数组存储学生数据。

学习难点

1. 顺序表操作边界检查:

在插入和删除操作时,必须检查位置是否合法以及顺序表是否为空或已满。这些边界检查确保顺序表操作的稳定性。

2. 内存管理:

创建顺序表时需要动态分配内存,内存分配失败时要正确处理。

3. 删除和插入操作中的数据移动:

插入数据时需要将插入位置后的所有元素后移;删除数据时,需要将被删除位置后的元素前移。

4. 去重功能的实现:

通过两层嵌套循环比较学生姓名来删除重复信息,且删除时需要调整索引。

主要事项

1. 数组长度和顺序表长度的关系:

顺序表长度不能超过数组长度。每次增加或删除学生信息后,都需要更新顺序表长度。

2. 位置和下标的转换:

在对顺序表进行插入、删除和查找操作时,用户输入的位置要转换为数组下标(即位置-1)。

3. 动态内存分配:

需要确保动态分配内存成功,否则可能会导致程序崩溃或出现未定义行为。

4. 字符串操作:

在查找和去重操作中,使用`strcmp`函数比较学生姓名,需要确保字符串的正确输入和处理。

未来学习的重点

1. 异常处理:

可以增加更多的异常处理逻辑,确保顺序表操作的健壮性。例如,在操作过程中如果顺序表出现错误,及时提示并处理。

2. 内存管理:

深入学习动态内存分配与释放,避免内存泄漏的问题。

3. 优化查找和去重算法:

目前的查找和去重操作时间复杂度较高,可以考虑优化查找算法,如引入二分查找或哈希查找。

4. 扩展顺序表功能:

进一步扩展顺序表功能,如添加排序功能、批量删除或插入等操作,提升顺序表的实用性。

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

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

相关文章

RTMP协议在无人机巡检中的应用场景

为什么要用无人机巡检 好多开发者对无人机巡检技术方案&#xff0c;相对陌生&#xff0c;实际上&#xff0c;无人机巡检就是利用无人机对特定区域或设施进行定期或不定期的检查。这种巡检方式相比传统的人工巡检具有显著的优势&#xff0c;包括速度快、覆盖广、风险低、准确性…

Tornado 是一个 Python 异步网络库和 web 框架

Tornado 是一个 Python 异步网络库和 web 框架&#xff0c;它最初由 FriendFeed 开发&#xff0c;后来被 Facebook 收购并开源。Tornado 因其非阻塞的 I/O 操作和优秀的性能而广受欢迎&#xff0c;特别是在需要处理大量并发连接的应用中。Tornado 的底层实现主要依赖于 Python …

神经网络通俗理解学习笔记(0) numpy、matplotlib

Numpy numpynumpy 基本介绍Ndarray对象及其创建Numpy数组的基础索引numpy数组的合并与拆分&#xff08;重要&#xff09;numpy数组的矩阵运算Numpy数组的统计运算numpy中的arg运算numpy中的神奇索引和比较 Matplotlib numpy numpy 基本介绍 numpy 大多数机器学习库都用了这个…

【Linux入门】基本指令(一)

目录 一.使用环境 二.快捷键 三. 登录与用户管理 1.ssh root[ip地址] 2.whoami 3.ls /home 4.adduser [用户名] 5.passwd [用户名] 四.目录文件操作 1.ls 2.pwd 3.cd 4.touch 5.mkdir 6.rm 7.cp 五.命令手册 一.使用环境 云服务器&#xff1a;市面上有很多&am…

Python 中的 typing 模块常见用法

typing 模块是 Python 提供的一个标准库&#xff0c;主要用于为函数、变量和类定义类型提示&#xff08;Type Hints&#xff09;&#xff0c;从而提高代码的可读性和类型安全性。虽然 Python 是动态类型语言&#xff0c;但通过 typing 模块&#xff0c;开发者可以明确指定变量和…

TMStarget学习——Functional Connectivity

今天基于结构像和功能像数据试验操作TMStarget 的第二个功能模块Functional Connectivity。参考季老师的文档PPT来学习的&#xff0c;整个处理过程蛮长的&#xff0c;可能配置原因一路上报错也比较多&#xff0c;下面还是逐步记录吧&#xff0c;后面采用连更的方式直到跑通后再…

C++ 中的继承(详细讲解)

一、继承的概念以及定义 1、继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的…

微波无源器件 功分器 4 一种用于天线阵列的紧凑宽带四路双极化波导功分器

摘要&#xff1a; 一种新型紧凑和高效率&#xff0c;在一个同相2x4方案(四路)显示双极化的功分器的设计和仿真被提出了&#xff0c;两个基本的正交模式TE10和TE01在四个方波导处同相输出通过使用四个3端口个四个E面和两个H面功分结构。此功分末端接了两个商用波导(WR75)端口&am…

青柠视频云——如何开启HTTPS服务?

前言 由于青柠视频云的语音对讲会使用到HTTPS服务&#xff0c;这里我们说一下如何申请证书以及如何在实战中部署并且配置使用。 一、证书申请 1、进入控制台 我们拿阿里云的免费个人证书为例&#xff0c;首先登录阿里云&#xff0c;在控制台找到数字证书管理服务&#xff0c;进…

膨胀罐选型计算和其他事项

膨胀罐&#xff0c;也称定压罐、气压罐&#xff0c;广泛应用于空调、太阳能、锅炉等暖通系统以及供水和消防设备&#xff0c;缓冲系统压力波动&#xff0c;消除水锤&#xff0c;起到稳压卸荷的作用。在空调、太阳能、锅炉、地暖等闭式循环系统中&#xff0c;膨胀罐的作用是在工…

3.数据类型

作业系统链接 Python 是一门面向对象友好的语言&#xff0c;支持多种内置数据类型&#xff0c;包括整数&#xff08;int&#xff09;、浮点数&#xff08;float&#xff09;、布尔值&#xff08;bool&#xff09;、字符串&#xff08;str&#xff09;、列表&#xff08;list&am…

直流电表如何在新能源领域进行应用

直流电表在新能源领域的应用广泛且深入&#xff0c;其高精度、实时监测和数据分析能力为新能源系统的运行、管理和优化提供了重要支持。 一、太阳能光伏发电系统 在太阳能光伏发电系统中&#xff0c;直流电表扮演着至关重要的角色。太阳能电池板将光能转化为直流电能&#xf…

.NET 一直跻身 30 大Github最活跃开源项目之列。

大家好&#xff0c;我是编程乐趣。 一直以来都在介绍.Net的热门开源项目&#xff0c;今天来说说.Net本身。 .Net在GitHub上也是一个开源项目&#xff0c;.NET 是一个由 Microsoft 和 .NET 社区共同维护的开源跨平台框架。 自 2017 年以来&#xff0c;.NET 一直是 GitHub 上最…

新手教学系列——非正常关机导致MySQL权限表(db)损坏及修复详解

在使用MySQL的过程中,我们常常会遇到一些问题,尤其是当服务器或主机非正常关机或重启时,MySQL的某些表,特别是权限表(如 mysql.db 表),可能会损坏,导致数据库无法启动或访问。这种情况对生产环境的数据库系统来说是相当严重的,因此掌握修复方法非常重要。 本篇文章将…

分享两个ADG监控脚本

分享两个监控脚本&#xff0c;用于监控Oracle ADG的状态&#xff0c;如果状态异常则发送邮件告警 脚本一&#xff1a; 利用语句查询日志的应用状态&#xff0c;如果长时间未应用则邮件告警&#xff0c;提醒DBA检查ADG的状态是否异常&#xff1b; 阈值条件&#xff1a;最近一…

关于用matplotlib.pyplot加载图片颜色不对的解决方法

1.原理&#xff1a;用opencv加载的图片是BGR存储的。而用matplotlib.pyplot 需要RGB的格式,故在加载之前使用下面的语句改成RGB格式。 img2 cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 或使用 # img2 img[:, :, ::-1]#将图像img的颜色通道进行反转。 ::-1 表示在最后一个维度…

财富通公司开发维修售后小程序,解决售后维修问题

财富通公司为广大用户开发的维修售后小程序&#xff0c;旨在便捷地解决售后维修问题&#xff0c;提升用户体验&#xff0c;增强客户粘性。以下是该小程序如何具体解决售后维修问题的几个关键点&#xff1a; 一. 一站式报修流程 1.简化操作&#xff1a;用户只需通过小程序几步…

智能监控-智能管理系统解决方案

一、引言 在数字化浪潮席卷全球的今天&#xff0c;智能化管理已成为各行业不可或缺的一部分。物联网智能监控管理系统解决方案&#xff0c;凭借其强大的功能性和易用性&#xff0c;为网络传输、环境监测及安全控制提供了全面的智能管理手段。该系统集成了I/O网络模块、高精度传…

HTML/CSS/JS学习笔记 Day7(CSS--C4 CSS的三大特性)

跟着该视频学习&#xff0c;记录笔记&#xff1a;【黑马程序员pink老师前端入门教程&#xff0c;零基础必看的h5(html5)css3移动端前端视频教程】https://www.bilibili.com/video/BV14J4114768?p12&vd_source04ee94ad3f2168d7d5252c857a2bf358 Day6 内容梳理&#xff1a;…

用Python实现时间序列模型实战——Day 26-27: 时间序列分析项目实战

一、学习内容 在本次项目实战中&#xff0c;我们将使用一个复杂的时间序列数据集&#xff0c;展示完整的时间序列分析流程&#xff0c;包括&#xff1a; 数据探索与预处理&#xff1a;初步分析数据的特征&#xff0c;处理缺失值和异常值&#xff0c;进行必要的转换。建模&…