简易MFC的成绩管理系统

请添加图片描述

意义

掌握MFC控件的基本使用,结合了面向对象和Window消息机制的知识。
选择做简单的成绩管理系统,该项目切合大学生实际情况。易于更好理解。
项目实现了成绩的增加、修改、删除、存储(文件读写操作)的功能。

创建项目

打开软件:VS2022;创建新项目MFC应用;选择基于对话框;有必要的话添加对话框标题(用户界面功能)

设置UI界面

请添加图片描述

1、工具控件:列表(List Control),编辑框(Edit Control),静态文本(Static Text),下拉框(Combo Box),按钮(Button);
2、列表控件属性: 视图为Report
3、下拉列表外观属性 : 类型为下拉列表;行为属性:数据是 男;女;

为UI控件添加变量(很详细,必须理解)

1、选中控件,右键鼠标,添加变量。
在这里插入图片描述

2、添加控制变量,类别、名称、访问权限。(完成所有控件的变量设置,都是重复操作)
在这里插入图片描述
3、类向导
界面全部控件添加变量的类型和名称 (选择对话框 右击选择类向导可查看全部控件变量)
请添加图片描述
可以看到5个按钮对应界面的增 删 改 确定 取消,7个编辑框对应界面相应的属性等。

代码部分

1、创建两个类,一个为Student,存储学生的个人信息;一个为Management,管理学生的个人信息。
2、Student类包含七个成员变量,分别为学号、姓名、性别、年龄、地址、数学成绩、C++成绩。
3、Student类成员函数包括对 七个属性的值的获取与设置。
4、Management类成员变量即Student类列表。
5、Management类有四个成员函数对Student类进行 增 删 改 清

//Student.h
#pragma once
#include <iostream>
using namespace std;
class Student
{
private:
	string id;
	string name;
	string sex;
	string age;
	string address;
	string math;
	string programing;
public:
	Student();
	Student(string sid, string sname, string ssex, string sage, string saddress, string smath, string sprograming);
	void setName(string sname);
	void setId(string sid);
	void setAge(string sage);
	void setSex(string ssex);
	void setAddress(string saddress);
	void setMath(string smath);
	void setPrograming(string sprograming);
	string  getName();
	string  getSex();
	string  getAddress();
	string  getId();
	string  getAge();
	string  getMath();
	string  getPrograming();
	friend ostream& operator <<(ostream& os, Student& st);
	friend istream& operator >>(istream& is, Student& st);
	friend bool LessMath(const Student* st1, const Student* st2);
	friend bool LessOop(const Student* st1, const Student* st2);
	~Student();
};

//Student.cpp
#include "pch.h"
#include "Student.h"
#include <iostream>
#include <string>
using namespace std;

Student::Student() {}
Student::Student(string sid, string sname, string ssex, string sage, string saddress, string smath, string sprograming)
{
	id = sid;
	name = sname;
	sex = ssex;
	age = sage;
	address = saddress;
	math = smath;
	programing = sprograming;

}
void Student::setName(string sname)
{
	name = sname;
}
void Student::setId(string sid)
{
	id = sid;
}
void Student::setAge(string sage)
{
	age = sage;
}
void Student::setSex(string ssex)
{
	sex = ssex;
}
void Student::setAddress(string saddress)
{
	address = saddress;
}
void Student::setMath(string smath)
{
	math = smath;
}
void Student::setPrograming(string sprograming)
{
	programing = sprograming;
}
string Student::getName()
{
	return name;
}
string Student::getSex()
{
	return sex;
}
string Student::getAddress()
{
	return address;
}
string Student::getId()
{
	return id;
}
string  Student::getAge()
{
	return age;
}
string  Student::getMath()
{
	return math;
}
string Student::getPrograming()
{
	return programing;
}
ostream& operator<<(ostream& os, Student& st)
{
	os << st.id << '\t' << st.name << '\t';
	os << st.sex << '\t' << st.age << '\t';
	os << st.address << '\t' << st.math << '\t' << st.programing;
	return os;
}

istream& operator>>(istream& is, Student& st)
{
	is >> st.id >> st.name >> st.sex >> st.age
		>> st.address >> st.math >> st.programing;
	return is;
}

