【实现报告】学生信息管理系统(顺序表)

目录

实验一 线性表的基本操作

一、实验目的

二、实验内容

三、实验提示

四、实验要求

五、实验代码如下:

(一)顺序表的构建及初始化

(二)检查顺序表是否需要扩容

(三)根据指定学生个数,逐个输入学生信息

(四)逐个显示学生表中所有学生的相关信息

(五)根据姓名进行查找,返回此学生的学号和成绩

(六)根据指定的位置可返回相应的学生信息(学号,姓名,成绩);

(七) 给定一个学生信息,插入到表中指定的位置

检查插入位置的有效性

检查并扩容

将插入位置及之后的元素后移

在指定位置插入新元素

更新顺序表长度

 (八)删除指定位置的学生记录

 (九)main函数

六、整体代码如下: 


实验一 线性表的基本操作

一、实验目的

1、掌握线性表的定义;

2、掌握线性表的基本操作,如建立、查找、插入和删除等。

二、实验内容

定义一个包含学生信息(学号,姓名,成绩)的顺序表和链表,使其具有如下功能:

(1) 根据指定学生个数,逐个输入学生信息;

(2) 逐个显示学生表中所有学生的相关信息;

(3) 根据姓名进行查找,返回此学生的学号和成绩;

(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);

(5) 给定一个学生信息,插入到表中指定的位置;

(6) 删除指定位置的学生记录;

(7) 统计表中学生个数。

三、实验提示

学生信息的定义:

typedef struct {

    char no[8];   //8位学号

    char name[20]; //姓名

    int grade;     //成绩

}Student;

顺序表的定义

typedef  struct {

  Student  *elem;     //指向数据元素的基地址

  int  length;       //线性表的当前长度                                                           

 }SqList;

链表的定义:

typedef struct LNode{

     Student   data;       //数据域

     struct LNode  *next;   //指针域

}LNode,*LinkList;

四、实验要求

(1) 程序要添加适当的注释,程序的书写要采用缩进格式。

(2) 程序要具有一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的位置不对等等。

(3) 程序要做到界面友好,在程序运行时用户可以根据相应的提示信息进行操作。

(4) 根据实验报告模板详细书写实验报告,在实验报告中给出链表根据姓名进行查找的算法和插入算法的流程图。

五、实验代码如下:

(一)顺序表的构建及初始化

  1. 动态内存分配:使用malloc函数为elem分配内存空间,空间大小为MAX_SIZE乘以sizeof(Student),即足够存储MAX_SIZEStudent类型的数据。MAX_SIZE是一个宏定义,表示顺序表的初始容量。

  2. 内存分配失败检查:如果malloc返回NULL,表示内存分配失败。此时,程序打印错误信息并通过exit(1)退出。

  3. 初始化顺序表属性:将length设置为0,表示顺序表当前没有任何元素。将capacity设置为MAX_SIZE,表示顺序表的当前容量为MAX_SIZE个元素。

  4. 内存清零:使用memset函数将新分配的内存区域全部清零。这是一种预防措施,确保所有的Student记录从一开始就处于一个定义良好的状态(即所有位都是0),避免了使用未初始化的内存。

typedef struct {char no[8];    // 8位学号char name[20]; // 姓名double grade;     // 成绩
}Student;// 顺序表的定义
typedef  struct SqList
{Student* elem;     // 指向数据元素的基地址int  length;       // 线性表的当前长度 int  capacity;     // 线性表的容量
}SL;
typedef Student ElemType;void SeqListInit(SL* ps)
{// 动态分配一个固定大小的数组用于存储学生信息ps->elem = (Student*)malloc(MAX_SIZE * sizeof(Student));if (!ps->elem) {// 如果内存分配失败,打印错误信息并退出程序printf("建立顺序表失败\n");exit(1);}ps->length = 0;  // 初始化顺序表当前长度为0ps->capacity = MAX_SIZE;  // 设置顺序表的容量为MAX_SIZEmemset(ps->elem, 0, sizeof(Student) * MAX_SIZE); // 将分配的内存区域清零  
}

