SWUST软件技术基础实验笔记

news2025/5/20 0:57:06

目录

前言

堆栈的操作

实验目的

实验要求

单链表操作

实验目的

实验要求

二叉树操作

实验目的

实验要求

查找与排序

实验目的

实验要求

查找算法

排序算法

实验总结


 

前言

软件技术基础实验分为四个部分,涵盖了堆栈的操作、单链表操作、二叉树操作以及查找与排序。在课本的附录页面,提供了基础的C语言源码。鉴于本学期选修了C++,我对这些源码进行了一些修改,并补充了扩展的编程要求,且提供了一些思考题。本人因为最常使用的还是Python,所以曾经研究并手写实现过查找与排序算法,当然后面我也补充了C++版本的源码。本篇博客主要面向SWUST的同学们,旨在解释一些关键的部分,帮助大家顺利完成实验并理解其中的要点。

实验环境:Windows 11、Vistual Studio 2022、PyCharm Community Edition 2021.3.1。

堆栈的操作

实验目的

  • 掌握栈的定义;
  • 掌握栈基本操作的实现,并能用于解决实际问题;

实验要求

  • 用顺序存储结构实现栈的基本操作:Push,pop,isempty,isfull,createstack;
  • 利用栈的基本操作实现conversion()函数,该函数能将任意输入的十进制整数转化为二进制形式表示。
  • 扩展要求:修改程序将任意输入的十进制 修改程序将任意输入的十进制整数转化为八进制、十六进制形式表示。
#include<iostream>
#include<cmath>

const int maxsize = 1024;
using namespace std;
typedef int datatype;

//用于规定栈的大小和栈顶
typedef struct {
    datatype elements[maxsize];
    int Top;
}Stack;
//创建空栈
void setStackNull(Stack* S) {
    S->Top = -1;
}
//判满
int isfull(Stack* S) {
    if (S->Top >= maxsize - 1)
        return 1;
    else
        return 0;
}
//判空
int isempty(Stack* S) {
    if (S->Top < 0)
        return 1;
    else
        return 0;
}
//压栈
void push(Stack* S, datatype E) {
    if (isfull(S))
        cout << "Stack Overflow" << endl;
    else {
        S->Top++;
        S->elements[S->Top] = E;
    }
}
//出栈
datatype* pop(Stack* S) {
    datatype* temp;
    if (isempty(S)) {
        cout << "Stack Underflow" << endl;
        return NULL;
    }
    else {
        temp = (datatype*)malloc(sizeof(datatype));
        *temp = S->elements[S->Top];
        S->Top--;
        return (temp);
    }
}
//十进制整数转化为二进制数
void conversion(int n) {
    Stack S;
    setStackNull(&S);
    int r, m;
    r = n;
    while (r) {
        m = r % 2;
        if (isfull(&S))
            cout << "Over flow" << endl;
        else
            push(&S, m);
        r = r / 2;
    }
    cout << "转换后的二进制为:" << endl;
    while (!isempty(&S)) {
        cout << *(pop(&S));
    }
    cout << endl;
}
void conversion2(int n, int r) {
    Stack S;
    int x;
    setStackNull(&S);
    int f = n;
    while (f) {
        if (isfull(&S))
            cout << "Over flow" << endl;
        else
            push(&S, f % r);
        f /= r;
    }
    cout << "数据" << n << "转化为" << r << "进制后的结果为:";
    while (!isempty(&S)) {
        x = *(pop(&S));
        if (x >= 10) {
            cout << (char)('A' + x - 10);
        }
        else {
            cout << x;
        }
    }
    cout << endl;
}
int main() {
    int num;
    cout << "请输入要转换为二进制的十进制数据:" << endl;
    cin >> num;
    conversion(num);

    //扩展3功能
    int n, r;
    cout << "请输入转化的数字以及进制位:" << endl;
    cin >> n >> r;
    conversion2(n, r);

    double mu;
    int nu;
    cout << "请输入m进制转化为n进制中m和n:" << endl;
    cin >> mu >> nu;
    cout << "请输入需要转换的数据:" << endl;
    char arra[1024];
    cin >> arra;
    int s = strlen(arra);
    int sum = 0;
    double j = 0;
    for (int i = s - 1; i >= 0; i--) {
        sum += (arra[i] - '0') * pow(mu, j);
        j++;
    }
    conversion2(sum, nu);
    return 0;
}