bool LessMath(const Student* st1, const Student* st2)
{
	return st1->math > st2->math;
}
bool LessOop(const Student* st1, const Student* st2)
{
	return st1->programing > st2->programing;
}
Student::~Student(void) {}

//Management.h
#pragma once
#include"Student.h"
#include <list>
#include <fstream>
#include <string>
using namespace std;
class Management
{
private:
	list<Student*>studentArray;
public:
	Management();
	~Management(void);//删除数据
	void Clear();//删除数据
	void Add(Student* pSt);//加入数据
	Student* Delete(string id);//删除指定数据
	void Modify(string sid, string sname, string ssex, string sage, string saddress, string smath, string sprograming);//修改指定数据
	list<Student*>* GetStudent();
	void SortByMath();
	void SortByOop();
	bool Save(const char* fileName);
	bool Open(const char* fileName);
};

//Management management;
//Management* management = new Management();
//Management.cpp
#include "pch.h"
#include "Management.h"
#include "Student.h"
#include <fstream>
#include <iostream>
using namespace std;
Management::Management() {}
Management::~Management(void)//删除数据
{
	for (auto iter = studentArray.begin(); iter != studentArray.end(); iter++)
	{
		delete* iter;
	}
}
void Management::Clear()//删除数据
{
	for (auto iter = studentArray.begin(); iter != studentArray.end(); iter++)
	{
		delete* iter;
	}
}
void  Management::Add(Student* pSt)//加入数据
{
	studentArray.push_back(pSt);
}
Student* Management::Delete(string id)//删除指定数据
{
	Student* pSt = nullptr;
	for (auto iter = studentArray.begin(); iter != studentArray.end(); iter++)
	{
		if ((*iter)->getId() == id)
		{
			pSt = *iter;
			break;
		}
	}
	if (pSt != nullptr) studentArray.remove(pSt);
	return pSt;
}
void  Management::Modify(string sid, string sname, string ssex, string sage, string saddress, string smath, string sprograming)//修改指定数据
{
	Student* pSt = nullptr;
	for (auto iter = studentArray.begin(); iter != studentArray.end(); ++iter)
	{
		if ((*iter)->getId() == sid)
		{
			pSt = *iter;
			break;
		}
	}
	if (pSt != nullptr)
	{
		pSt->setName(sname);
		pSt->setSex(ssex);
		pSt->setAge(sage);
		pSt->setAddress(saddress);
		if (atof(smath.c_str()) >= 0.0) pSt->setMath(smath);
		if (atof(sprograming.c_str()) >= 0.0) pSt->setPrograming(sprograming);
	}
}
list<Student*>* Management::GetStudent()
{
	return &studentArray;
}

void Management::SortByMath()
{
	studentArray.sort(LessMath);
}
void Management::SortByOop()
{
	studentArray.sort(LessOop);
}
bool  Management::Save(const char* fileName)
{
	ofstream file(fileName, ios::out);	//创建文件写入流
	if (!file) return false;	//创建文件失败返回
	file << studentArray.size() << '\n';	//写入学生个数
	写入学生信息 转行隔开
	for (auto iter = studentArray.begin(); iter != studentArray.end(); ++iter)
	{
		file << (**iter) << '\n';
	}
	file.close();
	return true;//返回创建成功
}
bool  Management::Open(const char* fileName)
{
	Clear();	//原列表内容清空
	ifstream file(fileName, ios::in);	//创建文件读入流
	if (!file) return false;	//读入失败返回
	int n = 0;
	file >> n;		//接收文件学生人数
	//为每个学生创建存储空间  并更新原有列表内容
	for (int k = 0; k < n; ++k)
	{
		Student* pSt = new Student();
		file >> *pSt;
		studentArray.push_back(pSt);
	}
	file.close();
	return true;	//返回读入成功
}

对话框的初始化

1、查找对话框初始化代码位置 (选择DIg类 项目会创建AboutDIg App DIg三个类)
请添加图片描述
2、添加代码(具体代码(主要是对列表控件的初始化 包括表头 还有风格))

	//1、为列表控件加入表头
	CString strHeader[] = { _T("学号"),_T("姓名"),_T("性别"),_T("年龄"),_T("地址"),_T("数学"),_T("C++") };
	int nWidth[] = { 80,80,60,60,80,80,80 };
	for (int i = 0; i < 7; i++)
		M_studentList.InsertColumn(i, strHeader[i], LVCFMT_LEFT, nWidth[i]);
	//2、设置列表空间显示风格 整行选中 显示网格
	M_studentList.SetExtendedStyle(M_studentList.GetExtendedStyle()| LVS_EX_FULLROWSELECT| LVS_EX_GRIDLINES);