(二)检查顺序表是否需要扩容

  • 检查是否需要扩容:首先,函数检查顺序表ps的当前长度(ps->length)是否等于其容量(ps->capacity)。等于容量意味着顺序表已满,没有多余的空间来存储新的元素,因此需要扩容。

  • 计算新容量:如果顺序表需要扩容,函数计算新的容量newcapacity。新容量被设置为当前容量的两倍,这是一种常见的扩容策略,旨在平衡扩容操作的次数和每次扩容增加的空间。特殊情况是,如果当前容量为0(意味着顺序表尚未初始化或特殊设计),则初始化为4

  • 重新分配内存:通过realloc函数尝试重新分配内存。realloc不仅能够扩展或缩减已分配的内存块大小,还会保留原内存块的内容(在新内存块中复制原有数据),这对于顺序表的扩容操作是非常必要的。新内存的大小是newcapacity * sizeof(ElemType)ElemType是顺序表存储元素的类型,这里是Student结构体。

  • 检查内存分配结果:如果realloc返回NULL,意味着内存分配失败,函数会打印错误信息并退出程序。。

  • 更新顺序表属性:如果内存分配成功,realloc会返回新分配内存的地址,函数会将这个新地址赋给ps->elem,以此更新顺序表的基地址。同时,更新顺序表的容量为newcapacity

void SeqListCheckCapacity(SL* ps)
{// 如果当前长度达到容量限制,则需要扩容if (ps->length == ps->capacity) {// 新容量是当前容量的两倍,特殊情况下从0开始则初始化为4int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;// 尝试重新分配内存ElemType* tmp = (ElemType*)realloc(ps->elem, newcapacity * sizeof(ElemType));if (tmp == NULL) {// 如果内存分配失败,打印错误信息并退出程序perror("realloc fail!");exit(1);}ps->elem = tmp; // 更新顺序表的元素指针ps->capacity = newcapacity; // 更新顺序表的容量}
}

(三)根据指定学生个数,逐个输入学生信息

void Input(ElemType* e)
{提示用户输入一个学生的学号、姓名和成绩//printf("请输入要读入的学生信息(包括学号, 姓名, 成绩):");//scanf("%s %s %lf", e->no, e->name, &e->grade);printf("学号:");	scanf("%s", e->no);printf("姓名:");	scanf("%s", e->name);printf("成绩:");	scanf("%lf", &e->price);printf("输入完成\n\n");
}// 根据指定学生个数,逐个输入学生信息printf("请输入要输入的学生个数:\n"); scanf("%d", &n);
while (n--)
{if (ps->length >= ps->capacity){SeqListCheckCapacity(ps);}ps->length++;printf("请输入第 %d 个学生:\n", ps->length);Input(&ps->elem[ps->length]);
}

(四)逐个显示学生表中所有学生的相关信息

void Output(ElemType* e)
{// 格式化输出学生的学号、姓名和成绩printf(" 学号:%-10s\n 姓名:%-20s\n 成绩:%-10.2f\n\n", e->no, e->name, e->grade);
}// 显示学生表信息
for (i = 1; i <= ps->length; i++) {Output(&ps->elem[i]);
}
break;

(五)根据姓名进行查找,返回此学生的学号和成绩

int Search(SqList* ps, char str[])
{// 遍历顺序表中的每个元素,查找姓名匹配的学生int i = 1; // 注意这里的索引从1开始,为了用户友好for (; i <= ps->length; i++){if (strcmp(ps->elem[i].name, str) == 0)return i; // 如果找到,返回学生的位置}return 0;
}printf("请输入要查找的学生姓名:");
scanf("%s", str);
//根据姓名进行查找,返回此学生的学号和成绩;
if (t = Search(ps, str))Output(&ps->elem[Search(ps, str)]);
elseprintf("没有此学生信息!\n");
*str = NULL;

(六)根据指定的位置可返回相应的学生信息(学号,姓名,成绩);

void Output(ElemType* e)
{// 格式化输出学生的学号、姓名和成绩printf(" 学号:%-10s\n 姓名:%-20s\n 成绩:%-10.2f\n\n", e->no, e->name, e->grade);
}printf("请输入显示的位置:\n");
scanf("%d", &id1);
Output(&ps->elem[id1]);

(七) 给定一个学生信息,插入到表中指定的位置

检查插入位置的有效性

  • 函数首先检查提供的位置i是否在合法范围内。有效的插入位置从1开始,到ps->length + 1结束(含)。
  • 如果i小于1或大于ps->length + 1,函数返回false,表示插入操作失败。