d578b162744d42ce899e18f773e10213.png

代码实现了一个栈数据结构,并提供了一些基本的栈操作函数。栈是一种具有后进先出(LIFO)特性的数据结构,通过压栈和出栈操作实现数据的存储和检索。

具体的代码功能如下:

  • 定义了一个结构体 Stack,包含一个数组 elements 用于存储栈的元素,以及一个整数 Top 用于表示栈顶的位置。
  • setStackNull 函数用于将栈置空,即将栈顶 Top 设置为 -1。
  • isfull 函数用于判断栈是否已满,如果栈顶位置 Top 大于等于 maxsize-1,则表示栈已满。
  • isempty 函数用于判断栈是否为空,如果栈顶位置 Top 小于 0,则表示栈为空。
  • push 函数用于将元素压入栈中,如果栈已满,则输出 "Stack Overflow"。
  • pop 函数用于将栈顶元素弹出,并返回其值。如果栈为空,则输出 "Stack Underflow",并返回 NULL。
  • conversion 函数用于将十进制整数转换为二进制数。通过除以 2 的余数来逐步转换,并将余数依次压入栈中。然后从栈中依次弹出并输出二进制数。
  • conversion2 函数用于将一个十进制整数转换为指定进制的数。类似于 conversion 函数,但这里除以的不是 2,而是通过参数 r 指定的进制。
  • 主函数 main 提供了用户交互的界面,可以输入一个十进制数进行转换,以及扩展功能3的操作。

单链表操作

实验目的

  • 掌握线性表的链式存储结构:(1)线性表的链式存储原理;(2)链式存储结构的优缺点;(3)掌握线性表在链式存储结构上的运算
  • 掌握结构体的应用以及数据结点的生成:(1)结构体的定义;(2)动态存储分配函数的使用;(3)强制类型转换的方法
  • 掌握指针的应用:(1)巩固指针的含义和用法;(2)结构体指针的使用

实验要求

  • 完成链表带头结点尾插入法函数。
  • 完成按序号查找函数。
  • 完成插入函数。
  • 扩展要求:完成删除函数。
#include <iostream>
using namespace std;
typedef char datatype;

struct Node {
    datatype data;
    Node* next;
};
typedef Node* linklist;

linklist createlist() {
    char ch;
    linklist head, s, r;
    head = new Node();
    r = head;
    cout << "请输入字符生成链表,以‘#’结束" << endl;
    cin.get(ch);
    while (ch != '#') {
        s = new Node();
        s->data = ch;
        r->next = s;
        r = s;
        cin.get(ch);
    }
    r->next = NULL;  //链表的结束
    return head;   //头指针
}

linklist get(linklist head, int i) {
    int j;        
    linklist p;      
    p = head;
    j = 0;
    while (p->next != NULL && j < i) {  
        p = p->next;
        j++;
    }
    if (i == j)
        return p;
    else
        return NULL;
}

linklist deletelink(linklist head, int i) {
    linklist p = head, q;
    int j = 0;

    while (p ->next != NULL) {  
        j++;
        if (j == i) {
            q = p->next;
            p->next = q->next;
            delete q;
            return head;
        }
        else {
            p = p->next;
        }
    }
    cout << "error" << endl;
    return head;
}

void insertById(linklist head, int i, char x) {
    linklist s, p;
    int j;
    s = new Node();
    s->data = x;
    p = head;
    j = 0;
    while (p != NULL && j < i) {
        j++;
        p = p->next;
    }
    if (p != NULL) {
        s->next = p->next;
        p->next = s;
    }
    else {
        cout << "结点未找到!" << endl;
    }
}