3、运行结果
请添加图片描述
完成到这里,很不错啦! 有一些成就感,我们往下继续

按钮事件编写(鼠标双击找到编写地方)

//增加按钮
void Cmfc08Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	
	//0、将编辑框内容同步到变量
	UpdateData(TRUE);
	
	//1、往列表最后一行添加数据   count是用来记录学生个数的变量
	int newindex=M_studentList.InsertItem(M_studentList.GetItemCount(),M_id);
	M_studentList.SetItemText(newindex, 1, M_name);
	M_studentList.SetItemText(newindex, 2, M_sex);
	M_studentList.SetItemText(newindex, 3, M_age);
	M_studentList.SetItemText(newindex, 4, M_address);
	M_studentList.SetItemText(newindex, 5, M_math);
	M_studentList.SetItemText(newindex, 6, M_programing);

	//2、将编辑框的内容从CString转string
	string ID = CW2A(M_id.GetString());
	string NAME = CW2A(M_name.GetString());
	string SEX = CW2A(M_sex.GetString());
	string AGE = CW2A(M_age.GetString());
	string ADDRESS = CW2A(M_address.GetString());
	string MATH = CW2A(M_math.GetString());
	string PROGRAMING = CW2A(M_programing.GetString());

	//3、往类添加数据
	Student* pSt=new Student;
	pSt->setId(ID);
	pSt->setName(NAME);
	pSt->setSex(SEX);
	pSt->setAge(AGE);
	pSt->setAddress(ADDRESS);
	pSt->setMath(MATH);
	pSt->setPrograming(PROGRAMING);
	management.Add(pSt);

	//4、返回成功页面
	MessageBox(TEXT("添加成功!"));

}

//修改按钮
void Cmfc08Dlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码

	//0、将编辑框内容同步到变量
	UpdateData(TRUE);
	
	//1、获取列表选定索引
	int nIndex = M_studentList.GetSelectionMark();

	//2、更改列表内容
	M_studentList.SetItemText(nIndex, 0, M_id);
	M_studentList.SetItemText(nIndex, 1, M_name);
	M_studentList.SetItemText(nIndex, 2, M_sex);
	M_studentList.SetItemText(nIndex, 3, M_age);
	M_studentList.SetItemText(nIndex, 4, M_address);
	M_studentList.SetItemText(nIndex, 5, M_math);
	M_studentList.SetItemText(nIndex, 6, M_programing);

	//3、更改类内容
	string ID = CW2A(M_id.GetString());
	string NAME = CW2A(M_name.GetString());
	string SEX = CW2A(M_sex.GetString());
	string AGE = CW2A(M_age.GetString());
	string ADDRESS = CW2A(M_address.GetString());
	string MATH = CW2A(M_math.GetString());
	string PROGRAMING = CW2A(M_programing.GetString());
	management.Modify(ID, NAME, SEX, AGE, ADDRESS, MATH, PROGRAMING);

	//4、返回成功页面
	MessageBox(TEXT("修改成功!"));

}

//删除按钮
void Cmfc08Dlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码

	//1、获取列表选定索引
	int nIndex = M_studentList.GetSelectionMark();
	
	//2、从列表中删除
	M_studentList.DeleteItem(nIndex);
	
	//3、从类中删除
	string ID = CW2A(M_id.GetString());
	management.Delete(ID);

	//4、返回成功页面
	MessageBox(TEXT("删除成功!"));

}

//确定按钮
void Cmfc08Dlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	CDialog::OnOK();
}

//取消按钮
void Cmfc08Dlg::OnBnClickedButton5()
{
	// TODO: 在此添加控件通知处理程序代码
	CDialog::OnCancel();
}

查找列表选中触发事件 (属性 -> 事件 -> NM_CLICK -> ADD)

