学生信息管理系统简易版(文件读写操作)
功能模块

具体功能如下:
- 添加学生信息
- 修改学生信息(按学号)
- 排序(分别按总分升序、降序、以及按姓名升序)
- 查找学生(按学号)
- 删除学生
- 查看所有学生信息
数据结构体设计
本表设计一个学生信息的结构体就行:
//学生信息结构体
typedef struct student
{char ID[10];//学号char name[20]; //姓名char sex; //性别float score[5]; //成绩float total; //总成绩float avg; //平均成绩
}STU;
这样就定义了学生信息的结构体STU,STU student[N]定义多个学生
总体设计流程图
在主函数中首先调用load函数,把文件中的学生信息全部读取到结构数组中,然后调用display函数显示主菜单,接着输入选择项,然后根据选择项调用不同的函数执行相应功能。

这样就得到了系统的整体流程
主要功能模块
下面是功能模块函数的声明:
//函数声明
void display(void);//显示菜单
void load(STU stu[],int *nPtr);//输入学生信息
void save(STU stu[],int n);//保存学生信息
void sort(STU stu[],int n);//排序
void InputRecord(STU stu[],int i);//输入一条记录
void find(STU stu[],int n);//查找
void del(STU stu[],int *nPtr);//删除
void add(STU stu[],int *nPtr);//增加
void edit(STU stu[],int n);//修改
void DeleteAll(STU stu[],int *nPtr);//删除所有记录
void DeleteRecord(STU stu[],int *nPtr);//删除一条记录
int FindByNum(STU stu[],int n,char *str);//按学号查找
void output(STU stu[],int n);//输出学生信息
void PrintRecord(STU *sPtr);//输出一条记录
主函数代码编写
定义结构体数组,然后使用Switch来设置进入界面菜单
int main()
{STU stu[100];//学生信息结构体数组int n;int select;load(stu,&n);//读取文件信息while (1){display();//显示菜单scanf("%d",&select);switch (select){case 1:add(stu,&n);//增加break;case 2:edit(stu,n);//修改break;case 3:sort(stu,n);//排序break;case 4:find(stu,n);//查找break;case 5:del(stu,&n);//删除break;case 6:output(stu,n);//输出学生信息break;case 7:return 0;default:printf("输入错误,请重新输入!\n");break;}}return 0;
}
显示主菜单display
void display(void)
{system("cls");//清屏printf("欢迎使用学生信息管理系统!\n");printf("说明:在本系统输入功能对应数字即可!\n");printf("1.增加学生信息\n");printf("2.修改学生信息\n");printf("3.排序\n");printf("4.查找\n");printf("5.删除\n");printf("6.输出学生信息\n");printf("7.退出\n");
}
学生信息加载到数组stu的函数load
运用文件读写fread将文件中的学生信息读取到stu数组中去,记录下当前学生数量
//输入学生信息
void load(STU stu[],int *nPtr)
{FILE *fp;int i;if((fp=fopen("stu.dat","r"))==NULL){*nPtr=0;printf("文件打开失败!\n");return;}//把文件中的信息读取到结构体数组中for ( i = 0;fread(&stu[i],sizeof(STU),1,fp)!=0 ; i++);*nPtr=i;//记录文件中当前学生数量fclose(fp);
}
保存数据save
//保存数据
void save(STU stu[],int n)
{ FILE *fp;if((fp=fopen("stu.dat","w"))==NULL){printf("文件打开失败!\n");return;}//把n个记录写入文件fwrite(stu,n*sizeof(stu[0]),1,fp);fclose(fp);
}
输入记录InputRecord
//输入一条记录InputRecord
void InputRecord(STU stu[],int i)//输入一条记录
{ int j;//输入学号,并验证其合法性printf("请输入第%d个学生的学生信息:",i+1);printf("请输入学号(学号小于9位数字组成)\n");scanf("%s",&stu[i].ID);//输入姓名printf("请输入姓名(姓名小于20位字符组成)\n");scanf("%s",&stu[i].name);//输入性别 printf("请输入性别(男性用m或女性用f)\n");scanf(" %c",&stu[i].sex);//输入成绩总和printf("请输入5门课的成绩(成绩为0-100之间的整数)\n");stu[i].total=0;for ( j = 0; j < 5; j++){scanf("%f",&stu[i].score[j]);stu[i].total+=stu[i].score[j];}//计算平均成绩stu[i].avg=stu[i].total/5;
}
添加记录add
/*调用InputRecord函数添加若干学生信息,并把新添加的学生信息依次保存到文件中 */
//添加记录add
void add(STU stu[],int *nPtr)
{int i=0;char sel='y';while (sel=='y'){InputRecord(stu,(*nPtr)++);//添加第n+1个学生信息(*nPtr)++;printf("是否继续添加(y/n)?\n");scanf(" %c",&sel);}save(stu,*nPtr);//保存学生信息
}
输出指针sPtr所指记录的内容PrintRecord
//输出指针sPtr所指记录的内容PrintRecord
void PrintRecord(STU *sPtr)
{int i;printf("%8s%8s%4c",sPtr->ID,sPtr->name,sPtr->sex);for ( i = 0; i < 5; i++){printf("%8.2f",sPtr->score[i]);}printf("%8.2f%8.2f",sPtr->total,sPtr->avg);
printf("\n");
}
输出学生信息output()
首先输出表头,然后在循环中调用PrintRecord来显示每一个记录的内容
//输出学生信息output
void output(STU stu[],int n)
{int i;printf("学号\t姓名\t性别\t课程1\t课程2\t课程3\t课程4\t课程5\t总成绩\t平均成绩\n");for ( i = 0; i < n; i++){PrintRecord(&stu[i]);}system("pause");
}
按学号查找学生信息FindByNum
按学号查询信息,返回学生下标
//按学号查找学生信息FindByNum
int FindByNum(STU stu[],int n,char *str)
{for ( int i = 0; i < n; i++)if(strcmp(stu[i].ID,str)==0)return i;return -1;
}
修改学生信息函数edit()
该函数首先按用户输入的学号,调用函数FindByName找到要修改的记录,然后调用PrintRecord显示该记录的内容,再逐项询问是否需要修改,最后调用save更新文件。
//edit修改学生信息
void edit(STU stu[],int n)
{int i,index;char sel;char str[20];printf("请输入学号:\n");scanf("%s",str);index=FindByNum(stu,n,str);//查找学号为str的学生信息if(index<0){printf("没有找到学号为%s的学生信息!\n",str);return;}else{printf("找到学号为%s的学生信息!\n",str);PrintRecord(&stu[index]);}//修改姓名printf("是否修改姓名(y/n)?\n");scanf(" %c",&sel);if(sel=='y'){printf("请输入新的姓名:\n");scanf("%s",stu[index].name);}//修改性别printf("是否修改性别(y/n)?\n");scanf(" %c",&sel);if(sel=='y'){printf("请输入f or m:\n");scanf("%s",stu[index].sex);}//修改成绩printf("是否修改成绩(y/n)?\n");scanf(" %c",&sel);if(sel=='y'){stu[index].total=0;for ( i = 0; i < 5; i++){printf("请输入第%d门课的成绩:\n",i+1);scanf("%f",&stu[index].score[i]);stu[index].total+=stu[index].score[i];}stu[index].avg=stu[index].total/5;}save(stu,n);//保存修改后的学生信息}
排序sort的功能流程图

排序代码编写
//排序sort
//菜单编写
void sort(STU stu[],int n)
{int select,i,j;int (*cmp)(STU a,STU b);//函数指针 int ScoreAsc(STU a,STU b);//成绩升序int ScoreDesc(STU a,STU b);//成绩降序int NameAsc(STU a,STU b);//姓名升序printf("请选择排序方式(1.成绩升序 2.成绩降序 3.姓名升序):\n");scanf("%d",&select);switch (select){case 1:cmp=ScoreAsc;break;case 2:cmp=ScoreDesc;break;case 3:cmp=NameAsc;break;default:return;
}//比较函数编写
//按照指定规则,进行比较交换排序
for ( i = 0; i < n-1; i++)for ( j = i+1;j<n;j++)if((*cmp)(stu[i],stu[j])>0)//若逆序,cmp返回正数{STU temp=stu[i];stu[i]=stu[j];stu[j]=temp;}output(stu,n);//输出排序后的学生信息
}//成绩升序
int ScoreAsc(STU a,STU b)
{return a.total>b.total?1:-1;//如果a>b,返回1,否则返回-1
}//成绩降序
int ScoreDesc(STU a,STU b)
{return a.total<b.total?1:-1;//如果a<b,返回1,否则返回-1
}//姓名升序
int NameAsc(STU a,STU b)
{return strcmp(a.name,b.name);//按照姓名升序排列/*若 a 和 b 相等,则返回值为 0;
若 a 按字典序小于 b,则返回值为负整数;
若 a 按字典序大于 b,则返回值为正整数。*/}
查询信息find
//查询find
//在数组stu的前n个元素中,查找学号为str的学生信息
void find(STU stu[],int n)
{int index;char str[20];printf("请输入学号:\n");scanf("%s",str);index=FindByNum(stu,n,str);//查找学号为str的学生信息if(index<0){printf("没有找到学号为%s的学生信息!\n",str);return;}else{printf("找到学号为%s的学生信息!\n",str);PrintRecord(&stu[index]);}system("pause");
}
删除del
调用FindByName得到对应下标,然后删除记录,save更新文件
//删除指定记录del
void del(STU stu[],int *nPtr)
{int i,index;char str[20];printf("请输入学号:\n");scanf("%s",str);index=FindByNum(stu,*nPtr,str);//查找学号为str的学生信息if(index<0){printf("没有找到学号为%s的学生信息!\n",str);return;}for ( i = index; i < *nPtr-1; i++){stu[i]=stu[i+1];}(*nPtr)--;printf("删除成功\n");save(stu,*nPtr);//保存修改后的学生信息system("pause");
}
删除全部
//删除全部delALL
void DeleteAll(STU stu[],int *nPtr)
{char str[20];*nPtr=0;save(stu,*nPtr);//保存修改后的学生信息system("pause");
}
整体代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>//学生信息结构体
typedef struct student
{char ID[10];//学号char name[20]; //姓名char sex; //性别float score[5]; //成绩float total; //总成绩float avg; //平均成绩
}STU;//函数声明
void display(void);//显示菜单
void load(STU stu[],int *nPtr);//输入学生信息
void save(STU stu[],int n);//保存学生信息
void sort(STU stu[],int n);//排序
void InputRecord(STU stu[],int i);//输入一条记录
void find(STU stu[],int n);//查找
void del(STU stu[],int *nPtr);//删除
void add(STU stu[],int *nPtr);//增加
void edit(STU stu[],int n);//修改
void DeleteAll(STU stu[],int *nPtr);//删除所有记录
void DeleteRecord(STU stu[],int *nPtr);//删除一条记录
int FindByNum(STU stu[],int n,char *str);//按学号查找
void output(STU stu[],int n);//输出学生信息
void PrintRecord(STU *sPtr);//输出一条记录int main()
{STU stu[100];//学生信息结构体数组int n;int select;load(stu,&n);//读取文件信息while (1){display();//显示菜单scanf("%d",&select);switch (select){case 1:add(stu,&n);//增加break;case 2:edit(stu,n);//修改break;case 3:sort(stu,n);//排序break;case 4:find(stu,n);//查找break;case 5:del(stu,&n);//删除break;case 6:output(stu,n);//输出学生信息break;case 7:return 0;default:printf("输入错误,请重新输入!\n");break;}}return 0;
}//显示菜单
void display(void)
{system("cls");//清屏printf("欢迎使用学生信息管理系统!\n");printf("说明:在本系统输入功能对应数字即可!\n");printf("1.增加学生信息\n");printf("2.修改学生信息\n");printf("3.排序\n");printf("4.查找\n");printf("5.删除\n");printf("6.输出学生信息\n");printf("7.退出\n");
}//输入学生信息
void load(STU stu[],int *nPtr)
{FILE *fp;int i;if((fp=fopen("stu.dat","rb"))==NULL){*nPtr=0;printf("文件打开失败!\n");return;}//把文件中的信息读取到结构体数组中for ( i = 0;fread(&stu[i],sizeof(STU),1,fp)!=0 ; i++);*nPtr=i;//记录文件中当前学生数量fclose(fp);
}//保存数据
void save(STU stu[],int n)
{ FILE *fp;if((fp=fopen("stu.dat","wb"))==NULL){printf("文件打开失败!\n");return;}//把n个记录写入文件fwrite(stu,n*sizeof(stu[0]),1,fp);fclose(fp);
}//输入一条记录InputRecord
void InputRecord(STU stu[],int i)//输入一条记录
{ int j;//输入学号,并验证其合法性printf("请输入第%d个学生的学生信息:",i+1);printf("请输入学号(学号小于9位数字组成)\n");scanf("%s",&stu[i].ID);//输入姓名printf("请输入姓名(姓名小于20位字符组成)\n");scanf("%s",&stu[i].name);//输入性别 printf("请输入性别(男性用m或女性用f)\n");scanf(" %c",&stu[i].sex);//输入成绩总和printf("请输入5门课的成绩(成绩为0-100之间的整数)\n");stu[i].total=0;for ( j = 0; j < 5; j++){scanf("%f",&stu[i].score[j]);stu[i].total+=stu[i].score[j];}//计算平均成绩stu[i].avg=stu[i].total/5;
}//添加记录add
void add(STU stu[],int *nPtr)
{int i=0;char sel='y';while (sel=='y'){InputRecord(stu,(*nPtr)++);//添加第n+1个学生信息(*nPtr)++;printf("是否继续添加(y/n)?\n");scanf(" %c",&sel);}save(stu,*nPtr);//保存学生信息
}//输出指针sPtr所指记录的内容PrintRecord
void PrintRecord(STU *sPtr)
{int i;printf("%8s%8s%4c",sPtr->ID,sPtr->name,sPtr->sex);for ( i = 0; i < 5; i++){printf("%8.2f",sPtr->score[i]);}printf("%8.2f%8.2f",sPtr->total,sPtr->avg);
printf("\n");
}//输出学生信息output
void output(STU stu[],int n)
{int i;printf("学号\t姓名\t性别\t课程1\t课程2\t课程3\t课程4\t课程5\t总成绩\t平均成绩\n");for ( i = 0; i < n; i++){PrintRecord(&stu[i]);}system("pause");
}//按学号查找学生信息FindByNum
int FindByNum(STU stu[],int n,char *str)
{for ( int i = 0; i < n; i++)if(strcmp(stu[i].ID,str)==0)return i;return -1;}//edit修改学生信息
void edit(STU stu[],int n)
{int i,index;char sel;char str[20];printf("请输入学号:\n");scanf("%s",str);index=FindByNum(stu,n,str);//查找学号为str的学生信息if(index<0){printf("没有找到学号为%s的学生信息!\n",str);return;}else{printf("找到学号为%s的学生信息!\n",str);PrintRecord(&stu[index]);}//修改姓名printf("是否修改姓名(y/n)?\n");scanf(" %c",&sel);if(sel=='y'){printf("请输入新的姓名:\n");scanf("%s",stu[index].name);}//修改性别printf("是否修改性别(y/n)?\n");scanf(" %c",&sel);if(sel=='y'){printf("请输入f or m:\n");scanf("%s",stu[index].sex);}//修改成绩printf("是否修改成绩(y/n)?\n");scanf(" %c",&sel);if(sel=='y'){stu[index].total=0;for ( i = 0; i < 5; i++){printf("请输入第%d门课的成绩:\n",i+1);scanf("%f",&stu[index].score[i]);stu[index].total+=stu[index].score[i];}stu[index].avg=stu[index].total/5;}save(stu,n);//保存修改后的学生信息}//排序sort
void sort(STU stu[],int n)
{int select,i,j;int (*cmp)(STU a,STU b);//函数指针 int ScoreAsc(STU a,STU b);//成绩升序int ScoreDesc(STU a,STU b);//成绩降序int NameAsc(STU a,STU b);//姓名升序printf("请选择排序方式(1.成绩升序 2.成绩降序 3.姓名升序):\n");scanf("%d",&select);switch (select){case 1:cmp=ScoreAsc;break;case 2:cmp=ScoreDesc;break;case 3:cmp=NameAsc;break;default:return;
}//按照指定规则,进行比较交换排序
for ( i = 0; i < n-1; i++)for ( j = i+1;j<n;j++)if((*cmp)(stu[i],stu[j])>0)//若逆序,cmp返回正数{STU temp=stu[i];stu[i]=stu[j];stu[j]=temp;}output(stu,n);//输出排序后的学生信息
}//成绩升序
int ScoreAsc(STU a,STU b)
{return a.total>b.total?1:-1;//如果a>b,返回1,否则返回-1
}//成绩降序
int ScoreDesc(STU a,STU b)
{return a.total<b.total?1:-1;//如果a<b,返回1,否则返回-1
}//姓名升序
int NameAsc(STU a,STU b)
{return strcmp(a.name,b.name);//按照姓名升序排列/*若 a 和 b 相等,则返回值为 0;
若 a 按字典序小于 b,则返回值为负整数;
若 a 按字典序大于 b,则返回值为正整数。*/}//查询find
//在数组stu的前n个元素中,查找学号为str的学生信息
void find(STU stu[],int n)
{int index;char str[20];printf("请输入学号:\n");scanf("%s",str);index=FindByNum(stu,n,str);//查找学号为str的学生信息if(index<0){printf("没有找到学号为%s的学生信息!\n",str);return;}else{printf("找到学号为%s的学生信息!\n",str);PrintRecord(&stu[index]);}system("pause");
}//删除指定记录del
void del(STU stu[],int *nPtr)
{int i,index;char str[20];printf("请输入学号:\n");scanf("%s",str);index=FindByNum(stu,*nPtr,str);//查找学号为str的学生信息if(index<0){printf("没有找到学号为%s的学生信息!\n",str);return;}for ( i = index; i < *nPtr-1; i++){stu[i]=stu[i+1];}(*nPtr)--;printf("删除成功\n");save(stu,*nPtr);//保存修改后的学生信息system("pause");
}//删除全部delALL
void DeleteAll(STU stu[],int *nPtr)
{char str[20];*nPtr=0;save(stu,*nPtr);//保存修改后的学生信息system("pause");
}
运行截图:

代码还是有点小问题,
后续希望完善。
相关文章:
学生信息管理系统简易版(文件读写操作)
功能模块 具体功能如下: 添加学生信息修改学生信息(按学号)排序(分别按总分升序、降序、以及按姓名升序)查找学生(按学号)删除学生查看所有学生信息 数据结构体设计 本表设计一个学生信息的结…...
C/C++每日一练(20230426)
目录 1. 不喜欢带钱的小C 🌟🌟 2. 数组排序 ※ 3. 超级素数 ※ 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 不喜欢带钱的小C 小C不喜欢带钱,…...
halcon灰度积分投影/垂直积分投影
简介:关于灰度投影积分可以用到的场合很多,例如分割字符,分割尺子上的刻度等,适用于有规律的变化这些内容的检测。本文复现了论文《基于深度学习和灰度纹理特征的铁路接触网绝缘子状态检测》中灰度积分投影实现了对绝缘子缺陷位置的检测。见(图1)灰度积分垂直方向投影获得…...
Unity打包的apk在安卓4.4.2盒子上碰到的问题
项目场景: Unity开发的项目需要在安卓4.4.2盒子上运行。 问题描述 1、会出"从顶部向下滑动即可退出全屏模式。"的弹框,这是android4.4的一个特性,叫做沉浸模式(Full-screen Immersive Mode),当app启用该模…...
docker的简单使用(centos7中为例)
安装: yum -y install docker 启动: service start docker 搜索镜像: docker search centos:7.9 下载镜像: docker pull docker.io/18703283952/mycentos 查看所有镜像: docker images 启动并进入镜像:…...
Stable Diffusion人工智能图像合成
AI 图像生成大有来头。新发布的开源图像合成模型称为Stable Diffusion,它允许任何拥有 PC 和像样的 GPU 的人想象出他们能想象到的几乎任何视觉现实。它几乎可以模仿任何视觉风格,如果你给它输入一个描述性的短语,结果就会像魔术一样出现在你…...
【Java EE】-CSS详解
作者:学Java的冬瓜 博客主页:☀冬瓜的主页🌙 专栏:【JavaEE】 分享: 且视他人如盏盏鬼火,大胆地去走你的道路。——史铁生《病隙碎笔》 主要内容:CSS引入html的三种方式,CSS八大选择器ÿ…...
C#_语言简介
目录 1. C# 简介 2. Visual Studio 窗口界面显示 1. C# 简介 什么是程序? 程序(Program)简单来说就是: 计算机是无法听懂我们人类的语言的,也可以说我们通过我们日常交流的语言是无法控制计算机的,计算机…...
【Python_Opencv图像处理框架】直方图与傅里叶变换
写在前面 本篇文章是opencv学习的第五篇文章,主要讲解了直方图与傅里叶变换的有关操作,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正🥰 写在中间 一、直方图 ( 1 &…...
Know-Evolve: Deep Temporal Reasoning for Dynamic Knowledge Graphs
Know-Evolve: Deep Temporal Reasoning for Dynamic Knowledge Graphs Rakshit Trivedi 1 Hanjun Dai 1 Yichen Wang 1 Le Song 1 知识背景 Temporal Knowledge Graph : facts occur,recur or evolve over time in these graphs,and each edge in the graphs have temporal …...
电脑高效率工作、学习工具软件推荐
本文介绍在学习、工作时,实测很好用、明显提高工作效率的几个免费电脑软件与小工具。 1 Microsoft To Do 官方网站:https://todo.microsoft.com/tasks/ Microsoft To Do是一款由Microsoft公司开发的待办事项管理应用程序。它提供了一个简单易用的界面&a…...
Java8新特性函数式编程 - Lambda、Stream流、Optional
1.Lambda表达式 1.1 概述 Lambda是JDK8中一个语法糖。他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。 1.2 核心原则 可推导可省略 1.3 基本格式 (参数列表)->{代码}例一…...
AutoGPT安装教程
最近安装AutoGPT时遇到了一些问题,写下这篇文章记录一下 1 下载AutoGPT AutoGPT链接:https://github.com/Significant-Gravitas/Auto-GPT/tree/v0.2.2 下载AutoGPT 推荐下载stable 版本 2 申请openai 的api key 获取api的key,这里就不介…...
轻量级服务器nginx:负载均衡
负载均衡就是让每个设备,以同样的概率,处理用户对于服务器的任务请求,默认采用的负载调度策略就是轮流询问,Nginx作为反向代理服务器安装在服务端,Nginx的功能就是把请求转发给后面的应用服务器. 这里写目录标题 一 负…...
陶渊明最有名的10首诗,闲适美好
他是中国第一位田园诗人,被誉为“古今隐逸诗人之宗”、“田园诗派之鼻祖”。 他是诗人、辞赋家、散文家。 他是陶渊明。 欧阳修:晋无文章,唯陶渊明《归去来兮辞》。 陶渊明不为五斗米折腰,挂冠而去,给后世留下一段…...
最好用的六款虚拟机软件,赶紧收藏
在日常工作和学习中,我们常常需要在一台电脑上运行多个操作系统,以便进行软件测试、开发、学习以及实验等任务。虚拟机软件就是一种崭新的技术,它可以在一台电脑上运行多个操作系统,为用户提供了更高效、安全、稳定和智能化的工作和学习环境。今天我为大家介绍6款优秀的虚拟…...
LSSANet:一种用于肺结节检测的长、短切片感知网络
文章目录 LSSANet: A Long Short Slice-Aware Network for Pulmonary Nodule Detection摘要方法Long Short Slice GroupingLong Short Slice-Aware Network 实验结果 LSSANet: A Long Short Slice-Aware Network for Pulmonary Nodule Detection 摘要 提出了一个长短片感知网…...
LVS负载均衡群集部署—NAT
目录 一、群集的概述1、群集的含义2、出现高并发的解决方法3、群集的三种分类3.1负载均衡群集3.2高可用群集3.3高性能运算群集 4、负载均衡的结构 三、LVS调度器用的调度方法四、LVS的工作模式及其工作过程1.NAT模式(VS-NAT)2.直接路由模式(V…...
【Access】win 10 / win 11:Access 下载、安装、使用教程(「管理信息系统」实践专用软件)
目录 一、前言 二、卸载 Office 三、下载 Office Tool Plus 四、安装 Office(内含 Access) (1)启动 Office Tool Plus (2)部署 (3)安装 Office(内含 Access&#…...
波奇学Linux:Linux的认识和云服务器使用
认识Linux 在讲Linux前,我们先来理解计算机: 计算机:输入->算法->输出 举个栗子: pritnf :输出到屏幕(硬件)上 我们在计算机所有的行为都会转为硬件行为。 再进一步理解,我们打开visual studio后&a…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