int main() {
    linklist head, r;
    int num;

    head = createlist();
    cout << "链表信息为:";
    r = head->next;
    while (r) {
        cout << r->data;
        r = r->next;
    }
    cout << endl;

    cout << "请输入要查询的序号:" << endl;
    cin >> num;
    r = get(head, num);
    if (r == NULL)
        cout << "没有查到" << endl;
    else
        cout << "查找的结果为:" << r->data << endl;

    cout << "请输入要删除的序号:" << endl;
    int i;
    cin >> i;
    head = deletelink(head, i);
    cout << "删除后链表信息为:";
    r = head->next;
    while (r) {
        cout << r->data;
        r = r->next;
    }
    cout << endl;

    cout << "请输入要插入的序号和字符:" << endl;
    int N;
    char x;
    cin >> N >> x;
    insertById(head, N, x);
    cout << "插入后链表信息为:";
    r = head->next;
    while (r) {
        cout << r->data;
        r = r->next;
    }

    return 0;
}

7653fc700684420c958f9784a61ec2ec.png

这段代码实现了链表的创建、查找、删除和插入等基本操作。

具体的代码功能如下:

  • 定义了一个结构体 Node,包含一个数据成员 data 和一个指向下一个节点的指针 next。
  • 定义了一个类型别名 linklist,表示指向链表节点的指针。
  • createlist 函数用于创建一个链表,用户输入字符并生成链表,以 '#' 结束输入。
  • get 函数用于根据序号获取链表中对应节点的指针,遍历链表直到找到对应位置的节点,返回该节点的指针。
  • deletelink 函数用于删除链表中指定位置的节点,遍历链表直到找到对应位置的节点,删除该节点并释放内存。
  • insertById 函数用于在链表的指定位置插入一个节点,遍历链表直到找到对应位置的节点,插入新节点并更新指针。
  • 在主函数 main 中,通过调用上述函数来执行链表的创建、查找、删除和插入操作,并在控制台输出相应的结果。

二叉树操作

实验目的

  • 掌握二叉树的二叉链表存储结构。掌握二叉树的二叉链表存储结构。
  • 掌握利用二叉树创建方法。
  • 掌握二叉树的先序、中序、后序的递归实现方法。

实验要求

  • 编写创建如图1-1所示二叉树的函数,函数名:create。
  • 编写递归实现二叉树的中序、先序和后序遍历算法。函数名分别为inorder,preorder,postorder。
  • 编写主函数测试以上二叉树的创建和遍历函数。
0d3ab27d78444b50b436b98059c005c4.png

图1-1

 

#include <iostream>
#include <cstdlib>
using namespace std;

const int maxsize = 1024;
typedef char datatype;
typedef struct node {
    datatype data;
    struct node* lchild;
    struct node* rchild;
} Bitree;

Bitree* CreateTree() {
    char ch;                       //接收用户输入的节点值
    Bitree* Q[maxsize];            //指针数组 Q,用于辅助构建二叉树,指针类型的数组构成队列
    int front, rear;               //用于指示数组 Q 的前后位置
    Bitree* root, * s;             //指针变量 root 和 s
    root = NULL;                   //初始时二叉树为空
    front = 1;                     //表示数组 Q 的初始状态
    rear = 0;

    cout << "请输入二叉树的各个结点,@表示虚结点,#表示结束:" << endl;
    cin >> ch;
    while (ch != '#') {
        cout << ch;
        s = NULL;            //s 初始化为 NULL
        if (ch != '@') {                                                      
            s = (Bitree*)malloc(sizeof(Bitree));                   
            s->data = ch;                       //节点值赋值给 s 的 data 成员
            s->lchild = NULL;//s 的左孩子指针 lchild 
            s->rchild = NULL; //s 的右孩子指针 lchild 
        }
        rear++;                                 //rear 增加 1,并将 s 存储在 Q 数组的对应位置
        Q[rear] = s;
        if (rear == 1)                          //rear 的值为 1,即为第一个节点,将 root 指向 s
            root = s;
        else {
            if (s && Q[front])
                if (rear % 2 == 0)
                    Q[front]->lchild = s;       //如果是偶数,则将s赋值给Q[front]节点的左孩子指针lchild
                else
                    Q[front]->rchild = s;
            if (rear % 2 == 1)                  //前节点是一个新的层级的节点
                front++;
        }                                       //指向下一层的节点,指针 front 向下移动
        cin >> ch;
    }
    return root;                                //返回二叉树的根节点指针root。
}

