C语言实现学生管理系统(顺序表版)

news2024/9/21 14:28:04

前言

设计知识


使用语言:C语言


数据结构类型:顺序表

内容导图

在这里插入图片描述

效果展示

在这里插入图片描述

内容目录

  • 前言
    • 设计知识
    • 内容导图
    • 效果展示
  • 静态管理系统
    • 菜单的实现
    • 选择功能实现
    • 静态开辟空间
    • 实现增删功能
      • 增加功能实现
      • 删除功能实现
    • 实现查找功能
    • 实现修改功能
    • 实现排序功能
  • 动态管理系统
    • 动态开辟空间
    • 动态的初始化
    • 动态扩容函数
    • 动态增加函数
  • 总代码汇总
    • 静态管理系统汇总
      • 头文件:student.h
      • 函数实现:student.c
      • 功能实现:test.c
    • 动态管理系统汇总
      • 头文件:student.h
      • 函数实现:stduent2.c
      • 功能的实现:test.c

静态管理系统

菜单的实现

完成一个小项目,我们首先要明确它有那些功能,并且我们需要告诉明确的告诉用户这些功能。而菜单恰恰能够实现和用户的交互。但是,如果我们把菜单直接写在main函数里面就会显得非常的臃肿,所以我们可以把菜单封装成一个函数

void menu()
{
	printf("********************************\n");
	printf("*******欢迎进入学生管理系统*****\n");
	printf("*********0.退出管理系统*********\n");
	printf("*********1.增加学生信息*********\n");
	printf("*********2.删除学生信息*********\n");
	printf("*********3.查找学生信息*********\n");
	printf("*********4.修改学生信息*********\n");
	printf("*********5.打印学生信息*********\n");
	printf("********************************\n");
}

选择功能实现

有了菜单还不够,我们需要让菜单的每一个选项都有对应的功能。
因为每个功能都还没用函数进行实现,所以我们可以先用其他东西代替测试。比如我需要添加一个学生的信息,因为我还没开始实现我的增加学生这个函数,我们可以先打印一句话来确定。选择功能的这个函数有没有出问题。
写完选择功能,我们可以把他和菜单函数一起放在main函数中测试一下。

int main()
{
	int input=0;

	do
	{
		menu();
		printf("请选择功能:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:printf("增加\n"); break;
		case 2:printf("删除\n"); break;
		case 3:printf("查找\n"); break;
		case 4:printf("修改\n"); break;
		case 5:printf("排序\n"); break;
		case 6:printf("打印\n"); break;
		default:printf("选项输入有误!\n"); break;
		}
	} while (input);
	return 0;
}

在这里插入图片描述


测试正常,选择功能并没有出错,所以我们接下来需要分类实现一个个实现对应功能的函数。

静态开辟空间

每一位学生都有很多信息,所以符合结构体的特性。我们可以定义一个结构体类型。

typedef struct StudentInfo
{
	char name[NAME];//姓名
	char sex[SEX];//性别
	int id;//学号
	int age;//年纪
	int score;//分数
}Student;

接下来,继续开辟一个结构体,里面还要存放上面的结构体的数组

//静态开辟100个数组
#define MAX 100
typedef struct ClassInfo
{
	Student data[MAX];
	size_t size;
}Class;

实现增删功能

增加功能实现

静态开辟空间的最大缺陷就是内存有限,不能随需而增加。
所以我们在是实现该增加函数的时候,必须要先判断他的内存是不是已经满了。

void ClassAdd(Class* psl)
{
	assert(psl);
	if (psl->size == MAX)
	{
		printf("该学生管理系统内存已满,请清理!\n");
		return;
	}
	printf("请输入学生姓名:");
	scanf("%s", &psl->data[psl->size].name);
	printf("请输入学生性别:");
	scanf("%s", &psl->data[psl->size].sex);
	printf("请输入学生年纪:");
	scanf("%d", &psl->data[psl->size].age);
	printf("请输入学生分数:");
	scanf("%d", &psl->data[psl->size].score);
	printf("请输入学生学号:");
	scanf("%d", &psl->data[psl->size].id);
	psl->size++;
	printf("添加信息成功!\n");
}

删除功能实现