检查并扩容

  • 如果顺序表的当前长度加1大于等于其容量(ps->length + 1 >= ps->capacity),意味着顺序表没有足够的空间来容纳新元素,因此需要扩容。
  • SeqListCheckCapacity函数被调用来处理可能的扩容。如果需要,这个函数会增加顺序表的容量,保证有足够的空间插入新元素。

将插入位置及之后的元素后移

  • 为了在指定位置i插入新元素,从该位置开始到顺序表末尾的所有元素都需要向后移动一位。这通过一个从ps->length开始,向下到i的逆序循环完成。循环中的每一步都将元素从j位置移动到j + 1位置。
  • 这个过程为新元素腾出了位置i

在指定位置插入新元素

  • 新元素通过解引用e指针(*e)获得,并被插入到顺序表的位置i。由于函数用户友好性考虑,位置i是从1开始计数的。

更新顺序表长度

  • 成功插入新元素后,顺序表的长度ps->length增加1,以反映新元素的添加。

返回值

  • 函数最后返回true,表示插入操作成功执行。

bool ListInsert(SqList* ps, int i, ElemType* e)
{// 检查插入位置的有效性if ((i < 1) || (i > ps->length + 1)) return false;// 检查并扩容if (1 + ps->length >= ps->capacity){SeqListCheckCapacity(ps);}// 将插入位置及之后的元素后移for (int j = ps->length; j >= i; j--){ps->elem[j + 1] = ps->elem[j];}// 在指定位置插入新元素ps->elem[i] = *e;ps->length++; // 更新顺序表长度return true;
}//给定一个学生信息,插入到表中指定的位置;
printf("请输入要插入的位置:");
scanf("%d", &id2);
printf("输入要插入的人数:");
scanf("%d", &n);
for (i = 1; i <= n; i++)
{printf("请输入第 %d 个学生:\n", i);Input(&a);if (ListInsert(ps, id2, &a)){puts("插入成功");}else{puts("插入失败\n");}
}

 (八)删除指定位置的学生记录

  • 在执行删除操作之前,函数首先检查提供的索引i是否有效。索引有效的条件是它必须在1和顺序表当前长度ps->length之间(包含这两个值)
  • 如果i无效(即小于1或大于ps->length),函数立即返回false,表示删除操作失败。
  • 如果索引i有效,函数通过将从位置i+1开始的所有元素向前移动一位来删除位于位置i的元素。这通过一个for循环实现,循环的迭代变量ji开始,直到ps->length(包含)。
  • 循环内部的操作ps->elem[j] = ps->elem[j + 1];将每个后续元素复制到其前一个位置上,实际上是将位置i上的元素“覆盖”,从而实现删除效果。

bool ListDelete(SqList* ps, int i)
{// 首先检查给定的索引i是否有效。if ((i < 1) || (i > ps->length))return false;for (int j = i; j <= ps->length; j++){ps->elem[j] = ps->elem[j + 1];}--ps->length;return true;
}//删除指定位置的学生记录;
printf("请输入要删除的位置:");
int id3;
scanf("%d", &id3);
if (ListDelete(ps, id3))
{puts("删除成功");
}
else
{puts("删除失败");
}

 (九)main函数

int main()
{SL* ps = (SL*)malloc(sizeof(SL));ElemType a;printf("\n1.构造顺序表\n");printf("2.输入学生信息\n");printf("3.显示学生表信息\n");printf("4.根据姓名进行查找\n");printf("5.显示指定的位置学生信息\n");printf("6.在指定位置插入学生信息\n");printf("7.删除指定位置的学生记录\n");printf("8.统计学生人数\n");printf("9.退出\n\n");int choose, n = 0; char str[20]; int id1, t = 0, id2 = 0, i = 1;while (1) {printf("请选择:");scanf("%d", &choose);if (choose == 9) break;switch (choose) {......}}return 0;
}