void preorder(Bitree* p) {
    if (p != NULL) {
        cout << " " << p->data << " ";
        preorder(p->lchild);                    //以当前节点 p 的左孩子作为参数,实现前序遍历左子树。
        preorder(p->rchild);
    }
}

void inorder(Bitree* p) {
    if (p != NULL) {
        inorder(p->lchild);                     //当前节点 p 的左孩子作为参数,实现中序遍历左子树
        cout << " " << p->data << " ";
        inorder(p->rchild);
    }
}

void postorder(Bitree* p) {
    if (p != NULL) {
        postorder(p->lchild);
        postorder(p->rchild);
        cout << " " << p->data << " ";
    }
}

int main() {
    Bitree* root;
    root = CreateTree();
    cout << "\n先序遍历结果如下:" << endl;
    preorder(root);
    cout << "\n中序遍历结果如下:" << endl;
    inorder(root);
    cout << "\n后序遍历结果如下:" << endl;
    postorder(root);
    cout << endl;
    return 0;
}

10ce3d4bdc85471cb75fadc847728a3b.png

这段代码实现了二叉树的基本操作。

具体的代码功能如下:

  • ch接收用户输入的节点值、指针数组 Q,用于辅助构建二叉树,指针类型的数组构成队列、front表示队列Q的前部位置,用于指示下一个节点应该插入到哪个位置、rear表示队列Q的尾部位置,用于指示当前队列中最后一个节点的位置
  • rear为奇数时,表示当前节点是一个新的层级的节点,需要递增front,以便在下一次插入节点时,将新节点链接到正确的父节点。front指示下一个节点的插入位置,rear表示当前队列中最后一个节点的位置
  • preorder、inorder、postorder为先序遍历、中序遍历、后续遍历
  • 主函数main 中,通过调用上述函数来执行链表的创建、查找、删除和插入操作,并在控制台输出相应的结果

查找与排序

实验目的

  • 了解数据查找的一系列方法:(1)了解查找表的分类;(2)掌握折半查找法的原理
  • 掌握各种排序(简单插入,简单选择,冒泡排序,快速排序等)方法及适用场合,并能在解决实际问题时灵活应用。
  • 了解查找与排序在实际生活中的应用。

实验要求

  • 顺序查找:首先从键盘输入一个数据序列生成一个顺序表,然后从键盘上任意输入一个值,在顺序表中进行查找。
  • 折半查找:任意输入一组数据作为各数据元素的键值,首先将此序列进行排序,然后在该有序表上使用折半查找算法进行对给定值的查找。
  • 对于给定的某无序序列,分别用直接插入、希尔排序、快速排序等方法进行排序,并输出每种排序下的各趟排序结果。

查找算法

基本要求是做这两个,重点还是理解折半查找。

a.顺序查找


#include <iostream>
#include <vector>
using namespace std;

typedef int datatype;
typedef struct
{
    vector<datatype> elem;
    int length;
} Stable;

void create(Stable* l)
{
    cout << "请输入顺序表的内容:" << endl;
    for (int i = 0; i < l->length; i++)
    {
        datatype data;
        cout << "l.elem[" << i + 1 << "] = ";
        cin >> data;
        l->elem.push_back(data);
    }
}

void s_search(const Stable* l, datatype k)
{
    bool found = false;
    for (int i = 0; i < l->length; i++)
    {
        if (l->elem[i] == k)
        {
            cout << "查找成功." << endl;
            found = true;
            cout << "l.elem[" << i + 1 << "] = " << k << endl;
        }
    }
    if (!found)
    {
        cout << "没有找到数据" << k << "!" << endl;
    }
}

int main()
{
    Stable table;
    datatype key;

    cout << "请输入顺序表的长度: ";
    cin >> table.length;

    create(&table);

    cout << "创建的顺序表内容:" << endl;
    for (int i = 0; i < table.length; i++)
    {
        cout << "l.elem[" << i + 1 << "] = " << table.elem[i] << endl;
    }

    cout << "输入查找关键字: ";
    cin >> key;

    s_search(&table, key);

    return 0;
}

示例: 

c395af01bcea465da9e0050641c73ff4.png

b.折半查找

#include <iostream>
using namespace std;

const int MAX = 100;