想删除一个数,那就必须得先找到这个数,找到某个数所在的位置,这个需求,在其他的功能的实现中也是被需要的。所以我们可以把它封装为一个函数,便于实现其他功能的时候可以使用。
我们使用循环,遍历数组中的所有内容。找到了就返回下标,找不到就返回-1

int Find_name(Class* psl, char name[])
{
	int i = 0;
	for (i = 0; i < psl->size; i++)
	{
		if (0 == strcmp(psl->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}

有了查找位置的功能,再去实现删除函数就显得容易很多了。
当然,值得注意的是,顺序表要保证数据的连续性,你删除某个数,并不是删除它所在位置的空间,而是用后面的数来覆盖掉它,并且删除掉最后面的一个空间。以此来保证数据的连续性。

void ClassDel(Class* psl)
{
	assert(psl);
	char name[NAME];
	printf("请输入你要删除学生的姓名:");
	scanf("%s", &name);
	int ret = Find_name(psl, name);
	if (-1 == ret)
		printf("你输入的学生不存在!\n");
	else
	{
		for (int i = ret; i < psl->size - 1; i++)
		{
			psl->data[i] = psl->data[i + 1];
		}
		psl->size--;
		printf("成功删除指定联系人\n");
	}
}

实现查找功能

这个功能就用到了上面我们实现的查找位置函数了。我们只要查找到需要被查找到的数的位置,并打印该位置的数,就可以了。

void ClassSearch(Class* psl)
{
	assert(psl);
	char name[NAME];
	printf("请输入你要查找的学生的姓名:");
	scanf("%s", &name);
	int ret = Find_name(psl, name);
	if (-1 == ret)
		printf("你要查找的学生不存在!\n");
	else
	{
		printf("%-5s\t%-5s\t%-5s\t%-20s\t%-10s\n", "姓名", "性别", "年龄", "学号", "总分");
		printf("%-5s\t%-5s\t%-5d\t%-20d\t%-10d\n", psl->data[ret].name,
			psl->data[ret].sex,
			psl->data[ret].age,
			psl->data[ret].id,
			psl->data[ret].score);
	}
}

实现修改功能

和查找功能一样,想修改一个数,我们必须要找到这个数的。

void ClassModi(Class* psl)
{
	printf("请输入要修改人的名字:>");
	char name[NAME];
	scanf("%s", name);
	int ret = Find_name(psl, name);
	if (ret == -1)
		printf("要修改的人不存在\n");
	else
	{
		printf("请输入学生姓名:");
		scanf("%s", &psl->data[ret].name);
		printf("请输入学生性别:");
		scanf("%s", &psl->data[ret].sex);
		printf("请输入学生年纪:");
		scanf("%d", &psl->data[ret].age);
		printf("请输入学生分数:");
		scanf("%d", &psl->data[ret].score);
		printf("请输入学生学号:");
		scanf("%d", &psl->data[ret].id);
		printf("修改成功\n");
	}
}

实现排序功能

实现排序的方法有很多,这里我使用的是大家最常用的冒泡排序法。
我这里以分数作为的排序标准。
感兴趣的也可以以学号或者年纪作为排序标准。

void Score_sqrt(Class* psl)
{
	Student tmp;
	for (int i = 0; i < psl->size; i++)
	{
		for (int j = 0; j < psl->size; j++)
		{
			if (psl->data[j].score < psl->data[j + 1].score)
			{
				tmp = psl->data[j];
				psl->data[j] = psl->data[j + 1];
				psl->data[j + 1] = tmp;
			}
		}
	}
	printf("排序完成!\n");
}

动态管理系统

动态开辟空间

静态的管理系统最大的缺点就是不能自主的扩容,很麻烦。
所以这里我们可以使用动态的顺序表来修改开辟空间的这一个过程。
当然其他功能还都可以用上述的函数实现,最后面我们会汇总代码。

typedef struct ClassInof
{
	Student *data;
	size_t size; //现有数据
	size_t capacity;//最大容量
}Class;

动态的初始化

void ClassInit(Class* psl)
{
	assert(psl);//断言防止其为空指针
	psl->data = NULL;//讲该指针置空
	psl->size = 0;//设置有效数据个数为0
	psl->capacity = 0;//设置空间容量为0
}

动态扩容函数

我们可以通过realloc函数根据我们需要多少空间来进行动态开辟。

void ClassAddcapacity(Class* psl)
{
	assert(psl);

	if (psl->size == psl->capacity)
	{
		int newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
		Student* tmp = (Student*)realloc(psl->data, newCapacity * sizeof(Student));
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}

		psl->data = tmp;
		psl->capacity = newCapacity;
	}
}

动态增加函数

这个增加数据的函数,就是和静态管理系统的其他功能唯一不一样的地方了。
其他的功能的实现和静态版本的一模一样,无需修改。

void ClassAdd(Class* psl)
{
	assert(psl);
	ClassAddcapacity( psl);
	printf("请输入学生姓名:");
	scanf("%s", &psl->data[psl->size].name);
	printf("请输入学生性别:");
	scanf("%s", &psl->data[psl->size].sex);
	printf("请输入学生年纪:");
	scanf("%d", &psl->data[psl->size].age);
	printf("请输入学生分数:");
	scanf("%d", &psl->data[psl->size].score);
	printf("请输入学生学号:");
	scanf("%d", &psl->data[psl->size].id);
	psl->size++;
	printf("添加信息成功!\n");
}

总代码汇总

静态管理系统汇总

头文件:student.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#define NAME 50
#define SEX 100
#define MAX 100
//学生信息结构
typedef struct StudentInfo
{
	char name[NAME];//姓名
	char sex[SEX];//性别
	int id;//学号
	int age;//年纪
	int score;//分数
}Student;
//静态开辟的数组
typedef struct ClassInfo
{
	Student data[MAX];
	size_t size;
}Class;
//菜单函数的声明
void menu();
//初始化函数的声明
void ClassInit(Class* psl);
//增加函数的声明
void ClassAdd(Class* psl);
//打印函数的声明
void ClassPrint(Class* psl);
//删除函数的声明
void ClassDel(Class* psl);
//查找函数的声明
void ClassSearch(Class* psl);
//修改函数的声明
void ClassModi(Class* psl);
//排序函数的声明
void Score_sqrt(Class* psl);

函数实现:student.c

#include"Student.h"
void menu()
{
	printf("********************************\n");
	printf("*******欢迎进入学生管理系统*****\n");
	printf("*********0.退出管理系统*********\n");
	printf("*********1.增加学生信息*********\n");
	printf("*********2.删除学生信息*********\n");
	printf("*********3.查找学生信息*********\n");
	printf("*********4.修改学生信息*********\n");
	printf("*********5.成绩排序信息*********\n");
	printf("*********6.打印学生信息*********\n");
	printf("********************************\n");
}
//静态初始化
void ClassInit(Class* psl)
{
	assert(psl);
	psl->size = 0;
	memset(psl->data, 0, MAX * sizeof(Student));
}
//增加函数的实现
void ClassAdd(Class* psl)
{
	assert(psl);
	if (psl->size == MAX)
	{
		printf("该学生管理系统内存已满,请清理!\n");
		return;
	}
	printf("请输入学生姓名:");
	scanf("%s", &psl->data[psl->size].name);
	printf("请输入学生性别:");
	scanf("%s", &psl->data[psl->size].sex);
	printf("请输入学生年纪:");
	scanf("%d", &psl->data[psl->size].age);
	printf("请输入学生分数:");
	scanf("%d", &psl->data[psl->size].score);
	printf("请输入学生学号:");
	scanf("%d", &psl->data[psl->size].id);
	psl->size++;
	printf("添加信息成功!\n");
}
//打印函数的实现
void ClassPrint(Class* psl)
{
	int i = 0;
	printf("%-5s\t%-5s\t%-5s\t%-20s\t%-10s\n", "姓名", "性别", "年龄", "学号", "总分");
	for (i = 0; i < psl->size; i++)
	{
		printf("%-5s\t%-5s\t%-5d\t%-20d\t%-10d\n", psl->data[i].name,
			psl->data[i].sex,
			psl->data[i].age,
			psl->data[i].id,
			psl->data[i].score);
	}
}
//查找位置的函数
int Find_name(Class* psl, char name[])
{
	int i = 0;
	for (i = 0; i < psl->size; i++)
	{
		if (0 == strcmp(psl->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}
//删除函数的实现
void ClassDel(Class* psl)
{
	assert(psl);
	char name[NAME];
	printf("请输入你要删除学生的姓名:");
	scanf("%s", &name);
	int ret = Find_name(psl, name);
	if (-1 == ret)
		printf("你输入的学生不存在!\n");
	else
	{
		for (int i = ret; i < psl->size - 1; i++)
		{
			psl->data[i] = psl->data[i + 1];
		}
		psl->size--;
		printf("成功删除指定联系人\n");
	}
}
//查找学生函数的实现
void ClassSearch(Class* psl)
{
	assert(psl);
	char name[NAME];
	printf("请输入你要查找的学生的姓名:");
	scanf("%s", &name);
	int ret = Find_name(psl, name);
	if (-1 == ret)
		printf("你要查找的学生不存在!\n");
	else
	{
		printf("%-5s\t%-5s\t%-5s\t%-20s\t%-10s\n", "姓名", "性别", "年龄", "学号", "总分");
		printf("%-5s\t%-5s\t%-5d\t%-20d\t%-10d\n", psl->data[ret].name,
			psl->data[ret].sex,
			psl->data[ret].age,
			psl->data[ret].id,
			psl->data[ret].score);
	}
}
//修改函数的实现
void ClassModi(Class* psl)
{
	printf("请输入要修改人的名字:>");
	char name[NAME];
	scanf("%s", name);
	int ret = Find_name(psl, name);
	if (ret == -1)
		printf("要修改的人不存在\n");
	else
	{
		printf("请输入学生姓名:");
		scanf("%s", &psl->data[ret].name);
		printf("请输入学生性别:");
		scanf("%s", &psl->data[ret].sex);
		printf("请输入学生年纪:");
		scanf("%d", &psl->data[ret].age);
		printf("请输入学生分数:");
		scanf("%d", &psl->data[ret].score);
		printf("请输入学生学号:");
		scanf("%d", &psl->data[ret].id);
		printf("修改成功\n");
	}
}
//排序函数的实现(冒泡)
void Score_sqrt(Class* psl)
{
	Student tmp;
	for (int i = 0; i < psl->size; i++)
	{
		for (int j = 0; j < psl->size; j++)
		{
			if (psl->data[j].score < psl->data[j + 1].score)
			{
				tmp = psl->data[j];
				psl->data[j] = psl->data[j + 1];
				psl->data[j + 1] = tmp;
			}
		}
	}
	printf("排序完成!\n");
}

功能实现:test.c

#include"Student.h"
int main()
{
	int input=0;
	Class class;
	ClassInit(&class);
	do
	{
		menu();
		printf("请选择功能:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:ClassAdd(&class); break;
		case 2:ClassDel(&class); break;
		case 3:ClassSearch(&class); break;
		case 4:ClassModi(&class); break;
		case 5:Score_sqrt(&class); break;
		case 6:ClassPrint(&class); break;
		default:printf("选项输入有误!\n"); break;
		}
	} while (input);
	return 0;
}

动态管理系统汇总

头文件:student.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#define NAME 100
#define SEX 50
//学生基本信息
typedef struct StudentInof
{
	char name[NAME];//姓名
	char sex[SEX];//性别
	int id;//学号
	int age;//年纪
	int score;//分数
}Student;
//动态顺序表
typedef struct ClassInof
{
	Student *data;
	size_t size; //现有数据
	size_t capacity;//最大容量
}Class;

void menu();
//初始化函数的声明
void ClassInit(Class* psl);
//增加容量声明
void ClassAddcapacity(Class* psl);
//增加函数的声明
void ClassAdd(Class* psl);
//打印函数的声明
void ClassPrint(Class* psl);
//删除函数的声明
void ClassDel(Class* psl);
//查找函数的声明
void ClassSearch(Class* psl);
//修改函数的声明
void ClassModi(Class* psl);
//排序函数的声明
void Score_sqrt(Class* psl);

函数实现:stduent2.c

#include"student.h"
//菜单的定义
void menu()
{
	printf("********************************\n");
	printf("*******欢迎进入学生管理系统*****\n");
	printf("*********0.退出管理系统*********\n");
	printf("*********1.增加学生信息*********\n");
	printf("*********2.删除学生信息*********\n");
	printf("*********3.查找学生信息*********\n");
	printf("*********4.修改学生信息*********\n");
	printf("*********5.成绩排序信息*********\n");
	printf("*********6.打印学生信息*********\n");
	printf("********************************\n");
}
//动态初始化
void ClassInit(Class* psl)
{
	assert(psl);//断言防止其为空指针
	psl->data = NULL;//讲该指针置空
	psl->size = 0;//设置有效数据个数为0
	psl->capacity = 0;//设置空间容量为0
}
//动态扩容
void ClassAddcapacity(Class* psl)
{
	assert(psl);

	if (psl->size == psl->capacity)
	{
		int newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
		Student* tmp = (Student*)realloc(psl->data, newCapacity * sizeof(Student));
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}

		psl->data = tmp;
		psl->capacity = newCapacity;
	}
}
//增加数据函数定义
void ClassAdd(Class* psl)
{
	assert(psl);
	ClassAddcapacity( psl);
	printf("请输入学生姓名:");
	scanf("%s", &psl->data[psl->size].name);
	printf("请输入学生性别:");
	scanf("%s", &psl->data[psl->size].sex);
	printf("请输入学生年纪:");
	scanf("%d", &psl->data[psl->size].age);
	printf("请输入学生分数:");
	scanf("%d", &psl->data[psl->size].score);
	printf("请输入学生学号:");
	scanf("%d", &psl->data[psl->size].id);
	psl->size++;
	printf("添加信息成功!\n");
}
//打印函数的定义
void ClassPrint(Class* psl)
{
	int i = 0;
	printf("%-5s\t%-5s\t%-5s\t%-20s\t%-10s\n", "姓名", "性别", "年龄", "学号", "总分");
	for (i = 0; i < psl->size; i++)
	{
		printf("%-5s\t%-5s\t%-5d\t%-20d\t%-10d\n", psl->data[i].name,
			psl->data[i].sex,
			psl->data[i].age,
			psl->data[i].id,
			psl->data[i].score);
	}
}
//查找位置的函数
int Find_name(Class* psl, char name[])
{
	int i = 0;
	for (i = 0; i < psl->size; i++)
	{
		if (0 == strcmp(psl->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}
//删除函数的实现
void ClassDel(Class* psl)
{
	assert(psl);
	char name[NAME];
	printf("请输入你要删除学生的姓名:");
	scanf("%s", &name);
	int ret = Find_name(psl, name);
	if (-1 == ret)
		printf("你输入的学生不存在!\n");
	else
	{
		for (int i = ret; i < psl->size - 1; i++)
		{
			psl->data[i] = psl->data[i + 1];
		}
		psl->size--;
		printf("成功删除指定联系人\n");
	}
}
//查找学生函数的实现
void ClassSearch(Class* psl)
{
	assert(psl);
	char name[NAME];
	printf("请输入你要查找的学生的姓名:");
	scanf("%s", &name);
	int ret = Find_name(psl, name);
	if (-1 == ret)
		printf("你要查找的学生不存在!\n");
	else
	{
		printf("%-5s\t%-5s\t%-5s\t%-20s\t%-10s\n", "姓名", "性别", "年龄", "学号", "总分");
		printf("%-5s\t%-5s\t%-5d\t%-20d\t%-10d\n", psl->data[ret].name,
			psl->data[ret].sex,
			psl->data[ret].age,
			psl->data[ret].id,
			psl->data[ret].score);
	}
}
//修改函数的实现
void ClassModi(Class* psl)
{
	printf("请输入要修改人的名字:>");
	char name[NAME];
	scanf("%s", name);
	int ret = Find_name(psl, name);
	if (ret == -1)
		printf("要修改的人不存在\n");
	else
	{
		printf("请输入学生姓名:");
		scanf("%s", &psl->data[ret].name);
		printf("请输入学生性别:");
		scanf("%s", &psl->data[ret].sex);
		printf("请输入学生年纪:");
		scanf("%d", &psl->data[ret].age);
		printf("请输入学生分数:");
		scanf("%d", &psl->data[ret].score);
		printf("请输入学生学号:");
		scanf("%d", &psl->data[ret].id);
		printf("修改成功\n");
	}
}
//排序函数的实现(冒泡)
void Score_sqrt(Class* psl)
{
	Student tmp;
	for (int i = 0; i < psl->size; i++)
	{
		for (int j = 0; j < psl->size; j++)
		{
			if (psl->data[j].score < psl->data[j + 1].score)
			{
				tmp = psl->data[j];
				psl->data[j] = psl->data[j + 1];
				psl->data[j + 1] = tmp;
			}
		}
	}
	printf("排序完成!\n");
}

功能的实现:test.c

#include"student.h"
int main()
{
	int input = 0;
	Class class;
	ClassInit(&class);
	do
	{
		menu();
		printf("请选择功能:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:ClassAdd(&class); break;
		case 2:ClassDel(&class); break;
		case 3:ClassSearch(&class); break;
		case 4:ClassModi(&class); break;
		case 5:Score_sqrt(&class); break;
		case 6:ClassPrint(&class); break;
		default:printf("选项输入有误!\n"); break;
		}
	} while (input);
	return 0;
}

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

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

相关文章

rollup打包工具快速入门

0.开始 教学视频出处 https://www.bilibili.com/video/BV1w84y1z77V?p3&spm_id_frompageDriver&vd_source0f7f337dd5a99bb975b88a48ae1b3711 日期&#xff1a;2022/12/3 rollup目前版本&#xff1a; "rollup": "^3.5.1"1.rollup概述 官网 http…

N32G45之串口+DMA数据收发

N32G45之串口DMA数据收发 1.串口简介   通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信&#xff0c;也支持LI…

【云原生】nacos权限制认证

鉴权 服务端如何开启鉴权 非Docker环境 按照官方文档配置启动,默认是不需要登录的&#xff0c;这样会导致配置中心对外直接暴露。而启用鉴权之后&#xff0c;需要在使用用户名和密码登录之后&#xff0c;才能正常使用nacos。 开启鉴权之前&#xff0c;application.properti…

0115 查找算法Day4

剑指 Offer 03. 数组中重复的数字 在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1&#xff1a; …

Linux-CPU之平均负载

一般我们觉得系统变慢了&#xff0c;都会执行 top 或者 uptime 命令&#xff0c;来了解系统的负载情况。 uptime11:29:06 up 0 min, 2 users, load average: 1.21, 0.29, 0.10// 当前时间 // 系统运行时间 // 正在登录用户数 //1 分钟、5 分钟、15 分钟的平均负载概念&…

补知识点:Stream API

一、创建Stream 首先创建Stream的话&#xff0c;有四种创建方式&#xff1a; 注&#xff1a; 第一种集合的方式是最常用的 package com.atguigu.gulimall.gateway;import com.atguigu.gulimall.streamapi.Employee; import com.atguigu.gulimall.streamapi.EmployeeData; impo…

【应用】Docker

DockerDocker 的安装基本安装流程配置镜像加速Docker 常用命令镜像相关命令容器相关命令DockerfileDockerfile 常用指令Dockerfile 简单使用案例Dockerfile 构建 java 项目镜像Docker ComposeDocker compose 基本参数services 配置参数Docker 的安装 基本安装流程 使用虚拟机…

Linux JDK8下载安装

JDK安装 整体步骤介绍 操作步骤: 1 查看自己linux版本位 getconf LONG_BIT(64位) 2. 下载jdk的安装包 这里提供三种方法下载: (以jdk-8u171-linux-x64.tar.gz为例) 2.1 官网下载jdk: 官网: https://www.oracle.com/downloads/ jdk最新版本下载: https://www.oracle.com…

带你玩转序列模型之seq2seq模型定向(集束)搜索

目录 一.基础模型 二.选择最可能的句子 三.定向搜索 四.改进定向搜索 五.定向搜索的误差分析 一.基础模型 在这一周&#xff0c;你将会学习seq2seq&#xff08;sequence to sequence&#xff09;模型&#xff0c;从机器翻译到语音识别&#xff0c;它们都能起到很大的作用…

【数据结构1】数据结构的基本概念

数据结构的基本概念 数据&#xff1a;数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 数据元素、数据项&#xff1a;数据元素是数据的基本单位&#xff0c;通常作为一…

以太网 TCP协议(TCP交互过程中出现丢包时的解决机制-列举部分)

2.7.3 以太网 TCP协议&#xff08;TCP交互过程中出现丢包时的解决机制-列举部分&#xff09; 参考&#xff1a;CSDN_TCP的重传机制_博主.Pr Young&#xff0c;对描述进行了整理与结合个人的理解进行编写。 一、超时重传机制 在发送数据时&#xff0c;设定一个定时器&#xff0c…

Ubuntu下cmake使用入门

CMake是一个跨平台的安装&#xff08;编译&#xff09;工具&#xff0c;可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件。其包含自己的语法结构&#xff0c;只要按照其语法编写成CMakeLists.txt&#xff0c;然后camke程序就能对…

MAML:User Diverse Preference Modeling by Multimodal AttentiveMetric Learning

一、摘要 大多数现有的推荐系统用特征向量表示用户的偏好&#xff0c;当预测该用户对不同项目的偏好时&#xff0c;假设该特征向量是固定的。然而&#xff0c;同一个向量不能准确地捕捉用户对所有项目的不同偏好&#xff0c;特别是在考虑各种项目的不同特征时。为了解决这个问…

【应用】Kubernetes

Kubernetesk8s 安装流程安装前配置安装 docker 以及 k8s 组件初始化 k8s 集群测试使用&#xff1a;安装 kubernetes-dashboardk8s 基础概念k8s 核心技术概念k8s 内部组件k8s 中的 IP 地址K8S 服务暴露的三种方式k8s 安装流程 k8s-masterk8s-node01k8s-node02192.168.86.140192…

【编程题】【Scratch四级】2022.09 三个数排序

三个数排序 输入三个数&#xff0c;比较三个数的大小&#xff0c;并将这三个数按照从小到大的顺序说出。 1. 准备工作 &#xff08;1&#xff09;保留小猫角色&#xff0c;默认位置&#xff1b; &#xff08;2&#xff09;白色背景。 2. 功能实现 &#xff08;1&#xff…

Java基于SSM框架的教室预约申请管理系统 毕业设计

本教室管理系统主要包括系统用户管理模块、楼层信息管理模块、校内新闻管理、教室信息管理、登录模块、和退出模块等多个模块。它帮助教室管理实现了信息化、网络化,通过测试,实现了系统设计目标,相比传统的管理模式,本系统合理的利用了教室管理数据资源,有效的减少了教室管理的…

四旋翼无人机学习第13节--Padstack Editor的简单使用

文章目录0 前言1 绘制MP2120 QFN10封装焊盘(初步学习)1.1 数据手册确定焊盘种类1.2 软件设置焊盘11.3 软件设置焊盘22 绘制DM9000A LQFP48L封装焊盘(初步学习)2.1 数据手册确定焊盘种类2.2 软件设置焊盘3 绘制STC89C51 PDIP-40封装通孔焊盘(初步学习)3.1 数据手册确定焊盘种类3…

【Spring源码系列】Bean生命周期-Bean销毁

前言 Spring给我们提供了一种当bean销毁时调用某个方法的方式。那么&#xff0c;Spring底层到底是如何实现的呢&#xff1f;接下来&#xff0c;我们将从源码案例的方式来解析&#xff1a;spring如何实现当bean销毁时调用某个方法的。 一、Bean销毁介绍 bean销毁的时机 当sp…

[附源码]计算机毕业设计springboot智能衣橱APP

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

数据增强 - 当数据有限时如何使用深度学习(一)

本文是对图像的深度学习数据增强技术的全面综述前言我们都遇到过这种情况&#xff1a;您有一个可以使用机器学习模型实现的机会&#xff0c;但当您打开网络浏览器并搜索相关数据&#xff0c;很有可能&#xff0c;您会发现一个只有几百张图像的数据集。您记得最受欢迎的数据集的…