六、整体代码如下: 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>#define MAX_SIZE 10
#define Case break;casetypedef struct {char no[8];    // 8位学号char name[20]; // 姓名double grade;     // 成绩
}Student;// 顺序表的定义
typedef  struct SqList
{Student* elem;     // 指向数据元素的基地址int  length;       // 线性表的当前长度 int  capacity;     // 线性表的容量
}SL;
typedef Student ElemType;void SeqListInit(SL* ps)
{// 动态分配一个固定大小的数组用于存储学生信息ps->elem = (Student*)malloc(MAX_SIZE * sizeof(Student));if (!ps->elem) {// 如果内存分配失败,打印错误信息并退出程序printf("建立顺序表失败\n");exit(1);}ps->length = 0;  // 初始化顺序表当前长度为0ps->capacity = MAX_SIZE;  // 设置顺序表的容量为MAX_SIZEmemset(ps->elem, 0, sizeof(Student) * MAX_SIZE); // 将分配的内存区域清零  
}void SeqListCheckCapacity(SL* ps)
{// 如果当前长度达到容量限制,则需要扩容if (ps->length == ps->capacity) {// 新容量是当前容量的两倍,特殊情况下从0开始则初始化为4int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;// 尝试重新分配内存ElemType* tmp = (ElemType*)realloc(ps->elem, newcapacity * sizeof(ElemType));if (tmp == NULL) {// 如果内存分配失败,打印错误信息并退出程序perror("realloc fail!");exit(1);}ps->elem = tmp; // 更新顺序表的元素指针ps->capacity = newcapacity; // 更新顺序表的容量}
}void Input(ElemType* e)
{void Input(ElemType* e)
{提示用户输入一个学生的学号、姓名和成绩//printf("请输入要读入的学生信息(包括学号, 姓名, 成绩):");//scanf("%s %s %lf", e->no, e->name, &e->grade);printf("学号:");	scanf("%s", e->no);printf("姓名:");	scanf("%s", e->name);printf("成绩:");	scanf("%lf", &e->price);printf("输入完成\n\n");
}
}void Output(ElemType* e)
{// 格式化输出学生的学号、姓名和成绩printf(" 学号:%-10s\n 姓名:%-20s\n 成绩:%-10.2f\n\n", e->no, e->name, e->grade);
}int Search(SqList* ps, char str[])
{// 遍历顺序表中的每个元素,查找姓名匹配的学生int i = 1; // 注意这里的索引从1开始,为了用户友好for (; i <= ps->length; i++){if (strcmp(ps->elem[i].name, str) == 0)return i; // 如果找到,返回学生的位置}return 0;
}bool ListInsert(SqList* ps, int i, ElemType* e)
{// 检查插入位置的有效性if ((i < 1) || (i > ps->length + 1)) return false;// 检查并扩容if (1 + ps->length >= ps->capacity){SeqListCheckCapacity(ps);}// 将插入位置及之后的元素后移for (int j = ps->length; j >= i; j--){ps->elem[j + 1] = ps->elem[j];}// 在指定位置插入新元素ps->elem[i] = *e;ps->length++; // 更新顺序表长度return true;
}bool ListDelete(SqList* ps, int i)
{// 首先检查给定的索引i是否有效。if ((i < 1) || (i > ps->length))return false;// 将删除位置之后的元素前移for (int j = i; j <= ps->length; j++){ps->elem[j] = ps->elem[j + 1];}--ps->length;// 更新顺序表长度return true;
}int main()
{SL* ps = (SL*)malloc(sizeof(SL));ElemType a;printf("\n1.构造顺序表\n");printf("2.输入学生信息\n");printf("3.显示学生表信息\n");printf("4.根据姓名进行查找\n");printf("5.显示指定的位置学生信息\n");printf("6.在指定位置插入学生信息\n");printf("7.删除指定位置的学生记录\n");printf("8.统计学生人数\n");printf("9.退出\n\n");int choose, n = 0; char str[20]; int id1, t = 0, id2 = 0, i = 1;while (1) {printf("请选择:");scanf("%d", &choose);if (choose == 9) break;switch (choose) {case 1:// 初始化顺序表SeqListInit(ps);Case 2:// 根据指定学生个数,逐个输入学生信息printf("请输入要输入的学生个数:\n"); scanf("%d", &n);while (n--){if (ps->length >= ps->capacity){SeqListCheckCapacity(ps);}ps->length++;printf("请输入第 %d 个学生:\n", ps->length);Input(&ps->elem[ps->length]);}Case 3:// 显示学生表信息for (i = 1; i <= ps->length; i++) {Output(&ps->elem[i]);}break;Case 4:printf("请输入要查找的学生姓名:");scanf("%s", str);//根据姓名进行查找,返回此学生的学号和成绩;if (t = Search(ps, str))Output(&ps->elem[Search(ps, str)]);elseprintf("没有此学生信息!\n");*str = NULL;Case 5://根据指定的位置可返回相应的学生信息(学号,姓名,成绩);printf("请输入显示的位置:\n");scanf("%d", &id1);Output(&ps->elem[id1]);Case 6://给定一个学生信息,插入到表中指定的位置;printf("请输入要插入的位置:");scanf("%d", &id2);printf("输入要插入的人数:");scanf("%d", &n);for (i = 1; i <= n; i++){printf("请输入第 %d 个学生:\n", i);Input(&a);if (ListInsert(ps, id2, &a)){puts("插入成功");}else{puts("插入失败\n");}}Case 7://删除指定位置的学生记录;printf("请输入要删除的位置:");int id3;scanf("%d", &id3);if (ListDelete(ps, id3)){puts("删除成功");}else{puts("删除失败");}Case 8://统计表中学生个数。printf("表中学生个数有%d人\n", ps->length);break;default:printf("无效选项\n");break;}}return 0;
}

运行截图:

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

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

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

相关文章

PHP图床程序优化版:图片外链服务、图床API服务、图片CDN加速与破解防盗链

图片免费上传 支持本地储存、FTP储存、第三方云储存&#xff08;阿里云 OSS、腾讯云 COS、七牛云等&#xff09;。 图片外链加速 一键转换第三方网站的图片外链地址为图床可分享的图片地址&#xff08;支持CDN&#xff09;。 图片解析服务 直接将第三方外链图片地址显示为…

【spring】AbstractApplicationContext 的refresh() 方法学习

上一篇我们一起学习了【spring】FileSystemXmlApplicationContext 类学习 AbstractApplicationContext 的refresh() 方法介绍 AbstractApplicationContext的refresh()方法仍然是整个Spring应用程序上下文初始化的核心流程入口。大体上的刷新生命周期依然保持一致。 refresh(…

基于Spring boot + Vue协同过滤算法的电影推荐系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

[RoarCTF 2019]Online Proxy --不会编程的崽

这几天也是ctf做得有点头疼了。好些序列化的题没碰&#xff0c;一直做些sql注入类的题目。闲来无事&#xff0c;在更一次sql注入吧。 整个页面就这点信息。首先想想为什么他能获取你的ip。猜测是数据包X-Forwarded-For。 它还输出上次访问页面客户端的ip。很明显了&#xff0c…

可视化图表:饼图,展示数据的比例关系。

Hi&#xff0c;我是贝格前端工场的老司机&#xff0c;本文分享可视化图表设计的饼图设计&#xff0c;欢迎老铁持续关注我们。 可视化饼图是一种常用的数据展示方式&#xff0c;它以圆形图表的形式展示数据的比例关系。饼图通过将数据按照比例划分成不同的扇区&#xff0c;每个…

自动发卡平台源码优化版配套免签个人支付宝微信插件

这款免签个人支付宝微信插件&#xff0c;配套的是 自动发卡平台源码优化版&#xff0c;支持个人免签支付 其他系统的不支持&#xff01;

Jupyter开启远程服务器(最新版)

Jupyter Notebook 在本地进行访问时比较简单&#xff0c;直接在cmd命令行下输入 jupyter notebook 即可&#xff0c;然而notebook的作用不止于此&#xff0c;还可以用于远程连接服务器&#xff0c;这样如果你有一台服务器内存很大&#xff0c;但是呢你又不喜欢在linux上进行操作…

【计算机网络】第 11、12 问:流量控制和可靠传输机制有哪些?

目录 正文流量控制的基本方法停止-等待流量控制基本原理滑动窗口流量控制基本原理 可靠传输机制1. 停止-等待协议2. 后退 N 帧协议&#xff08;GBN&#xff09;3. 选择重传协议&#xff08;SR&#xff09; 正文 流量控制涉及对链路上的帧的发送速率的控制&#xff0c;以使接收…

MTransE阅读笔记

Multilingual Knowledge Graph Embeddings for Cross-lingual Knowledge Alignment 用于交叉知识对齐的多语言知识图谱嵌入(MTransE) Abstract 最近的许多工作已经证明了知识图谱嵌入在完成单语知识图谱方面的好处。由于相关的知识库是用几种不同的语言构建的&#xff0c;因…

Day25:统一处理异常、AOP编程、统一记录日志

表现层在最外面&#xff0c;异常在这层处理。 SpringBoot处理异常的简单实现 把error文件夹放在templates文件夹下&#xff0c;html命名为状态吗&#xff1a; 修改404.html和500.html为模版&#xff08;注意图片路径修改为动态&#xff09; 更细粒度的处理异常的方式 Control…

单例模式如何保证实例的唯一性

前言 什么是单例模式 指一个类只有一个实例&#xff0c;且该类能自行创建这个实例的一种创建型设计模式。使用目的&#xff1a;确保在整个系统中只能出现类的一个实例&#xff0c;即一个类只有一个对象。对于频繁使用的对象&#xff0c;“忽略”创建时的开销。特点&#xff1a…

目标检测+车道线识别+追踪

一种方法&#xff1a; 车道线检测-canny边缘检测-霍夫变换 一、什么是霍夫变换 霍夫变换&#xff08;Hough Transform&#xff09;是一种在图像处理和计算机视觉中广泛使用的特征检测技术&#xff0c;主要用于识别图像中的几何形状&#xff0c;尤其是直线、圆和椭圆等常见形状…

(编程实用技巧)如何减少内存占用和提高运算速度?(C语言)

一、减少内存 减少C语言程序内存占用可以从以下几个方面入手&#xff1a; 1. **合理选择数据类型**&#xff1a; - 根据实际需求选择适当的数据类型&#xff0c;避免过大类型造成不必要的内存消耗。例如&#xff0c;如果只需要表示较小的整数&#xff0c;可以使用uint8_t而非i…

踏上机器学习之路:探索数据科学的奥秘与魅力

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

samba实现linux共享文件夹

一、samba安装 sudo apt install samba 二、配置Samba 编辑Samba配置文件sudo vi /etc/samba/smb.conf 在文件末尾添加以下内容&#xff0c;设置一个简单的共享目录&#xff08;替换path_to_share为实际的共享目录路径&#xff09;&#xff1a; [Share] path /path_to_sha…

Docker进阶:使用Docker部署Harbor私有镜像仓库

Docker进阶&#xff1a;使用Docker部署Harbor私有镜像仓库 1、安装Docker和Docker Compose1、安装Docker、Docker Compose2、验证Docker和Docker Compose是否成功安装3、先启动运行docker服务 2、下载并配置Harbor1、下载最新版本的Harbor离线安装包2、配置Harbor的主机名和管理…

C#全新一代医院手术麻醉系统围术期全流程源码

目录 一、麻醉学科的起源 二、麻醉前访视与评估记录单 患者基本信息 临床诊断 患者重要器官功能及疾病情况 病人体格情况分级 手术麻醉风险评估 拟施麻醉方法及辅助措施 其他需要说明的情况 访视麻醉医师签名 访视时间 与麻醉相关的检查结果 三、手术麻醉信息系统…

数据库---PDO

以pikachu数据库为例&#xff0c;数据库名&#xff1a; pikachu 1.连接数据库 <?php $dsn mysql:hostlocalhost; port3306; dbnamepikachu; // 这里的空格比较敏感 $username root; $password root; try { $pdo new PDO($dsn, $username, $password); var_dump($pdo)…

零基础10 天入门 Web3之第1天

10 天入门 Web3 Web3 是互联网的下一代&#xff0c;它将使人们拥有自己的数据并控制自己的在线体验。Web3 基于区块链技术&#xff0c;该技术为安全、透明和可信的交易提供支持。我准备做一个 10 天的学习计划&#xff0c;可帮助大家入门 Web3&#xff1a; 想要一起探讨学习的…

C/C++ ③ —— C++11新特性

1. 类型推导 1.1 auto auto可以让编译器在编译期就推导出变量的类型 auto的使⽤必须⻢上初始化&#xff0c;否则⽆法推导出类型auto在⼀⾏定义多个变量时&#xff0c;各个变量的推导不能产⽣⼆义性&#xff0c;否则编译失败auto不能⽤作函数参数在类中auto不能⽤作⾮静态成员…