typedef struct {
    int element[MAX + 1];
    int length;
} Stable;

void create_seq(Stable* l)
{
    cout << "请输入顺序表的内容:" << endl;
    for (int i = 0; i < l->length; i++)
    {
        cout << "l.element[" << i + 1 << "] = ";
        cin >> l->element[i];
    }
}

void sort_seq(Stable* l)
{
    int flag, t;
    for (int i = 0; i < l->length - 1; i++)
    {
        flag = 0;
        for (int j = 0; j < (l->length) - 1 - i; j++)
        {
            if (l->element[j] > l->element[j + 1])
            {
                t = l->element[j + 1];
                l->element[j + 1] = l->element[j];
                l->element[j] = t;
                flag = 1;
            }
        }
        if (flag == 0)
            break;
    }
}

int sea_self(const Stable* l, int k, int low, int high)
{
    if (low > high)
    {
        cout << "没有找到查找的值" << endl;
        return -1;
    }
    int mid = (low + high) / 2;
    if (l->element[mid] == k)
    {
        cout << "查找成功" << endl;
        cout << "l[" << mid + 1 << "] = " << k << endl;
        return mid;
    }
    else
    {
        if (l->element[mid] < k)
            return sea_self(l, k, mid + 1, high);
        else
            return sea_self(l, k, low, mid - 1);
    }
}

int main()
{
    Stable table;
    int key;

    cout << "请输入线性表的长度:";
    cin >> table.length;

    create_seq(&table);

    sort_seq(&table);

    cout << "排序后的数据" << endl;
    for (int i = 0; i < table.length; i++)
    {
        cout << "l[" << i + 1 << "] = " << table.element[i] << endl;
    }

    cout << "请输入查找的值:" << endl;
    cin >> key;

    sea_self(&table, key, 0, table.length - 1);

    return 0;
}

示例: 

8e6ae178cafb4163bf754cba405ae66f.png

排序算法

实现插入排序、希尔排序、快速排序。

a.Python

# 插入排序
def insert_sort(R):
    for i in range(1, len(R)):
        temp = R[i]
        j = i - 1
        while j >= 0 and temp['key'] < R[j]['key']:
            R[j + 1] = R[j]
            j -= 1
        R[j + 1] = temp

# 希尔排序
def shell_sort(R):
    n = len(R)
    h = n // 2
    while h > 0:
        for j in range(h, n):
            temp = R[j]
            i = j - h
            while i >= 0 and temp['key'] < R[i]['key']:
                R[i + h] = R[i]
                i -= h
            R[i + h] = temp
        h //= 2

# 快速排序
def partition(R, low, high):                                  #用于划分数组并返回基准元素的位置。它通过交换元素的方式将小于基准的元素放在基准的左边,大于基准的元素放在基准的右边。
    i = low
    j = high
    pivot = R[i]
    while i < j:
        while i < j and R[j]['key'] >= pivot['key']:
            j -= 1
        if i < j:
            R[i] = R[j]
            i += 1
        while i < j and R[i]['key'] < pivot['key']:
            i += 1
        if i < j:
            R[j] = R[i]
            j -= 1
    R[i] = pivot
    return i

def quick_sort(R, low, high):
    if low < high:
        pivot_pos = partition(R, low, high)
        quick_sort(R, low, pivot_pos - 1)
        quick_sort(R, pivot_pos + 1, high)

if __name__ == "__main__":
    # 26 5 37 1 61 11 59 15 48 19
    s = 11
    R = [{'key': 0} for _ in range(s)]

    # 插入排序
    print("请输入使用插入算法排序的10个数据,以空格分隔:")
    input_str = input()
    input_list = input_str.split()
    for i in range(1, s):
        R[i]['key'] = int(input_list[i-1])
    print("插入排序之前:")
    for i in range(1, s):
        print(R[i]['key'], end="\t")
    insert_sort(R)
    print("\n插入排序之后:")
    for i in range(1, s):
        print(R[i]['key'], end="\t")

    # 希尔排序
    print("\n请输入使用希尔算法排序的10个数据,以空格分隔:")
    input_str = input()
    input_list = input_str.split()
    for i in range(s-1):
        R[i]['key'] = int(input_list[i])
    print("\n希尔排序之前:")
    for i in range(s-1):
        print(R[i]['key'], end="\t")
    shell_sort(R)
    print("\n希尔排序之后:")
    for i in range(s-1):
        print(R[i]['key'], end="\t")

    # 快速排序
    print("\n请输入使用快排算法排序的10个数据,以空格分隔:")
    input_str = input()
    input_list = input_str.split()
    for i in range(1, s):
        R[i]['key'] = int(input_list[i-1])
    print("\n快排排序之前:")
    for i in range(1, s):
        print(R[i]['key'], end="\t")
    quick_sort(R, 1, s-1)
    print("\n快排排序之后:")
    for i in range(1, s):
        print(R[i]['key'], end="\t")