//单击列表内容
void Cmfc08Dlg::OnNMClickList2(NMHDR* pNMHDR, LRESULT* pResult)
{
	LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;

	//1、获取列表选定索引
	int nIndex = M_studentList.GetSelectionMark();
	//2、获取索引指定内容
	CString ID = M_studentList.GetItemText(nIndex, 0);
	CString NAME = M_studentList.GetItemText(nIndex, 1);
	CString SEX = M_studentList.GetItemText(nIndex, 2);
	CString AGE = M_studentList.GetItemText(nIndex, 3);
	CString ADDRESS = M_studentList.GetItemText(nIndex, 4);
	CString MATH = M_studentList.GetItemText(nIndex, 5);
	CString PROGRAMING = M_studentList.GetItemText(nIndex, 6);
	//3、将内容赋值给变量
	M_id = ID;
	M_name = NAME;
	M_sex = SEX;
	M_age = AGE;
	M_address = ADDRESS;
	M_math = MATH;
	M_programing = PROGRAMING;
	//4、将变量内容显示到编辑框
	UpdateData(FALSE);
}

调试一下,查看运行结果!!!
请添加图片描述

数据的存储

1、数据的保存——Management类的成员函数

bool  Management::Save(const char* fileName){
	//创建文件写入流
	ofstream file(fileName, ios::out);
	//创建文件失败返回
	if (!file) return false;
	//写入学生个数
	file << studentArray.size() << '\n';
	//写入学生信息 转行隔开
	for (auto iter = studentArray.begin(); iter != studentArray.end(); ++iter)
		file << (**iter) << '\n';
	//文件关闭
	file.close();
	//返回创建成功
	return true;
}

2、数据的重新加载——Management类的成员函数

bool  Management::Open(const char* fileName){
	//原列表内容清空
	Clear();
	//创建文件读入流
	ifstream file(fileName, ios::in);
	//读入失败返回
	if (!file) return false;
	//接收文件学生人数
	int n = 0;file >> n;
	//为每个学生创建存储空间  并更新原有列表内容
	for (int k = 0; k < n; ++k){
		Student* pSt = new Student();
		file >> *pSt;
		studentArray.push_back(pSt);
	}
	//文件关闭
	file.close();
	//返回读入成功
	return true;
}

3、打开原有文件按钮

//打开原有文件按钮
void Cmfc08Dlg::OnBnClickedButton6()
{
	// TODO: 在此添加控件通知处理程序代码
	
	//1、打开文件  对学生列表进行更新
	management.Open("studentmark.txt");

	//2、将原来的列表内容进行清空
	M_studentList.DeleteAllItems();

	//3、获取类中的学生信息
	list<Student*> arr = *(management.GetStudent());

	//4、将学生列表内容展现在列表上
	int count = 0;
	CString student[7];
	for (auto iter = arr.begin(); iter != arr.end(); iter++) {
		//string->CString
		student[0] = (*iter)->getId().c_str();
		student[1] = (*iter)->getName().c_str();
		student[2] = (*iter)->getSex().c_str();
		student[3] = (*iter)->getAge().c_str();
		student[4] = (*iter)->getAddress().c_str();
		student[5] = (*iter)->getMath().c_str();
		student[6] = (*iter)->getPrograming().c_str();
		for(int i=0;i<7;i++)
			if(i==0)
				M_studentList.InsertItem(count,student[0]);
			else
				M_studentList.SetItemText(count, i, student[i]);
		count++;
	}
	//5、返回成功页面
	MessageBox(TEXT("加载成功!"));
}

4、保存按钮——在确定按钮上作修改

//确定按钮  也称保存按钮
void Cmfc08Dlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码

	//1、保存信息
	management.Save("studentmark.txt");
	//2、返回成功页面
	MessageBox(TEXT("保存成功!"));
	//3、关闭窗口
	CDialog::OnOK();
}

5、运行结果
5.1 项目下有被创建的txt文件
请添加图片描述

5.2 打开原有文件,保存的学生信息会被加载

请添加图片描述

注意事项

理解三个东西:解决方案资源管理器、类视图和资源视图。
解决方案资源管理器(Solution Explorer):解决方案资源管理器是用于组织和管理项目文件和资源的窗口。它**显示了整个项目的目录结构,包括源代码文件、头文件、资源文件等。**您可以在解决方案资源管理器中添加、删除、重命名文件,创建文件夹,对文件进行管理,并且可以通过拖放等方式进行文件的操作。

