期末查分系统(c,链表实现)

主要功能:

分为三个身份:

学生:可以通过学号查询个人分数

老师:可以看所有学生成绩,单科排名(正序,倒序),统计绩点,查看绩点排名前百分之n的学生

管理员端:可以创建链表,添加修改删除学生数据,并保存数据

学生,老师,管理员密码都为123456

效果图:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
头插法:36h
登录:91h-
添加学生信息:295h
教师查看学生信息:208h
学生查询成绩:按照要求记录所要的学生信息243h,打印查询到的学生成绩230h
删除学生信息:315h
排序:335h
修改学生信息:527h
绩点:计算绩点,622h:输出需要的前百分之n 的学生绩点,606h*/
typedef struct student {char sno[20];char sname[50];char sex[50];double math;double english;double cs;double score;struct student* next;
} Stu;//头插法
Stu* creatCHead(FILE* fp) {Stu* p, * L;int w;//链表的处理L = (Stu*)malloc(sizeof(Stu));L->next = NULL;fseek(fp, 0, 2);w = ftell(fp);rewind(fp);//不断地读取数据while (w != ftell(fp))//读取txt{p = (Stu*)malloc(sizeof(Stu));fread(p, sizeof(Stu), 1, fp);p->next = L->next;L->next = p;}return L;
}
typedef struct teacher {int sno;char sex;char name[15];char subject;struct teacher* next;
} Tea;//尾插法
Stu* createtail(FILE* fp) {Stu* p, * L, * r;int w;L = (Stu*)malloc(sizeof(Stu));r = L;r->next = NULL;fseek(fp, 0, 2);w = ftell(fp);rewind(fp);while (w != ftell(fp))//读取txt{p = (Stu*)malloc(sizeof(Stu));fread(p, sizeof(Stu), 1, fp);p->next = NULL;r->next = p;r = p;}r->next = NULL;return L;
}void showinfo(char info[])//成功信息
{printf(info);printf("\n");
}void showerror(char errorinfo[])//失败信息
{printf(errorinfo);printf("\n");
}int stuLogin() {char user[50], password[50];printf("请输入学号和学生登录密码:\n");printf("学号:");scanf("%s", &user);printf("密码:");scanf("%s", &password);if (strcmp(password, "123456") == 0) {printf("登陆成功!\n");return 1;}else {printf("登录失败!\n");return 0;}
}int teaLogin() {char user[50], password[50];printf("请输入教师登录密码:\n");printf("登录密码:");scanf("%s", &password);if (strcmp(password, "123456") == 0) {printf("登陆成功!\n");return 1;}else {printf("登录失败!\n");return 0;}
}int adminLogin() {char user[50], password[50];printf("请输入管理员登录密码:");scanf("%s", &password);if (strcmp(password, "123456") == 0) {printf("登陆成功!\n");return 1;}else {printf("登录失败!\n");return 0;}
}void ShowFirstMenu() {printf("*********************欢迎使用期末查分系统********************\n");printf("╔═══════════════════════════════════╗\n");printf("║        请选择您需要的选项         ║\n");printf("╠═══════════════════════════════════╣\n");printf("║ 1. 学生端                         ║\n");printf("║ 2. 教师端                         ║\n");printf("║ 3. 管理员端                       ║\n");printf("║ 4. 退出系统                       ║\n");printf("╚═══════════════════════════════════╝\n");
}void showstudentMeun()//学生页面
{printf("\n\n\n\n\n");printf("\t\t|---------------------STUDENT-------------------|\n");printf("\t\t|\t 0. 退出                                |\n");printf("\t\t|\t 1. 查询学生成绩                        |\n");printf("\t\t|-----------------------------------------------|\n\n");printf("\t\t\t选择(0或1):");
}void showteacherMeun()//教师页面
{printf("\n\n\n\n\n");printf("\t\t|---------------------TEACHER-------------------|\n");printf("\t\t|\t 0.退出                                 |\n");printf("\t\t|\t 1.显示数据                             |\n");printf("\t\t|\t 2.查询单科成绩排名                     |\n");printf("\t\t|\t 3.统计学生绩点                         |\n");printf("\t\t|-----------------------------------------------|\n\n");printf("\t\t\t选择(0-3):");
}void showadminMeun()//管理员页面
{printf("\n\n\n\n\n");printf("\t\t|---------------------ADMIN---------------------|\n");printf("\t\t|\t 0. 退出                                |\n");printf("\t\t|\t 1. 创建链表                            |\n");printf("\t\t|\t 2. 添加数据                            |\n");printf("\t\t|\t 3. 删除数据                            |\n");printf("\t\t|\t 4. 修改数据                            |\n");printf("\t\t|\t 5. 保存数据                            |\n");printf("\t\t|-----------------------------------------------|\n\n");printf("\t\t\t选择(0-5):");printf("输入你想要的操作的序号:\n");
}Stu* InputStudent(FILE* fp)//录入学生信息
{int num, i;Stu* L = NULL;Stu* p = NULL;printf("请输入需要录入的学生人数:");scanf("%d", &num);printf("请输入学生信息:\n");printf("学号  姓名  性别  英语 数学 专业课\n");for (i = 0; i < num; i++) {printf("请输入第%d个数据\n", i + 1);p = (Stu*)malloc(sizeof(Stu));scanf("%s %s %s %lf %lf %lf", p->sno, p->sname, p->sex, &p->math, &p->english, &p->cs);fwrite(p, sizeof(Stu), 1, fp);p->next = L;L = p;}printf("学生数据录入成功!\n");return L;
}void Showstudent(Stu* L)//展示学生数据
{printf("学号   姓名     性别    数学成绩     英语成绩     专业课成绩    \n");Stu* p = L->next;while (p)//直到下一个数据为空值,否则一直打印{printf("%s   %s    %s    %.2lf     %.2lf     %.2lf\n", p->sno, p->sname, p->sex, p->math, p->english, p->cs);p = p->next;}
}void Showteacher(Tea* L)//展示教师数据
{printf("工号    姓名     性别    教授科目\n");Tea* p = L->next;while (p)//直到下一个数据为空值,否则一直打印{printf("%d    %s     %s    %s\n", p->sno, p->name, p->sex, p->subject);p = p->next;}
}void SearchstudentList(Stu* L, int* cnt)//查询学生信息结果
{printf("学号   姓名     性别    数学成绩     英语成绩     专业课成绩    \n");Stu* p = L;while (p && *cnt)//直到下一个数据为空值,否则一直查找{printf("%s   %s   %s    %.2lf     %.2lf     %.2lf\n", p->sno, p->sname, p->sex, p->math, p->english, p->cs);--* cnt;p = p->next;}
}//查询学生数据
Stu* Searchstudent(Stu* L, int type, char keyval[], char keystr[], int* cnt) {Stu* p = L->next;Stu* ptr = (Stu*)malloc(sizeof(Stu)); // 创建新节点保存查询结果Stu* newstudent = ptr;int flag = 0;while (p != NULL) {if ((type == 1) && (strcmp(p->sno, keyval) == 0)) {newstudent->next = (Stu*)malloc(sizeof(Stu));newstudent = newstudent->next;strcpy(newstudent->sno, p->sno);strcpy(newstudent->sname, p->sname);strcpy(newstudent->sex, p->sex);newstudent->math = p->math;newstudent->english = p->english;newstudent->cs = p->cs;++* cnt;flag = 1;}else if ((type == 2) && (strcmp(p->sname, keystr) == 0)) {newstudent->next = (Stu*)malloc(sizeof(Stu));newstudent = newstudent->next;strcpy(newstudent->sno, p->sno);strcpy(newstudent->sname, p->sname);strcpy(newstudent->sex, p->sex);newstudent->math = p->math;newstudent->english = p->english;newstudent->cs = p->cs;++* cnt;flag = 1;}else if ((type == 3) && (strcmp(p->sex, keystr) == 0)) {newstudent->next = (Stu*)malloc(sizeof(Stu));newstudent = newstudent->next;strcpy(newstudent->sno, p->sno);strcpy(newstudent->sname, p->sname);strcpy(newstudent->sex, p->sex);newstudent->math = p->math;newstudent->english = p->english;newstudent->cs = p->cs;++* cnt;flag = 1;}p = p->next;}if (flag == 0) {return NULL;}return ptr->next;
}void Addstudent(Stu* L)//增添学生信息
{Stu* p, * r, * s = L;int num, i;while (s->next)s = s->next;r = s;printf("请输入要添加的学生的人数:");scanf("%d", &num);printf("学号  姓名  性别  英语 数学 专业课\n");for (i = 0; i < num; i++) {printf("请输入录入的第 %d 数据:\n", i + 1);p = (Stu*)malloc(sizeof(Stu));scanf("%s %s %s %lf %lf %lf", p->sno, p->sname, p->sex, &p->math, &p->english, &p->cs);r->next = p;r = p;}r->next = NULL;
}int Deletestudent(Stu* L, char str[]) {Stu* p, * r;int flag = 0;p = L;while (p->next) {if (strcmp(p->next->sno, str) == 0) {flag = 1;break;}p = p->next;}if (flag) {r = p->next;p->next = r->next;free(r);}return flag;
}//5.数学成绩排序
Stu* showMathorder(Stu* L, int n) {//数学成绩排序Stu* p = L->next, * p1;char sno[50];char sname[50];char sex[50];double math, english, cs;if (n == 1){while (p){p1 = p;while (p1->next){if (p1->math > p1->next->math){math = p1->next->math;cs = p1->next->cs;strcpy(sname, p1->next->sname);english = p1->next->english;strcpy(sno, p1->next->sno);strcpy(sex, p1->next->sex);p1->next->math = p1->math;p1->next->cs = p1->cs;p1->next->english = p1->english;strcpy(p1->next->sname, p1->sname);strcpy(p1->next->sno, p1->sno);strcpy(p1->next->sex, p1->sex);p1->math = math;p1->cs = cs;p1->english = english;strcpy(p1->sname, sname);strcpy(p1->sno, sno);strcpy(p1->sex, sex);}p1 = p1->next;}p = p->next;}return L;}else if (n == 2){while (p){p1 = p;while (p1->next){if (p1->math < p1->next->math){math = p1->next->math;cs = p1->next->cs;strcpy(sname, p1->next->sname);english = p1->next->english;strcpy(sno, p1->next->sno);strcpy(sex, p1->next->sex);p1->next->math = p1->math;p1->next->cs = p1->cs;p1->next->english = p1->english;strcpy(p1->next->sname, p1->sname);strcpy(p1->next->sno, p1->sno);strcpy(p1->next->sex, p1->sex);p1->math = math;p1->cs = cs;p1->english = english;strcpy(p1->sname, sname);strcpy(p1->sno, sno);strcpy(p1->sex, sex);}p1 = p1->next;}p = p->next;}return L;}
}
void showmathorder(Stu* L, int n) {int swapped;Stu* ptr1; Stu* ptr2 = NULL; Stu* prev = NULL; // 检查链表是否为空或只有一个节点if (L == NULL || L->next == NULL)return;do {swapped = 0;ptr1 = L->next;while (ptr1->next != ptr2) {// 比较if ((n == 1 && ptr1->math > ptr1->next->math) || (n == 2 && ptr1->math < ptr1->next->math)) {// 交换节点数据Stu* temp = ptr1->next;ptr1->next = temp->next;temp->next = ptr1;if (ptr1 == L->next)L->next = temp;else {prev->next = temp;}ptr1 = temp;swapped = 1;}prev = ptr1; ptr1 = ptr1->next;}ptr2 = ptr1; } while (swapped);
}void showenglishorder(Stu* L, int n) {int swapped;Stu* ptr1; Stu* ptr2 = NULL;Stu* prev = NULL; if (L == NULL || L->next == NULL)return;do {swapped = 0;ptr1 = L->next;while (ptr1->next != ptr2) {// 比较if ((n == 1 && ptr1->english > ptr1->next->english) || (n == 2 && ptr1->english < ptr1->next->english)) {// 交换节点数据Stu* temp = ptr1->next;ptr1->next = temp->next;temp->next = ptr1;// 更新头节点的位置if (ptr1 == L->next)L->next = temp;else {prev->next = temp;}ptr1 = temp;swapped = 1;}prev = ptr1; ptr1 = ptr1->next;}ptr2 = ptr1; } while (swapped);
}void showcsorder(Stu* L, int n) {int swapped; Stu* ptr1; Stu* ptr2 = NULL; Stu* prev = NULL; // 检查链表是否为空或只有一个节点if (L == NULL || L->next == NULL)return;do {swapped = 0;ptr1 = L->next;       while (ptr1->next != ptr2) {// 比较if ((n == 1 && ptr1->cs > ptr1->next->cs) || (n == 2 && ptr1->cs < ptr1->next->cs)) {// 交换节点数据Stu* temp = ptr1->next;ptr1->next = temp->next;temp->next = ptr1;             if (ptr1 == L->next)L->next = temp;else {prev->next = temp;}ptr1 = temp;swapped = 1;}prev = ptr1;ptr1 = ptr1->next;}ptr2 = ptr1; } while (swapped);
}int Revisestudent(Stu* L, char no[]) {Stu* p = L;char sname[50];char sex[50];double english, math, cs;int flag = 0;while (p) {if (strcmp(p->sno, no) == 0) {printf("请输入修改后的姓名:");scanf("%s", sname);printf("请输入修改后的性别:");scanf("%s", sex);printf("请输入修改后的数学成绩:");scanf("%lf", &math);printf("请输入修改后的英语成绩:");scanf("%lf", &english);printf("请输入修改后的专业课成绩:");scanf("%lf", &cs);// 修改相关数据strcpy(p->sname, sname);strcpy(p->sex, sex);p->math = math;p->english = english;p->cs = cs;flag = 1;break;}p = p->next;}return flag;
}void SavestudentData(FILE* fp, Stu* L) {Stu* p = L->next;rewind(fp);while (p) {fwrite(p, sizeof(Stu), 1, fp);p = p->next;}fclose(fp);
}void sortByScore(Stu* L) {int swapped; //用于判断每次循环是否进行了排序,如果没有,就说明那个已经有序,提前结束Stu* ptr1; // 指向当前比较的节点,用于比较当前节点和下一个节点的值,并进行节点交换Stu* ptr2 = NULL; // 标记节点,确定已经排序好的节点的位置Stu* prev = NULL; // 指向 ptr1 的前一个节点if (L == NULL || L->next == NULL)return;do {swapped = 0;ptr1 = L->next;   while (ptr1->next != ptr2) {// 比较if (ptr1->score < ptr1->next->score) {// 交换节点数据Stu* temp = ptr1->next;ptr1->next = temp->next;temp->next = ptr1;               if (ptr1 == L->next)L->next = temp;else {prev->next = temp;}ptr1 = temp;swapped = 1;}prev = ptr1; ptr1 = ptr1->next;}ptr2 = ptr1; } while (swapped);
}void printTopNPercent(Stu* L, int n) {int count = 0;Stu* current = L->next;while (current != NULL) {count++;current = current->next;}int numStudents = count * n / 100; // 计算需要输出的学生数量printf("Top %d%% 学生:\n", n);current = L->next;for (int i = 0; i < numStudents && current != NULL; i++) {printf("%s\t%s\t%s\t%.2f\n", current->sno, current->sname, current->sex, current->score);current = current->next;}
}void CountGrade(Stu* L, int n) {Stu* current = L->next;while (current != NULL) {double math = current->math / 10.0;double english = current->english / 10.0;double cs = current->cs / 10.0;double gpa = (math + english + cs - 15.0) / 3.0;current->score = gpa;current = current->next;}sortByScore(L);printTopNPercent(L, n);
}int main() {FILE* cfp = NULL, * efp = NULL, * sfp = NULL;int flag1 = 0;int flag2 = 0;int flag3 = 0;int result = 0, sel1 = 0, sel2 = 0, cmenuflag = 1, emenuflag = 1, cdeleteflag = 0, edeleteflag = 0, etype = 0, ctype = 0, sorttype = 0, sort = 0, cflag = 0;Stu* CCHead = NULL;int s, j, k, n = 0;int sorttype1 = 0;int sorttype2 = 0;Stu* CHead = NULL;int choice = 0;int choicetype = 0;int b = 0;int frontn = 0;char cname = 0;char del[50], ssex[50], ssname[50], snum[50];do {ShowFirstMenu();scanf("%d", &choice);switch (choice) {case 1:flag1 = stuLogin();if (flag1 == 0) continue;cmenuflag = 1;while (cmenuflag) {showstudentMeun();//学生页面;scanf("%d", &s);switch (s) {case 1://学生端多种方式查询if (CHead == NULL) {showerror("请先创建链表");}else {printf("请输入您想查询的方式\n1.按照学生学号查询\n2.按照学生姓名查询\n3.按照性别查询\n");printf("您的选择是:");scanf("%d", &choicetype);if (choicetype == 1) {int* cnt = malloc(sizeof(int));*cnt = 0;printf("请输入您想查询的学生学号:");scanf("%s", snum);CCHead = Searchstudent(CHead, choicetype, snum, NULL, cnt);if (CCHead != NULL) {showinfo("查询成功");SearchstudentList(CCHead, cnt);}elseshowerror("查询失败");free(cnt);}else if (choicetype == 2) {int* cnt = malloc(sizeof(int));*cnt = 0;printf("请输入您想查询的学生姓名:");scanf("%s", ssname);CCHead = Searchstudent(CHead, choicetype, NULL, ssname, cnt);if (CCHead != NULL) {showinfo("查询成功");SearchstudentList(CCHead, cnt);}elseshowerror("查询失败");free(cnt);}else if (choicetype == 3) {int* cnt = malloc(sizeof(int));*cnt = 0;printf("请输入您想查询的学生性别:");scanf("%s", ssex);CCHead = Searchstudent(CHead, choicetype, NULL, ssex, cnt);if (CCHead != NULL) {showinfo("查询成功");SearchstudentList(CCHead, cnt);}elseshowerror("查询失败");free(cnt);}elseshowerror("无效的查询方式");}break;case 0://退出系统cmenuflag = 0;break;default:cmenuflag = 0;printf("无效的选项!\n");break;}}break;case 2://教师页面flag2 = teaLogin();if (flag2 == 0) continue;cmenuflag = 1;while (cmenuflag) {showteacherMeun();scanf("%d", &j);switch (j) {case 1:if (CHead == NULL)showerror("请先创建链表");elseShowstudent(CHead);break;case 2:printf("1,数学成绩排名\n2,英语成绩排名\n3,专业课成绩排名\n");printf("请输入你要查询的科目编号:");scanf("%d", &k);switch (k) {case 1:if (CHead == NULL)showerror("请先创建链表");else {printf("请输入排序方式:1.升序 2.降序\n");printf("您的选择是:");scanf("%d", &sorttype);if (sorttype == 1) {showmathorder(CHead, sorttype);if (CHead) {showinfo("排序成功");Showstudent(CHead);}elseshowerror("排序失败");}else if (sorttype == 2) {showmathorder(CHead, sorttype);if (CHead) {showinfo("排序成功");Showstudent(CHead);}elseshowerror("排序失败");}elseprintf("无效的排序方式");}break;case 2:if (CHead == NULL)showerror("请先创建链表");else {printf("请输入排序方式:1.升序 2.降序\n");printf("您的选择是:");scanf("%d", &sorttype2);if (sorttype2 == 1) {showenglishorder(CHead, sorttype2);if (CHead) {showinfo("排序成功");Showstudent(CHead);}elseshowerror("排序失败");}else if (sorttype2 == 2) {showenglishorder(CHead, sorttype2);if (CHead) {showinfo("排序成功");Showstudent(CHead);}elseshowerror("排序失败");}elseprintf("无效的排序方式");}break;case 3:if (CHead == NULL)showerror("请先创建链表");else {printf("请输入排序方式:1.升序 2.降序\n");printf("您的选择是:");scanf("%d", &sorttype1);if (sorttype1 == 1) {showcsorder(CHead, sorttype1);if (CHead) {showinfo("排序成功");Showstudent(CHead);}elseshowerror("排序失败");}else if (sorttype1 == 2) {showcsorder(CHead, sorttype1);if (CHead) {Showstudent(CHead);showinfo("排序成功");}elseshowerror("排序失败");}elseprintf("无效的排序方式");}break;}break;case 3:// 统计学生绩点if (CHead == NULL)showerror("请先创建链表");else {printf("请输入要查看的前n%\n");scanf("%d", &n);CountGrade(CHead, n);}break;case 0://退出系统cmenuflag = 0;break;default:cmenuflag = 0;printf("无效的选项!\n");break;}}break;case 3:flag3 = adminLogin();if (flag3 == 0) continue;if ((cfp = fopen("student.txt", "r")) == NULL) {printf("未找到文件\n");if ((cfp = fopen("student.txt", "w+")) != NULL)CHead = InputStudent(cfp);}cmenuflag = 1;while (cmenuflag) {showadminMeun();scanf("%d", &n);switch (n) {case 1://创建链表printf("请输入您想创建的方式\n1.表示头插法\n2.表示尾插法\n");printf("您的选择是:");scanf("%d", &b);if (b == 1)CHead = creatCHead(cfp);//头结点创建链表elseCHead = createtail(cfp);//尾结点创建链表if (CHead)showinfo("创建成功");elseshowerror("创建失败");break;case 2:if (CHead == NULL)showerror("请先创建链表");elseAddstudent(CHead);if (CHead)showinfo("添加成功");elseshowerror("添加失败");break;case 3://删除学生数据if (CHead == NULL)showerror("请先创建链表");else {printf("请输入您想删除的学生信息的学号:");scanf("%s", del);cdeleteflag = Deletestudent(CHead, del);if (cdeleteflag == 1)showinfo("删除成功");elseshowerror("删除失败");}break;case 4:if (CHead == NULL)showerror("请先创建链表");else {printf("请输入您要修改的学生的学号:");scanf("%s", snum);cflag = Revisestudent(CHead, snum);if (cflag == 1)showinfo("修改成功");elseshowerror("修改失败");}break;case 5:if (CHead == NULL)showerror("请先创建链表");else {cfp = fopen("student.txt", "wb");SavestudentData(cfp, CHead);}if (CHead)showinfo("保存成功");elseshowerror("保存失败");break;case 0:cmenuflag = 0;break;default:cmenuflag = 0;printf("无效的选项!\n");break;}}break;case 4:return 0;}} while (1);
}

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

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

相关文章

用React给XXL-JOB开发一个新皮肤(二):目录规划和路由初始化

目录 一. 简述二. 目录规划三. Vite 配置 3.1. 配置路径别名3.2. 配置 less 四. 页面 4.1. 入口文件4.2. 骨架文件4.3. 普通页面 五. 路由配置六. 预览启动 一. 简述 上一篇文章我们介绍了项目初始化&#xff0c;此篇文章我们会先介绍下当前项目的目录规划&#xff0c;接着对…

Magics 教程

文章目录 基本流程基本操作页面的介绍基本操作 基本流程 基本操作 页面的介绍 右侧是工具页&#xff0c;可以直接进行调整&#xff0c;也可以在选项&帮助->自定义用户界面 那里进行相关的调整 基本操作 直接拖动鼠标左键&#xff1a;选中物体鼠标右键&#xff1a; 长按…

JVM工作原理与实战(十二):打破双亲委派机制-自定义类加载器

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、打破双亲委派机制的方法 二、自定义类加载器 1.Tomcat自定义类加载器案例 2.自定义类加载器详解 3.案例解析 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执…

RAG:让大语言模型拥有特定的专属知识

作为一个在Chatbot领域摸爬滚打了7年的从业者&#xff0c;笔者可以诚实地说&#xff0c;在大语言模型的推动下&#xff0c;检索增强生成&#xff08;Retrieval Augmented Generation&#xff0c;RAG&#xff09;技术正在快速崛起。 RAG的搜索请求和生成式AI技术&#xff0c;为搜…

【教学类-45-06】正确 X-Y之间的三连加减题混合 (竖向排列)(44格:11题“++ ”11题“--”11题“ +-”11题“ -+” )

作品展示&#xff1a; 背景需求&#xff1a; 把以下四款3连题 混在一起&#xff0c;每种题目随机抽取11题&#xff0c;一共44格 出现问题&#xff1a; 1、- 、-里面有重复题 2、升序排列最好竖排展示 素材准备: ​ ​ 问题改正 1、单元格修改&#xff1a;确保竖列写入 …

【Docker项目实战】使用Docker部署nullboard任务管理工具

【Docker项目实战】使用Docker部署nullboard任务管理工具 一、nullboard介绍1.1 nullboard简介1.2 任务看板工具介绍 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍2.3 注意事项 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四…

C# WPF 数据绑定

需求 后台变量发生改变,前端对应的相关属性值也发生改变 实现 接口 INotifyPropertyChanged 用于通知客户端(通常绑定客户端)属性值已更改。 示例 示例一 官方示例代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using Sys…

spring boot + mybatis + websocket + js实战

项目技术&#xff1a;spring boot mybatis websocket js 需求背景&#xff1a;当添加一个女孩时&#xff0c;页面的socket收到消息&#xff0c;打印最新的所有女生list&#xff0c;这样可以进一步在react/vue前端框架下&#xff0c;实现当A用户新增了某业务数据后&#xff…

迅为RK3568开发板Android11/12/Linux编译驱动到内核

在平时的驱动开发中&#xff0c;经常需要在内核中配置某种功能&#xff0c;为了方便大家开发和学习&#xff0c;本小 节讲解如何在内核中添加驱动。具体的讲解原理讲解请参考本手册的驱动教程。 Android11 源码如果想要修改内核&#xff0c;可以运行以下命令进行修改: cd ke…

ffmpeg 视频分辨率修改 质量压缩

随着手机像素的提高&#xff0c;拍摄视频也越来越大&#xff0c;10秒的视频动辄 二三十兆&#xff0c;这给视频传输和播放都带来了 诸多不变。一般都需要 前端或或者后端 对视频进行压缩。由于我这边前端是 H5&#xff0c;所以只能后端进行压缩&#xff0c; 采用主流压缩库采用…

centOS系统yum安装和卸载mongodb

0.1 什么是mongodb&#xff1f; 0.2 Mongodb是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 0.3 Mongodb是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据…

现代密码学 考点复盘

现代密码学 考点汇总&#xff08;上&#xff09; 写在最前面考试范围一、给一个简单的方案&#xff0c;判断是否cca安全二、随机预言机模型之下的简单应用 考试题目1.证明CBC方案是CPA安全的2. 证明哈希函数的抗碰撞性3. CBC-MAC安全&#xff1a;证明CPA安全的对称密钥加密方案…

使用git submodule解决高耦合度问题

引言 在开发我的笔记系统时&#xff0c;我遇到了一个问题。问题是&#xff0c;在api-gate服务中&#xff0c;我需要验证用户的access_code&#xff0c;但是access_code的生成逻辑是在auth2服务中实现的。这个问题从架构设计的层面上看&#xff0c;就是一个高耦合度问题。高耦合…

大数据 - Doris系列《三》- 数据表设计之表的基本概念

目录 &#x1f436;3.1 字段类型 &#x1f436;3.2 表的基本概念 3.2.1 Row & Column 3.2.2 分区与分桶 &#x1f959;3.2.2.1 Partition 1. Range 分区 2. List 分区 进阶&#xff1a;复合分区与单分区的选择 3.2.3 PROPERTIES &#x1f959;3.2.3.1 分片副本数 &#x1f…

正则表达式、文件访问(Python实现)

一、主要目的&#xff1a; 1.了解正则表达式的基本概念和处理过程。 2.掌握使用正则表达式模块 Re 进行字符串处理的方法。 3.了解文件的基本概念和类型。 4.掌握在 Python 中访问文本文件的方法和步骤。 5.熟悉在 Python 中访问二进制文件的方法和步骤。 二、主要内容和结…

【小白专用】C# 连接 MySQL 数据库

C# – Mysql 数据库连接 1. 配置环境 #前提&#xff1a;电脑已安装Mysql服务&#xff1b; Visual Studio 安装Mysql依赖库&#xff1a; 工具 -> NuGet 包管理器 -> 管理解决方案的 NuGet程序包 —> 搜索&#xff0c; 安装Mysql.Data (Oracle); (安装成功后&…

常用的网站

PIXEL MOTION 注册-YesPMP平台 模型下载 - Ourblender - 专业的三维素材库 Vega AI 创作平台 夏沫的AI小站 Tripo AI B站视频下载工具 | 极简纯净

视频监控录像服务器(中心录像服务器)功能详细介绍

目 录 一、概述 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;视频监控中心录像服务器 二、存储策略服务 &#xff08;一&#xff09;存储策略配置 1、 录入页面 2、 选择需要进行录像的视频 3、批量选择多个通道号 4、其他关键参数…

rime中州韵小狼毫 敏感词脱敏滤镜

快速录入&#xff0c;是任何一个输入法&#xff0c;以及输入人员&#xff08;无论是否专业&#xff09;的追求目标之一。现实中&#xff0c;由于各种输入法在录入文本时&#xff0c;都无法完全避免重码的问题&#xff0c;所以在输入过程中都或多或少的需要进行选字/选词操作。这…

Redis不同环境缓存同一条数据,数据内部值不同

背景 现实中&#xff0c;本地环境&#xff08;dev&#xff09;和开发环境&#xff08;feature&#xff09;会共同使用相同的中间件&#xff08;本篇拿Redis举例&#xff09;&#xff0c;对于不同环境中的&#xff0c;图片、视频、语音等资源类型的预览地址url&#xff0c;需要配…