学习JavaEE的日子 Day17 面向对象版学生管理系统

news2025/2/26 7:13:28

Day17 面向对象版学生管理系统

代码已放在资源里,有需要可自取!!!

1.需求分析

管理的是一个一个的学生对象

学生类:

public class Student{

   String name;

   char sex;

   int age;

   String classId;//班级号

   String id;//学号

}

学生数据的限制:(StuInfoUtil工具类)

1.名字长度2–16

2.性别必须是男或女

3.年龄18–50

4.班级号长度4

5.学号长度3

怎么判断学生是否相同呢? 班级号+学号(重写equals方法)

管理 --> 数组 - Student[](数组中没有增,所以设置只能放3个元素的数组,然后扩容)

​ 增 - 注意:涉及到扩容

​ 删 - 注意:根据班级号+学号去删除

​ 改 - 注意:修改学生对象里所有的数据

​ 查 - 注意:

​ 根据姓名查询 - 学生数组

​ 根据性别查询 - 学生数组

​ 根据年龄查询 - 学生数组

​ 根据班级号查询 - 学生数组

​ 根据班级号+学号查询 - 学生对象在容器的下标

注意:数据源:存储数据的地方

设计图:

在这里插入图片描述

2.项目搭建

2.1 分包

sms:学生管理包

utils:工具包

pojo:实体类

impI:实现接口类

分包示意图:

在这里插入图片描述

2.2 编写实体类(Student)

pojo包中放的是学生对象,有无参构造,get、set方法,toString方法,重写equals方法

package com.pcb.pojo;

public class Student{

	   private String name;
	   private char sex;
	   private int age;
	   private String classId;//班级号
	   private String id;//学号

	   public Student() {
	}