示例:

82484ffa37e84ea2bc47f46ea8e73a63.png

b.C++

#include<iostream>
#include<ctime>
#include<cstdio>
#include<cstring>
using namespace std;
const int s = 11;
typedef char datatype;
typedef struct
{
    int key;
    datatype others;//记录的其他域
} rectype;
/*插入排序*/
void InsertSort(rectype R[])
{
    int i, j;
    for (i = 2; i < s; i++)//插入的数据分别在1到n当中
    {
        memcpy(&R[0], &R[i], sizeof(rectype));
        j = i - 1;
        while (R[0].key < R[j].key)
        {
            R[j + 1] = R[j];//将关键字大于R[i].key 记录后移
            j--;
        }
        R[j + 1] = R[0];
    }
}
/*希尔排序*/
void ShellSort(rectype R[], int n)
{
    int i, j, h;
    rectype temp;
    h = n / 2;
    while (h > 0)
    {
        for (j = h; j <= n - 1; j++)
        {
            temp = R[j];
            i = j - h;
            while ((i >= 0) && temp.key < R[i].key)
            {
                R[i + h] = R[i];
                i = i - h;
            }
            R[i + h] = temp;

        }
        h /= 2;//增量为1排序后终止算法
    }

}
int Partition(rectype R[], int l, int h)
{
    int i, j;
    rectype temp;
    i = l;
    j = h;
    temp = R[i];//快排第一次的基准
    int flag = 1;//修改flag
    while (flag)
    {
        while ((R[j].key >= temp.key) && (i < j))
            j--;
        if (i < j)
            R[i++] = R[j];
        while ((R[i].key < temp.key) && (i < j))
            i++;
        if (i < j)
            R[j--] = R[i];
        if (i == j)
            flag = 0;
    }//这段可以结合快排算法结合理解
    R[i] = temp;
    return i;
}
void QuickSort(rectype R[], int s1, int t1)
{
    int i;
    if (s1 < t1)
    {
        i = Partition(R, s1, t1);//对R[s1]~R[t1]作划分
        QuickSort(R, s1, i - 1);
        QuickSort(R, i + 1, t1);
    }
}
int main()
{
    // /t的含义是跳格
    rectype R[s];
    int i;
    /*插入测试*/
    cout << "请输入使用插入算法排序的10个数据" << endl;
    for (i = 1; i < s; i++)
    {
        cin >> R[i].key;
    }
    cout << "插入排序之前" << endl;
    for (i = 1; i < s; i++)
    {
        cout << R[i].key << "\t";
    }
    InsertSort(R);
    cout << endl << "插入排序之后" << endl;
    for (i = 1; i < s; i++)
    {
        cout << R[i].key << "\t";
    }
    /*希尔测试*/
    cout << endl << "请输入使用希尔算法排序的10个数据" << endl;
    for (i = 0; i < s - 1; i++)
    {
        cin >> R[i].key;
    }
    cout << endl << "希尔排序之前" << endl;
    for (i = 0; i < s - 1; i++)
    {
        cout << R[i].key << "\t";
    }
    ShellSort(R, 10);
    cout << endl << "希尔排序之后" << endl;
    for (i = 0; i < s - 1; i++)
    {
        cout << R[i].key << "\t";
    }
    /*快排测试*/
    cout << endl << "请输入使用快排算法排序的10个数据" << endl;
    for (i = 1; i < s; i++)
    {
        cin >> R[i].key;
    }
    cout << endl << "快排排序之前" << endl;
    for (i = 1; i < s; i++)
    {
        cout << R[i].key << "\t";
    }
    QuickSort(R, 1, 10);
    cout << endl << "快排排序之后" << endl;
    for (i = 1; i < s; i++)
    {
        cout << R[i].key << "\t";
    }
}