类视图(Class View):类视图提供了一个查看和导航项目中所有类的层次结构的窗口。它以树状结构展示了项目中的类和类成员,并且可以展开和折叠各个类的成员列表。通过类视图,您**可以快速浏览项目中的类的层次关系,查看类的基类、派生类、成员函数和成员变量等信息。**同时,您还可以在类视图中直接定位到具体的类或成员,方便地进行导航和查找。

资源视图(Resource View):资源视图用于管理MFC应用程序中的资源,如对话框、菜单、图标等。它允许您按照资源的类型来组织和管理项目的资源文件。通过资源视图,您可以添加、删除、修改和查看应用程序的各种资源,还可以在对话框编辑器中对对话框进行可视化设计和布局。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅谈企业能源监测管理系统的设计与应用

安科瑞 华楠 摘要: 针对企业目前能源监测现状, 结合企业信息化建设情况和发展需要, 介绍了能源监测管理信息系统, 提出了企业能源监测管理系统建设建议。 关键词:管理系统; 能源监测; 企业信息化 0 引言 节能降耗是缓解中国资源约束的根本出路, 也是提高企业自主创新能力的…

Vault从入门到精通系列之二:启动Vault服务器

Vault从入门到精通系列之二&#xff1a;启动Vault服务器 一、启动开发服务器二、设置环境变量三、验证服务器正在运行四、vault命令汇总 Vault 作为客户端-服务器应用程序运行。Vault 服务器是唯一与数据存储和后端交互的 Vault 架构。通过 Vault CLI 完成的所有操作都通过 TLS…

【并发知识点】CAS的实现原理及应用

系列文章目录 AQS的实现原理及应用 CAS的实现原理及应用 文章目录 系列文章目录前言1、CAS的概念2、CAS的实现原理3、单JVM内锁CAS实现3.1、效果 4、模拟赛龙舟比赛 前言 本章节介绍CAS概念、实现原理&#xff0c;并通过java代码应用&#xff0c;最终模拟赛龙舟比赛。 1、CA…

【spring cloud学习】2、Eureka服务注册与发现

前言 一套微服务架构的系统由很多单一职责的服务单元组成&#xff0c;而每个服务单元又有众多运行实例。由于各服务单元颗粒度较小、数量众多&#xff0c;相互之间呈现网状依赖关系&#xff0c;因此需要服务注册中心来统一管理微服务实例&#xff0c;维护各服务实例的健康状态…

【HTML】常用标签

文章目录 1.标题字标签h1-h62.段落标签p3.换行标签br4.格式化标签5.图片标签6.超链接标签a7.表格标签单元格合并行合并列合并 8.无序列表9.有序列表10.自定义列表11.表单标签11.1 form标签11.2 表单控件11.2.1 input标签11.2.2 label标签11.2.3 select标签11.2.4 textarea标签 …

外网SSH远程连接linux服务器「cpolar内网穿透」

文章目录 视频教程1. Linux CentOS安装cpolar2. 创建TCP隧道3. 随机地址公网远程连接4. 固定TCP地址5. 使用固定公网TCP地址SSH远程 转载自内网穿透工具的文章&#xff1a;无公网IP&#xff0c;SSH远程连接Linux CentOS服务器【内网穿透】 本次教程我们来实现如何在外公网环境下…

两阶段目标检测指南:R-CNN、FPN、Mask R-CNN

动动发财的小手&#xff0c;点个赞吧&#xff01; Source[1] 多阶段&#xff08;Two-stage&#xff09;物体检测 计算机视觉中最基本和最广泛研究的挑战之一是目标检测。该任务旨在在给定图像中绘制多个对象边界框&#xff0c;这在包括自动驾驶在内的许多领域非常重要。通常&am…

2022年长三角高校数学建模竞赛B题齿轮箱故障诊断解题全过程文档及程序

2022年长三角高校数学建模竞赛 B题 齿轮箱故障诊断 原题再现&#xff1a; 齿轮箱是用于增加输出扭矩或改变电机速度的机械装置&#xff0c;被广泛应用于如汽车、输送机、风机等机械设备中。它由两个或多个齿轮组成&#xff0c;其中一个齿轮由电机驱动。电机的轴连接到齿轮箱的…