	public Student(String name, char sex, int age, String classId, String id) {
		super();
		this.name = name;
		this.sex = sex;
		this.age = age;
		this.classId = classId;
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getClassId() {
		return classId;
	}

	public void setClassId(String classId) {
		this.classId = classId;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	//判断两个学生是否相同
	//比较规则:班级号+学号
	@Override
	public boolean equals(Object obj) {//重写equals
		if (this == obj) {
			return true;	
		}
		
		if (obj instanceof Student) {//判断是否是学生类
			
			Student stu = (Student) obj;//强转
			
			if (this.classId.equals(stu.classId) && this.id.equals(stu.id)) {
				return true;
			}
		}	
		return false;
	}
	
	@Override
	public String toString() {
		return name + "\t" + sex + "\t" + age + "\t" + classId + "\t" + id;
	}
	   
	   
	}
2.3 编写工具类

utils包中存放的是学生信息合法性的类(就是上面的学生数据的限制)

package com.pcb.utils;

import com.pcb.pojo.Student;

//学生信息合法性的工具类
public interface StuInfoUtil {

	public static boolean isStu(Student stu) {
		String name = stu.getName();
		char sex = stu.getSex();
		int age = stu.getAge();
		String classId = stu.getClassId();
		String id = stu.getId();
		
		if (isName(name) && isSex(sex) && isAge(age) && isClassId(classId) &&isId(id)) {
			return true;
		}		
		return false;
	}
	
	
	public static boolean isName(String name){

		int len=name.length();//长度
		if (len >= 2 && len <= 16) {
			return true;
		}
		return false;
	}

	public static boolean isSex(char sex){

		if (sex == '男' || sex == '女') {
			return true;
		}
		return false;
	}

	public static boolean isAge(int age){

		if (age >= 18 && age <= 50) {
			return true;
		}
		return false;
	}
	
	public static boolean isClassId(String classId){

		int len=classId.length();
		if (len == 4) {
			return true;
		}
		return false;
	}
	
	public static boolean isId(String id){

		int len=id.length();
		if (len == 3) {
			return true;
		}
		return false;
	}
}
2.4 编写接口

sms学生管理包放学生管理系统的接口(列出添加、扩容、删除、修改等的接口)

package com.pcb.sms;

import com.pcb.pojo.Student;

public interface StudentManagerSystem {

	//type的种类
	int NAME = 1;
	int SEX = 2;
	int AGE = 3;
	int CLASS_ID = 4;
	int ID = 5;
	
	/**
	 * 添加学生
	 * @param stu 学生对象
	 * @return 添加状态码
	 */
	public int add(Student stu);
	
	/**
	 * 数据源扩容
	 * 扩容机制为原来长度的1.5
	 */
	public void expansion();
		
	/**
	 * 删除学生
	 * @param classId 目标班级号
	 * @param id 目标学号
	 * @return 删除状态码
	 */
	public int delete(String classId,String id);
	
	/**
	 * 修改学生信息
	 * @param classId 目标班级号
	 * @param id 目标学号
	 * @param type 修改类型:1-修改姓名 2-修改性别 3-修改年龄 4-修改班级号 5-修改学号
	 * @param val 修改的值
	 * @return 修改状态码
	 */
	public int update(String classId,String id,int type,Object val);
	
	/**
	 * 根据学生查询在数据源中的学生对象的下标
	 * @param stu 目标学生
	 * @return 如果有,就返回数据源中的下标。如果没有,就返回-1
	 */
	public int query(Student stu);
	
	/**
	 * 根据班级号+学号查询在数据源中的学生对象的下标
	 * @param classId 目标班级号
	 * @param id 目标学号
	 * @return 如果有,就返回数据源中的下标。如果没有,就返回-1
	 */
	public int query(String classId,String id);
	
	/**
	 * 根据姓名查询学生对象数组
	 * @param name 目标姓名
	 * @return 如果有,返回学生对象数组。如果没有,就返回null
	 */
	public Student[] getStuByName(String name);
	
	/**
	 * 根据性别查询学生对象数组
	 * @param sex 目标性别
	 * @return 如果有,返回学生对象数组。如果没有,就返回null
	 */
	public Student[] getStuBySex(char sex);
	
	/**
	 * 根据年龄段查询学生对象数组
	 * @param start 开始年龄 - 包含
	 * @param end 结束年龄 - 排他
	 * @return 如果有,返回学生对象数组。如果没有,就返回null
	 */
	public Student[] getStuAge(int start,int end);
	
	/**
	 * 根据班级号查询学生对象数组
	 * @param classId 目标班级号
	 * @return 如果有,返回学生对象数组。如果没有,就返回null
	 */
	public Student[] getStuClassId(String classId);
	
	/**
	 * 打印数据源中所有的学生对象
	 */
	public void printAllStudent();
}

3.添加功能

在ImpI包中的StudentManagerSystemImpl,写下面的添加方法(涉及的到扩容方法·)

@Override
	public int add(Student stu) {
		
		//1.判断学生信息合法性
		if(!StuInfoUtil.isStu(stu)){
			return -1;
		}
		
		//2.判断是否有重复学生
		if(query(stu) != -1){
			return -2;
		}
		
		//3.判断是否扩容
		if(stus.length == size){
			expansion();
		}
		//4.添加学生
		stus[size++] = stu;
		return 1;
	}

	@Override
	public void expansion() {
		int oldCapacity = stus.length;
		int newCapacity = oldCapacity + (oldCapacity>>1);
		
//		Student[] newStus = new Student[newCapacity];
//		for (int i = 0; i < stus.length; i++) {
//			newStus[i] = stus[i];
//		}
//		stus = newStus;
		
		stus = Arrays.copyOf(stus, newCapacity);
	}

3.1 编写测试类的添加前端页面

在main包的Test类中写前端页面,设置addMenu(Scan,sms),添加菜单

public class Test {

	public static void main(String[] args) {

		Scanner scan = new Scanner(System.in);

		StudentManagerSystemImpl sms=new StudentManagerSystemImpl();

		System.out.println("欢迎使用**学生管理系统");
		boolean flag = true;
		while(flag){
			System.out.println("请选择以下功能:");
			System.out.println("1 - 添加学生");
			System.out.println("2 - 删除学生");
			System.out.println("3 - 修改学生");
			System.out.println("4 - 查询学生");
			System.out.println("5 - 打印所有学生");
			System.out.println("886 - 退出系统");
			int num = scan.nextInt();

			switch (num) {
			case 1:
				addMenu(scan, sms);
				break;
			case 2:
				
				break;
			case 3:

				break;
			case 4:

				break;
			case 5:
				sms.printAllStudent();
				break;
			case 886:
				flag = false;
				System.out.println("正在退出**学生管理系统,欢迎下次再来...");
				break;
			default:
				System.out.println("输入错误,请重新输入...");
				break;
			}
			System.out.println("------------------------");
		}
		
		scan.close();//关闭资源
	}

添加菜单的编写

private static void addMenu(Scanner scan, StudentManagerSystemImpl sms) {// Alt + shift + m
		System.out.println("请输入姓名:");
		String name = scan.next();
		System.out.println("请输入性别:");
		char sex = scan.next().charAt(0);//1.输入字符串 2.获取字符串中下标为0的字符
		System.out.println("请输入年龄:");
		int age = scan.nextInt();
		System.out.println("请输入班级号:");
		String classId = scan.next();
		System.out.println("请输入学号:");
		String id = scan.next();
		
		Student stu = new Student(name, sex, age, classId, id);
		int addCode = sms.add(stu);
		if(addCode == -1){
			System.out.println("添加失败 -- 学生信息不合法");
		}else if(addCode == -2){
			System.out.println("添加失败 -- 有重复学生");
		}else if(addCode == 1){
			System.out.println("添加成功");
		}
	}

4.删除功能

为了方便删除,在StudentManagerSystemImpl,写一个无参构造方法,设置初始值,方便测试删除功能(后面可删除此方法)

	public StudentManagerSystemImpl() {
		stus = new Student[DEFAULT_CAPACITY];
		
		add(new Student("麻生希", '女', 27, "2401", "001"));
		add(new Student("椎名空", '女', 23, "2401", "002"));
		add(new Student("水菜丽", '女', 21, "2401", "003"));
		add(new Student("朝桐光", '女', 31, "2401", "004"));
		add(new Student("北岛玲", '女', 36, "2401", "005"));
		add(new Student("樱井步", '女', 29, "2401", "006"));
		add(new Student("爱田奈奈", '女', 32, "2401", "007"));
		add(new Student("水野朝阳", '女', 31, "2401", "008"));
		add(new Student("古川伊织", '女', 27, "2401", "009"));
		add(new Student("巴得伟", '男', 21, "2401", "010"));
		add(new Student("李星乐", '男', 20, "2401", "011"));
		add(new Student("北条麻衣", '女', 34, "2402", "001"));
		add(new Student("濑亚美莉", '女', 23, "2402", "002"));
		add(new Student("三上悠亚", '女', 21, "2402", "003"));
		add(new Student("小西满里惠", '女', 31, "2402", "004"));
		add(new Student("桃谷绘里香", '女', 27, "2402", "005"));
		add(new Student("铃原爱蜜莉", '女', 23, "2402", "006"));
		add(new Student("明日花绮罗", '女', 28, "2402", "007"));
		add(new Student("京香Julia", '女', 34, "2402", "008"));
		add(new Student("巴得伟", '男', 18, "2402", "009"));
		add(new Student("张海杰", '男', 20, "2402", "010"));
	}

删除功能的实现

@Override
	public int delete(String classId, String id) {
		//1.判断学生信息合法性
		if(!StuInfoUtil.isClassId(classId) || !StuInfoUtil.isId(id)){
			return -1;
		}
		
		//2.判断是否有该学生
		int index = query(classId, id);
		if(index == -1){
			return -2;
		}
		
		//3.删除学生
		for (int i = index; i < size-1; i++) {
			stus[i] = stus[i+1];//数据移位,把后面的赋值给前一个
		}
		size--;
		return 1;
	}

pojo包下的Student类,编写Student的无参构造,只有classId,id

public Student(String classId, String id) {
		this.classId = classId;
		this.id = id;
	}
@Override
	public int query(String classId, String id) {
		//创建临时学生对象(注意:该学生对象中只有班级号和学号)
		Student stu = new Student(classId, id);
		int index = query(stu);
		return index;
	}

思考题://1.判断学生信息合法性

4.1 编写测试类的删除前端页面
case 1:
	addMenu(scan, sms);
	break;
case 2:
	deleteMenu(scan, sms);
	break;

删除菜单的方法

private static void deleteMenu(Scanner scan, StudentManagerSystemImpl sms) {
		System.out.println("请输入班级号:");
		String classId = scan.next();
		System.out.println("请输入学号:");
		String id = scan.next();
		
		int deleteCode = sms.delete(classId, id);
		if(deleteCode == -1){
			System.out.println("删除失败 -- 学生信息不合法");
		}else if(deleteCode == -2){
			System.out.println("删除失败 -- 没有该学生");
		}else if(deleteCode == 1){
			System.out.println("删除成功");
		}
	}

5.查询功能

在StudentManagerSystemImpl实现类中,重写以下方法,根据姓名,年龄,性别段,班级号查询的方法

@Override
	public Student[] getStuByName(String name) {

		//1.验证学生信息合法性
		if (! StuInfoUtil.isName(name)) {
			return null;
		}

		//2.获取符合条件的学生人数
		int count =0;
		for (int i = 0; i < size; i++) {
			if (stus[i].getName().equals(name)) {
				count++;
			}
		}
		if (count == 0) {
			return null;
		}
		//3.创建新数组
		Student[] newStus = new Student[count];

		//4.遍历数据源,把符合条件的学生对象存入新数组中
		int index=0;//下标
		for (int i = 0; i < size; i++) {
			if (stus[i].getName().equals(name)) {
				newStus[index++] =stus[i];
			}
		}

		return newStus;
	}

	@Override
	public Student[] getStuBySex(char sex) {
		//1.验证学生信息合法性
		if (! StuInfoUtil.isSex(sex)) {
			return null;
		}

		//2.获取符合条件的学生人数
		int count =0;
		for (int i = 0; i < size; i++) {
			if (stus[i].getSex() == sex) {
				count++;
			}
		}
		if (count == 0) {
			return null;
		}
		//3.创建新数组
		Student[] newStus = new Student[count];

		//4.遍历数据源,把符合条件的学生对象存入新数组中
		int index=0;//下标
		for (int i = 0; i < size; i++) {
			if (stus[i].getSex() == sex) {
				newStus[index++] =stus[i];
			}
		}

		return newStus;
	}


	@Override
	public Student[] getStuAge(int start, int end) {
		//1.验证学生信息合法性
		if (!StuInfoUtil.isAge(start) || !StuInfoUtil.isAge(end)) {
			return null;
		}

		//2.获取符合条件的学生人数
		int count =0;
		for (int i = 0; i < size; i++) {
			int age=stus[i].getAge();
			if (age>=start && age<end) {
				count++;
			}
		}
		if (count == 0) {
			return null;
		}
		//3.创建新数组
		Student[] newStus = new Student[count];

		//4.遍历数据源,把符合条件的学生对象存入新数组中
		int index=0;//下标
		for (int i = 0; i < size; i++) {
			int age=stus[i].getAge();
			if (age>=start && age<end) {
				newStus[index++] =stus[i];
			}
		}

		return newStus;
	}

	@Override
	public Student[] getStuClassId(String classId) {

		//1.验证学生信息合法性
		if (! StuInfoUtil.isClassId(classId)) {
			return null;
		}

		//2.获取符合条件的学生人数
		int count =0;
		for (int i = 0; i < size; i++) {
			if (stus[i].getClassId().equals(classId)) {
				count++;
			}
		}
		if (count == 0) {
			return null;
		}
		//3.创建新数组
		Student[] newStus = new Student[count];

		//4.遍历数据源,把符合条件的学生对象存入新数组中
		int index=0;//下标
		for (int i = 0; i < size; i++) {
			if (stus[i].getClassId().equals(classId))  {
				newStus[index++] =stus[i];
			}
		}

		return newStus;
	}
5.1 编写测试类的查询前端页面

在main包下的Test类中添加以下代码,写一个queryMenu菜单方法

       switch (num) {
			case 1:
				addMenu(scan, sms);
				break;
			case 2:
				deleteMenu(scan, sms);
				break;
			case 3:
				updateMenu(scan, sms);				
				break;
			case 4:
				queryMenu(scan, sms);
				break;

queryMenu查询菜单方法如下

private static void queryMenu(Scanner scan, StudentManagerSystemImpl sms) {
		System.out.println("请选择查询的条件:");
		System.out.println("1 - 根据姓名查询");
		System.out.println("2 - 根据性别查询");
		System.out.println("3 - 根据年龄段查询");
		System.out.println("4 - 根据班级号查询");
		int num = scan.nextInt();
		Student[] stus = null;
		switch (num) {
		case 1:
			System.out.println("请输入需要查询的姓名:");
			String name = scan.next();
			stus = sms.getStuByName(name);
			break;
		case 2:
			System.out.println("请输入需要查询的性别:");
			char sex = scan.next().charAt(0);
			stus = sms.getStuBySex(sex);
			break;
		case 3:
			System.out.println("请输入需要查询的起始年龄(包含):");
			int start = scan.nextInt();
			System.out.println("请输入需要查询的结束年龄(排他):");
			int end = scan.nextInt();
			stus = sms.getStuAge(start, end);
			break;
		case 4:
			System.out.println("请输入需要查询的班级号:");
			String classId = scan.next();
			stus = sms.getStuClassId(classId);
			break;
		}

		if(stus != null){
			sms.printStus(stus);
		}else{
			System.out.println("查询错误");
		}
	}

为了方便打印数组,在StudentManagerSystem接口中,写一个默认方法,在前端Test类中直接调用这个方法

     /**
	 * 打印学生数组
	 * @param stus目标数组
	 */
	default void printStus(Student[] stus){
		for (Student stu : stus) {
			System.out.println(stu);
		}
	}

6.修改功能

在StudentManagerSystemImpl实现类中,重写修改方法

    @Override
	public int update(String classId, String id, int type, Object val) {

		//1.判断学生信息合法性
		if(!StuInfoUtil.isClassId(classId) || !StuInfoUtil.isId(id)){
			return -1;
		}

		//2.判断是否有该学生
		int index = query(classId, id);
		if (index == -1) {
			return -2;//返回-2,就是没有该学生
		}

		//3.判断修改类型
		switch (type) {
		case NAME:
			String nameVal = (String) val;// name --> 强转成String类型
			//判断修改数据的合法性
			if(!StuInfoUtil.isName(nameVal)){
				return -3;
			}
			//修改数据
			stus[index].setName(nameVal);
			break;
		case SEX:
			char sexVal = (Character) val;// sex --> 强转成Character类型
			//判断修改数据的合法性
			if(!StuInfoUtil.isSex(sexVal)){
				return -3;
			}
			//修改数据
			stus[index].setSex(sexVal);
			break;
		case AGE:
			int ageVal = (Integer) val;
			//判断修改数据的合法性
			if(!StuInfoUtil.isAge(ageVal)){
				return -3;
			}
			//修改数据
			stus[index].setAge(ageVal);
			break;
		case CLASS_ID:

			String classIdVal = (String) val;

			//判断目标班级上是否有重复学生
			if(query(classIdVal, id) != -1){
				return -4;
			}

			//判断修改数据的合法性
			if(!StuInfoUtil.isClassId(classIdVal)){
				return -3;
			}
			//修改数据
			stus[index].setClassId(classIdVal);
			break;
		case ID:

			String idVal = (String) val;

			//判断目标学号上是否有重复学生
			if(query(classId, idVal) != -1){
				return -5;
			}

			//判断修改数据的合法性
			if(!StuInfoUtil.isId(idVal)){
				return -3;
			}
			//修改数据
			stus[index].setId(idVal);
			break;
		}

		return 1;
	}
6.1 编写测试类的修改前端页面

在main包下的Test类中添加以下代码,写一个updateMenu菜单方法

  case 3:
		updateMenu(scan, sms);				
		break;

修改菜单

private static void updateMenu(Scanner scan, StudentManagerSystemImpl sms) {
		System.out.println("请输入要修改学生的班级号:");
		String classId = scan.next();
		System.out.println("请输入要修改学生的学号:");
		String id = scan.next();
		System.out.println("请选择需要修改的类型:");
		System.out.println("1 - 修改姓名");
		System.out.println("2 - 修改性别");
		System.out.println("3 - 修改年龄");
		System.out.println("4 - 修改班级号");
		System.out.println("5 - 修改学号");
		int type = scan.nextInt();
		System.out.println("请输入修改的值:");
		Object val = null;
		switch (type) {
		case 1:case 4:case 5:
			val = scan.next();//这是多态,向上转型: String -> Object 
			break;
		case 2:
			val = scan.next().charAt(0);//char -> Character -> Object
			break;
		case 3:
			val = scan.nextInt();//int -> Integer -> Object
			break;
		default:
			System.out.println("修改失败 -- 修改类型错误");
			return;//结束该方法
		}
		//判断返回值,然后打印错误信息
		int updateCode = sms.update(classId, id, type, val);
		if(updateCode == -1){
			System.out.println("修改失败 -- 学生信息不合法");
		}else if(updateCode == -2){
			System.out.println("修改失败 -- 没有该学生");
		}else if(updateCode == -3){
			System.out.println("修改失败 -- 修改值的信息不合法");
		}else if(updateCode == -4){
			System.out.println("修改失败 -- 目标班级上有学生");
		}else if(updateCode == -5){
			System.out.println("修改失败 -- 目标学生上有学生");
		}else if(updateCode == 1){
			System.out.println("修改成功");
		}
	}

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

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

相关文章

1.26 day3 C++

设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostream>using namespace std; cla…

大文件传输之以太网UDP传输延迟解决方案

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业最宝贵的资产之一。随着企业规模的扩大和业务的全球化&#xff0c;大文件传输的需求日益增长&#xff0c;它不仅关系到企业内部数据的高效管理&#xff0c;也是与外部合作伙伴进行有效沟通的关键。然而&#xff0c;大文件…

aardio - 调用C编写的dll时的不同参数类型处理方法

import console; //生成 DLL import tcc; var c tcc(); c.code /** #include <stdio.h> #include <stdlib.h> #include <stdbool.h>#ifdef __cplusplus #define EXTERN_C extern "C" __declspec(dllexport) #else #define EXTERN_C __declsp…

23111 C++ day3

思维导图 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostream>using namespac…

零基础学编程工具简介,中文编程开发工具

零基础学编程工具简介&#xff0c;中文编程开发工具 一、前言 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家…

Ansys APDL如何查看已经施加的约束和载荷

目录 查看当前已经施加的载荷和约束 查看具体的值 查看已经定义的参数 查看当前已经施加的载荷和约束 在菜单栏选择&#xff1a; 通常在有限元单元的视图下&#xff1a; 选择SOLID MODEL LOADS&#xff08;如下&#xff09;可查看当前已经施加的载荷和约束。 也可以看所有…

Redis核心技术与实战【学习笔记】 - 1.Redis为什么高性能

作为键值数据库&#xff0c;Redis 的应用非常广泛&#xff0c;如果你是后端工程师&#xff0c;我猜你出去面试&#xff0c;八成都会被问到与它相关的性能问题。比如说&#xff0c;为了保证数据的可靠性&#xff0c;Redis 需要在磁盘上读写 AOF 和 RDB&#xff0c;但在高并发场景…

使用Halcon匹配助手进行模板匹配

使用Halcon匹配助手进行模板匹配 文章目录 使用Halcon匹配助手进行模板匹配1. 选择匹配方法2. 创建模板3. 检测模板4. 优化匹配速度 使用Halcon匹配助手&#xff0c;可以很方便地选择模板图像&#xff0c;设置匹配参数&#xff0c;并测试匹配结果.Halcon匹配助手支持下面几种匹…

#常见问题总结#在docker中跑前端vue项目

目录 前言一、no such file or directory, open...总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 记录在docker中跑前端项目过程中&#xff0c;我遇到的问题以及解决方法 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一…

2022年至2023年广东省职业院校技能大赛高职组“信息安全管理与评估”赛项样题

2022 年至 2023 年广东省职业院校技能大赛高职组“信息安全管理与评估”赛项样题 一、 第一阶段竞赛项目试题 本文件为信息安全管理与评估项目竞赛第一阶段试题&#xff0c;第一阶段内容包 括&#xff1a;网络平台搭建、网络安全设备配置与防护。 本阶段比赛时间为 180 分钟…

HBuilderX插件

HBuilderX>工具插件安装 安装新插件 前往插件市场安装 1.DCloud插件市场 https://ext.dcloud.net.cn/ 2.GitHub官网 插件项目(下载zip) 本地离线包 离线安装插件 https://hx.dcloud.net.cn/Tutorial/OfflineInstall open /Applications/HBuilderX.app/Contents/HBuilderX/p…

Nginx安装以及具体应用

文章目录 Centos7安装NginxNginx命令Nginx具体应用反向代理 location指令说明负载均衡动静分离 Nginx.conf配置详解 Centos7安装Nginx 下载地址&#xff1a;nginx: download 中间这个就是tar.gz包 Centos7安装Nginx 下载nginx-1.16.1.tar.gz上传到Centos7中的/user/local目…

论述Python中列表、元组、字典和集合的概念

Python列表是用于存储任意数目、任意类型的数据集合&#xff0c;包含多个元素的有序连续的内存空间&#xff0c;是内置可变序列&#xff0c;或者说可以任意修改。在Python中&#xff0c;列表以方括号&#xff08;[ ]&#xff09;形式编写。 Python元组与Python列表类似&#x…

实验:MySQL 客户端SocketTimeout 抓包分析

实验准备 服务端环境准备 服务器信息 阿里云 99 大洋白嫖机 $ cat /proc/version Linux version 5.15.0-83-generic (builddlcy02-amd64-027) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #92-Ubuntu SMP Mon Aug 14 09:30:42 UT…

JAVA架构图的设计与画法

日常的工作中&#xff0c;假如你身边坐了一个女程序猿&#xff0c;为了让乏味的工作氛围增加点提神的荷尔蒙&#xff0c;文艺又懂点技术的你可能会对她说&#xff1a;小姐姐&#xff0c;我能把世间万物抽象成一个类&#xff0c;但唯独不能抽象你&#xff0c;你在我眼里美的那么…

Cortex-M4处理器 故障处理

故障处理 故障是异常的子集&#xff0c;故障产生的原因有&#xff1a; 总线错误&#xff1a;指令获取或向量表加载&#xff1b;数据访问。内部检测到的错误&#xff0c;如未定义指令试图从标记为永不执行&#xff08;XN&#xff09;的内存区域执行指令。如果您的设备包含MPU&…

学习MySQL仅此一篇就够了(DATAGRIP连接Linux以及索引结构详解)

索引 datagrip远程连接linux 首先在要在Linux端安装MySQL linux端操作&#xff1a; mysql> create user root% identified with mysql_native_password by Wyxbuke00.; Query OK, 0 rows affected (0.01 sec)mysql> grant all on *.* to root%; Query OK, 0 rows aff…

Linux/Uinx 系统编程:进程管理(1)

Linux/Uinx 系统编程&#xff1a;进程管理&#xff08;1&#xff09; 文章目录 Linux/Uinx 系统编程&#xff1a;进程管理&#xff08;1&#xff09;什么是进程进程来源INIT 和 守护进程登录进程sh进程进程的执行模式进程管理的系统调用关于syscall中参数b&#xff0c;c&#x…

蓝桥OJ3694肖恩的投球游戏plus

二维差分 #include<bits/stdc.h> using namespace std;const int N 1e3 5; int a[N][N],d[N][N];int main() {int n, m, q;cin >> n >> m >> q;for (int i 1 ; i < n; i){for (int j 1; j < m; j){cin >> a[i][j];d[i][j] a[i][j] a…

3dmax效果图渲染失败原因有哪些?

在3ds Max可创建复杂场景的模型&#xff0c;效果图渲染是完成建模后的最重要一步。不少设计师与是和艺术家追求的目标都不一样。然而&#xff0c;成功渲染出高质量的图像可能面临多种挑战&#xff0c;从硬件性能限制到软件设置瑕疵&#xff0c;都有可能导致效果图渲染失败。此外…