示例: 

6f071f83813d4d7a941b14871a8ddcfc.png

实验总结

祝各位同学能够顺利的完成实验,师兄先给未来的大佬们敬杯茶。

 

 

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

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

相关文章

微前端——qiankun配置方法

什么是微前端 微前端是指存在于浏览器中的微服务&#xff0c;其借鉴了微服务的架构理念&#xff0c;将微服务的概念扩展到了前端。 如果对微服务的概念比较陌生的话&#xff0c;可以简单的理解为微前端就是将一个大型的前端应用拆分成多个模块&#xff0c;每个微前端模块可以…

Qt文件系统源码分析—第八篇QFileSystemWatcher

深度 本文主要分析Windows平台&#xff0c;Mac、Linux暂不涉及 本文只分析到Win32 API/Windows Com组件/STL库函数层次&#xff0c;再下层代码不做探究 本文QT版本5.15.2 类关系图 QTemporaryFile继承QFile QFile、QSaveFile继承QFileDevice QFileDevice继承QIODevice Q…

RK最强ARM系列之RK3588+AI+Ethercat(linux +xenomai+igh)实时解决方案

RK3588是瑞芯微新一代旗舰级高端处理器&#xff0c;具有高算力、低功耗、超强多媒体、丰富数据接口等特点。搭载四核A76四核A55的八核CPU和ARM G610MP4 GPU&#xff0c;内置6.0TOPs算力的NPU。 有五大技术优势 1. 内置多种功能强大的嵌入式硬件引擎&#xff0c;支持8K60fps 的…

5.29-kubernetes learning

文章目录 HomeGet StartedThe kubernetes network model First of all &#xff0c;we should understand the layout of this official website page. Home The Home chapter is that the official website has manuals for different versions of k8s ,and then generally…

chatgpt赋能python:Python中单词排序的方法—从入门到精通

Python中单词排序的方法—从入门到精通 Python是一门很流行的编程语言&#xff0c;它是一门被广泛使用的高级编程语言&#xff0c;为开发者提供了丰富的工具和库&#xff0c;在处理字符串、文本信息时也有着广泛的应用。本文主要介绍在Python中进行单词排序的方法。 什么是单…

python pycharm的安装教程

pycharm安装教程&#xff0c;超详细_皮小孩ls的博客-CSDN博客目录 前言 python的安装教程&#xff1a; 1.下载地址&#xff1a; 2. 安装 1&#xff09;customize installation 勾选 use 2&#xff09;.默认 . 3&#xff09;. 选择安装位置 4&#xff09;.耐心等待&…

【CSSpart4--盒子模型】

CSSpart4--盒子模型 网页布局的三大核心&#xff1a;盒子模型&#xff0c;浮动&#xff0c;定位网页布局的过程&#xff08;本质&#xff09;&#xff1a;盒子模型的组成四部分&#xff1a;边框&#xff0c;内容&#xff0c;内边距&#xff0c;外边距 一 、盒子边框border:1.1 …

Queue 队列的实现与应用

目录 1.概念2.常用的队列方法2.1 方法2.2 代码 3.自己实现队列3.1 构造MyQueue3.2 入队列offer()3.3 出队列poll()3.4 获得队头peek()3.5 是否为空isEmpty()3.6 获得队列大小size() 4.循环队列4.1 概念4.2 解析4.3 如何判断队列满4.4 代码&#xff08;保留一个位置实现&#xf…

vue+nodejs校园二手物品交易市场网站_xa1i4

。为满足如今日益复杂的管理需求&#xff0c;各类管理系统程序也在不断改进。本课题所设计的校园二手交易市场&#xff0c;使用vue框架&#xff0c;Mysql数据库、nodejs语言进行开发&#xff0c;它的优点代码不能从浏览器查看&#xff0c;保密性非常好&#xff0c;比其他的管理…