SpringMvc入门

SpringMvc用来代替展示层Servlet&#xff0c;均属于Web层开发技术 Servlet是如何工作的 1、导入Servlet依赖坐标 2、创建一个Servlet接口实现类&#xff0c;重写其中的所有方法 3、在Servlet实现类上加上WebServlet注解&#xff0c;用来配置Servlet访问路径 4、启动Tomca…

总结906

学习目标&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲&#xff0c;背诵15篇短文&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化3讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日规划 今日已做&#xff1a; 1.回环背诵…

详解Hystrix

目录 1.微服务中的容错 1.1.服务雪崩 1.2.解决办法 2.hystrix 2.1.概述 2.2.项目结构及依赖 2.3.代码示例 2.3.1.注册中心 2.3.2.服务调用者 2.3.3.服务提供者 2.4.服务降级 2.4.1.单点响应 2.4.2.默认响应 2.4.3.前置响应 2.5.服务熔断 2.5.1.概述 2.5.2.使用…

centos 安装 nginx

1.下载nginx安装包 wget -c https://nginx.org/download/nginx-1.24.0.tar.gz 下载到了当前目录下 2.解压安装包 解压后的结果 3.安装依赖 yum -y install gcc gcc-c make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 4. ./configure --prefix/usr/lo…

【Linux】深入理解文件系统

系列文章 收录于【Linux】文件系统 专栏 关于文件描述符与文件重定向的相关内容可以移步 文件描述符与重定向操作。 可以到 浅谈文件原理与操作 了解文件操作的系统接口。 想深入理解文件缓冲区还可以看看文件缓冲区。 目录 系列文章 磁盘 结构介绍 定位数据 抽象管理…

高速电路设计系列分享-电源噪声分析

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 当今许多应用都要求高速采样模数转换器&#xff08;ADC)具有12位或以上的分辨率&#xff0c;以便用户能够进行更精确的系统测量。然而&#xff0c;更高分辨率…

【机器学习】机器故障的二元分类模型-Kaggle竞赛

竞赛介绍 数据集描述 本次竞赛的数据集&#xff08;训练和测试&#xff09;是从根据机器故障预测训练的深度学习模型生成的。特征分布与原始分布接近&#xff0c;但不完全相同。随意使用原始数据集作为本次竞赛的一部分&#xff0c;既可以探索差异&#xff0c;也可以了解在训…

使用CloudOS快速实现K8S容器化部署

关于容器技术 容器技术&#xff08;以docker和Kubernetes为代表&#xff09;呱呱坠地到如今&#xff0c;在国内经历了如下3个阶段&#xff1a; 婴儿期&#xff1a;2014-2016年的技术探索期&#xff1b; 少儿期&#xff1a;2017-2018年的行业试水期&#xff1b; 少年期&…

【Django | 爬虫 】收集某吧评论集成舆情监控(附源码)

&#x1f935;‍♂️ 个人主页: 计算机魔术师 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 文章目录 一、爬取帖子、二级评论二、构建数据表三、并入项目1. spider代码2. view视图代码3. 优化后台界面3. urls路由 四、定…

自然语言处理: 第三章NPLM(Neural Probabilistic Language Mode)

理论基础 NPLM的全称是"Neural Probabilistic Language Model"&#xff0c;即神经概率语言模型。这是一种基于神经网络的语言模型&#xff0c;用于生成自然语言文本。最早是由Bengio 在2003年的A Neural Probabilistic Language Model一文中提出来的&#xff0c; NP…

【永久服务器】EUserv

1. 请先自行准备网络&#xff08;我用的伦敦还可以&#xff09;、以及visa卡&#xff0c;淘宝可以代付&#xff0c;我总共花了97人民币&#xff08;10.94欧代付费&#xff09; 现在只能申请一台&#xff0c;多了会被删除&#xff0c;也就是两欧元&#xff0c;然后选择visa卡 选…

MySQL(六):基本的SELECT语句

基本的SELECT语句 前言一、SELECT...二、SELECT ... FROM三、列的别名四、去除重复行五、空值参与运算六、着重号七、查询常数八、显示表结构九、过滤数据 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注博主&#…