电子医嘱录入系统设计_第1页
电子医嘱录入系统设计_第2页
电子医嘱录入系统设计_第3页
电子医嘱录入系统设计_第4页
电子医嘱录入系统设计_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

./课程设计报告题目电子医嘱录入系统系别年级专业班级学号学生姓名指导教师职称讲师设计时间目录1绪论11.1课题背景和意义11.2主要研究内容12系统功能设计22.1初始化模块22.2预约模块22.3查看预约信息模块22.4删除预约信息模块32.5创建病人信息模块32.6修改病人信息模块32.7查看病人信息模块32.8保存信息并退出模块33系统详细设计43.1数据表的存储组织4病人信息数据结构4科室信息数据结构5病人预约信息数据结构5三种结构的关联63.2主要算法设计7初始化模块8预约模块9查看预约模块10删除预约模块11创建病人信息模块12修改病人信息模块13查看病人信息模块14保存信息并退出模块154系统测试164.1病人信息管理测试174.2病人预约信息管理测试214.3文件信息存取测试245总结与展望245.1全文总结24心得体会25参考文献26.1绪论1.1课题背景和意义随着社会的信息化,各个行业的管理与运营都逐渐开始使用电子系统来取代传统的管理模式。使用电子医嘱管理可以帮助医院更为便捷的管理医嘱,通过计算机技术给医院的管理人员和就诊病人在病历创建、预约查询以及记录统计等方面带来便利,为医院在管理医嘱方面提供一种更好的方式。1.2主要研究内容本系统使用C语言编写了电子医嘱管理系统,主要实现医院中医生医嘱的电子管理。通过此系统可对医嘱进行管理和维护操作,实现电子医嘱管理的一般功能。主要内容包括:电子医嘱查询。提供按照科室信息、病人信息查询;电子医嘱创建。提供病人信息、预约记录的录入功能;电子医嘱编辑。提供对系统数据的修改、删除等功能;电子医嘱维护。提供对系统数据的保存、读取等功能。系统采用菜单方式作为人机交互界面,为用户提供便捷的使用方式。用户根据菜单提示,选择所需要的服务,系统自动做出相应的响应。医嘱信息包含病人姓名、身份证号、科室名称、就诊科室等。科室信息、病人信息的读取和保存要求有一定的格式规范,录入的信息以文件的形式保存并可以对其进行浏览、查询、修改、删除等基本操作。整个程序基于链表实现,一个就诊信息的更改不影响其他的就诊记录。2系统功能设计电子医嘱管理系统是由五大功能模块组成:预约模块、查看预约信息模块、删除预约信息模块、创建病人信息模块、修改病人信息模块、查看病人信息模块、保存信息并退出模块以及初始化模块如图2.1所示。图2.1电子医嘱管理系统的功能模块2.1初始化模块创建链表并将文件中的格式化信息读取到内存链表中。2.2预约模块预约模块的操作流程包括选择预约科室,输入预约人员身份证号,若存在病人则预约,若不存在则返回主界面。2.3查看预约信息模块查看预约信息模块的操作流程包括输入预约人员身份证号码得到相关预约科室信息,若存在病人则预约,若不存在则返回主界面。2.4删除预约信息模块删除预约信息模块的操作流程包括输入预约人员身份证号码得到相关预约科室信息,选择删除预约科室删除成功返回主界面。2.5创建病人信息模块创建病人信息模块的操作流程依次输入身份证号码、姓名、年龄、性别、联系电话、住址、密码并回车添加病人信息。2.6修改病人信息模块修改病人信息模块的操作流程输入病人身份证号显示病人信息输入修改项并输入修改的内容,若退出则按0返回主界面。2.7查看病人信息模块查看病人信息模块的操作流程输入病人身份证号码显示病人信息按回车返回主界面。2.8保存信息并退出模块保存信息并退出模块的操作流程直接退出程序将链表中的信息保存到文件。3系统详细设计3.1数据表的存储组织根据2.3节中设计,系统建立病人基本信息和病人预约信息表。在系统实现中,采用内存链表和磁盘文件二级的数据存储结构来存放这些数据信息。系统将文件信息转换为内存链表,再将链表转换成磁盘文件形式。系统首先将磁盘文件数据转入内存链表,在通过对链表数据的处理,对用户请求作出响应。本系统以病人信息文件以及预约信息二份文本文件作为表单对应的磁盘存储,在内存中以结构变量的方式分别存放基本信息,并以链表的形式将所有的数据组织起来。3.1.1病人信息数据结构病人信息在内存中采用结构类型进行描述。病人结构成员包括:病人姓名、身份证号、性别、年龄、联系方式、家庭住址、密码。病人姓名、身份证号、性别、年龄、联系方式、家庭住址、密码均以字符数组的形式存储。在病人结构中有一个个结构指针,指向下一个病人结构,通过这个指针可以组成病人链表。该结构变量实现病人信息表在计算机上的存储,其结构声明如图3.1所示。typedefstructtypedefstructpatientinf{charname[10]; charnumber[19]; charsex[10]; charage[10]; chartel[20]; charaddr[20];charPassWord[5]; structpatientinf*next;}patinf;图3.1病人结构3.1.2科室信息数据结构科室信息在内存中采用结构类型进行描述。科室结构成员包括:科室名称。科室名称以指针数组的形式存储。在科室结构中有二个结构指针,一个指向下一个科室结构,通过这个指针可以组成科室信息链表,一个指向下一个病人结构,通过这个指针可以组成病人链表。该结构变量实现病人信息表在计算机上的存储,其结构声明如图3.2所示。typedefstructtypedefstructhead{ char*name; structhead*next; structpat*next_;}class_;图3.2科室结构病人预约信息数据结构病人预约信息在内存中采用结构类型进行描述。预约结构成员包括:病人身份证号。病人身份证号以字符数组的形式存储。在预约结构中有一个结构指针,指向下一个预约结构通过该指针可以将某一科室的所有预约病人链接起来,组成就诊链表。该结构变量实现病人预约信息表在计算机上的存储,其结构声明如图3.3所示。typedefstructtypedefstructpat{ charnumber[19]; structpat*next;}patient;图3.3预约结构三种结构的关联本系统数据之间以指针相结合的方式来链接系统中各类对象。系统中,科室结构中的病人身份证号以及科室编号的值将科室和预约病人关联起来。在系统实现中为了提高查询效率,查询模块实现中采用了值的相等对记录进行定位。科室、预约病人之间存在着层次关系,为了在内存中较好的体现这种层次关系,本系统采用二重链表的方式组织信息之间的关联关系。具体结构如图3.4所示。科室信息存放在二重链表的主链结点上,每个主链结点除了保存下一个结点的地址,还保存该科室的预约病人的基本信息链表头结点地址;预约病人信息存放在二重链表中相应科室的预约病人链结点上,每个结点保存下一个预约病人基本信息结点的地址。图3.4二重链表存储结构示意图病人信息存放在单链表中,具体结构如图3.5所示。病人信息结点除了保存病人信息还保存下一个结点的地址。NULL病人信息PatInfHEADNULL病人信息PatInfHEAD图3.5单链表存储结构示意图3.2主要算法设计本系统在算法设计上采用"自顶向下,逐步求精"的设计方法。由全局到局部、由整体到细节、由抽象到具体,逐步将系统的问题分解为相对简单的小规模问题。本系统依照使用功能分成几个子模块:预约模块、查看预约信息模块、删除预约信息模块、创建病人信息模块、修改病人信息模块、查看病人信息模块、保存信息并退出模块以及初始化模块。系统的总控模块的算法流程如图3.1所示。系统运行系统运行文本菜单初始化界面加载文件中存储的链表数据系统功能模块的选择和运行保存数据链表关闭系统结束图3.1主程序运行流程图初始化模块初始化模块负责将文本文件转换成内存链表。在第2章的概要设计中,系统数据分为二种基础数据,这二种系统数据要求储存到数据文件中。为便于处理每个文件,本系统将三种数据分别存放在二个文本文件中。为了实现上述功能编辑了三个子函数与一个创建单链表语句:structhead*TreeListCreat<intn>;voidPatInfToListRead<>;voidAppointedInfToListRead<>;PatInfHEAD->next=NULL;初始化的过程包括将预约信息文件、病人信息文件从数据文件中读取并存放到所创建的链表中。算法流程如图3.2所示。图3.2初始化模块运行流程图3.2.2预约模块预约模块中包括找到对应预约科室尾部结点并添加结点其中使用到四个函数:structpat*mainListLocatedSearch<char*str>;structpat*leafListTailSearch<structpat*head>;patinf*PatInfNodeSearch<char*number>;structpat*leafListnodeAdd<patient*previous>;过程包括找到所预约科室头结点然后根据头结点找到添加链表的尾结点输入信息在添加结点。算法流程如图3.3所示。图3.3预约模块运行流程图3.2.3查看预约模块查看预约模块中包括找到病人预约二重链表中所有的预约信息使用到两个子函数:voidAppointNumDisplay<>;voidPatAppointedSearch<char*str>;过程包括遍历分科室遍历二级链表然后显示预约信息。算法流程如图3.4所示。图3.4查看预约模块运行流程图3.2.4删除预约模块删除预约模块中包括找到结点位置,和找到结点前一个位置用到四个子函数:structstructpat*leafListLocatedSearch<structpat*secondlist,char*num>;structpat*mainListLocatedSearch<char*str>;structpat*leafListLocatedSearchPrevious<structpat*secondlist,char*num>;structpat*leafListLocatedSearch<structpat*secondlist,char*num>;过程包括先找到要删除结点的前一个结点位置和删除结点位置然后删除结点然后将前一个结点的位置指向下一个结点。算法流程如图3.5所示。图3.5删除预约模块运行流程图3.2.5创建病人信息模块创建病人信息模块中包括找到病人信息链表的尾结点然后添加结点使用到两个子函数:patinf*PatInfListTailSearch<>voidPatInfListnodeAdd<patinf*tail>过程包括找到病人结点尾部然后在病人结点尾部添加一个结点。算法流程如图3.6所示。图3.6创建病人信息模块运行流程图3.2.6修改病人信息模块修改病人信息模块中使用到一个子函数:patinf*PatInfNodeSearch<char*number>;过程包括找到结点然后修改内容。算法流程如图3.7所示。图3.7修改病人信息模块运行流程图3.2.7查看病人信息模块查看病人信息模块中使用到一个子函数:patinf*PatInfNodeSearch<char*number>;过程包括找到结点然后显示内容。算法流程如图3.8所示。图3.8查看病人信息模块运行流程图3.2.8保存信息并退出模块保存信息并退出模块中使用到两个子函数:voidPatListInfSave<>;voidAppointListInfSave<>;过程包括保存格式化的病人信息到文件和保存格式化的预约信息到文件然后退出程序。算法流程如图3.9所示。图3.9保存信息并退出模块运行流程图4系统测试软件测试即使用人工或者自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。随着软件测试技术的不断发展,测试方法也越来越多样化,针对性更强;选择合适的软件测试方法可以让测试事半功倍。常用的软件测试方法有:黑盒测试、白盒测试、静态测试、动态测试、自动化测试、功能测试、集成测试、场景测试、系统测试等。本系统的测试针对系统的功能进行检查,以功能进行分类,对几个模块进行测试。4.1病人信息管理测试运行程序首先创建病人信息如图4.1.1所示图4.1.1创建病人信息然后可选择修改病人信息如图4.1.2所示图4.1.2修改病人信息可修改多项病人信息如图所示图4.1.3修改多项病人信息也可查看病人信息如图4.1.4所示图4.1.4查看病人信息4.2病人预约信息管理测试创建病人信息后便可开始预约如图4.2.1所示图4.2.1预约科室也可查输入病人身份证查看预约信息如图4.2.2所示图4.2.2查看预约信息还可删除预约如图4.2.3所示图4.2.4删除预约信息4.3文件信息存取测试初始化会打开"病人信息.txt"与"科室信息.txt"读取信息如果文件不存在则会创建,程序退出选择"7.保存信息并退出",链表中的信息会保存到文件中5总结与展望5.1全文总结本文使用C语言实现了《电子医嘱管理系统》,实现了课程设计的功能要求,能够正确运行。从实用和性能方面可以进一步加以改善。〔1完整性。可通过增加科室名单表等方法,对输入信息进行完整性检查。如果输入科室名称与名单表不符,则该信息视为无效。对年龄设置上下限,以保证数据的合理性。〔2安全性。在系统中可以增加多种角色的登陆方式,提高系统的安全性。对于不同角色的用户,给与不同的操作权限,从而保证系统内部数据的安全性。在登陆时可加入口令认证,确保用户身份的正确性。〔3性能优化。对内部数据建立索引表,对索引表进行二分查找,提高查询速度。对链表可以采用双向十字链表结构存储,提高信息处理的速度。心得体会刚开始看到题目时一头雾水,不知该从何处下手,,因为平时只做过一些输入输出的普通小程序,根本没有界面的概念。于是我就想如果先运行一下书上提供的样例程序,脑中大概也就有了一些概念和想法。可是把书上提供的几个代码拿来一运行编译error就有几十行,面对那上千行的代码,我就不知该怎么下手了。后来实在没办法,首先拿起那本《C语言实验与课程设计》看了三天,大概懂了一些函数的用法,就开始将书上的代码一段一段的输入进去跑一跑,慢慢的就大概懂了怎么来实现那些界面。首先把那个任务说明看了几遍,就将程序主要分成五大块内容:〔1文件处理功能:首先得有将数据信息保存的功能,这就得用到老师讲的"文件"那章的知识,我又拿起课本看了几遍。其次还得有数据备份的功能,以备在重大失误后能找回一些数据,将损失降低。有了备份,还得有恢复备份数据地功能。最后必须有安全退出系统的功能。〔2数据处理功能:首先得让系统能读入操作者输入的数据并将数据存储在文件中。然后如果操作者输入数据有误那还得有对数据修改,部分数据删除,以及数据添加的功能。〔3查询功能:第一可以按照科室编号来查询,第二还可以按照病人身份证号查询,第三还可以按照科室编号,病人身份证及就诊日期进行多条件统计查询。〔4统计信息功能:最重要的要有日就诊人数统计功能,其次还可以有病人就诊历史,就诊病人年龄分类的统计。〔5系统帮助功能:第一得告诉操作者本系统的用途,然后告诉怎样操作使用系统以及一些基本的操作快捷功能。最后,当屏幕上显示的信息过多时还得有清理屏幕的功能,以方便用户观看数据。接下来就是一一实现那些功能。通过运用课堂上讲过的数组,指针,文件等知识,编写了链表的创建,之后是将链表的内容写入到文件中保存,并将文件中写入的内容再次逐条读取出来,显示在屏幕上。这个主体写完了,接下来就开始写科室、病人等信息的查询函数,这个就比较容易点。还有就是我想写一个能将同一病人在不同科室下的所有就诊记录全部显示的功能,方便病人查询自己就诊历史。最后就是调试程序了。这个应该是整个课程设计中最为复杂和难搞的部分。首先是整个系统,光是函数就有几十个,而且经常是一个函数中又调用着若干其它函数,这样调试起来就比较困难,因为就算一个函数里,一点小小的错误就会引起连锁反应导致其它函数都出错,而且有些错误时隐性的,就是可能在这个函数中运行没问题,可在哪个函数中运行起来又有大问题。所以调试也是最耗时间和精力的一个环节,有时候我为了测试一个函数的功能是否稳定,我得将程序跑很多次,一遍又一遍的运行,看看有没有一些不足的地方,有没有一些隐藏的问题,然后又得静下心来仔细分析问题原因所在并慢慢地纠正并再次调试运行,直到满意为止。差不多有连续十来天我有空就将程序跑一跑,看看有没有大问题潜藏在其中,一经发现立刻将它修正。这十来天我也体会调试员真还得过硬的基础知识,能敏锐觉察出代码中的错误,而且还得有足够的精力和耐力。尽管程序系统算是完成了,但是开始写报告时才发现原来课程设计才刚完成了一半而已。还得将当初的构思、想法、到实现、再到最后的调试,这其中每个环节的步骤用文字的形式记录下来,好让其他人也能了解你当初的想法。其实有些想法有你自己特异的思维方式,也许口头说说还行,真得写下来,并让别人也看懂,并不那么容易。在本次C课程设计构思创作过程中,得到了老师的大力帮助和支持,在此表示衷心的感谢,感谢提供无私的帮助和支持的老师们!感谢他们默默无闻的奉献!另外也要感谢热心的同学们,他们在我的设计过程中给与了很多的建议与帮助。参考文献[1]曹计昌,卢萍,李开.C语言程序设计,北京:科学出版社,2008[2]张引.C程序设计基础课程设计,XX:XX大学出版社,2007[3]黄明,梁旭,万洪莉.C语言课程设计,北京:电子工业出版社,2006[4]BrainWKernighan,DennisMRitchie.THECPROGRAMMINGLANGUAGE.北京:清华大学出版社。PRENTICEHALL,2011.[5]ISO/IEC的C语言标准。ISO/IEC9899:2011[6]秦友淑,曹化工。C语言程序设计教程〔第二版。[7]田淑清.二级教程-C语言程序设计<2008年版>[8]刘振安.C语言程序设计[M].机械工业出版社,2007#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<string.h>#include<time.h>#include<Windows.h>#defineN5/*科室数量*/time_t_Curtime=<time_t>0;structtm*_RetTime=NULL;/**@功能:定义patient结构体*@输入:*@返回:*@*/typedefstructpatientinf{charnumber[19];charPassWord[5];charname[10];charage[10];charsex[10];chartel[20];charaddr[20];structpatientinf*next;}patinf;/**@功能:定义patient结构体*@输入:*@返回:*@*/typedefstructpat{charnumber[19];chartime[20];structhead*_next;structpat*next;}patient;/**@功能:定义class_结构体*@输入:*@返回:*@*/typedefstructhead{char*name;structhead*next;structpat*next_;}class_;/*定义一个大头*/class_*ALL=<structhead*>malloc<sizeof<structhead>>;/*定义病人信息链表头*/patinf*PatInfHEAD=<patinf*>malloc<sizeof<patinf>>;charstrhead2[5]={"头"};charSTR[N][12]={"内科","外科","儿科","骨科","皮肤科"};charStrfilepat[17]="病人信息.txt";charStrfileappointed[17]="预约信息.txt";/**@功能:从文件中读入预约信息*@输入:*@返回:*@*/voidAppointListInfSave<>;/**@功能:从文件中读入预约信息*@输入:*@返回:*@*/voidAppointedInfToListRead<>;/**@功能:显示各个科室预约人数信息*@输入:*@返回:*@*/voidAppointNumDisplay<>;/**@功能:从文件中读入科室信息*@输入:*@返回:*@*/voidClassMessageDisplay<intnumber>;/**@功能:遍历链表所有元素*@输入:链表头结点,匹配元素*@*@返回:结点位置<结点地址>*@*/structpat*leafListLocatedSearch<structpat*secondlist,char*num>;/**@功能:遍历链表所有元素*@输入:链表头结点,匹配元素*@*@返回:结点位置的上一个位置*@*/structpat*leafListLocatedSearchPrevious<structpat*secondlist,char*num>;/**@功能:向结点尾部添加结点*@输入:叶子结点*@返回:尾结点*@*/structpat*leafListnodeAdd<patient*previous>;/**@功能:向结点尾部添加结点*@输入:叶子结点*@返回:尾结点*@*/structpat*leafListnodeandNumAdd<char*Num,patient*previous>;/**@功能:遍历链表所有元素*@输入:链表头结点*@*@返回:结点个数*@*/charleafListnumSearch<structpat*secondlist>;/**@功能:找到树枝尾部*@输入:树枝头部结点*@返回:尾部位置<尾部地址>*@*/structpat*leafListTailSearch<structpat*head>;/**@功能:遍历链表所有元素*@输入:链表头结点<structhead*mainlist,char*str>*@*@返回:副链表头*@*/structpat*mainListLocatedSearch<char*str>;/**@功能:遍历链表所有元素*@输入:链表头结点<structhead*mainlist>*@*@返回:结点位置<结点地址>*@*/charmainListnumSearch<structhead*mainlist>;/**@功能:从病人链表中遍历病人信息*@输入:*@返回:*@*/voidPatAppointedSearch<char*str>;/**@功能:改变病人信息*@输入:病人身份证号*@返回:*@*/voidPatInfChange<char*number>;/**@功能:向病人信息链表末端添加元素*@输入:patinf*tail*@返回:*@*/voidPatInfListnodeAdd<patinf*tail>;/**@功能:找到病人信息链表末端*@输入:*@返回:末端结点地址*@*/patinf*PatInfListTailSearch<>;/**@功能:遍历病人信息链表找到病人结点的前一结点*@输入:病人身份证号*@返回:病人节点的前一结点位置*@*/patinf*PatInfNodePreviousSearch<char*number>;/**@功能:遍历病人信息链表找到病人结点*@输入:病人身份证号*@返回:病人节点位置*@*/patinf*PatInfNodeSearch<char*number>;/**@功能:从文件中读入病人信息*@输入:*@返回:*@*/voidPatInfToListRead<>;/**@功能:保存病人信息到链表*@输入:*@返回:*@*/voidPatListInfSave<>;/**@功能:创建主干链表与叶子连接结点*@输入:主干结点个数*@返回:主干头结点*@*/structhead*TreeListCreat<intn>;/**@功能:创建主干链表与叶子连接结点*@输入:主干结点个数*@返回:主干头结点*@*/structhead*TreeListCreat<intn>{inti;structhead*h,*p1,*p2;structpat*pat[N];h=NULL;for<i=0;i<n;i++>{p1=<structhead*>malloc<sizeof<structhead>>;/*动态分配内存空间,并数据转换为<structhead>类型*/pat[i]=<structpat*>malloc<sizeof<structpat>>;/*为结点分配空间*/p1->name=*<STR+i>;strcpy_s<pat[i]->number,5,strhead2>;pat[i]->next=NULL;/*尾结点的后继指针为NULL<空>*/pat[i]->_next=h;/*尾结点的后继指针为h*/p1->next_=pat[i];/*返回链表的头指针*/if<h==NULL>/*指定链表的头指针*/{h=p1;p2=p1;}else{p2->next=p1;p2=p1;}p2->next=NULL;/*尾结点的后继指针为NULL<空>*/}returnh;/*返回链表的头指针*/}/**@功能:向结点尾部添加结点*@输入:叶子结点*@返回:尾结点*@*/structpat*leafListnodeAdd<patient*previous>{structpat*tail;tail=<structpat*>malloc<sizeof<structpat>>;/*动态分配内存空间,并数据转换为<structpat>类型*/printf<"请输入身份证号:">;scanf_s<"%s",tail->number,19>;if<PatInfNodeSearch<tail->number>==0>return0;tail->next=NULL;/*尾结点的后继指针为NULL<空>*/tail->_next=ALL;/*尾部结点_next指向ALL大头*/if<previous->next==NULL>previous->next=tail;returntail;/*返回尾结点*/}/**@功能:向结点尾部添加结点*@输入:叶子结点*@返回:尾结点*@*/structpat*leafListnodeandNumAdd<char*Num,patient*previous>{structpat*tail;tail=<structpat*>malloc<sizeof<structpat>>;/*动态分配内存空间,并数据转换为<structpat>类型*/strncpy_s<tail->number,Num,19>;//tail->next=NULL;/*尾结点的后继指针为NULL<空>*/tail->_next=ALL;/*尾部结点_next指向ALL大头*/if<previous->next==NULL>previous->next=tail;/*head指向创建的结点*/returntail;/*返回尾结点*/}/**@功能:遍历链表所有元素*@输入:链表头结点<structhead*mainlist>*@*@返回:结点位置<结点地址>*@*/charmainListnumSearch<structhead*mainlist>{chara=0;/*创建临时变量*/structhead*mainTemp=<structhead*>malloc<sizeof<structhead>>;{mainTemp=mainlist;printf<"\n">;while<1>{a++;printf<"%d.%s:\n",a,mainTemp->name>;if<mainTemp->next==NULL>{printf<"\n">;}returna;mainTemp=mainTemp->next;}}}/**@功能:遍历链表所有元素*@输入:链表头结点<structhead*mainlist,char*str>*@*@返回:副链表头*@*/structpat*mainListLocatedSearch<char*str>{inta=0;/*创建临时变量*/structhead*p=<structhead*>malloc<sizeof<structhead>>;{p=ALL->next;while<1>{if<strcmp<p->name,str>==0>{returnp->next_;}a++;if<p->next==NULL>break;p=p->next;}}return0;}/**@功能:遍历链表所有元素*@输入:链表头结点,匹配元素*@*@返回:结点位置<结点地址>*@*/structpat*leafListLocatedSearch<structpat*secondlist,char*num>{/*创建临时变量*/structpat*secTemp=<structpat*>malloc<sizeof<structpat>>;secTemp=secondlist;while<1>{if<strcmp<secTemp->number,num>==0>{printf<"找到:%s\n",num>;returnsecTemp;//???}if<secTemp->next==NULL>break;secTemp=secTemp->next;}printf<"未找到:%s\n",num>;return0;}/**@功能:遍历链表所有元素*@输入:链表头结点,匹配元素*@*@返回:结点位置的上一个位置*@*/structpat*leafListLocatedSearchPrevious<structpat*secondlist,char*num>{/*创建临时变量*/structpat*Previous,*secTemp=<structpat*>malloc<sizeof<structpat>>;secTemp=secondlist;while<1>{if<strcmp<secTemp->number,num>==0>{printf<"找到:%s\n",num>;returnPrevious;}if<secTemp->next==NULL>break;Previous=secTemp;secTemp=secTemp->next;}printf<"未找到:%s\n",num>;return0;}/**@功能:遍历链表所有元素*@输入:链表头结点*@*@返回:结点个数*@*/charleafListnumSearch<structpat*secondlist>{chara=0;/*创建临时变量*/structpat*secTemp=<structpat*>malloc<sizeof<structpat>>;{secTemp=secondlist;while<1>{if<strcmp<secTemp->number,strhead2>==0>;elsea++;if<secTemp->next==NULL>break;secTemp=secTemp->next;}}returna;}/**@功能:找到树枝尾部*@输入:树枝头部结点*@返回:尾部位置<尾部地址>*@*/structpat*leafListTailSearch<structpat*head>{structpat*Temp;/*创建临时变量*/Temp=head;while<Temp->next!=NULL>{Temp=Temp->next;}returnTemp;}/**@功能:显示各个科室预约人数信息*@输入:*@返回:*@*/voidAppointNumDisplay<>{patient*p;class_*cp;cp=ALL->next;printf<"\n">;for<inti=0;;i++>{printf<"%d.%s:",i,cp->name>;p=cp->next_;printf<"%d人\n",leafListnumSearch<p>>;if<cp->next==NULL>break;cp=cp->next;}printf<"\n">;}/**@功能:从病人链表中遍历病人信息*@输入:*@返回:*@*/voidPatAppointedSearch<char*str>{patient*p;class_*cp;cp=ALL->next;while<1>{printf<"%s\n",cp->name>;p=leafListLocatedSearch<cp->next_,str>;if<cp->next==NULL>break;cp=cp->next;}}/**@功能:找到病人信息链表末端*@输入:*@返回:末端结点地址*@*/patinf*PatInfListTailSearch<>{patinf*p=<patinf*>malloc<sizeof<patinf>>;p=PatInfHEAD;while<1>{if<p->next==NULL>break;elsep=p->next;}returnp;}/**@功能:向病人信息链表末端添加元素*@输入:patinf*tail*@返回:*@*/voidPatInfListnodeAdd<patinf*tail>{patinf*p=<patinf*>malloc<sizeof<patinf>>;tail->next=p;printf<"\n">;printf<"输入病人信息:\n">;printf<"身份证号:">;scanf_s<"%s",p->number,19>;printf<"姓名:">;scanf_s<"%s",p->name,10>;printf<"年龄:">;scanf_s<"%s",p->age,10>;printf<"性别:">;scanf_s<"%s",p->sex,10>;printf<"联系电话:">;scanf_s<"%s",p->tel,20>;printf<"住址:">;scanf_s<"%s",p->addr,20>;printf<"密码:">;scanf_s<"%s",p->PassWord,5>;printf<"\n">;p->next=NULL;}/**@功能:遍历病人信息链表找到病人结点*@输入:病人身份证号*@返回:病人节点位置*@*/patinf*PatInfNodeSearch<char*number>{patinf*p;p=PatInfHEAD;while<1>{if<strcmp<p->number,number>==0>returnp;if<p->next==NULL>break;elsep=p->next;}return0;}/**@功能:遍历病人信息链表找到病人结点的前一结点*@输入:病人身份证号*@返回:病人节点的前一结点位置*@*/patinf*PatInfNodePreviousSearch<char*number>{patinf*p,*temp;p=PatInfHEAD;while<1>{if<strcmp<p->number,number>==0>returntemp;if<p->next==NULL>break;else{temp=p;p=p->next;}}return0;}/**@功能:改变病人信息*@输入:病人身份证号*@返回:*@*/voidPatInfChange<char*number>{patinf*p;charn;chartemp[50];p=PatInfNodeSearch<number>;while<1>{printf<"\n">;printf<"病人信息:\n">;printf<"1.身份证号:%s\n",p->number>;printf<"2.姓名:%s\n",p->name>;printf<"3.年龄:%s\n",p->age>;printf<"4.性别:%s\n",p->sex>;printf<"5.联系电话:%s\n",p->tel>;printf<"6.住址:%s\n",p->addr>;printf<"7.密码:%s\n",p->PassWord>;printf<"\n">;printf<"输入:">;scanf_s<"%d",&n,1>;switch<n>{case1:{printf<"1.身份证号:%s\n",p->number>;printf<"请输入要改成的内容:\n">;scanf_s<"%s",temp,19>;strncpy_s<p->number,temp,19>;}break;case2:{printf<"2.姓名:%s\n",p->name>;printf<"请输入要改成的内容:\n">;scanf_s<"%s",temp,10>;strncpy_s<p->name,temp,10>;}break;case3:{printf<"3.年龄:%s\n",p->age>;printf<"请输入要改成的内容:\n">;scanf_s<"%s",temp,10>;strncpy_s<p->age,temp,10>;}break;case4:{printf<"4.性别:%s\n",p->sex>;printf<"请输入要改成的内容:\n">;scanf_s<"%s",temp,10>;strncpy_s<p->sex,temp,10>;}break;case5:{printf<"5.联系电话:%s\n",p->tel>;printf<"请输入要改成的内容:\n">;scanf_s<"%s",temp,20>;strncpy_s<p->tel,temp,20>;}break;case6:{printf<"6.住址:%s\n",p->addr>;printf<"请输入要改成的内容:\n">;scanf_s<"%s",temp,20>;strncpy_s<p->addr,temp,20>;}break;case7:{printf<"7.密码:%s\n",p->PassWord>;printf<"请输入要改成的内容:\n">;scanf_s<"%s",temp,5>;strncpy_s<p->PassWord,temp,5>;}break;}printf<"\n">;printf<"病人信息:\n">;printf<"1.身份证号:%s\n",p->number>;printf<"2.姓名:%s\n",p->name>;printf<"3.年龄:%s\n",p->age>;printf<"4.性别:%s\n",p->sex>;printf<"5.联系电话:%s\n",p->tel>;printf<"6.住址:%s\n",p->addr>;printf<"7.密码:%s\n",p->PassWord>;printf<"\n">;printf<"是否修改完成<是请按0>">;printf<"输入:">;scanf_s<"%d",&n,1>;if<n==0>return;}}/**@功能:保存病人信息到链表*@输入:*@返回:*@*/voidPatListInfSave<>{patinf*p;FILE*fp=NULL;p=PatInfHEAD->next;if<<fp=fopen<"病人信息.txt","w+">>==NULL>{printf<"无法打开文件\n">;}fprintf<fp,"$病人信息:\n">;for<inti=0;;i++>{fprintf<fp,"\n">;fprintf<fp,"$1$%s$\n",p->number>;fprintf<fp,"$2$%s$\n",p->name>;fprintf<fp,"$3$%s$\n",p->age>;fprintf<fp,"$4$%s$\n",p->sex>;fprintf<fp,"$5$%s$\n",p->tel>;fprintf<fp,"$6$%s$\n",p->addr>;fprintf<fp,"$7$%s$\n\n",p->PassWord>;fprintf<fp,"\n">;if<p->next==NULL>break;elsep=p->next;}time<&_Curtime>;_RetTime=localtime<&_Curtime>;fprintf<fp,"\n更新时间:%04d-%02d-%02d%02d:%02d%02d\n",_RetTime->tm_year+1900,_RetTime->tm_mon+1,_RetTime->tm_mday,_RetTime->tm_hour,_RetTime->tm_min,_RetTime->tm_sec>;fclose<fp>;}/**@功能:从文件中读入预约信息*@输入:*@返回:*@*/voidAppointListInfSave<>{class_*cp;FILE*fp=NULL;patient*secTemp;cp=ALL->next;fp=fopen<"预约信息.txt","w+">;while<1>{secTemp=cp->next_;for<inti=0;;i++>{if<i!=0>fprintf<fp,"*%s*%s*%d*\n",cp->name,secTemp->number,i>;if<secTemp->next==NULL>break;secTemp=secTemp->next;}fprintf<fp,"***\n">;if<cp->next==NULL>break;cp=cp->next;}time<&_Curtime>;_RetTime=localtime<&_Curtime>;fprintf<fp,"\n更新时间:%04d-%02d-%02d%02d:%02d%02d\n",_RetTime->tm_year+1900,_RetTime->tm_mon+1,_RetTime->tm_mday,_RetTime->tm_hour,_RetTime->tm_min,_RetTime->tm_sec>;fclose<fp>;}/**@功能:从文件中读入病人信息*@输入:*@返回:*@*/voidPatInfToListRead<>{FILE*fp;charstrLine[1024];patinf*h,*p1,*p2;h=NULL;//读取缓冲区if<<fp=fopen<"病人信息.txt","w+">>==NULL>//判断文件是否存在及可读{printf<"无病人信息\n">;return;}while<!feof<fp>>//循环读取每一行,直到文件尾{fgets<strLine,1024,fp>;//将fp所指向的文件一行内容读到strLine缓冲区//printf<"%s",strLine>;//输出所读到的内容//DOSOMETHINGELSEif<strLine[0]=='$'&&strLine[2]=='$'>{switch<strLine[1]>{case'1':{p1=<patinf*>malloc<sizeof<patinf>>;for<inti=3;i<1024;i++>{if<strLine[i]=='$'>{*<p1->number+i-3>='\0';break;}*<p1->number+i-3>=strLine[i];}break;}case'2':for<inti=3;i<1024;i++>{if<strLine[i]=='$'>{*<p1->name+i-3>='\0';break;}*<p1->name+i-3>=strLine[i];}break;case'3':for<inti=3;i<1024;i++>{if<strLine[i]=='$'>{*<p1->age+i-3>='\0';break;}*<p1->age+i-3>=strLine[i];}break;case'4':for<inti=3;i<1024;i++>{if<strLine[i]=='$'>{*<p1->sex+i-3>='\0';break;}*<p1->sex+i-3>=strLine[i];}break;case'5':for<inti=3;i<1024;i++>{if<strLine[i]=='$'>{*<p1->tel+i-3>='\0';break;}*<p1->tel+i-3>=strLine[i];}break;case'6':for<inti=3;i<1024;i++>{if<strLine[i]=='$'>{*<p1->addr+i-3>='\0';break;}*<p1->addr+i-3>=strLine[i];}break;case'7':{for<inti=3;i<1024;i++>{if<strLine[i]=='$'>{*<p1->PassWord+i-3>='\0';break;}*<p1->PassWord+i-3>=strLine[i];}if<h==NULL>/*指定链表的头指针*/h=p1;elsep1->next=p2;p2=p1;p2->next=NULL;}break;}}}PatInfHEAD->next=h;/*将字符串写入节点链表头过继到PatInfHEAD*/}/**@功能:从文件中读入预约信息*@输入:*@返回:*@*/voidAppointedInfToListRead<>{FILE*fp;charstrLine[1024];charTemp[1024];charTemp2[1024];inti,j;patient*h;structpat*pp;h=NULL;//读取缓冲区if<<fp=fopen<"预约信息.txt","w+">>==NULL>//判断文件是否存在及可读{printf<"OpenFalied!">;}while<!feof<fp>>//循环读取每一行,直到文件尾{fgets<strLine,1024,fp>;//将fp所指向的文件一行内容读到strLine缓冲区//DOSOMETHINGELSEif<strLine[0]=='*'&&strLine[1]!='*'&&strLine[2]!='*'>//if<strLine[0]=='*'>{for<j=1;;j++>{if<strLine[j]=='*'||strLine[j]==''>{Temp[j-1]='\0';break;}Temp[j-1]=strLine[j];}for<i=j+1;;i++>{if<strLine[i]=='*'||strLine[i]==''>{Temp2[i-j-1]='\0';break;}Temp2[i-j-1]=strLine[i];}/*printf<"%s",Temp>; printf<"%s",Temp2>; */pp=mainListLocatedSearch<Temp>;if<pp!=0>leafListnodeandNumAdd<Temp2,leafListTailSearch<pp>>;}}}/**@功能:从文件中读入科室信息*@输入:*@返回:*@*/voidClassMessageDisplay<intnumber>{charch;FILE*fp=NULL;switch<number>{//不到文件结束就循环//输出一个字符case0:{fp=fopen<"内科.txt","r">;while<<ch=fgetc<fp>>!=EOF>putchar<ch>;fclose<fp>;}break;case1:{fp=fopen<"外科.txt","r">;while<<ch=fgetc<fp>>!=EOF>putchar<ch>;fclose<fp>;}break;case2:{fp=fopen<"儿科.txt","r">;while<<ch=fgetc<fp>>!=EOF>putchar<ch>;fclose<fp>;}break;case3:{fp=fopen<"骨科.txt","r">;while<<ch=fgetc<fp>>!=EOF>putchar<ch>;fclose<fp>;}break;case4:{fp=fopen<"皮肤科.txt","r">;while<<ch=fgetc<fp>>!=EOF>putchar<ch>;fclose<fp>;}break;}}/**@功能:主函数*@输入:*@返回:*@*/voidmain<>{charnumber[19];chara;charstr[5];patient*p;patient*Previous;class_*cp;patient*Temp;patinf*pp;PatInfHEAD->next=NULL;ALL->next=TreeListCreat<N>;PatInfToListRead<>;AppointedInfToListRead<>;while<1>{printf<"电子医嘱录入系统V2\n">;printf<"1.预约\n2.查看预约信息\n3.删除预约信息\n4.创建病人信息\n5.修改病人信息\n6.查看病人信息\n7.保存信息退出\n">;printf<"\n">;printf<"输入:">;scanf_s<"%d",&a,1>;if<a==1>{chara;printf<"预约:\n">;AppointNumDisplay<>;printf<"输入预约科室序号:">;scanf_s<"%d",&a,1>;// ClassMessageDisplay<a>;Temp=leafListnodeAdd<leafListTailSearch<mainListLocatedSearch<*<STR+a>>>>;if<Temp==0>{printf<"未找到病人\n请返回创建病人信息\n">;}elseprintf<"预约成功\n">;system<"pause">;system<"cls">;}if<a==2>{printf<"查看预约信息:\n">;AppointNumDisplay<>;printf<"输入病人身份证号:">;scanf_s<"%s",str,5>;printf<"\n">;PatAppointedSearch<str>;printf<"\n">;printf<"查找成功\n">;system<"pause">;system<"cls">;}if<a==3>{printf<"输入病人身份证号:">;scanf_s<"%s",str,5>;cp=ALL->next;printf<"\n">;a=0;for<inti=0;;i++>{printf<"%d.%s\n",i,cp->name>;p=leafListLocatedSearch<cp->next_,str>;if<p==0>a++;if<cp->next==NULL>break;cp=cp->next;}if<a==N>{gotoEND;}printf<"\n">;printf<"选择删除预约科室\n">;printf<"输入:">;scanf_s<"%d",&a,1>;/*删除点的位置*/Previous=mainListLocatedSearch<*<STR+a>>;Previous=leafListLocatedSearchPrevious<Previous,str>;p=mainListLocatedSearch<*<STR+a>>;p=leafLi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论