轻松实现动态人脸识别,AidLux加速智慧城市场景化应用落地

随着AI技术进入全新发展阶段&#xff0c;智能物联网&#xff08;AIoT&#xff09;的渗透率进一步加深&#xff0c;应用场景不断拓展&#xff0c;人脸识别也迅速走进了人们的日常生活&#xff0c;在手机解锁、公司考勤、支付验证、天网抓捕在逃嫌犯等场景中发挥着重要作用。 人脸…

dataV教程-浅用dataV

一别多日&#xff0c;好久没有和大家相见了。其一的原因是因为公司的项目&#xff0c;其二就是因为太懒了。现在给大家浅浅的介绍一下这个好用的大屏展示框架吧。如果后续有深入的话&#xff0c;我会出一个详解版本的。 一、dataV介绍 前言:由于当前的大数据时代&#xff0c;…

Github标星60K!mall前台商城系统正式发布,支持完整订单流程!

之前有很多小伙伴问我&#xff0c;mall项目有没有前台商城系统&#xff0c;可见大家对mall项目的前台商城系统还是非常期待的。最近抽空把前台商城系统的功能给完善了&#xff0c;目前已经可以支持完整的订单流程。我已经把前台商城系统开源了&#xff0c;项目地址也放在文末了…

重磅发布!面向装备制造业服务化转型白皮书(私信获取)

《面向装备制造业服务化转型白皮书》 关于白皮书 《面向装备制造业服务化转型白皮书》通过调研160余家装备制造企业的服务化路径及模式&#xff0c;研讨支持企业开展服务型制造的系统化方案&#xff0c;希望为装备制造业服务化转型&#xff0c;探索切实有效的路径以供参考。 …

【MySQL】- 02 MySQL explain执行

目录 1.使用explain语句去查看分析结果2.MYSQL中的组合索引3.使用慢查询分析&#xff08;实用&#xff09;4.MYISAM和INNODB的锁定explain用法详解关于MySQL执行计划的局限性&#xff1a;备注&#xff1a; 1.使用explain语句去查看分析结果 如explain select * from test1 whe…

nSoftware IPWorks 2022 C++ Crack

nSoftware IPWorks 2022 C最全面的互联网组件套件&#xff0c;PKI 代理远程签署代码和文档&#xff0c;无需暴露您的私钥&#xff0c;一种安全的自托管解决方案&#xff0c;可使用集中存储的密钥实现远程代码和文档签名&#xff0c;随附的 PKCS#11 驱动程序允许与 Jarsigner、S…

小航助学题库蓝桥杯stem科技素养模拟练习试卷(中级第2套)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 25. 2020 年 7 月 23 日&#xff0c;中国的火星探测器“天问一号“发射&#xff0c;开始了前往火星的 旅程。作为中国首个完全自主研发…

Vue之条件渲染

1. if分支结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-widt…

【分享】如何国内免费使用ChatGPT4教程

一、ChatGPT-3使用 1、ChatGPT用法总结&#xff1a; 自动化文本生成&#xff1a;可以用GPT生成文章、新闻、文本摘要&#xff0c;甚至小说、诗歌等文学作品。语音生成&#xff1a;结合语音合成技术&#xff0c;GPT可以生成自然流畅的语音&#xff0c;可以用于语音助手、交互式…

Python学习——数据排序及分箱pd.cut\pd.qcut

文章目录 1 排序1.1 按照索引排序 df.sort_index1.2 按照值进行排序 df.sort_values1.3 数值型数据快速排序 df.nlargest 2 分箱&#xff08;离散化&#xff09;2.1 pd.cut2.1.1 均匀切分,等距分箱2.1.2 指定切分点切分 2.2 pd.qcut 1 排序 dataFrame进行排序时&#xff0c;可…

最全面的WMS系统选购指南:从功能到价格一网打尽

WMS&#xff08;仓库管理系统&#xff09;是一款能够提高仓储和物流企业效率的重要工具&#xff0c;并且能够帮助客户更好地管理他们的供应链网络。但是市面上有很多不同的WMS系统&#xff0c;如何选出最适合自己的系统呢&#xff1f;下面将为您介绍全面的WMS系统选购指南。 功…