精华内容
下载资源
问答
  • 宏达销售清单管理系统是对针对企业商品销售的一款软件,包括基本信息、销售管理、查询统计三个模块。系统包含以下功能:1、基本信息:商品信息2、销售管理、销售管理、后期付
  • 项目管理交付清单

    2015-05-27 15:46:52
    根据项目大小,提供不同的交付内容,适用于各种信息化项目。大概分段为2段式,3段式....5段式。
  • CRM客户管理 完全手册 有效管理 计划管理 销售合同管理系统 开票管理 帐款管理 业绩考核管理 市场 信息 促销品广告 统计报表 公共关系管理
  • 超市管理系统日常功能实现

    千次阅读 2019-03-02 18:47:20
    模拟真实的库存管理逻辑,完成超市管理系统的日常功能的实现 ——————————欢迎光临itcast超市—————————— 1:货物清单 2:添加新货物 3:删除货物 4:修改货物 5:退出系统 请您输入要操作的...

    模拟真实的库存管理逻辑,完成超市管理系统的日常功能的实现
    ——————————欢迎光临itcast超市——————————
    1:货物清单 2:添加新货物 3:删除货物 4:修改货物 5:退出系统
    请您输入要操作的功能序号:
    ————————————————————
    输入1:货物清单
    ——————————商品库存清单——————————
    商品编号 商品名称 商品单价
    9001 少林寺酥饼核桃 120.0
    9002 尚康杂粮牡丹饼 20.0
    9003 新疆原产哈密瓜 7.0

    输入2:添加新货物
    请输入新水果的名称:斯柯达苹果醋
    请输入新水果的编号:9523
    请输入新水果的单价:19.9

    输入3:删除货物
    请输入您要删除的水果编号:9523
    水果信息删除完毕!

    输入4:修改货物
    请输入你要修改信息的水果编号:9002
    请输入新的水果编号:2002
    请输入新的水果名称:味道好凤梨干
    请输入新的水果单价:6.5
    水果信息更新完成!

    输入5.退出系统

    ——
    案例需求分析
    1.完成超市商品初始化。创建商品,将商品添加到集合
    2.显示来到超市能做的操作,也就是显示主菜单
    3.根据收到的功能选项,执行对应的功能
    3.1.库存货物查询
    3.2.添加新货物
    3.3.删除货物
    3.4.修改货物
    3.5.推出系统,结束main方法的运行
    4.循环,回到 2.显示主菜单

    展开全文
  • 医院信息管理系统需求分析

    万次阅读 多人点赞 2019-10-04 01:44:22
    医院信息管理系统 一、导言 1.1 编写目的 本需求说明文档描述了医院管理系统项目的要求,作为系统设计、项目目标以及项目验收的依据。需求分析详细描述了用户对功能的需求、对性能的需求以及对运行环境的需求。 软件...

    医院信息管理系统1.0
    一、导言
    1.1 编写目的

    本需求说明文档描述了医院管理系统项目的要求,作为系统设计、项目目标以及项目验收的依据。需求分析详细描述了用户对功能的需求、对性能的需求以及对运行环境的需求。
    软件开发小组的每位成员应该阅读本需求说明,明确项目最后要求完成的软件产品的特点。
    1.2 项目范围
    本文档主要涉及“医院信息管理系统”的应用模型和功能需求描述
    1.3 参考资料
    《软件工程案例教程》 韩万江等 机械工业出版社
    《软件工程导论》 张海藩等 清华大学出版社

    二、项目介绍
    2.1 项目背景

    本项目是针对《软件工程导论》课程的需要而建设成的网站,以加强医院与患者之间的联系以及方便公民就医为目的而建设的网站。
    2.2 项目目标
    本项目将所有的功能化为X个模块:职工系统管理、患者信息管理、科室信息管理、药物系统管理

    三、应用环境
    服务器配置如下
    操作系统:Windows XP及以上
    CPU:Intel i5酷睿双核及以上
    内存:16G及以上
    硬盘空间:100G以上
    软件配置如下:
    开发工具:MyEclipse
    数据库:SQL Server
    Web服务器:Tomcat

    四、功能规格
    4.1系统角色分析

    角色或执行者是与系统产生交互的外部用户或者外部系统。本系统的使用角色主要分为医院职工(包括医生,护士,药房工作人员,行政人员等等),患者,管理员三种。以下是对每个角色的详细介绍。
    不同角色将拥有不同权限,即使用过程中功能配置不同。其中职工部分人员可拥有多重身份。
    4.1.1医院职工
    此类角色无需注册,由后台管理员分配账号。
    1、医生
    医生可在该系统进行登陆,可用功能主要有,查看本科室工作安排表,查看本科室病患信息(包括电子病历,检查报告等),可撰写电子病历,开出取药单,并对电子病历和取药单可进行导出打印。
    2、护士
    护士可在该系统进行登陆,可用功能主要有,查看本科室工作安排表,查看本科室病患信息(包括电子病历,检查报告等),可撰写医嘱和护理记录。
    3、药房工作人员
    药房工作人员可在该系统进行登陆,可用功能主要有,查询药物信息,查看病患药物信息,对药品出库入库进行修改登记。
    4、财务工作人员
    财务工作人员可在该系统进行登陆,可用功能主要有,对患者缴费情况进行查询和登记。
    5、行政人员
    行政人员可在该系统进行登陆,可用功能主要有,查看所有医院职工信息,可上传科室工作安排表,查看医院各种统计数据等。
    4.1.2 患者
    此类角色在第一次使用系统时需要进行注册,并登记真实身份信息。
    患者可用功能主要有查看科室信息,查看医生护士职工信息,可进行预约挂号或取消挂号,查看本人历史病历记录,检查报告,用药记录,缴费记录等。
    4.1.3 管理员
    此类角色为固定账号。
    管理员可在该系统进行登陆,可用功能为,管理医院职工信息,管理患者信息,管理科室信息,统计数据管理,药品信息管理,项目收费管理。
    4.2主用例图
    在这里插入图片描述
    4.3 客户端子系统
    在这里插入图片描述
    4.3.1 登陆系统
    角色:医院职工,患者,管理员
    目的:用户登录系统
    用例描述:
    1、用户进入系统首页。
    2、系统显示登陆界面,用户输入用户名和密码,单击确定。
    3、系统检查是否有此用户信息,若存在此用户,用户进入系统;若不存在此用户,本页显示相应的错误信息。
    4.3.2 注册系统
    角色:患者
    目的:用户注册
    用例描述:
    1、用户进入系统首页,点击用户注册。
    2、系统显示注册页面,用户输入相关的身份信息,单击确定。
    3、设置用户名为真实姓名。密码不足6位或者超过16位时,提示“密码必须为6位 以上,16位以下”。
    4、绑定就诊卡号。
    5、系统经过后台确认数据合法后提示注册成功。
    4.3.3 工作安排
    角色:医院职工
    目的:查看本科室工作安排
    用例描述:
    1、用户处于登陆成功后的界面,点击工作安排模块。
    2、显示最新十周工作安排表附件列表,一周一附件模式,点击进行下载。
    不同身份登陆详细说明:
    行政人员:增加上传附件功能。其余人员无此功能,只能进行下载查看。
    4.3.4 患者信息查询
    角色:医生,护士,药房工作人员,财务工作人员,患者
    目的:查询患者身份信息及其他信息。
    用例描述:
    1、用户处于登陆成功后的界面,点击患者信息查询模块。
    2、三选一输入框,就诊卡号,患者姓名,身份证号;输入一项即可点击确定查询;出现同名患者即全部显示。
    3、查询信息包括患者身份信息,病历记录,检查报告,护理记录,用药记录,住院信息等。
    不同身份登陆详细说明:
    医生/护士:查询信息显示包括患者身份信息,病历记录,检查报告,护理记录,用药记录,住院信息,医嘱。
    药房工作人员:查询信息显示包括患者身份信息,用药记录。
    财务工作人员:查询信息显示为患者身份信息。
    患者:查询信息为病历记录,检查报告。
    4.3.5 职工信息查询
    角色:行政人员
    目的:查询职工身份信息。
    用例描述:
    1、用户处于登陆成功后的界面,点击职工信息查询模块。
    2、查询方式为三种:填写职工编号进行查询;选取所属科室进行查询,点击确定显示科室所有人员;选取岗位信息进行查询,点击确定显示所有科室相同岗位人员。科室和岗位可同时选取,点击确定显示同时满足筛选需求的人员。
    3、点击相应人员记录可查看该职工信息。
    4.3.6 个人信息查询
    角色:医院职工,患者
    目的:查看,修改相关个人基本信息。
    用例描述:
    1、用户处于登陆成功后的界面,点击个人信息查询模块。
    2、显示个人基本信息。
    3、可对部分基本信息进行修改,点击确认进行保存。
    4.3.7 科室信息查询
    角色:患者
    目的:查询各个科室相关信息。
    用例描述:
    1、用户处于登陆成功后的界面,点击科室信息查询模块。
    2、搜索栏搜索和直接查看两种方式。
    3、各个科室介绍以块状分布展示在页面,点击可进入查看详细介绍,包括科室简介,治疗病症范围,医学骨干,员工风采信息等等。
    4.3.8 信息填写
    角色:医生,护士
    目的:对病人相关资料进行填写,上传。
    用例描述:
    1、用户处于登陆成功后的界面,点击信息填写模块。
    不同身份登陆详细说明:
    医生:进入信息填写模块后,可选择的信息填写类型包括病历填写,检查报告填写,添加检查项目,检查报告上传附件和医嘱。首先选择信息填写类型,输入患者就诊卡号,填入信息,点击确认进行保存和发布。
    护士:进入信息填写模块后,可选择的信息填写类型为护理记录。首先选择信息填写类型,输入患者就诊卡号,填入信息,点击确认进行保存和发布。
    4.3.9 药物系统
    角色:医生,药房工作人员
    目的:开药,查看用药信息,查询药物信息。
    用例描述:
    1、用户处于登陆成功后的界面,点击药物系统模块。
    不同身份登陆详细说明:
    医生:进入药物系统模块后,包含两个子模块,第一个模块为填写用药清单模块,输入患者就诊卡号,添加药物,填写数量,填写具体用药剂量,点击确认保存;第二个子模块为查询药物信息,通过药物名称进行查询,可查看药物的信息为药品简介以及是否有库存。
    药房工作人员:进入药物系统模块后,包含两个子模块,第一个子模块为取药工作台,输入患者就诊卡号,关于该患者的未取药信息更新至取药工作台界面,药房配药交付病人后,点击取药成功即可将该患者取药信息状态改为已处理,并且该条信息从取药工作台界面消失;第二个子模块为查询药物信息,可通过药物编号或通过药物名称进行查询,显示信息包括药物简介,库存量,可对药物库存量进行修改。
    4.3.10 缴费系统
    角色:财务工作人员,患者
    目的:查看收费项目,进行缴费确认。
    用例描述:
    1、用户处于登陆成功后的界面,点击缴费系统模块。
    不同身份登陆详细说明:
    财务工作人员:进入缴费系统模块后,包含两个子模块,第一个子模块为缴费窗口,输入患者就诊卡号,即显示患者的未缴费记录,为时间降序排列,有未缴费标识,点击相应记录可查看详细收费项目信息,该记录可以进行直接打印,患者进行缴费后,可在该记录后点击缴费成功按钮,该记录状态改变;第二个子模块为查询缴费记录,输入患者就诊卡号,可查询患者所有缴费记录,未缴费和已缴费分块展示,为时间降序排列;也可根据患者缴费状态和时间区间进行查询,通过两个下拉框确认查询范围,如:查询2019-9-1至2019-9-30有未缴清费用的患者名单。
    患者:进入缴费系统模块后,显示个人所有缴费记录,为时间降序排列,有是否已缴费标识,点击相应记录可查看具体收费项目信息。
    4.3.11 统计系统
    角色:行政人员
    目的:查看各项统计数据
    用例描述:
    1、用户处于登陆成功后的界面,点击统计系统模块。
    2、选取需要查看的统计类型,选择时间区间,显示统计结果。
    4.3.12 预约挂号
    角色:患者
    目的:进行预约挂号,取消挂号
    用例描述:
    1、用户处于登陆成功后的界面,点击预约挂号模块。
    2、包含两个子模块,第一个子模块为预约挂号模块,第二个子模块为预约信息模块。
    2、第一个子模块显示所有科室模块,点击预约科室,显示本周和下一周的各个坐诊医生安排以及时间段,不可预约时间段为灰色,可预约时间段后有预约按键,点击即可进行预约。
    3、第二个子模块显示患者个人预约信息,预约时间24小时前可点击取消预约键进行取消,24小时内无取消键即不可取消。
    4.4 管理端子系统
    在这里插入图片描述

    4.4.1 职工信息管理
    角色:管理员
    目的:对医院各类职工信息进行增加,修改,停用等。
    用例描述:
    1、用户处于登陆成功后的界面,点击职工信息管理模块。
    2、五个可选项对五种医院职工信息进行管理。可通过选择种类,科室两种方式进行显示信息列表。
    3、可直接通过职工编号或姓名进行直接查询。
    4、可对医院各类职工信息进行增加,修改,密码重置以及设置停用标志(由于关系历史记录,不可对人员信息记录进行删除)。
    4.4.2 患者信息管理
    角色:管理员
    目的:对患者信息进行增加,修改,停用等。
    1、用户处于登陆成功后的界面,点击患者信息管理模块。
    2、可直接通过就诊卡号或姓名或身份证号进行直接查询。
    4、可对患者信息进行增加,修改,密码重置以及设置停用标志(由于关系历史记录,不可对人员信息记录进行删除)。
    4.4.3 科室信息管理
    角色:管理员
    目的:对科室信息进行增加,修改,停用等。
    1、用户处于登陆成功后的界面,点击科室信息管理模块。
    2、显示所有科室模块。
    4、可对科室信息进行增加,修改,设置停用标志。
    4.4.4 药品信息管理
    角色:管理员
    目的:对药品信息进行增加,修改,停用等。
    1、用户处于登陆成功后的界面,点击药品信息管理模块。
    2、可通过药品编号或名字进行查询,显示药品信息和库存量,可以修改药品简介和单价。
    4.4.5 项目收费管理
    角色:管理员
    目的:对收费项目信息进行增加,修改,停用等。
    1、用户处于登陆成功后的界面,点击项目收费管理。
    2、可通过收费项目编号或名字进行查询,可以修改收费项目单价。
    4.4.6 统计系统管理
    角色:管理员
    目的:查看各项统计数据
    用例描述:
    1、用户处于登陆成功后的界面,点击统计系统模块。
    2、选取需要查看的统计类型,选择时间区间,显示统计结果。

    4.5 非功能新需求
    4.5.1 界面需求
    系统的界面要求如下:
    1、页面内容:各类信息内容准确,术语和行文格式统一、规范、明确,栏目、菜单设置和布局合理,传递的信息准确、及时。
    2、导航结构:页面具有明确的导航提示,且便于理解,方便用户使用。
    3、技术环境:页面大小适当,能用各种常用浏览器以不同分辨率浏览;无错误链接和空链接。
    4、艺术风格:界面、版面形象清新悦目、布局合理,字号大小适宜、字体选择合理,前后一致,美观大方;色彩和谐自然,与内容相协调。
    4.5.2响应时间需求
    当用户登陆,系统应该及时地进行反应,反应的时间在3秒以内。系统应能检测出各种非正常情况,如与设备的通信中断,无法连接数据库服务器等,避免出现长时间等待甚至无响应。
    4.5.3 可靠性需求
    系统应保证7*24小时内不宕机,保证100人以上可以同时在客户端登陆,系统正常运行,正确提示相关内容。
    4.5.4 可扩展性需求
    系统设计要求能够体现扩展性要求,以适应将来功能扩展的需求。
    4.5.5 系统安全性需求
    网站有严格的权限管理功能,各功能模块需有相应的权限方能进入(如职工和患者具有不同的访问权限)。系统能够防止各类误操作可能造成的数据丢失,破坏。防止用户非法获取网页以及内容。

    五、需求变更
    需求变更控制过程如图所示。
    从上图可以得到需求变更的控制过程为:客户递交变更,形成变更请求,变更请求递交给开发小组,开发小组主要从技术实现的层面评估该变更请求是否合理,并对其进行成本和影响分析,接着将变更请求递交给产品开发小组产品开发小组从机构和战略以及经济的层面评估该变更请求是否合理,然后进行变更选择。
    选择的结果有三种:一种是拒绝,也就是变更失败;一种是下个版本再修改,一种是变更通过。若变更通过,就需要修改相关需求,修改合同的相关信息,修改相应的项目计划。这样,需求变更的控制过程就结束了。

    展开全文
  • C语言实现超市信息管理系统(简单版)

    万次阅读 多人点赞 2019-01-04 09:54:01
    设计要求:设计一个超市信息管理系统,利用结构体存储货物信息和所购买商品的信息,并使用链表保存购物车信息, 能够完成建立库存信息以及文件自动建立库存信息,对购物车添加商品、结算并修改库存等操作,可以将...

    设计要求:设计一个超市信息管理系统,利用结构体存储货物信息和所购买商品的信息,并使用链表保存购物车信息,
    能够完成建立库存信息以及文件自动建立库存信息,对购物车添加商品、结算并修改库存等操作,可以将库存信息保存在文件中,并且可以对文件中的库存信息进行读取与显示。

    程序代码如下:

    /*ifndef/define/endif”主要目的是防止头文件的重复包含和编译*/
    #ifndef MARKET_H
    #define MARKET_H
    
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<time.h>
    #include<conio.h>
    #include<windows.h>
    #define N 5
    
    struct mar//该结构体为存储货物信息 
    { 
    	char ID[10];//货号 
    	char brand[20];//品名
    	double inprice;//进价
    	double outprice;//售价
    	int storage;//存储量 
    };
    
    struct node//该结构体为存储购物车中的信息 
    {
    	struct mar buy;//货物信息 
    	int number;//购物的数量 
    	struct node *next; //指向下一个购物节点 
    };
    
    struct mar goods[N];//结构体数组 
    struct node *cart;//购物车头结点 
    
    int menu();//打印主菜单函数 
    void WenJianKucun();//文件建立库存信息 
    void ShouJianKucun();//手动建立库存信息
    void DisKucun();//显示库存信息函数
    void ShopCart();//对购物车进行操作
    int ShopCartMenu();//打印购物车菜单
    void XianShi();//显示购物列表
    void add();//在购物车里添加商品 
    void UpdateKu();//更新购物车信息函数 
    void  calculate();//计算所购商品价格并修改保存 
    
    #endif
    
    /
    int main()
    {//主函数 
    	printf("*********************************************************\n");
    	printf("                欢迎进入超市信息管理系统\n");
    	printf("*********************************************************\n");
    	int find=0;
    	
    	while(1)
    	{
    		switch(menu()) 
    		{//menu()函数为输入选项
    			case 1: WenJianKucun();
    					find=1;		 
    					break;//选项1 文件建立库存信息
    					 
    			case 2:	if(find==0)
    					ShouJianKucun();
    					else
    					printf("库存信息已存在\n");
    					break;//选项2 手动建立库存信息
    					
    			case 3: DisKucun(); 
    					break;//选项3 显示库存信息函数
    					
    			case 4: ShopCart(); 
    					break;//选项4 对购物车进行操作
    					
    			case 5: calculate(); 
    					break;//选项5 计算所购商品价格并修改保存 
    					
    			case 6: system("cls");
    					printf("感谢您的使用,再见!\n");
    					Sleep(2000);
    					exit(0);
    		}
    	}
    	return 0;
    }
    
    /
    int menu()
    {//打印主菜单函数
    	char s[5];//输入的选项 
    	int n;//选项为整数 
    	printf("\n\n请选择下面的数字进行操作:\n");
    	printf("--------------------------------------------\n"); 
    	printf("1. 文件建立库存信息\n");
    	printf("2. 手动建立库存信息\n");
    	printf("3. 显示所有商品信息\n");
    	printf("4. 购物车\n");
    	printf("5. 结算\n");
    	printf("6. 退出程序\n"); 
    	printf("--------------------------------------------\n");
    	printf("请选择对应数字1~6(1,2选其一)\n");
    	printf("本程序制作人: 2017物联网工程 胡斌、刘萌欣、陈俊飞\n");
    	
    	
    	while(1)
    	{
    		fflush(stdin);//清空输入流
    		gets(s);//输入一串字符串 
    		n=atoi(s);//字符串转化为整数 
    		
    		
    		if(n<1||n>6)//判断输入的选项是否正确
    		printf("输入错误,请重新输入:\n");
    		else//输入正确,结束循环 
    		break; 
    	}
    	return n;//返回输入选项 
    } 
    
    /
    void WenJianKucun()
    {//文件建立库存信息
    	FILE *fp;//定义文件指针 
    	if((fp=fopen("kucun.txt","w"))==NULL) 
    	{//创建文件
    		printf("创建文件失败\n");
    		return ;
    	}
    	//向文件中写入信息 
    	fprintf(fp,"69011111 飘柔日常护理 12.00 15.00 30\n");
    	fprintf(fp,"69021111 优酸乳 1.50 2.00 200\n");
    	fprintf(fp,"69031111 红富士苹果 2.50 3.50 300\n");
    	fprintf(fp,"69041111 晨光笔芯 0.70 1.00 150\n");
    	fprintf(fp,"69051111 胡医生面膜 12.00 16.50 100\n");
    	fclose(fp);//关闭文件 
    	printf("成功导入信息\n"); 
    	return ;
    }
    
    /
    void ShouJianKucun()
    {//手动建立库存信息
    	FILE *fp;//定义文件指针 
    	int i;
    	printf("请依次输入货物信息:\n");
        printf("--------------------------------------------\n");
    	for(i=0;i<N;i++) 
    	{//向文件中写入信息
    		printf("第%d个商品:\n",i+1);
    		printf("货号:"); 
    		fflush(stdin);//清空输入流
    		gets(goods[i].ID);//输入货号
    		
    		printf("品名:");
    		fflush(stdin);//清空输入流
    		gets(goods[i].brand);//输入品名 
    		
    		printf("进价: ");
    		fflush(stdin);//清空输入流
    		scanf("%lf",&goods[i].inprice);//输入进价 
    		
    		printf("售价:");
    		fflush(stdin);//清空输入流
    		scanf("%lf",&goods[i].outprice);//输入售价 
    		
    		printf("数量:");
    		fflush(stdin);//清空输入流
    		scanf("%d",&goods[i].storage);//输入数量 
    		printf("\n");
    	}
    	if((fp=fopen("kucun.txt","w"))==NULL) 
    	{//判断文件是否创建失败
    		printf("创建文件失败。\n");
    		return ;
    	}
    	//fprintf(fp,"货号       品名      单价    库存量\n");
    	for(i=0;i<N;i++)
    	{//把货物信息写进文件
    		fprintf(fp,"%-11s%-15s%-8.3f%-8.3f%-7d\n",goods[i].ID,goods[i].brand,goods[i].inprice,goods[i].outprice,goods[i].storage);
    	}
    	//fwrite(goods,sizeof(struct mar),N,cun);二进制文件输出 
    	fclose(fp);//关闭文件 
    	printf("信息导入成功\n");
    	return ;
    }
    
    /
    void DisKucun()
    {//显示库存信息函数
    	FILE *fp;//定义文件指针 
    	int i;
    	if((fp=fopen("kucun.txt","r"))==NULL) 
    	{//判断是否打开了文件
    		printf("打开文件失败\n");
    		return ;
    	}
    		
    	for(i=0;i<N;i++) 
    	{//输出物品信息
    		//读取文件信息 
    		fscanf(fp,"%s%s%lf%lf%d",goods[i].ID,goods[i].brand,&goods[i].inprice,&goods[i].outprice,&goods[i].storage);
    		printf("--------------------------------------------\n");
    		//输出文件信息 
    		printf("货号       品名           单价    库存量\n");
    		printf("%-11s%-15s%-8.3f%-7d\n",goods[i].ID,goods[i].brand,goods[i].outprice,goods[i].storage);
    	}
    	fclose(fp);//关闭文件 
    }
    
    /
    void  ShopCart()
    {//对购物车进行操作
    	while(1)
    	{
    		switch(ShopCartMenu()) 
    		{//ShopCartMenu()为输入选项
    			case 1: XianShi();
    					break;//选项1 显示购物车物品信息
    			case 2: add();
    					break;//选项2 添加购物车物品
    			//case 3: deleteitem();//删除购物车中的某项商品
    			//		break;
    			case 3: return ;//选项3 退出 
    		}
    	}
    }
    
    /
    int ShopCartMenu()
    {//打印购物车菜单
    	int n;//为整数 
    	char s[5];//输入一串字符串 
    	printf("\n\n请选择操作:\n");
    	printf("--------------------------------------------\n");
    	printf("1. 显示当前可以购物列表\n");
    	printf("2. 在购物车里添加商品\n");
    	//printf("3. 删除购物车商品\n"); 
    	printf("3. 退出\n");
    	printf("--------------------------------------------\n");
    	printf("请选择对应数字1~3\n");
    	
    	
    	while(1)
    	{
    		fflush(stdin);//清空输入流
    		gets(s);//输入一串字符串 
    		n=atoi(s);//字符串转化为整数 
    		if(n<1||n>3)//判断输入的选项是否正确 
    		printf("输入错误,请重新输入: \n");
    		else//输入正确,结束循环 
    		break;
    	}
    	return n;//返回输入选项 
    }
    
    /
    void XianShi()
    {//显示购物列表
    	struct node *p; //定义节点指针 
    	p=cart;//把购物车链表赋给p 
    	FILE *fp1;//定义文件指针 
    	if((fp1=fopen("cart.txt","r"))==NULL)
    	{//判断是否打开了文件 
    		printf("打开文件失败\n");
    		//return ;
    	}
    	
    	if(p==NULL)
    	{//购物车为空 
    		printf("目前购物车为空:");
    		return ;
    	}
    	else
    	{//购物车不为空 
    		while(p!=NULL) 
    		{//把购物车物品不断减一,直到为空
    			printf("--------------------------------------------\n");
    			printf("货号       品名           单价    数量\n");
    			printf("%-11s%-15s%-8.3f%-7d\n",p->buy.ID,p->buy.brand,p->buy.outprice,p->number);	//输出物品信息 
    			p=p->next; 
    		}
    	}
    	fclose(fp1);//关闭文件 
    	return ;
    }
    
    /
    void add()
    {//在购物车里添加商品 
    	FILE *fp,*fp1;//fp表示kucun文件,fp1表示cart文件 
    	struct node *p1,*p,*p2;//定义节点指针 
    	int i,n;//n表示商品数量 
    	char s[20];//表示货号或者品名 
    	char choice1[20],choice2[20];//选择项(y继续,n继续) 
    	
    	
    	do{
    		printf("输入所需物品的名称或货号:\n");
    		fflush(stdin);//清空输入流 
    		gets(s);//输入货号或者品名 	
    		if((fp=fopen("kucun.txt","r"))==NULL)
    		{//打开文件 
    			printf("打开文件失败\n");
    			continue;
    		}
    		for(i=0;i<N;i++)
    		{//循环N次 
    			fscanf(fp,"%s%s%*lf%lf%d",goods[i].ID,goods[i].brand,&goods[i].outprice,&goods[i].storage);//从文件中读取货物信息 
    			
    			if((strcmp(goods[i].ID,s)==0||strcmp(goods[i].brand,s)==0)&&goods[i].storage>0)//找输入对应的商品 
    			{
    				printf("已找到所需商品:\n");
    				printf("--------------------------------------------\n");
    				printf("货号       品名           单价    数量\n");
    				printf("%-11s%-15s%-8.3f%-7d\n",goods[i].ID,goods[i].brand,goods[i].outprice,goods[i].storage);//输出所需物品信息 
    				
    				printf("请输入所需商品数量: ");
    				scanf("%d",&n);//商品数量 
    				if(n>goods[i].storage)
    				{//判断是否还可以购买不 
    					printf("该商品库存不足\n");
    					break;
    				}
    				printf("\n是否购买此商品?(Y/N)\n");
    				fflush(stdin);//清空输入流 
    				scanf("%s",choice1);//输入一个选项 
    				if(strcmp(choice1,"Y")==0||strcmp(choice1,"y")==0)
    				{//输入y/Y表示购买此商品 
    					p=new node;//生成新节点 
    					if(p==NULL)
    					{//分配内存失败 
    						printf("内存申请失败!\n");
    						exit(1);//退出 
    					}	
    					p->number=n;//商品数量 
    					p->buy=goods[i];//货物信息 
    					p->next=NULL;
    					p1=cart;//把头结点赋给p1 	
    					if(cart==NULL)//头结点为空 
    					cart=p;//把节点赋值给头结点 
    					else
    					{
    						while(p1->next!=NULL)
    						p1=p1->next;//把链表循环到尾部 
    						p->next=p1->next; 
    						p1->next=p;//把新节点p挂在链表尾部 
    					}
    				}
    				else
    				printf("输入错误\n");
    				break;//找到商品结束循环 
    			}
    		}	
    		if(i==N)//循环完毕还没找到对应商品 
    		printf("未找到所需物品\n");
    		fclose(fp);//关闭文件 
    	
    		UpdateKu();//更新库存信息函数 
    		printf("是否继续购物?(Y/N)\n");
    		fflush(stdin);//清空输入流 
    		scanf("%s",choice2);//输入选项
    		if(strcmp(choice2,"y")!=0&&strcmp(choice2,"Y")!=0)
    		printf("放弃购买,返回菜单!\n");
    		
    	}while(strcmp(choice2,"y")==0||strcmp(choice2,"Y")==0);//y/Y继续循环 
    	return ;
    } 
    
    /
    //更新购物车信息函数 
    void UpdateKu()
    {
    	FILE *fp;
    	struct node *p;
    	if((fp=fopen("cart.txt","w"))==NULL) 
    	{//判断文件是否创建失败
    		printf("创建文件失败。\n");
    		return ;
    	}
    	
    	p=cart;//把购物车链表赋给p2 
    	while(p!=NULL)
    	{	
    	//	fprintf(fp1,"货号       品名      单价    库存量\n");
    		//把货物信息写进文件
    		fprintf(fp,"%-11s%-15s%-8.3f%-7d\n",p->buy.ID,p->buy.brand,p->buy.outprice,p->number);
    		p=p->next;//指向下一个节点 
    	}	
    	fclose(fp);//关闭文件 
    	
    	return ; 
    }
    
    /
    void calculate()
    {//计算所购商品价格并修改保存
    	struct node *p;
    	p=cart;//把购物车(cart)链表赋给p 
    	double sum=0;//购买商品应付钱数 
    	double pay;//购买商品实付钱数 
    	FILE *fp;//定义文件指针 
    	int i;
    	printf("以下是购物清单:\n");
    	XianShi();//调用函数显示购物列表信息 
    	
    	
    	if((fp=fopen("kucun.txt","r"))==NULL)
    	{//打开文件  
    		printf("打开文件失败\n");
    		return ;
    	}
    	
    	for(i=0;i<N;i++)
    	{//从文件中读取信息 
    		fscanf(fp,"%s%s%*lf%lf%d",goods[i].ID,goods[i].brand,&goods[i].outprice,&goods[i].storage);
    	}
    	fclose(fp);//关闭文件 
    	
    	while(p!=NULL)
    	{//当链表不为空时 
    		sum=sum+p->buy.outprice*p->number;//计算应付钱数 
    		for(i=0;i<N;i++)
    		{//找出对应商品库存量 
    			if(strcmp(goods[i].ID,p->buy.ID)==0)
    			{//找到对应商品 
    				goods[i].storage=goods[i].storage-p->number;//库存量变化 
    				break;
    			}
    		} 
    		p=p->next;//指向下一个节点 
    	}
    	
    	printf("总计:%-8.3f\n",sum);//输出购买物品共需多少钱 
    	printf("输入实付金额:");
    	scanf("%lf",&pay);
    	printf("实付:  %-8.3f    找零:    %8.3f\n",pay,pay-sum);
    	
    	if((fp=fopen("kucun.txt","w"))==NULL)
    	{//打开文件 
    		printf("写入文件失败\n");
    		return ;
    	}
    	for(i=0;i<N;i++)
    	{//向文件中写入信息 
    		fprintf(fp,"%-11s%-15s%-8.3f%-8.3f%-7d\n",goods[i].ID,goods[i].brand,goods[i].inprice,goods[i].outprice,goods[i].storage);
    	}
    	fclose(fp);//关闭文件 
    	
    	return ;
    }

     

    展开全文
  • WMS软件产品标准功能清单,仓库管理系统是通过入库业务、出库业务、仓库调拨、库存调拨和虚仓管理等功能,对批次管理、物料对应、库存盘点、质检管理、虚仓管理和即时库存管理等功能综合运用的管理系统,有效控制并...
  • C++项目(1):学生信息管理系统(简单教学版)

    万次阅读 多人点赞 2017-01-14 18:45:56
    我的第一个C++项目。粗糙的学生信息管理系统。用TXT文件来做数据持久化。

    严肃点

    参考了这篇文章又觉得还有点意义的同学,请在你们汇报的报告上,把这篇文章作为参考文献…

    不然,以后小心被查说成“学术不断”、“学术不规范”……

    看见有人抄袭了本文,哇塞塞,你抄就抄吧,写个出处也行。不写也行,别用来营销自己的公众号好吧?

    有人提示:CStuMg代码中那个修改函数应该有点问题,出现了重定义,应该把形参stu换成别的吧。我没有仔细看,大家注意一下!

    引言

    这几乎是任何一门语言的经典案例。
    管理信息系统。
    MIS(管理信息系统——Management Information System)系统 ,是一个由人、计算机及其他外围设备等组成的能进行信息的收集、传递、存贮、加工、维护和使用的系统。
    这篇文章,就是把一个超简单的案例,翻来覆去说几遍。
    为什么一般情况下,看别人的代码很困难?
    因为很多时候写代码就不是从头到尾,线性地在写……
    为了让我这篇文章成为一篇所谓的简单的教学版,我就把代码挑着贴了,以便理清思路。最后,再想办法传一个完整的项目上去。

    需求如下

    这是功能清单。后文会多次使用。
    意思是,这个软件需要有哪些功能。(换种说法就是,这个软件如果做出来了,我就可以用它来干以下这些事情)
    * 1. 学生信息录入 (姓名、年龄、id)
    * 2. 学生信息修改
    * 3. 学生删除
    * 4. 显示
    * 5. 根据id查找
    * 6. 保存至文件
    * 7. 从文件恢复

    尽量用OOP的方式实现。分层实现。

    注意事项

    因为C++本身OOP还不纯粹,很有可能写着写着就是函数+函数+函数……
    而且还是全局函数!简直就是面向过程的写法。
    记得我的第一个完整意义上的软件,就是做的这个。
    当时是用C语言写的。还照着书上的代码写。
    一个个的overload的function,各种标志位。
    e.g. void updateList (Stu * list, Stu stu, int flag); // flag是操作描述标志位。意味着这个函数是修改、或是删除、或是增加…
    从早上写到下午,磕磕绊绊终于写完了。
    2012年2月吧,大一寒假,好像是,春节期间。在巡司镇的天河温泉旁边。
    现在又重来一遍。这次用C++。加上用了STL。开发速度快了不少。
    所有变量都是在stack上,如果数据太大了,stack根本就装不下,所以以后可以考虑在heap上开辟空间,同时用智能指针shared_ptr。

    软件设计

    这么小的软件,是直接开始写代码,还是设计一下再写呢?
    考虑了一下,还是先设计一下吧。说一些设计原则。
    一、一些设计原则
    1. 整个软件是控制台程序,所以一个黑窗口就可以搞定,不需要做别的界面。
    2. 把学生信息保存到文件,用一个TXT。
    3. 为了让用户和软件之间有个简单的交互,提供一个处理界面的类。(尽管main函数里面在接收用户的输入,这样设计不是很好吧…)
    二、关键的class
    下面,开始设计类。
    1. main。不算类了。要接收用户输入,调用处理界面更新功能的CMainView类。
    2. CMainView类。处理界面更新功能的类,相当于界面层(视图层,View层)。不仅是更新界面,还有处理用户的输入,调用下面CStuMg类中对应的函数实现对应功能。
    3. CStuMg类。处理信息,提供业务功能的类。e.g. 添加一个学生,删除一个学生…。这个类是实现业务功能的类,执行业务功能,把执行结果交给上层(View层)。
    4. CStu类。实体对象类。为什么要有这个类,我就不说了。简单起见,成员属性只有3个,学生id,学生name,学生age。
    三、数据存储
    1. 在软件执行过程中,数据存在内存中。为了在内存中保存学生,用了一个map<int, CStu> 的stu_map。用学生id作为map的key,用CStu作为map的value。选择map,主要是为了避免学号重复。
    2. 需要保存学生信息至硬盘时,数据写入硬盘上的TXT中。保存方式是:一行对应一个学生。每一行都有三列,分别是id,name和age。这三个“字段”分别对应CStu的三个成员属性。同时,各个字段之间,用一个空格隔开。为了方便地把map中的所有学生信息全部写入到文件中,我重载了CStu的<<运算符,实现把一个CStu对象的3个成员变量的值,<<到输出流ostream中。写文件的时候,调用stringstream,<<stu,再把stringstream的str()字符串内容,<<到ofstream(文件的输出流)中。
    3. 为了从文件读入学生信息,采用一行一行读取的方式。通过重载CStu的>>运算符,实现把字符串直接载入一个CStu对象的功能。

    编码实现之搭框架

    本项目很简单,很简单,很简单。但我仍然把这个项目写在简历项目经历的第一条。以至于, 面试官对我的勇气表示难以置信。
    但我不觉得这是什么丢脸的事!
    尽管项目再小,请大家都养成好习惯:先搭框架,再填里面的内容。
    如果不这样做,后果就是,按照陈老板的话来说,要写崩溃的。我第一次写的时候,也是这种感觉。上来就开始写,没写到一会儿,就写崩盘了。

    开发Domain类CStu

    我们的实体类(也叫Domain类吧),就是CStu学生类。根据上述三个成员变量,写出如下代码。(很简单,……)。
    另外,重载了<<和>>运算符。(原因请见“软件设计”的第三点“数据存储”)
    先写CStu的头文件
    #ifndef C_STUDENT_H
    #define C_STUDENT_H
    #include <string>
    #include <iostream>
    
    class CStudent
    {
    	/* friend function */
    	friend std::ostream & operator<<(std::ostream & os, CStudent & stu);
    	friend std::istream & operator>>(std::istream & is, CStudent & stu);
    
    public:
    
    	CStudent();
    	~CStudent();
    
    	int getId() const;
    	void setId(int val);
    
    	std::string getName() const;
    	void setName(std::string val);
    
    	int getAge() const;
    	void setAge(int val);
    
    	
    private:
    
    	int id;
    	std::string name;
    	int age;
    	
    };
    
    
    #endif
    再到CStu的CPP文件里,实现这些简单的函数。在CStu的构造函数中,先把stu的id设为-1,做一个无效标记。下面会提到为什么要这样做。
    #include <iostream>
    #include <string>
    #include "CStudent.h"
    using namespace std;
    
    // 学生默认id是-1,说明这暂时是一个无效的学生。
    CStudent::CStudent(){this->id = -1;}
    CStudent::~CStudent(){}
    
    
    int CStudent::getId() const { return id; }
    void CStudent:: setId(int val) { id = val; }
    
    std::string CStudent:: getName() const { return name; }
    void CStudent:: setName(std::string val) { name = val; }
    
    
    int CStudent:: getAge() const { return age; }
    void CStudent:: setAge(int val) { age = val; }
    
    
    std::ostream & operator<<(std::ostream & os, CStudent & stu) {
    
    	// 保存的时候,千万不要把,也保存进去!不然输入的时候,非常不好解决!-_-!
    	// ss >> x; 会失败!!有逗号!!
    // 	os<<"id: "<<stu.getId()<<", name: "<<stu.getName()<<", age: "
    // 		<<stu.getAge();
    
    	os<<stu.getId()<<"     "<<stu.getName()<<"     "<<stu.getAge();
    
    	return os;
    }
    
    std::istream & operator>>(std::istream & is, CStudent & stu) {
    	is>>stu.id>>stu.name>>stu.age;
    	return is;
    }
    唯一需要注意的就是在重载<<的时候。问题见代码中的注释。
     

    开发CStuMg业务类

    这里为了开发业务类,为了让软件的功能不重不漏,我就对照着最开始的需求里的功能列表来写。见上文,一共7个功能。

    这里就只有一个业务类,叫CStuMg。(Mg就是management的意思……)

    和开发CStu类一样,先写头文件

    #ifndef C_STUDENT_MG_H
    #define C_STUDENT_MG_H
    #include "CStudent.h"
    #include <map>
    #include <string>
    
    class CStudentMg
    {
    public:
    	CStudentMg();
    	~CStudentMg();
    
    	// 增
    	CStudent addAStu(std::map<int,CStudent> & m1,CStudent & stu);
    
    	// 删
    	bool deleteStuById(std::map<int, CStudent> & m1,const int & id);
    
    	// 改
    	CStudent updateStu(std::map<int, CStudent> & m1, const CStudent & stu);
    
    	// 查 by id
    	CStudent findById(const std::map<int, CStudent> & m1, const int & id) const;
    	
    	
    	// showAll
    	void showAll(const std::map<int, CStudent> & m1 ) const;
    	
    	// save to file
    	bool saveToFile(const std::map <int,CStudent> & m1,const std::string & pathName) const;
    
    	// read from file
    	bool readFromFile(std::map<int, CStudent> & m1, std::string path);
    	
    
    private:
    
    };
    
    
    #endif
    这样一来,就看得见我这个软件最后一共有哪些功能了。
    其实更好的做法是,在代码里多写注释!
    e.g. 输入变量是什么,返回值是什么,什么样的情况下返回什么样的结果……
    开发完head文件以后,再到它对应的CPP文件中,完成函数体。
    可以现在就把具体的函数体写全了, 也可以先就把函数体{...}空起来,意思一下即可。
    我更推荐第二种做法。让程序在语法上能通,具体的业务等我们把软件的框架搭起来以后再实现。
    e.g. 如果要求返回int,在{}里直接写个return 0; 就好。
    因为 现在要做的是,而且也只需要,把框架搭起来。
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <map>
    #include <sstream>
    #include "CStudent.h"
    #include "CStudentMg.h"
    
    using namespace std;
    
    
    CStudentMg::CStudentMg()
    {
    }
    
    CStudentMg::~CStudentMg()
    {
    }
    
    
    // 增
    CStudent CStudentMg:: addAStu(map<int,CStudent> & m1,CStudent & stu) {
    
    	return stu;
    }
    
    
    // 删
    bool  CStudentMg:: deleteStuById(map<int, CStudent> & m1, const int & id) {
    
    	bool b = false;
    	return b;
    }
    
    
    
    // 改
    CStudent CStudentMg:: updateStu(map<int,CStudent> & m1,const CStudent & cStu) {
    
    	CStudent stu;
    	return stu;
    }
    
    
    // 查 by id
    CStudent  CStudentMg:: findById(const map <int, CStudent> & m1, const int & id) const{
    
    	CStudent stu ;
    
    	return stu;
    }
    
    
    // showAll
    void  CStudentMg:: showAll(const map<int,CStudent> & m1) const{
    		
    }
    
    
    // save to file
    bool CStudentMg::saveToFile(const map <int,CStudent> & m1,const string & pathName) const{
    
    	bool b = true;
    	
    	return b;
    }
    
    
    // read from file
    bool CStudentMg:: readFromFile(std::map<int,CStudent> & m1, std::string path) {
    	bool b = true;
    	return b;
    }
    
    发现了咩???其实到现在为止,就根本还没有写什么具体的业务!!!但是,软件在语法上是可以满足的。这些代码是可以编译成功的!

    开发界面层CMainView类

    这个类写了,我们的软件就有界面了。(尽管这个界面还只是黑窗口的形式)
    依然是先写头文件。依然是对照着需求的功能清单写。
    #ifndef C_MAIN_VIEW_H
    #define C_MAIN_VIEW_H
    
    #include <iostream>
    #include <map>
    #include <string>
    #include "CStudent.h"
    #include "CStudentMg.h"
    
    class CMainView
    {
    public:
    	CMainView();
    	~CMainView();
    
    	/* 欢迎 */
    	void welcome();
    
    	/* 显示菜单 */
    	void showMenu();
    
    	/* view 显示所有学生 */
    	void showAllStuAtView(const std::map<int, CStudent> & stu_m1);
    
    	/* view层 添加一个学生 */
    	void addStuAtView( std::map<int, CStudent> & stu_m1 );
    
    	/* view 查找一个学生 */
    	void findStuAtView(const std::map<int, CStudent> & m1) ;
    
    	/* view层删除一个学生 */
    	void deleteByIdAtView(std::map<int, CStudent> & v1);
    
    	/* view层 更新一个学生 */
    	void updateByIdAtView(std::map<int, CStudent> & m1);
    
    	/* view层 把map保存进文件 */
    	void saveToFileAtView(const std::map<int, CStudent> & m1, std::string pathName);
    
    	/* view层 把文件中的东西导入 map */
    	void readFromFileAtView(std::map<int, CStudent> & m, std::string pathName);
    
    private:
    
    };
    
    #endif
    然后,再到对应的CPP文件里,把函数都抄一遍……
    #include "CMainView.h"
    
    CMainView::CMainView()
    {
    }
    
    CMainView::~CMainView()
    {
    }
    
    /* 欢迎 */
    void CMainView:: welcome() {
    }
    
    /* 显示菜单 */
    void CMainView:: showMenu() {
    }
    
    /* view 显示所有学生 */
    void CMainView:: showAllStuAtView(const std::map<int, CStudent> & stu_m1 ){
    }
    
    /* view层 添加一个学生 */
    void  CMainView:: addStuAtView( std::map<int, CStudent> & stu_m1 ){
    }
    
    /* view 查找一个学生 */
    void  CMainView::  findStuAtView(const std::map<int, CStudent> & m1) {
    }
    
    /* view层删除一个学生 */
    void   CMainView:: deleteByIdAtView(std::map<int, CStudent> & v1) {
    }
    
    /* view层 更新一个学生 */
    void   CMainView:: updateByIdAtView(std::map<int, CStudent> & m1) {
    }
    
    /* view层 把vec保存进文件 */
    void   CMainView:: saveToFileAtView(const std::map<int, CStudent> & m1, std::string pathName) {
    }
    
    /* view层 把文件中的东西导入 vec */
    void  CMainView::  readFromFileAtView(std::map<int, CStudent> & m, std::string pathName) {
    }
    View框架也写好了。
     

    开发Main函数

    main函数的开发,也就对照着需求的功能清单,把软件需要提供的功能,都列出来。
    我这里的设计思路是,用户输入0,软件退出,输入别的列出来的operateType,就执行相应功能。否则,就清屏,忽略用户的错误输入。
    在main函数里,针对用户不同操作类型的输入,调用业务类CStuMg中的成员函数,执行相应的操作。
    在main和mainView在开发过程中,可能会互相交叉着写。这个就看个人了。
    #include <iostream>
    #include <string>
    #include <map>
    #include "CStudent.h"
    #include "CStudentMg.h"
    #include "CMainView.h"
    
    using namespace std;
    
    int main() {
    
    	string pathName = "d:/student_manegement.txt";
    
    	map<int, CStudent> stu_v1;
    	
    	CMainView cView;
    
    	cView.welcome();
    	cView.showMenu();
    
    	string operateType;
    	cin>>operateType;
    
    	while (operateType!="0")
    	{
    		if (operateType=="1") {// 录入
    			cView.addStuAtView(stu_v1);
    		}
    		else if(operateType=="2") { // 修改
    			cView.updateByIdAtView(stu_v1);
    		}
    		else if(operateType=="3") { // 查找
    			cView.findStuAtView(stu_v1);
    		}
    		else if (operateType=="4") {
    			cView.deleteByIdAtView(stu_v1);
    		}
    		else if( operateType == "5") { // 显示所有
    			cView.showAllStuAtView(stu_v1);
    		}
    		else if( operateType=="6") {  // 保存至文件
    			cView.saveToFileAtView(stu_v1,pathName);
    		}
    		else if(operateType=="7") {// 从文件读取
    			cView.readFromFileAtView(stu_v1,pathName);
    		}
    		else {
    			
    			cView.welcome();
    			cView.showMenu();
    		}
    
    		cin>>operateType;
    	}
    
    	return 0;
    }
    
    至此,软件的框架就开发好了。剩下的内容,就是去把没有填上的函数体都填上。
     

    编码实现之填内容

    View层的CMainView

    把前面空着的一堆函数的函数体都填上。
    #include "CMainView.h"
    
    CMainView::CMainView()
    {
    }
    
    CMainView::~CMainView()
    {
    }
    
    /* 欢迎 */
    void CMainView:: welcome() {
    	system("cls");
    	std::cout<<"欢迎来到xxx大系统"<<std::endl;
    }
    
    /* 显示菜单 */
    void CMainView:: showMenu() {
    
    	std::cout<<"\n";
    	std::cout<<"操作步骤"<<std::endl;
    
    	std::cout<<"1. 录入"<<std::endl;
    	std::cout<<"2. 修改"<<std::endl;
    	std::cout<<"3. 查找"<<std::endl;
    	std::cout<<"4. 删除"<<std::endl;
    	std::cout<<"5. 显示所有"<<std::endl;
    	std::cout<<"6. 保存至文件"<<std::endl;
    	std::cout<<"7. 从文件导入"<<std::endl;
    	std::cout<<"0. 退出"<<std::endl;
    	std::cout<<"\n";
    
    	std::cout<<"Author:qcy"<<std::endl;
    	std::cout<<"2016/11/28"<<std::endl;
    
    	std::cout<<"\n";
    	std::cout<<"请选择操作:";
    }
    
    
    /* view 显示所有学生 */
    void CMainView:: showAllStuAtView(const std::map<int, CStudent> & stu_m1 )
    {
    
    	system("cls");
    	std::cout<<"id    |"<<"name  |"<<"age"<<std::endl;
    	CStudentMg cStuMg;
    	cStuMg.showAll(stu_m1);
    
    	system("pause");
    	system("cls");
    	welcome();
    	showMenu();
    }
    
    /* view层 添加一个学生 */
    void  CMainView:: addStuAtView( std::map<int, CStudent> & stu_m1 )
    {
    	CStudentMg cStuMg;
    
    	int id; 
    	std::string name;
    	int age;
    	CStudent cStu;
    
    	system("cls");
    
    	std::cout<<"录入\n";
    	std::cout<<"id:";
    	std::cin>>id;
    
    	std::cout<<"name:";
    	std::cin>>name;
    
    	std::cout<<"age:";
    	std::cin>>age;
    
    	cStu.setId(id);
    	cStu.setName(name);
    	cStu.setAge(age);
    
    	// 保存
    	cStuMg.addAStu(stu_m1,cStu);
    
    	system("cls");
    	welcome();
    	showMenu();
    }
    
    
    
    /* view 查找一个学生 */
    void  CMainView::  findStuAtView(const std::map<int, CStudent> & m1) {
    
    	system("cls");
    	std::cout<<"请输入要查找学生的id"<<std::endl;
    	int id;
    	std::cin>>id;
    
    	CStudentMg cStuMg;
    	CStudent cStu;
    	cStu = cStuMg.findById(m1,id);
    
    	if (cStu.getId()!=-1)
    	{
    		std::cout<<cStu<<std::endl;
    	}
    	else
    	{
    		std::cout<<"查无此人"<<std::endl;
    	}
    
    	system("pause");
    	system("cls");
    	welcome();
    	showMenu();
    
    }
    
    /* view层删除一个学生 */
    void   CMainView:: deleteByIdAtView(std::map<int, CStudent> & v1) {
    
    	system("cls");
    	std::cout<<"请输入要删除的学生的id"<<std::endl;
    	int id;
    	std::cin>>id;
    
    	CStudentMg cStuMg;
    	bool b = cStuMg.deleteStuById(v1,id);
    
    	if (b)
    	{
    		std::cout<<"删除成功"<<std::endl;
    	}
    	else {
    		std::cout<<"查无此人"<<std::endl;
    	}
    
    	system("pause");
    	system("cls");
    	welcome();
    	showMenu();
    
    }
    
    /* view层 更新一个学生 */
    void   CMainView:: updateByIdAtView(std::map<int, CStudent> & m1) {
    
    	system("cls");
    
    	std::cout<<"请输入要修改的学生的id"<<std::endl;
    	int id;
    	std::cin>>id;
    	std::string name;
    
    	std::cout<<"name:";
    	std::cin>>name;
    
    	int age;
    	std::cout<<"age:";
    	std::cin>>age;
    
    	CStudent cStu;
    	cStu.setId(id);
    	cStu.setName(name);
    	cStu.setAge(age);
    
    	CStudentMg cStuMg;
    
    	CStudent cStu2 = cStuMg.updateStu(m1,cStu);
    
    	if (cStu2.getId()!=-1)
    	{
    		std::cout<<cStu2<<std::endl;
    		std::cout<<"修改成功"<<std::endl;
    	}
    	else
    	{
    		std::cout<<"查无此人"<<std::endl;
    	}
    
    	system("pause");
    	system("cls");
    	welcome();
    	showMenu();
    
    }
    
    /* view层 把vec保存进文件 */
    void   CMainView:: saveToFileAtView(const std::map<int, CStudent> & m1, std::string pathName) {
    
    	if (m1.begin()==m1.end()) {
    		system("cls");
    		std::cout<<"还没有任何学生信息,无法保存"<<std::endl;
    	}
    	else {
    		// 保存
    		CStudentMg cStuMg;
    		bool b = cStuMg.saveToFile(m1,pathName);
    		if (b) {
    			system("cls");
    			std::cout<<"保存成功"<<std::endl;
    		}
    		else  {
    			std::cout<<"保存失败"<<std::endl;
    		}
    	}
    
    	system("pause");
    	system("cls");
    	welcome();
    	showMenu();
    
    }
    
    /* view层 把文件中的东西导入 vec */
    void  CMainView::  readFromFileAtView(std::map<int, CStudent> & m, std::string pathName) {
    
    	system("cls");
    
    	CStudentMg cStuMg;
    	bool b = cStuMg.readFromFile(m,pathName);
    	if (b){
    		std::cout<<"读取成功"<<std::endl;
    	}
    	else {
    		std::cout<<"读取失败"<<std::endl;
    	}
    	system("pause");
    	system("cls");
    	welcome();
    	showMenu();
    }
    注意,View层是在:
    1. 在屏幕上显示内容,提示用户。
    2. 接收用户的输入,把用户输入的数据封装。
    3. 调用CStuMg(业务层)的函数,以实现某种功能。
    e.g. 用户要查找,则输入一个待找学生的id,View层的CMainView接收到这个id以后,
    调用业务层CStuMg的findStuById的函数,查找一个学生。
    如果找到了,就把这个学生的信息打印在屏幕上。如果没有找到,就提示没有找到这个人。
    为了区分是否找到某个指定的学生, 我在CStu类的构造函数中,先把学生的id设置为-1,认为是无效学生。
    如果查询回来的学生的id是-1,其实意味着没有找到这个学生。

    Service层的CStuMg

    在View层里,程序已经在调用Service层CStuMg这个类里的成员函数了。实际上,这些成员函数还没有写出来。现在继续填空。
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <map>
    #include <sstream>
    #include "CStudent.h"
    #include "CStudentMg.h"
    
    using namespace std;
    
    CStudentMg::CStudentMg()
    {
    }
    
    CStudentMg::~CStudentMg()
    {
    }
    
    // 增
    CStudent CStudentMg:: addAStu(map<int,CStudent> & m1,CStudent & stu) {
    	
    	// 先假设id可以重复了
    	m1.insert(make_pair(stu.getId(),stu));
    	return stu;
    }
    
    // 删
    bool  CStudentMg:: deleteStuById(map<int, CStudent> & m1, const int & id) {
    
    	bool b = false;
    
    	map<int,CStudent> ::iterator iter;
    	iter = m1.find(id);
    	if (iter!=m1.end())
    	{
    		m1.erase(iter);
    		b = true; // 删除成功
    	}
    	
    	return b;
    }
    
    // 改
    CStudent CStudentMg:: updateStu(map<int,CStudent> & m1,const CStudent & cStu) {
    
    	// 迭代器是一个smart point!
    	// 是可以通过迭代器去访问到 m1里的东西,并且做出修改的!
    	// 除非迭代器是const迭代器
    
    	CStudent stu;
    	int id = cStu.getId();
    	
    	map<int,CStudent> :: iterator iter;
    	iter = m1.find(id);
    	if (iter!=m1.end())
    	{
    		// 修改
    		iter->second = cStu;
    		stu = cStu; // 把修改后的对象,赋值,再返回上层
    	}
    
    	return stu;
    }
    
    // 查 by id
    CStudent  CStudentMg:: findById(const map <int, CStudent> & m1, const int & id) const{
    
    	CStudent stu ;
    
    	map<int,CStudent> ::const_iterator iter;
    	iter = m1.find(id);
    	if (iter!=m1.end())
    	{
    		stu = iter->second;
    	}
    
    	return stu;
    }
    
    // showAll
    void  CStudentMg:: showAll(const map<int,CStudent> & m1) const{
    
    	for (auto p : m1)
    	{
    		cout<<p.second<<endl;
    	}
    	
    }
    
    // save to file
    bool CStudentMg::saveToFile(const map <int,CStudent> & m1,const string & pathName) const{
    
    	bool b = true;
    
    	//fstream ofs(pathName,ios::out+ios::binary); // 为什么不是以binary保存?
    	fstream ofs(pathName,ios::out);
    	if (ofs) {
    		stringstream ss;
    
    		cout<<"文件打开"<<endl;
    		
    		CStudent stu;
    		for (auto p = m1.begin();p!=m1.end();p++)
    		{
    			stu = p->second;
    			ss<<stu<<endl;
    		}
    		
    		ofs<<ss.str(); // 注意,输出一定是 ss.str();
    		
    		ofs.close();
    	}
    	else
    	{
    		cout<<"文件打开失败"<<endl;
    		b = false;
    	}
    
    	return b;
    }
    
    
    // read from file
    bool CStudentMg:: readFromFile(std::map<int,CStudent> & m1, std::string path) {
    	bool b = true;
    
    	m1.clear(); // 清掉原来的
    	
    	fstream ifs(path,ios::in);
    	if (ifs) {
    		cout<<"文件打开"<<endl;
    		string s;
    		stringstream ss;
    		while (getline(ifs,s)) // 怎么一行行地读取?
    		{
    			CStudent cStu;
    			ss<<s;
    			// cout<<ss.str();
    			ss>>cStu;
     			ss.clear();
    
    			m1.insert(make_pair(cStu.getId(),cStu));
    			
    		}
    
    		ifs.close();
    
    	}
    	else {
    		cout<<"文件打开失败"<<endl;
    		b = false;
    	}
    
    	return b;
    }
    

    效果展示

    效果展示,也没什么好展示的。基本上都一个样。上两张图吧。 依旧是粉色的桌面。

    总结了总结了

    本文对一个较为完整的C++项目(“学生信息管理系统”这个小项目)进行了剖析,比较详细地介绍了我当时写代码时,大脑的运转过程。
    尽管项目比较小,本文还是用了分层设计的思想(比较传统的、经典的MVC框架模式)。
    百度对于MVC,有以下说法。我摘一些过来。
    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
    MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。
    框架和设计模式的区别
    有很多程序员往往把框架模式和设计模式混淆,认为MVC是一种设计模式。实际上它们完全是不同的概念。
    框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。框架通常是代码重用,而设计模式是设计重用,架构则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。在软件生产中有三种级别的重用:内部重用,即在同一应用中能公共使用的抽象块;代码重用,即将通用模块组合成库或工具集,以便在多个应用和领域都能使用;应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。
    框架与设计模式虽然相似,但却有着根本的不同。设计模式是对在某种环境中反复出现的问题以及解决该问题的方案的描述,它比框架更抽象;框架可以用代码表示,也能直接执行或复用,而对模式而言只有实例才能用代码表示;设计模式是比框架更小的元素,一个框架中往往含有一个或多个设计模式,框架总是针对某一特定应用领域,但同一模式却可适用于各种应用。可以说,框架是软件,而设计模式是软件的知识。
    框架模式有哪些?
    MVC、MTV、MVP、CBD、ORM等等;
    框架有哪些?
    C++语言的QT、MFC、gtk,Java语言的SSH 、SSI,php语言的smarty(MVC模式),python语言的django(MTV模式)等等
    设计模式有哪些?
    工厂模式、适配器模式、策略模式等等
    简而言之:框架是大智慧,用来对软件设计进行分工;设计模式是小技巧,对具体问题提出解决方案,以提高代码复用率,降低耦合度。

    后记

    随着我代码能力的逐步提升,我希望以后再写这个老掉牙的经典学生信息管理系统,可以写得更漂亮。

    代码下载

    完整代码下载链接(在VS2012上编译通过)
    请至少保证计算机有D盘目录。
    展开全文
  • 医院信息管理系统

    千次阅读 2019-10-04 15:07:21
    医院信息管理系统 一、导言 1.1 编写目的 本需求说明文档描述了医院管理系统项目的要求,作为系统设计、项目目标以及项目验收的依据。需求分析详细描述了用户对功能的需求、对性能的需求以及对运行环境的需求。 软件...
  • 学生信息管理系统要实现的目标是为该校提供全面的学生信息管理的解决方案,以解决传统人工管理方式效率低、保密性差,不利于查找、更新和维护的问题,极大地提高学生信息管理的效率,节约教育经费,以适应学校信息...
  • 基于python列表实现一个简单的动物信息管理系统,包括的内容动物名称,动物数量等 1.添加动物信息 ,2.删除动物信息,3. 修改动物信息,4.显示所有动物, 0.退出系统 简单思路分析: 1. 由于是基于列表实现,所以...
  • 智慧城市综合管理平台功能清单

    千次阅读 2019-09-12 14:43:13
    智慧城市综合管理平台功能清单 一、九大标准子系统 序号 子系统名称 功能模块备名称 备注 1 无线数据采集子系统 用户管理 ...
  • 医院信息管理系统有哪些功能?

    千次阅读 2020-11-25 10:57:09
    医院管理软件包含模块:门诊收费划价系统、住院病人管理系统(一日清单)、药品发药管理系统、库房管理系统、财务报表查询系统、院长查询与决策系统、系统管理与设置、门诊监控等。功能:实现门诊病人收费划价、住院病人...
  • 体检信息管理系统功能表

    千次阅读 2014-06-30 16:13:14
    登记体检人员的预约信息,对体检人员进行事先预约、电子表格、档案、身份证导入。 2、体检登记 登记体检人员的基本信息和体检项目,可以从预约中导入,也可以批量增加或减少体检项目;对不同性质(如...
  • C++实践项目一:学生信息管理系统(内附完整代码)

    万次阅读 多人点赞 2019-04-17 15:55:59
    MIS(管理信息系统——Management Information System)系统 ,是一个由人、计算机及其他外围设备等组成的能进行信息的收集、传递、存贮、加工、维护和使用的系统。为什么一般情况下,看别人的代码很困难?因为很多...
  • 基于java毕业生就业信息管理系统的设计(含源文件)

    千次阅读 多人点赞 2021-03-04 22:49:50
    因此在这样的情况下,在INTERNET上开发并运行信息管理系统就能够极大地提高工作效率,弥补了用人单位和学生在时间和空间上的不足。 本设计就是采用网页编程工具、JSP技术和数据库技术,在网上设计一个虚拟的人才市场...
  • 测试:namespace ConsoleApplication1 { class Program { static void Main(string[] args) { UserManager manger = new UserManager(); manger.Login();
  • 信息系统项目管理--论文分析笔记

    万次阅读 多人点赞 2019-10-22 10:47:29
    信息系统项目管理–论文分析 (1)整体管理 制定项目章程 1.项目发起人发布了这个文件,项目启动了,我被授权了 2.项目章程的内容(6个项目,2个总体,2个其他) 制定项目管理计划 1.和大家一起制定了一个项目...
  • * 超市管理系统 * 实现的功能: * 1.商品数据的初始化 * 2.用户的菜单选择 * 3.根据选择执行不同的功能 * 3.1 read 查看商品 * 3.2 Create 添加商品 * 3.3 Delete 删除商品 * 3...
  • vb.net+access 学生信息管理系统

    热门讨论 2009-06-25 14:27:19
    学生信息管理系统vb.net+access
  • 20xx年x月,我作为项目经理参与了xx市某上市公司的生产管理系统项目。该项目总投资300万人民币,建设工期为10个月,通过项目的建设,实现了该公司物料管理、库存管理、生产工单、生产计划、生产派...
  • 管理信息系统复习总结(保姆级)

    万次阅读 多人点赞 2021-01-01 14:19:37
    管理信息系统的新变化:①技术(云计算、大数据与物联网、移动数字化平台) ②管理(在线合作与社会化网络软件、商务智能、虚拟会议)③组织(社会化商务、远程办公、商业价值的共创) 信息系统如何改变企业:①新兴...
  • 信息系统项目管理师学习笔记

    千次阅读 多人点赞 2019-03-30 14:34:08
    信息系统项目管理师学习笔记 信息化从小到大分为以下5个层次: 产品信息化、企业信息化、产业信息化、国民经济信息化、社会生活信息化 国家信息化体系包括6要素: 1、信息技术应用 2、信息资源 3、信息网络 4、信息...
  • 《程序设计综合训练实践报告》 此项目为图书信息管理系统,是一个采用了mysql+mybatis框架+java编写的maven项目
  • C语言学生成绩信息管理系统课程设计报告

    万次阅读 多人点赞 2016-10-07 22:19:22
    学生成绩管理系统 主要功能: (1)能按学期、按班级完成对学生成绩的录入、 修改,删除 (2)能按班级统计学生的成绩,求学生的总分及 平均分,并能根据学生的平均成绩进行排序 (3)能查询学生...
  • 一、项目管理系统 项目管理系统是管理项目所需的过程、工具、技术、方法、资源和程序的集合。 二、项目管理信息系统(project management information system
  • 为实现髙效管理,设计了商品配送中心信息管理系统,其主要 功能描述如下: 系统接收由连锁超市提出的供货请求,并将其记录到供货请求记录文件。 在接到供货请求后,从商品库存记录文件中进行商品库存信息查询。如果...
  • SQL第十七章项目案例:QQ用户信息管理系统

    万次阅读 多人点赞 2016-12-02 17:33:45
    //根据用户编号查找指定用户信息 public SqlDataReader GetUserByID(int UserID) { try { SqlConnection conn = new SqlConnection(strConn); conn.Open(); StringBuilder sb = new StringBuilder(); sb....
  • 设备管理信息系统

    万次阅读 多人点赞 2016-04-08 19:26:29
    设备管理系统(Equipment Management System)是将信息化了设备技术信息与现代化管理相结合,是实现研究级管理信息化的先导。设备管理软件是设备管理模式与计算机技术结合的产物,设备管理的对象是研究所中各种各样...
  • 数据结构课程设计报告-职工信息管理系统

    万次阅读 多人点赞 2016-02-24 13:34:39
    “数据结构”课程设计报告 职工信息管理系统 课程设计任务与要求: [问题描述] 每个员工的信息包括:编号、姓名、性别、出生年月、学历、职务、电话、住址等。系统能够完成员工信息的查询、更新、插入、删除、排序等...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 117,234
精华内容 46,893
关键字:

信息管理系统清单