第1章绪论1.1历史回顾1.2电通信系统的基本组成1.2.1数字通信系统1.2.2数字通信的早期工作1.3通信信道及其特征1.4通信信道的数学模型1.5本书的结构1.6深入学习第2章信号和系统的频域分析2.1傅里叶级数2.1.1实信号的傅里叶级数:三角傅里叶级数2.2傅里叶变换2.2.1实信号、偶信号和奇信号的傅里叶变换2.2.2傅里叶变换的基本性质2.2.3周期信号的傅里叶变换2.3功率和能量2.3.1能量型信号2.3.2功率型信号2.4带宽受限信号的抽样2.5带通信号2.6深入学习习题第3章模拟信号的发送和接收3.1调制简介3.2振幅调制(AM)3.2.1双边带抑制载波AM3.2.2常规振幅调制3.2.3单边带AM3.2.4残留边带AM3.2.5AM调制器和解调器的实现3.2.6信号多路复用3.3角度调制3.3.1FM信号和PM信号的表示形式3.3.2角度调制信号的频谱特性3.3.3角度调制器和解调器的实现3.4无线电广播和电视广播3.4.1AM无线电广播3.4.2FM无线电广播3.4.3电视广播3.5移动无线电系统3.6深入学习习题第4章随机过程4.1概率及随机变量4.2随机过程:基本概念4.2.1随机过程的描述4.2.2统计平均4.2.3平稳过程4.2.4随机过程与线性系统4.3频域中的随机过程4.3.1随机过程的功率谱4.3.2线性时不变系统的传输4.4高斯过程及白过程4.4.1高斯过程4.4,2白过程4.5带限过程及抽样4.6带通过程4.7深入学习习题第5章模拟通信系统中的噪声影响5.1噪声对线性调制系统的影响5.1.1噪声对基带系统的影响5.1.2噪声对DSB-SCAM的影响5.1.3噪声对SSBAM的影响5.1.4噪声对常规调幅的影响5.2使用锁相环(PLL)进行载频相位估计5.2.1锁相环5.2.2加性噪声对相位估计的影响5.3噪声对角度调制的影响5.3.1角度调制的门限效应5.3.2预加重和去加重滤波5.4模拟调制系统的比较5.5模拟通信系统中传输损耗和噪声的影响5.5.1热噪声源的特征5.5.2噪声温度效应及噪声系数5.5.3传输损耗5.5.4信号传输中继器5.6深入学习习题第6章信源与信源编码6.1信源的数学模型6.1.1信息的度量6.1.2联合熵与条件熵6.2信源编码理论6.3信源编码算法6.3.1霍夫曼信源编码算法6.3.2Lempel-Ziv信源编码算法6.4率失真理论6.4.1互信息量6.4.2微分熵6.4.3率失真函数6.5量化6.5.1标量量化6.5.2矢量量化6.6波形编码6.6.1脉冲编码调制(PCM)6.6.2差分脉冲编码调制(DPCM)6.6.3增量调制(M)6.7分析-合成技术6.8数字音频传输和数字音频记录6.8.1电话传输系统中的数字音频信号6.8.2数字音频录制6.9JPEG图像编码标准6.10深入学习习题第7章加性高斯白噪声信道中的数字传输7.1信号波形的几何表示7.2脉冲振幅调制7.3二维信号波形7.3.1基带信号7.3.2二维带通信号--载波相位调制7.3.3二维带通信号--正交振幅调制7.4多维信号波形7.4.1正交信号波形7.4.2双正交信号波形7.4.3单纯信号波形7.4.4二进制编码的信号波形7.5加性高斯白噪声信道中数字已调信号的最佳接收机7.5.1相关型解调器7.5.2匹配滤波器型解调器7.5.3最佳检测器7.5.4载波振幅已调信号的解调和检测7.5.5载波相位已调信号的解调和检测7.5.6正交振幅已调信号的解调和检测7。
5.7频率已调信号的解调和检测7.6加性高斯白噪声中信号检测的错误概率7.6.1二进制调制的错误概率7.6.2M进制PAM的错误概率7.6.3相位相干PSK调制的错误概率7.6.4DPSK的系统错误概率7.6.5QAM的错误概率7.6.6M进制正交信号的错误概率7.6.7M进制双正交信号的错误概率7.6.8M进制单纯信号的错误概率7.6.9FSK的非相干检测的错误概率7.6.10调制方式的比较7.7有线和无线通信信道的性能分析7.7.1再生中继器7.7.2无线信道中的链路预算分析7.8码元同步7.8.1超前-滞后门同步法7.8.2最小均方误差法7.8.3最大似然准则法7.8.4频谱线法7.8.5载波已调信号的码元同步7.9深入学习习题第8章通过带限AWGN信道的数字传输8.1通过带限信道的数字传输8.1.1带限基带信道上的数字PAM传输8.1.2带限带通信道上的数字传输8.2数字已调信号的功率谱8.2.1基带信号的功率谱8.2.2载波已调信号的功率谱8.3带限信道的信号设计8.3.1无码间干扰的带限信号的设计--奈奎斯特准则8.3.2具有可控ISI的带限信号8.4检测数字PAM的错误概率8.4.1具有零ISI的PAM检测的错误概率8.4.2可控ISI的逐码元数据检测8.4.3部分响应信号检测的错误概率8.5与记忆有关的数字调制信号8.5.1有记忆的调制编码与调制信号8.5.2最大似然序列检测器8.5.3部分响应信号的最大似然序列检测8.5.4有记忆数字信号的功率谱8.6存在信道失真的系统设计8.6.1已知信道的发送和接收滤波器的设计8.6.2信道均衡8.7多载波调制和OFDM8.7.1FFT算法实现的OFDM系统8.8深入学习习题第9章信道容量与信道编码9.1信道模型9.2信道容量9.2.1高斯信道容量9.3通信的容限9.3.1模拟信号的PCM传输9.4可靠通信的编码9.4.1正交信号错误概率的紧界9.4.2编码的原则9.5线性分析码9.5.1线性分组码的译码及其性能9.5.2突发错误纠错编码9.6循环码9.6.1循环码的结构9.7卷积码9.7.1卷积码的基本性质9.7.2卷积码的最佳译码--维特比算法9.7.3卷积码的其他译码算法9.7.4卷积码的错误概率界限9.8复合编码9.8.1乘积码9.8.2链接码9.8.3Turbo码9.8.4BCJR算法9.8.5Turbo码的性能9.9带限信道的编码9.9.1编码与调制的结合9.9.2网格编码调制9.10信道编码的实际应用9.10.1深层空间通信的编码9.10.2电话线路调制解调器的编码9.10.3光盘编码9.11深入学习习题第10章无线通信10.1衰落多径信道上的数字传输10.1.1时变多径信道的信道模型10.1.2衰落多径信道的信号设计10.1.3频率非选择性瑞利衰落信道上的二进制调制性能10.1.4通过信号分集提高系统性能10.1.5频率选择性信道的调制和解调--RAKE解调器10.1.6多天线系统和空时编码10.2连续载波相位调制10.2.1连续相位FSK(CPFSK)10.2.2连续相位调制(CPM)10.2.3CPFSK和CPM的频谱特性10.2.4CPM信号的解调和检测10.2.5CPM在AWGN信道和瑞利衰落信道中的性能10.3扩频通信系统10.3.1扩频数字通信系统的模型10.3.2直接序列扩频系统10.3.3直接序列扩频信号的应用10.3.4脉冲干扰和衰落的影响10.3.5PN序列的生成10.3.6跳频扩频10.3.7扩频系统的同步10.4数字蜂窝通信系统10.4.1GSM系统10.4.2基于IS-95的CDMA系统10.5深入学习习题附录A多信道二进制信号接收时的错误概率参考文献
2023/10/11 13:18:42 13.36MB 通信 系统
1
应用程序调试技术作者:(美)JohnRobbins 译者:潘文林陈武目录结论第l部分调试概论第1章错误:问题出在那里,如何解决1.l错误及其调试1.1.l什么是错误1.1.2进程错误及其解决方案1.1.3制定调试计划1.2调试的先决条件1.2.l技能组合l.2.2学习技能组合1.3调试过程1.3.l第1步:复制错误1.3.2第2步:描述错误1.3.3第3步:始终假定错误是你自己的问题1.3.4第4步:分解并解决错误1.3.5第5步:进行有创见的思考1.3.6第6步:杠杆工具1.3.7第7步:开始繁重的调试工作1.3.8第8步:校验错误已被更正.1.3.9第9步:学习与交流1.3.10调试过程的决定性秘诀1.4小结第2章开始调试2.1跟踪变更直到项目结束2.1.l版本控制系统2.1.2错误跟踪系统2.1.3选择正确的系统2.2制定构建调试系统的进度表2.2.l用调试符来连编所有的构件2.2.2警告与错误同等重要2.2.3了解在何处装载DLL2.2.4设计发布构件的轻便诊断系统2.3日常连编和冒烟测试是必须遵循的2.3.l日常构件2.3.2冒烟测试2.4立即连编安装程序2.5QA必须对调试构件进行测试2.6小结第3章边编码边调试3.1注意声明3.1.l如何声明,声明什么3.l.2不同类型的VisualC+十和VisualBasic声明3.l.3SUPERASSERT3.2跟踪、跟踪、跟踪、再跟踪3.3注意注释3.4相信自己,但要校验(单元测试)3.5小结第II部分高效率的调试第4章调试器的工作原理4.1Windows调试器的类型4.1.1用户模式调试器4.1.2内核模式调试器4.2Windows2000操作系统为调试对象提供的支持4.2.1Windows2000堆阵检查4.2.2在调试器中自动启动4.2.3快速中断项4.3MinDBG:一个简单的Win32调试器4.4WDBG:真正的调试器4.4.l内存读写操作4.4.2断点和单步执行4.4.3符号表、符号引擎和堆栈遍历4.4.4StepInto、StepOver和StapOut功能4.4.5WDBG调试器的一个有趣的开发问题4.5如果需要编写自己的调试器4.6WDBG调试器之后是什么?4.7小结第5章使用Visual C+十调试器进行强有力的调试5.1高级断点及其用法5.1.l高级断点语法和位置断点5.1.2在任何函数上快速中断5.1.3在系统或输出的函数中设置断点5.1.4位置断点修饰符5.1.5全局表达式和条件断点5.1.6Windows消息断点5.2远程调试5.3技巧及窍门5.3.1设置断点5.3.2Watch窗口5.4小结第6章使用x86汇编语言和Visual C++调试器Disassembly窗口进行强有力的调试6.1CPU的基础知识6.1.l寄存器6.1.2指令格式和内存编址6.2关于VisualC+十内联汇编器6.3需要了解的指令6.3.1堆栈处理6.3.2最常用的几个简单指令6.3.3常见的序列:函数入口和出口6.3.4变量访问:全局变量、参数和局部变量6.3.5调用进程和返回指令6.4调用约定6.5需要了解的其他指令6.5.l数据处理6.5.2指针处理6.5.3比较和测试6.5.4条约和分文指令6.5.5循环6.5.6字符串处理6.6常见的汇编语言结构6.6.1FS寄存器访问6.6.2结构和类引用6.7完整的例子6.8Disassembly窗口6.8.1导航功能6.8.2在堆栈上查看参数6.8.3SetNextStatement命令6.8.4Memory窗口和Disassembly窗口6.9技巧和诀窍6.9.1Endians6.9.2垃圾代码6.9.3寄存器和Watch窗口6.9.4从ASM文件中学习6.10小结第7章使用VisualBasic调试器进行强
2023/10/7 11:13:46 9.92MB 应用程序调试技术
1
gcc-3.4ubuntu安装包,文件解压后为.deb格式的。
2023/10/4 9:16:31 3.24MB gcc
1
第一篇MATLAB入门篇 第1章MATLAB概述  1.1MATLAB的产生与发展  1.2MATLAB的优势与特点  1.3MATLAB系统的构成  1.4MATLAB桌面操作环境   1.4.1MATLAB启动和退出   1.4.2MATLAB主菜单及功能   1.4.3MATLAB命令窗口   1.4.4MATLAB工作空间   1.4.5M文件编辑/调试器   1.4.6图形窗口   1.4.7MATLAB文件管理   1.4.8MATLAB帮助  1.5MATLAB的工具箱  1.6小结 第2章MATLAB计算基础  2.1MATLAB数值类型  2.2关系运算和逻辑运算  2.3矩阵及其运算   2.3.1矩阵的创建   2.3.2矩阵的运算  2.4复数及其运算   2.4.1复数表示   2.4.2复数绘图   2.4.3复数操作函数  2.5符号运算   2.5.1符号运算概述   2.5.2常用的符号运算  2.6小结 第3章MATLAB绘图入门  3.1MATLAB中绘图的基本步骤 3.2在工作空间直接绘图  3.3利用绘图函数绘图   3.3.1二维图形   3.3.2三维图形  3.4图形的修饰  3.5小结 第4章MATLAB编程入门  4.1MATLAB编程概述  4.2MATLAB程序设计原则  4.3M文件  4.4MATLAB程序流程控制  4.5MATLAB中的函数及调用   4.5.1函数类型   4.5.2函数参数传递  4.6函数句柄  4.7MATLAB程序调试   4.7.1常见程序错误   4.7.2调试方法   4.7.3调试工具   4.7.4M文件分析工具   4.7.5Profiler分析工具  4.8MATLAB程序设计技巧   4.8.1嵌套计算   4.8.2循环计算   4.8.3使用例外处理机制   4.8.4使用全局变量   4.8.5通过varargin传递参数  4.9小结 第5章Simulink仿真入门  5.1Simulink仿真概述   5.1.1Simulink的启动与退出   5.1.2Simulink模块库  5.2Simulink仿真模型及仿真过程  5.3Simulink模块的处理   5.3.1Simulink模块参数设置   5.3.2Simulink模块基本操作   5.3.3Simulink模块连接  5.4Simulink仿真设置   5.4.1仿真器参数设置   5.4.2工作空间数据导入/导出   5.4.2设置  5.5Simulink仿真举例  5.6小结第二篇神经网络提高篇 第6章MATLAB神经网络工具箱概述 第7章MATLAB神经网络GUI工具 第8章感知器神经网络 第9章线性神经网络 第10章BP神经网络 第11章径向基神经网络 第12章自组织神经网络 第13章反馈神经网络第三篇神经网络综合实战篇 第14章神经网络优化 第15章神经网络控制 第16章神经网络故障诊断 第17章神经网络预测 第18章Simulink中的神经网络设计 第19章自定义神经网络附录A工具箱函数列表参考文献
2023/9/22 10:10:45 92.68MB 神经网络
1
餐饮管理系统一、需求分析随着社会服务行业的发展,餐饮业对自身服务的质量和能力也有了更高的要求。
餐饮管理系统正是在这样的情况之下越来越受到重视。
餐厅的内部服务项目众多,既需要完成前台的服务工作,还需要完成后台的管理工作,如果没有一套可靠的餐饮管理系统,单凭手工操作,不仅效率低,而且会极大地影响到酒店的服务质量。
设计的目标:实现餐饮管理的科学化、自动化,提高各个模版的办公效率,为高质量的餐饮服务提供保证。
系统功能概述民以食为天,随着人民生活水平的提高,餐饮业在服务行业中占有越来越重要的地位。
经过多年发展,餐饮管理已经逐渐由定性管理,进入到重视定量管理的科学阶段。
众所周知,在定量管理的具体实现方法和手段方面,最有效的工具就是计算机管理。
传统的手工操作管理存在着许多无法避免的问题,例如:人工计算机账单金额出现差错;
收银工作中跑单、漏单、偷钱现象普遍;
个别服务员作弊、改单、宰客情形时有发生;
客人消费单据难以保存和查询。
如果借助计算机来管理,就可以轻松的解决处理这些问题。
一个餐饮管理信息系统应该包括基本的餐厅的服务管理、管理人员信息的维护等,以及与之相应的操作。
所以整个餐饮管理信息系统分为两个大部分,即后台的数据管理维护和前台的操作。
后台数据库的管理能保证系统各项功能正常运行,前台操作能提供给客户尽可能方便快捷的服务。
功能模块划分1. 前台操作系统订餐管理模块:点菜(输入桌台代码和食物代码)、加菜、下单。
结账管理模块:结账(输入桌台代码)、结账方式选择(包括现金结账、信用卡结账、支票结账、签单等)。
交班管理模块:统计当班数据(包括桌台数、人民币结账金额以及总金额等),为下班操作作准备。
2. 后台管理维护系统用户权限设置:可以查询员工的基本资料(姓名、性别、年龄、出生年月、籍贯、家庭住址等),员工登录名称、密码、员工操作权限等,可以根据需要进行设置。
菜谱设置:新菜单录入(包括菜式名称、代码、类型、价格、成本等)、菜式修改、删除等菜式维护。
付款方式设置:分为人民币付款、信用卡、支票签单等,可以根据需要进行添加和删除。
系统流程分析系统流程图1所示。
当用户进入系统主界面以后,新用户经过注册后才能凭借其用户名和密码登录,老用户可以直接登录。
用户登录以后,系统自动判断出其操作权限。
操作权限包括普通员工和管理人员。
新用户的操作权限默认为是普通员工。
普通员工只能进行订餐、结账操作,而管理人员除此之外还可以进行系统设置与营业分析。
•图1当有顾客订餐的时候,员工输入桌台号和食物代码即可进行点菜,在结账以前,加菜是允许的。
当顾客结账的时候,员工输入桌台号,选择顾客的付款方式,即可完成结账。
在下班时间,员工可以统计当班期间的消费情况。
这样,员工注销此次登录,退出系统,一天的工作就到此结束。
管理人员可以随时进行系统设置,包括菜谱设置、用户权限设置、付款方式设置等。
功能模块调用餐饮管理系统调用了以下功能模块:用户注册模块、用户登录模块、数据显示模块。
二、概念设计图2给出了餐饮管理系统的E-R实体关系图。
收银员、餐桌、菜单三者之间的关系是订餐,其中订餐关系包括的属性有:餐桌编号、菜肴编号、菜肴名称、菜肴单价、菜肴数量、菜肴价格、菜肴折扣、是否结账、结账时间。
三、逻辑设计将E-R关系模型转化为二维表。
本系统主要需要6个表,分别为用户信息表(UserInfo)、菜谱信息表(MenuInfo)、订餐信息表(OrderInfo)、桌台信息表(DeskInfo)、付款方式表(PayModeInfo)、当班统计表(CaldayInfo),各个表中字段的类型以及说明如表1-表6所示。
表1用户信息表表2菜谱信息表表3订餐信息表表4桌台信息表表5付款方式表表6当班统计表其中,用户信息表主要存储用户的基本信息,权限项决定了用户的操作权限。
菜谱信息表存储食物的基本信息。
价格项为结账与结算提供依据。
桌台信息表存储各个桌台的消费情况,如消费金额、是否结账等。
订餐信息表存储各个桌台的点菜情况。
付款方式表存储了基本的付款方式,供结账时选择。
当班统计表存储员工当班期间的营业情况。
四、数据库设计数据库管理系统采用MicrosoftSQLServer2000作为后台数据库。
首先,在企业管理器中建立一个名为MenuManageSys的数据库,然后建立以上6个数据库表,并设定主键、长度。
这样,数据库的设计已经完成。
五、详细设计本餐饮管理系统采用VisualC+++SQLServer来开发。
利用ADO技术调用后台数据库,使用了两个ADO智能指针_ConnectionPtr和_RecordsetPtr,其中_ConnectionPtr用来连接后台SQLServer数据库,_RecordsetPtr指针用来对数据库的表中的记录集进行操作。
工程使用的是基于对话框的程序,每个对话框为一个类,父类为CDialog,实现的一些功能都封装在类的函数中,体现了面向对象编程语言C++的特性。
导入ADO接口:在工程的stdafx.h文件里直接引入符号#import引入ADO库文件,加入下面一行代码,以使编译器能正确编译:#import"c:\programfiles\commonfiles\system\ado\msado15.dll"no_namespacerename("EOF","adoEOF")用_ConnectionPtr指针连接数据库:在CmenuManageSysApp类的BOOLInitInstance()函数中加入以下代码:m_pConnection.CreateInstance("ADODB.Connection"); try { m_pConnection->ConnectionTimeout=8; m_pConnection->PutCursorLocation(adUseClient);m_pConnection->Open("driver={SQLServer};Server=172.29.130.47;DATABASE=MenuManageSys;UID=;PWD=","","",adModeUnknown); } catch(_com_errore) { AfxMessageBox("数据库连接失败!"); returnFALSE; }1.设计工程框架餐饮管理系统的框架是一个对话框类型的操作界面,用户注册、登录后,可对餐饮管理的各个功能模块进行操作。
1.1设置主界面系统主界面如图3:图3每个事件的对应代码如下:(1) 单击“注册”菜单,弹出“注册”对话框,代码如下:voidCMenuManageSysDlg::OnRegister(){ CRegisterDlgdlg(this); dlg.DoModal();}(2) 单击“登录”菜单,弹出“登录”对话框,代码如下:voidCMenuManageSysDlg::OnLogin(){ CLoginDlgdlg(this); dlg.DoModal();}(3) 单击“订餐”菜单,判断用户是否登录,代码如下:voidCMenuManageSysDlg::OnUpdateOrderSystem(CCmdUI*pCmdUI){ if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); }}(4) 如果用户已经登录,弹出“餐桌信息”对话框,否则提示用户登录,代码如下:voidCMenuManageSysDlg::OnOrderSystem(){ CDeskDlgdlg; dlg.DoModal();}(5) 单击“结账”菜单,判断用户是否登录,代码如下:voidCMenuManageSysDlg::OnUpdatePayCheck(CCmdUI*pCmdUI){ if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); }}(6) 如果用户已经登录,弹出“结账”对话框,否则提示用户先登录,代码如下:voidCMenuManageSysDlg::OnPayCheck(){ CPayDlgdlg; dlg.DoModal();}(7) 单击“下班”菜单,判断用户是否登录,代码如下:voidCMenuManageSysDlg::OnUpdateChangeDuty(CCmdUI*pCmdUI){ if(theApp.m_Level==0||theApp.m_Level==1) { pCmdUI->Enable(true); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); }}(8) 如果用户已经登录,弹出“交接班”对话框,否则提示用户先登录,代码如下:voidCMenuManageSysDlg::OnChangeDuty(){ COffdutyDlgdlg; dlg.DoModal();}(9) 单击“用户权限设置”菜单,判断用户是否登录及其权限,代码如下:voidCMenuManageSysDlg::OnUpdateSetLevel(CCmdUI*pCmdUI){ if(theApp.m_Level==1) { pCmdUI->Enable(true); } elseif(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行用户级别设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } }(10) 如果权限是管理人员,弹出“权限设置”对话框,如果是普通员工会提示无权进行用户级别设置,代码如下:voidCMenuManageSysDlg::OnSetLevel(){ CLevelDlgdlg; dlg.DoModal();}(11) 单击“菜谱设置”菜单,判断用户是否登录及其权限,代码如下:voidCMenuManageSysDlg::OnUpdateSetMenu(CCmdUI*pCmdUI){ if(theApp.m_Level==1) { pCmdUI->Enable(true); } elseif(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行菜谱设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); } }(12)如果权限是管理人员,弹出“菜谱设置”对话框,如果是普通员工会提示无权进行用户级别设置,代码如下:voidCMenuManageSysDlg::OnSetMenu(){ CMenuSetDlgdlg; dlg.DoModal();}(13)单击“付款方式设置”菜单,判断用户是否登录及其权限,代码如下:voidCMenuManageSysDlg::OnUpdatePaymodeSet(CCmdUI*pCmdUI){ if(theApp.m_Level==1) { pCmdUI->Enable(true); } elseif(theApp.m_Level==0) { pCmdUI->Enable(false); AfxMessageBox("您无权进行付款方式设置"); } else { pCmdUI->Enable(false); AfxMessageBox("请您先登录"); }}(14)如果权限是管理人员,弹出“设置付款方式”对话框,如果是普通员工会提示无权进行用户级别设置,代码如下:voidCMenuManageSysDlg::OnPaymodeSet(){ CSetPaymodeDlgdlg; dlg.DoModal();}(15)单击“注销”菜单,提示用户本次登录已注销,代码如下:voidCMenuManageSysDlg::OnLogout(){ if(MessageBox("您确定要注销吗","注销询问",MB_OKCANCEL|MB_ICONQUESTION)==IDOK) { theApp.m_Level=-1; AfxMessageBox("本次登录已注销"); }}(16)单击“退出系统”,在确定退出后,关闭系统,代码如下:voidCMenuManageSysDlg::OnExitSystem(){ if(MessageBox("真的要退出系统吗","退出询问",MB_OKCANCEL|MB_ICONQUESTION)==IDOK) { CDialog::OnOK(); }}1.2设计注册模块注册模块如图4:图4注册模块在输入了完整的信息,按下“确定”按钮后,如果没有重复用户,则注册成功,代码如下:voidCRegisterDlg::OnRegisterBtn(){ //TODO:Addyourcontrolnotificationhandlercodehere UpdateData(TRUE);if(!m_strUserName.IsEmpty()&&!m_strUserNative.IsEmpty()&&!m_strUserAdddress.IsEmpty()&&!m_strUserPwd.IsEmpty()&& !m_strUserPwdAgain.IsEmpty()&&!m_strUserNum.IsEmpty()&&m_nUserAge!=0) { if(m_strUserPwd.CompareNoCase(m_strUserPwdAgain)!=0) { MessageBox("密码有误,请重新输入密码。
","系统注册"); } else { try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("SELECT*FROMUserInfo",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); } catch(_com_errore) { CStringtemp; temp.Format("连接数据库错误信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } m_pRecordset->AddNew(); m_pRecordset->PutCollect("UserName",_variant_t(m_strUserName)); m_pRecordset->PutCollect("UserPwd",_variant_t(m_strUserPwd)); m_pRecordset->PutCollect("UserNative",_variant_t(m_strUserNative)); m_pRecordset->PutCollect("UserAddress",_variant_t(m_strUserAdddress)); m_pRecordset->PutCollect("UserNum",_variant_t(m_strUserNum)); CStringstr; if(m_nUserSex==0) { m_pRecordset->PutCollect("UserSex",_variant_t("男")); } elsem_pRecordset->PutCollect("UserSex",_variant_t("女")); str.Format("%d",m_nUserAge); m_pRecordset->PutCollect("UserAge",_variant_t(str)); str.Format("%d",0); m_pRecordset->PutCollect("UserLevel",_variant_t(str)); m_pRecordset->Update(); m_pRecordset->Close(); m_pRecordset=NULL; MessageBox("恭喜您注册成功","系统注册"); CDialog::OnOK(); return; } } else { MessageBox("请输入完整注册信息","系统注册"); } }登录模块如图5:图5登录模块输入完整信息,并单击“确定”按钮后,如果用户名不存在,则重新输入;
如果密码错误,则重新输入,在重新输入三次密码后还不正确,则退出登录界面,登录失败。
代码如下:voidCLoginDlg::OnOK(){ UpdateData(TRUE); if(!m_strUserName.IsEmpty()&&!m_strPassword.IsEmpty()) { try { CStringsql,str; // str.Format("%d",m_nUserNum); sql="SELECT*FROMUserInfoWHEREUserName='"+m_strUserName+"'andUserNum='"+m_strUserNum+"'andUserPwd='"+m_strPassword+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); if(m_pRecordset->adoEOF) { m_pRecordset->Close(); sql="SELECT*FROMUserInfoWHEREUserName='"+m_strUserName+"'ANDUserNum='"+m_strUserNum+"'"; try { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText); if(m_pRecordset->adoEOF) { MessageBox("此用户不存在!","登录系统"); } else { if(count>=2) { MessageBox("登录次数过多,系统关闭","系统登录错误",MB_OK|MB_ICONWARNING); CDialog::OnOK(); } else { MessageBox("密码错误!","登录系统"); count++; } return; } } catch(_com_errore)///捕捉异常 { CStringtemp; temp.Format("连接数据库错误信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } } else { theApp.m_Level=m_pRecordset->GetCollect("UserLevel").lVal; theApp.m_name=m_strUserName; MessageBox("登录成功!","登录系统",MB_OKCANCEL|MB_ICONQUESTION); CDialog::OnOK(); return; } } catch(_com_errore)///捕捉异常 { CStringtemp; temp.Format("连接数据库错误信息:%s",e.ErrorMessage()); AfxMessageBox(temp); return; } m_pRecordset->Close(); m_pRecordset=NULL; } else { MessageBox("请输入用户名和密码","登录系统"); }}到此,注册模块与登录模块就设计完成。
新用户注册以后,凭借其用户名和密码可以登陆,从而对系统进行操作。
3.功能模块设计根据功能模块划分,可以将餐饮管理系统的功能模块划分为值班员管理模块、菜谱管理模块、用户管理模块、订餐模块、结账模块,下面对工程各个功能进行介绍。
3.1订餐模块设计订餐模块的功能是员工输入桌台号码和食物代码进行点菜、根据需要加菜、下单。
订餐模块如图6所示:图6订餐模块为对话框类添加3个数据集对象:_RecordsetPtrm_pRecordset_Desk;_RecordsetPtrm_pRecordset_Order;_RecordsetPtrm_pRecordset_Menu;对话框类的各成员函数的代码如下:CDeskDlg::CDeskDlg(CWnd*pParent/*=NULL*/):CDialog(CDeskDlg::IDD,pParent){ //{{AFX_DATA_INIT(CDeskDlg) m_nOrderDeskNumber=0; m_nOrderFoodNumber=0; m_nOrderFoodRebate=100; m_nOrderFoodAcount=1; //}}AFX_DATA_INIT}BOOLCDeskDlg::OnInitDialog()//对话框初始化函数{ CDialog::OnInitDialog(); GetDlgItem(IDOK)->EnableWindow(FALSE); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCDeskDlg::OnOrderBtn()//点菜消息按钮{ UpdateData(TRUE); CStringstr; CStringsql; if(m_nOrderDeskNumber==0) { AfxMessageBox("请输入餐桌编号"); return; } if(m_nOrderFoodNumber!=0) { str.Format("%d",m_nOrderFoodNumber); sql="SELECT*FROMMenuInfoWHEREFoodNum="+str+""; m_pRecordset_Menu.CreateInstance("ADODB.Recordset"); m_pRecordset_Menu->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Menu->GetRecordCount()==0) { AfxMessageBox("该菜肴编号不存在,请重新输入编号"); return; } else { intm_nTempPrice; CStringm_strTempName; m_nTempPrice=m_pRecordset_Menu->GetCollect("FoodPrice").lVal;//食物价格 m_strTempName=m_pRecordset_Menu->GetCollect("FoodName").bstrVal;//食物名称 m_pRecordset_Menu->Close(); str.Format("%d",m_nOrderDeskNumber);//桌子编号 sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_pRecordset_Order->AddNew(); str.Format("%d",m_nOrderDeskNumber); m_pRecordset_Order->PutCollect("DeskNum",_variant_t(str));//餐桌编号 str.Format("%d",m_nOrderFoodNumber); m_pRecordset_Order->PutCollect("FoodNum",_variant_t(str));//食物编号 str.Format("%d",m_nTempPrice); m_pRecordset_Order->PutCollect("FoodSignalPrice",_variant_t(str));//食物单价 str.Format("%d",m_nOrderFoodAcount); m_pRecordset_Order->PutCollect("FoodAcount",_variant_t(str));//食物数量 m_nTempPrice*=m_nOrderFoodAcount; str.Format("%d",m_nTempPrice); m_pRecordset_Order->PutCollect("FoodPrice",_variant_t(str));//食物价格 str.Format("%d",m_nOrderFoodRebate); m_pRecordset_Order->PutCollect("FoodRebate",_variant_t(str));//食物折扣 intm_nTempRePrice; m_nTempRePrice=(int)m_nTempPrice*m_nOrderFoodRebate/100; str.Format("%d",m_nTempRePrice); m_pRecordset_Order->PutCollect("FoodRePrice",_variant_t(str)); //折后价格(小计) m_pRecordset_Order->PutCollect("FoodName",_variant_t(m_strTempName));//食物名称 intm_nTempCheck; m_nTempCheck=0; str.Format("%d",m_nTempCheck); m_pRecordset_Order->PutCollect("FoodCheck",_variant_t(str));//是否结帐 CStringpaytime; CTimenow=CTime::GetCurrentTime(); paytime=now.Format(_T("%Y-%m-%d%H:%M:%S")); m_pRecordset_Order->PutCollect("FoodTime",_variant_t(paytime));//点菜时间 m_pRecordset_Order->Update(); m_pRecordset_Order->Close(); str.Format("%d",m_nOrderDeskNumber); CStringstr1; str1.Format("%d",0); sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+"andFoodCheck="+str1+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbFood.SetRefDataSource(NULL); m_dbFood.SetRefDataSource((LPUNKNOWN)m_pRecordset_Order); m_dbFood.SetColumnHeaders(2); m_dbFood.Refresh(); GetDlgItem(IDOK)->EnableWindow(TRUE); } } else { AfxMessageBox("请输入菜肴编号"); return; } }voidCDeskDlg::OnOK()//下单消息按钮{ CStringstr,sql,str1; intm_nTempRePrice; m_nTotalPrice=0; while(!m_pRecordset_Order->adoEOF) { m_nTempRePrice=m_pRecordset_Order->GetCollect("FoodRePrice").lVal; m_nTotalPrice+=m_nTempRePrice; m_pRecordset_Order->MoveNext(); } if(m_nTotalPrice>0) { inttemp=0; str1.Format("%d",temp); str.Format("%d",m_nOrderDeskNumber); sql="SELECT*FROMDeskInfoWHEREDeskNum="+str+"andDeskCheck="+str1+""; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Desk->GetRecordCount()==0) { m_pRecordset_Desk->AddNew(); str.Format("%d",m_nOrderDeskNumber); m_pRecordset_Desk->PutCollect("DeskNum",(_variant_t)str); str.Format("%d",m_nTotalPrice); m_pRecordset_Desk->PutCollect("DeskPrice",(_variant_t)str); temp=0; str.Format("%d",temp); m_pRecordset_Desk->PutCollect("DeskCheck",(_variant_t)str); } else { str.Format("%d",m_nTotalPrice); m_pRecordset_Desk->PutCollect("DeskPrice",(_variant_t)str); } m_pRecordset_Desk->Update(); m_pRecordset_Desk->Close(); } CDialog::OnOK();}voidCDeskDlg::OnUpdateOrderDeskNumber()//根据餐桌号自动将原来已点的食物信息绑定到数据列表{ UpdateData(TRUE); CStringstr,sql; str.Format("%d",m_nOrderDeskNumber); CStringstr1; inttemp=0; str1.Format("%d",temp); sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+"andFoodCheck="+str1+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbFood.SetRefDataSource(NULL); m_dbFood.SetRefDataSource((LPUNKNOWN)m_pRecordset_Order); m_dbFood.SetColumnHeaders(2); m_dbFood.Refresh(); }3.2结账模块设计结账模块的功能是员工输入桌台代码进行结账、选择结账方式(包括现金结账、信用卡结账、支票结账、签单等)、自动找零。
结账模块如图7所示:图7结账模块为对话框类添加3个数据集对象,代码如下: _RecordsetPtrm_pRecordset_Paymode; _RecordsetPtrm_pRecordset_Order; _RecordsetPtrm_pRecordset_Desk;对话框类的各成员函数的代码如下:CPayDlg::CPayDlg(CWnd*pParent/*=NULL*/) :CDialog(CPayDlg::IDD,pParent){ //{{AFX_DATA_INIT(CPayDlg) m_strPaymode=_T(""); m_strPayUserName=_T(""); m_nPayDeskNumber=0; m_nPayTotalPrice=0; m_nPayRealPrice=0; m_nPayRePrice=0; m_timePay=COleDateTime::GetCurrentTime(); //}}AFX_DATA_INIT}BOOLCPayDlg::OnInitDialog()//对话框初始化函数{ CDialog::OnInitDialog(); m_strPayUserName=theApp.m_name; CStringsql; sql="SELECT*FROMPayModeInfo"; m_pRecordset_Paymode.CreateInstance("ADODB.Recordset"); m_pRecordset_Paymode->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Paymode->GetRecordCount()!=0) { while(!m_pRecordset_Paymode->adoEOF) { m_coPaymode.AddString((LPCTSTR)(_bstr_t)m_pRecordset_Paymode->GetCollect("NAME")); m_pRecordset_Paymode->MoveNext(); } m_pRecordset_Paymode->Close(); m_coPaymode.SetCurSel(0); } UpdateData(FALSE); returnTRUE;}voidCPayDlg::OnUpdatePayDeskNumber()//自动将对应桌号的点菜信息以及消费情况显示在桌面上{ UpdateData(TRUE); CStringsql,str,str1; inttemp=0; str.Format("%d",m_nPayDeskNumber); str1.Format("%d",temp); sql="SELECT*FROMDeskInfoWHEREDeskNum="+str+"ANDDeskCheck="+str1+""; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Desk->GetRecordCount()!=0) { m_nPayTotalPrice=m_pRecordset_Desk->GetCollect("DeskPrice").lVal; } m_pRecordset_Desk->Close(); sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+"ANDFoodCheck="+str1+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPay.SetRefDataSource(NULL); m_dbPay.SetRefDataSource((LPUNKNOWN)m_pRecordset_Order); m_dbPay.SetColumnHeaders(1); m_dbPay.Refresh(); UpdateData(FALSE);}voidCPayDlg::OnUpdatePayRealprice()//根据实收金额自动计算找零金额{ UpdateData(TRUE); m_nPayRePrice=m_nPayRealPrice-m_nPayTotalPrice; UpdateData(FALSE);}voidCPayDlg::OnOK()//确定按钮消息函数,将数据写回DESK表和ORDER表,结账完成{ UpdateData(TRUE); if(!m_strPaymode.IsEmpty()&&m_nPayRealPrice!=0) { CStringsql,str,str1; inttemp=0; str.Format("%d",m_nPayDeskNumber); str1.Format("%d",temp); sql="SELECT*FROMDeskInfoWHEREDeskNum="+str+"ANDDeskCheck="+str1+""; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Desk->GetRecordCount!=0) { temp=1; str.Format("%d",temp); m_pRecordset_Desk->PutCollect("DeskCheck",(_variant_t)str); intselmode; selmode=m_coPaymode.GetCurSel(); m_coPaymode.GetLBText(selmode,m_strPaymode); m_pRecordset_Desk->PutCollect("DeskPaymode",_variant_t(m_strPaymode)); CStringpaytime; CTimenow=CTime::GetCurrentTime(); paytime=now.Format(_T("%Y-%m-%d%H:%M:%S")); m_pRecordset_Desk->PutCollect("DeskDateTime",(_variant_t)paytime); m_pRecordset_Desk->PutCollect("DeskName",(_variant_t)m_strPayUserName); } m_pRecordset_Desk->Update(); m_pRecordset_Desk->Close(); str.Format("%d",m_nPayDeskNumber); sql="SELECT*FROMOrderInfoWHEREDeskNum="+str+"ANDFoodCheck="+str1+""; m_pRecordset_Order.CreateInstance("ADODB.Recordset"); m_pRecordset_Order->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Order->GetRecordCount()!=0) { temp=1; str.Format("%d",temp); while(!m_pRecordset_Order->adoEOF) { m_pRecordset_Order->PutCollect("FoodCheck",(_variant_t)str); m_pRecordset_Order->Update(); m_pRecordset_Order->MoveNext(); } } m_pRecordset_Order->Close(); str.Format("%d",m_nPayDeskNumber); str+="号桌已结账"; AfxMessageBox(str); CDialog::OnOK(); } else { AfxMessageBox("请输入完整信息"); }}到此,结账模块已经设计完成。
3.3交接班模块设计交接班模块的功能是管理员统计当班数据(包括桌台数、人民币结账金额以及总金额等),为下班操作做准备。
交接班模块如图8所示:图8交接班模块为对话框类添加两个数据集对象,代码如下:_RecordsetPtrm_pRecordset_Off;_RecordsetPtrm_pRecordset_Desk;对话框类的各成员函数的代码如下:COffdutyDlg::COffdutyDlg(CWnd*pParent/*=NULL*/) :CDialog(COffdutyDlg::IDD,pParent){ //{{AFX_DATA_INIT(COffdutyDlg) m_strDayName=_T(""); m_nTotalAcount=0; m_timeDay=0; //}}AFX_DATA_INIT}BOOLCOffdutyDlg::OnInitDialog()//对话框初始化{ CDialog::OnInitDialog(); m_timeDay=CTime::GetCurrentTime(); m_strDayName=theApp.m_name; UpdateData(FALSE); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCOffdutyDlg::OnCalDayBtn()//统计按钮,负责当班统计{ CStringsql,str; inttemp=1; str.Format("%d",temp); sql="SELECT*FROMDeskInfoWHEREDeskCheck="+str+"ANDDeskName='"+m_strDayName+"'"; m_pRecordset_Desk.CreateInstance("ADODB.Recordset"); m_pRecordset_Desk->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); intrenminbi_jine=0,qita_jine=0,total_jine=0,acount=0; if(m_pRecordset_Desk->GetRecordCount!=0) { while(!m_pRecordset_Desk->adoEOF) { str=m_pRecordset_Desk->GetCollect("DeskPaymode").bstrVal; if(str.CompareNoCase("人民币")==0) { renminbi_jine+=m_pRecordset_Desk->GetCollect("DeskPrice").lVal; } else { qita_jine+=m_pRecordset_Desk->GetCollect("DeskPrice").lVal; } acount++; m_pRecordset_Desk->MoveNext(); } } m_pRecordset_Desk->Close(); total_jine=renminbi_jine+qita_jine; m_pRecordset_Off.CreateInstance("ADODB.Recordset"); m_pRecordset_Off->Open("SELECT*FROMCalDayInfo",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset_Off->GetRecordCount!=0) { while(!m_pRecordset_Off->adoEOF) { m_pRecordset_Off->Delete(adAffectCurrent); m_pRecordset_Off->Update(); m_pRecordset_Off->MoveNext(); } } m_pRecordset_Off->AddNew(); m_pRecordset_Off->PutCollect("mode",_variant_t("人民币")); str.Format("%d",renminbi_jine); m_pRecordset_Off->PutCollect("money",_variant_t(str)); m_pRecordset_Off->AddNew(); m_pRecordset_Off->PutCollect("mode",_variant_t("其他")); str.Format("%d",qita_jine); m_pRecordset_Off->PutCollect("money",_variant_t(str)); m_pRecordset_Off->AddNew(); m_pRecordset_Off->PutCollect("mode",_variant_t("合计")); str.Format("%d",total_jine); m_pRecordset_Off->PutCollect("money",_variant_t(str)); m_dbTotalDay.SetRefDataSource(NULL); m_dbTotalDay.SetRefDataSource((LPUNKNOWN)m_pRecordset_Off); m_dbTotalDay.SetColumnHeaders(2); m_dbTotalDay.Refresh(); m_pRecordset_Off->Update(); m_nTotalAcount=acount; UpdateData(FALSE);}3.4用户权限管理模块设计用户权限模块的功能是方便管理人员查询员工的基本资料,设置员工的操作权限。
用户权限设置模块的设计如图9:图9权限设置模块对话框类的各成员函数的代码如下:CLevelDlg::CLevelDlg(CWnd*pParent/*=NULL*/) :CDialog(CLevelDlg::IDD,pParent){ //{{AFX_DATA_INIT(CLevelDlg) m_strUserName=_T(""); m_strUserNum=_T(""); m_strLevelSelect=_T(""); //}}AFX_DATA_INIT}BOOLCLevelDlg::OnInitDialog(){ CDialog::OnInitDialog(); m_coLevelSelect.AddString("管理员"); m_coLevelSelect.AddString("用户"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); UpdateData(FALSE); CStringsql; sql="SELECT*FROMUserInfo"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCLevelDlg::OnChange(){ GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(TRUE); GetDlgItem(IDC_CONFIRM)->EnableWindow(TRUE); UpdateData(TRUE); CStringsql; sql="SELECTUserName,UserNum,UserLevel,UserPwdFROMUserInfoWHEREUserName='"+m_strUserName+"'ANDUserNum='"+m_strUserNum+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh();}voidCLevelDlg::OnConfirm(){ UpdateData(TRUE); if(!m_strLevelSelect.IsEmpty()) { if(m_strLevelSelect.CompareNoCase("管理员")==0) { CStringstr,sql;inttemp=1; str.Format("%d",temp); sql="SELECTUserName,UserNum,UserLevel,UserPwdFROMUserInfoWHEREUserName='"+m_strUserName+"'ANDUserNum='"+m_strUserNum+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_pRecordset->PutCollect("UserLevel",_variant_t(str)); m_pRecordset->Update(); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); AfxMessageBox("权限修改成功"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); } else { CStringstr,sql;inttemp=0; str.Format("%d",temp); sql="SELECTUserName,UserNum,UserLevel,UserPwdFROMUserInfoWHEREUserName='"+m_strUserName+"'ANDUserNum='"+m_strUserNum+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_pRecordset->PutCollect("UserLevel",_variant_t(str)); m_pRecordset->Update(); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); AfxMessageBox("权限修改成功"); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE); } } else { AfxMessageBox("请选择权限"); }}voidCLevelDlg::OnShowAll(){ CStringsql; sql="SELECT*FROMUserInfo"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbUserInfo.SetRefDataSource(NULL); m_dbUserInfo.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbUserInfo.SetColumnHeaders(2); m_dbUserInfo.Refresh(); GetDlgItem(IDC_LEVEL_SELECT)->EnableWindow(FALSE); GetDlgItem(IDC_CONFIRM)->EnableWindow(FALSE);}至此,权限设置模块设计完成。
3.5菜谱管理模块设计菜谱管理模块的功能是管理人员进行新菜式的录入、菜式修改、删除等菜式维护。
菜谱管理模块如图10:图10菜单管理模块对话框类的各成员函数的代码如下:CMenuSetDlg::CMenuSetDlg(CWnd*pParent/*=NULL*/) :CDialog(CMenuSetDlg::IDD,pParent){ //{{AFX_DATA_INIT(CMenuSetDlg) m_nInputNum=0; m_nCost=0; m_strName=_T(""); m_nNum=0; m_nPrice=0; m_strRemark=_T(""); m_strType=_T(""); //}}AFX_DATA_INIT}BOOLCMenuSetDlg::OnInitDialog()//对话框初始化{ CDialog::OnInitDialog(); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCMenuSetDlg::OnUpdateEditInputNum(){ UpdateData(TRUE); if(m_nInputNum!=0) { GetDlgItem(IDC_INQUIRY)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); }}voidCMenuSetDlg::OnInquiry()//查询{ UpdateData(TRUE); CStringsql,str; str.Format("%d",m_nInputNum); sql="SELECT*FROMMenuInfoWHEREFoodNum="+str+""; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()!=0) { m_nInputNum=0; m_nNum=m_pRecordset->GetCollect("FoodNum").lVal; m_strName=m_pRecordset->GetCollect("FoodName").bstrVal; m_strType=m_pRecordset->GetCollect("FoodType").bstrVal; m_nPrice=m_pRecordset->GetCollect("FoodPrice").lVal; m_nCost=m_pRecordset->GetCollect("FoodCost").lVal; m_strRemark=m_pRecordset->GetCollect("FoodRemark").bstrVal; GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(TRUE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); } else { // m_nInputNum=0; AfxMessageBox("您所查找的菜肴不存在"); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); } UpdateData(FALSE);}voidCMenuSetDlg::OnAddNew()//新增{ m_nCost=0; m_strName=_T(""); m_nNum=0; m_nPrice=0; m_strRemark=_T(""); m_strType=_T(""); GetDlgItem(IDC_ADDSAVE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NUM)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_INQUIRY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_INPUT_NUM)->EnableWindow(TRUE); UpdateData(FALSE);}voidCMenuSetDlg::OnAddSave()//保存所增加项{ UpdateData(TRUE); if(m_nCost!=0&&m_nNum!=0&&m_nPrice!=0&&!m_strName.IsEmpty()&&!m_strRemark.IsEmpty()&&!m_strType.IsEmpty()) { GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_ADDSAVE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_INPUT_NUM)->EnableWindow(TRUE); CStringstr,sql; str.Format("%d",m_nNum); sql="SELECT*FROMMenuInfoWHEREFoodNum="+str+""; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()!=0) { AfxMessageBox("菜肴号码已存在"); } else { m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("SELECT*FROMMenuInfo",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_nNum==0) { AfxMessageBox("菜肴号码不能为0"); return; } else { m_pRecordset->AddNew(); str.Format("%d",m_nNum); m_pRecordset->PutCollect("FoodNum",_variant_t(str)); m_pRecordset->PutCollect("FoodName",_variant_t(m_strName)); m_pRecordset->PutCollect("FoodType",_variant_t(m_strType)); str.Format("%d",m_nPrice); m_pRecordset->PutCollect("FoodPrice",_variant_t(str)); str.Format("%d",m_nCost); m_pRecordset->PutCollect("FoodCost",_variant_t(str)); m_pRecordset->PutCollect("FoodRemark",_variant_t(m_strRemark)); m_pRecordset->Update(); m_pRecordset->Close(); AfxMessageBox("已保存"); m_nCost=0; m_strName=_T(""); m_nNum=0; m_nPrice=0; m_strRemark=_T(""); m_strType=_T(""); UpdateData(FALSE); } } } elseAfxMessageBox("请输入完整信息");}voidCMenuSetDlg::OnModify()//修改{ GetDlgItem(IDC_EDIT_NUM)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_TYPE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_PRICE)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_COST)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_REMARK)->EnableWindow(TRUE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(TRUE); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); m_nCost=0; m_nPrice=0; m_strRemark=_T(""); m_strType=_T(""); UpdateData(FALSE);}voidCMenuSetDlg::OnModifysave()//保存修改{ UpdateData(TRUE); if(!m_strType.IsEmpty()&&m_nPrice!=0&&m_nCost!=0&&!m_strRemark.IsEmpty()) { CStringstr,sql; str.Format("%d",m_nNum); // m_pRecordset->PutCollect("FoodNum",_variant_t(str)); // m_pRecordset->PutCollect("FoodName",_variant_t(m_strName)); m_pRecordset->PutCollect("FoodType",_variant_t(m_strType)); str.Format("%d",m_nPrice); m_pRecordset->PutCollect("FoodPrice",_variant_t(str)); str.Format("%d",m_nCost); m_pRecordset->PutCollect("FoodCost",_variant_t(str)); m_pRecordset->PutCollect("FoodRemark",_variant_t(m_strRemark)); m_pRecordset->Update(); AfxMessageBox("修改成功"); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFYSAVE)->EnableWindow(FALSE); } else { AfxMessageBox("请输入完整信息"); }}voidCMenuSetDlg::OnDel(){ m_pRecordset->Delete(adAffectCurrent); m_pRecordset->Close(); AfxMessageBox("删除成功"); GetDlgItem(IDC_DEL)->EnableWindow(FALSE); GetDlgItem(IDC_MODIFY)->EnableWindow(FALSE);}至此,菜谱管理模块设计完成。
3.6付款方式设置模块设计付款方式设置模块如图11:图11付款方式模块对话框类的各成员函数的代码如下:CSetPaymodeDlg::CSetPaymodeDlg(CWnd*pParent/*=NULL*/) :CDialog(CSetPaymodeDlg::IDD,pParent){ //{{AFX_DATA_INIT(CSetPaymodeDlg) m_strPaymode=_T(""); //}}AFX_DATA_INIT}BOOLCSetPaymodeDlg::OnInitDialog()//对话框初始化{ CDialog::OnInitDialog(); m_bAdd=FALSE; m_bDel=FALSE; m_sInputPaymode.ShowWindow(SW_HIDE); m_editPaymode.ShowWindow(SW_HIDE); m_btnSure.ShowWindow(SW_HIDE); CStringsql; sql="SELECT*FROMPayModeInfo"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //EXCEPTION:OCXPropertyPagesshouldreturnFALSE}voidCSetPaymodeDlg::OnPaymodeAddBtn()//单击按钮后,开始新增{ m_sInputPaymode.ShowWindow(SW_SHOW); m_editPaymode.ShowWindow(SW_SHOW); m_btnSure.ShowWindow(SW_SHOW); m_bAdd=TRUE; m_bDel=FALSE;}voidCSetPaymodeDlg::OnPaymodeDelBtn()//单击按钮后,开始删除{ m_sInputPaymode.ShowWindow(SW_SHOW); m_editPaymode.ShowWindow(SW_SHOW); m_btnSure.ShowWindow(SW_SHOW); m_bAdd=FALSE; m_bDel=TRUE;}voidCSetPaymodeDlg::OnOK()//确定添加或者删除{ UpdateData(TRUE); if(!m_strPaymode.IsEmpty()) { if(m_bAdd==TRUE) { CStringstr; BOOLflag=0; m_pRecordset->MoveFirst(); while(!m_pRecordset->adoEOF) { str=m_pRecordset->GetCollect("NAME").bstrVal; if(str.CompareNoCase(m_strPaymode)==0) { MessageBox("您输入的付款方式已存在","输入错误",MB_OK|MB_ICONWARNING); flag=1; break; } elsem_pRecordset->MoveNext(); } /* CStringsql; sql="SELECT*FROMPayModeInfoWHERENAME='"+m_strPaymode+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()==0) { MessageBox("您输入的付款方式已存在","输入错误",MB_OK|MB_ICONWARNING); flag=1; } */ if(flag==0) { m_pRecordset->MoveLast(); m_pRecordset->AddNew(); m_pRecordset->PutCollect("NAME",_variant_t(m_strPaymode)); m_pRecordset->Update(); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); m_bAdd=FALSE; } } if(m_bDel==TRUE) { BOOLflag=0; UpdateData(TRUE); CStringstr; intnewid; /* m_pRecordset->MoveFirst(); while(!m_pRecordset->adoEOF) { str=m_pRecordset->GetCollect("NAME").bstrVal; if(str.CompareNoCase(m_strPaymode)==0) { flag=1; m_pRecordset->Delete(adAffectCurrent); m_pRecordset->Update(); break; } else m_pRecordset->MoveNext(); } */ CStringsql; sql="SELECT*FROMPayModeInfoWHERENAME='"+m_strPaymode+"'"; m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); if(m_pRecordset->GetRecordCount()!=0) { flag=1; m_pRecordset->Delete(adAffectCurrent); m_pRecordset->Update(); m_pRecordset.CreateInstance("ADODB.Recordset"); m_pRecordset->Open("SELECT*FROMPayModeInfo",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); m_dbPaymode.SetRefDataSource(NULL); m_dbPaymode.SetRefDataSource((LPUNKNOWN)m_pRecordset); m_dbPaymode.SetColumnHeaders(1); m_dbPaymode.Refresh(); m_bDel=FALSE; } if(flag==0) { MessageBox("您输入的付款方式不存在,请查询后确认","输入错误",MB_OK|MB_ICONWARNING); } m_dbPaymode.Refresh(); m_bDel=FALSE; } m_editPaymode.SetWindowText(""); m_sInputPaymode.ShowWindow(SW_HIDE); m_editPaymode.ShowWindow(SW_HIDE); m_btnSure.ShowWindow(SW_HIDE); } else { AfxMessageBox("请输入付款方式"); }}至此,付款方式设置模块设计完成。
六、系统演示系统设计并编写完成后,编译运行程序,初始界面如图12所示:图121. 系统登录单击“登录”菜单,弹出登录界面,在登陆界面输入框中分别输入用户编号、用户名和密码,如图13所示。
如果用户名和密码都正确,那么就可以登陆系统,系统提示如图14所示。
图13图14如果用户名不存在或密码输入不正确,系统提示如图15和图16所示,将无法进入系统。
图15图16如果未登录就进行其他操作,系统提示如图17所示。
只有登录后才能操作其他功能。
单击“注册”菜单,弹出注册对话框如图18所示。
按要求填写完注册信息,如果注册名未被注册,并且前后两次输入的密码一致,那么系统给出如图19所示提示。
如果前后两次输入密码不一致,系统给出如图20所示提示,此时注册不成功。
图19图202.订餐操作系统登录后,单击“订餐”菜单,弹出“餐桌信息”对话框,如图21所示。
餐桌第一次订餐时,输入餐桌编号、食物编号、数量以及折扣,单击“点菜”按钮,在右侧点菜信息栏中列举了该餐桌所点的菜肴,如图22所示。
图21图22如果餐桌已经订过餐,但是还没有结账,则在餐桌编号输入框输入餐桌号,在点菜信息栏中显示该桌已点的菜。
单击“下单”按钮,即可把点菜信息记录下来。
3.结账操作单击“结账”菜单,弹出“结账单”对话框。
输入桌台号,自动显示对应的点菜信息以及消费金额。
选取付款方式和实收金额后,界面会自动显示找零金额,结果如图23所示。
图234.用户权限设置单击“管理”|“用户权限设置”,弹出“权限设置”对话框,如图24所示,所有用户的信息都显示在数据列表中。
输入要查询的用户编号和名称,单击“更改”,该用户的信息就显示在列表中,结果如图25所示。
图24图25选择权限,单击确定后,如图26所示,用户权限已被修改。
图26单击“显示全部”,结果如图27所示。
图275.菜谱管理单击“管理”|“菜谱设置”菜单,弹出“菜谱设置”对话框,如图28所示。
图28在“菜谱设置”对话框中可以对菜谱进行查找、添加、删除、修改等操作。
6.付款方式设置单击“管理”|“付款方式设置”菜单,弹出“付款方式”对话框,如图29所示。
单击“新增”或“删除”按钮,显示新增付款方式文本框和“确定”按钮,如图30所示。
图29图30在文本框中输入要增加/删除的付款方式,并单击“确定”按钮,将新增或删除所选择的付款方式。
7.注销用户单击“注销”菜单,弹出“注销询问”对话框如图31所示。
选择“确定”,注销成功,如图32所示。
图31图328.系统退出单击“退出系统”菜单,弹出“退出询问”对话框如图33所示。
选择“确定”,则系统退出。
图33至此,系统的全部功能已经演示完毕。
七、结束语经过两个多星期的时间,终于完成了本系统的设计。
虽然本系统有一些漏洞和不完善的地方,但是本系统结合餐饮管理的实际情况,基于数据库设计通用的模块,对餐饮管理的前台和后台操作进行功能模块的设计,实现了餐饮管理的基本功能。
在设计的过程中,遇到了很多的技术上的问题。
例如,第一次接触ADO数据库访问技术,对用ADO来连接数据库不是很了解,出现了很多的问题,设计受到了很大的阻碍。
经过向专业指导老师请教和参阅了有关书籍后,终于把一些问题解决了。
在本次设计中,我懂得了“书到用时方恨少”的道理,发现了自己在专业方面还有很多要提高的地方,在今后的学习中,我一定努力进步!参考文献:[1]萨师煊,王珊.数据库系统概论[M]第3版.北京:高等教育出版社,2000[2]侯其锋,李晓华,李莎.VisualC++数据库通用模块开发与系统移植.北京:清华大学出版社,2007致谢在这次课程设计中,戴小鹏老师给了我很大的帮助。
他对我的精心指导和关心,使我在设计的过程中受到了很大的启发。
特别是他的那份耐心和责任心,使我在今后的学习和工作中受益匪浅。
在此,特向戴小鹏老师表示衷心的感谢!
2023/9/21 22:43:02 1.21MB 餐厅管理系统
1
oracle11g所需的包glibc-devel-2.3.4-2.x86_64.rpm
2023/9/21 20:49:14 2.37MB glibc devel
1
现代信号谱分析·目录第1章 基本概念1.1 引言1.2 确定信号的能量谱密度1.3 随机信号的功率谱密度1.4 功率谱密度的性质1.5 谱估计问题1.6 补充内容1.7 习题第2章 非参数化方法2.1引言2.2 周期图和相关图方法2.3 用FFT计算周期图2.4 周期图法的性质2.5 Blackman-Tukey方法2.6 窗函数设计中需考虑的问题2.7 其他改进的周期图方法2.8 补充内容2.9 习题第3章 有理谱估计的参数化方法3.1引言3.2 有理谱信号3.3ARMA过程的协方差结构3.4AR信号3.5Yule-Walker方程的阶递推解法3.6MA信号3.7ARMA信号3.8 多变量ARMA信号3.9 补充内容3.10 习题第4章 线谱估计的参数化方法4.1引言4.2 噪声中的正弦信号模型4.3 非线性最小二乘方法4.4 高阶Yule-Walker方法4.5 Pisarenko和MUSIC方法4.6 最小模方法4.7 ESPRIT方法4.8 前向-后向方法4.9 补充内容4.10 习题第5章 滤波器组方法5.1 引言5.2 周期图的滤波器组解释5.3 改进的滤波器组方法5.4 Capon方法5.5 用滤波器组进一步解释周期图5.6 补充内容5.7 习题第6章 空域方法6.1引言6.2 阵列模型6.3 非参数化方法6.4 参数化方法6.5 补充内容6.6 习题附录A 线性代数和矩阵分析工具附录B Cramer-Rao界分析工具附录C 模型阶数选择方法附录D 部分习题答案参考文献
2023/9/21 11:11:11 21.38MB 现代信号谱分析
1
一本好书,研究dds数字频率合成必读!内容简介《直接数字频率合成》共6章,比较全面、深入地讨论了DDS的理论与应用。
主要内容包括DDS的基本概念、相位累加器、正弦查表、D/A变换器的噪声分析;
拟周期脉冲删除;
级数展开、连分式展开;
DDS相位噪声和杂散产生的机理及其降低;
DDS与PLL的组合;
分数-N频率合成器原理;
低噪声微波频率合成器的设计原理;
新的DDS结构等。
《直接数字频率合成》的特点是:内容新,反映了现在的研究和发展水平;
抓住问题的主要方面,把理论与应用结合在一起;
可供无线电通信领域中的研究者和工程技术人员学习参考,也可作为工作在其他领域中的有关人员学习参考。
3目录序言第1章直接数字频率合成原理1.1DDS的基本概念1.2相位累加器1.3正弦查表1.4D/A变换器1.4.1数字编码1.4.2输出波形1.5具有调制能力的DDS系统1.6逼近频率合成第2章DDS中的相位和杂散噪声2.1引言2.2矩形波输出2.2.1拟周期脉冲删除2.2.2基于修正的恩格尔级数展开的系统2.2.3基于连分式展开的系统2.2.4基于展开组合的系统2.2.5杂散信号2.3正弦波输出2.3.1量化输出正弦波的傅里叶分析2.3.2相位截断正弦波的频谱分析2.3.3正弦字的截断2.3.4背景杂散信号电平的估计2.3.5W和S之间的关系2.4D/A变换器的噪声分析2.4.1量化引起的信噪比2.4.2D/A变换器引起的非线性杂散信号2.4.3突发性尖脉冲2.5脉冲速率频率合成器的频谱第3章DDS中相位噪声和杂散信号的降低3.1DDS的噪声特性3.1.1不同电路的噪声特性3.1.2DDS的相位噪声3.2DDS中接近载波的噪声3.2.1DDS输出噪声的计算3.2.2接近载波噪声的理论基础3.2.3杂散频谱的估计3.2.4实验结果及讨论3.3输出滤波器3.4改进DDS电路的设计3.4.1降低ROM的容量3.4.2降低突发性尖脉冲的方法3.5DDS频谱性能的改进3.6DDS与PLL的组合3.6.1DDS与PLL组合合成器3.6.2十进制DDS的设计第4章分数-N频率合成器原理4.1FNPLL环路4.1.1FNPLL环路的组成4.1.2FNPLL环路的工作原理4.2FNPLL环路简化频率合成4.3使用FNPLL环路的频率合成器4.4DDS控制吞脉冲分数-N频率合成原理4.5DDS控制吞脉冲分数-N环路的杂散相位调制4.6双模式分频器4.7多级调制分数分频器4.7.1分数分频的新方法4.7.2具有∑-△结构的分数-N频率合成中的杂散信号4.7.3分数分频器的实现第5章低噪声微波频率合成器的设计原理5.1微波环路的基本框图5.2微波环路中的加性噪声5.3用环路滤波器改善输出噪声5.4微波频率合成举例5.4.1超低噪声微波频率合成器5.4.2雷达和通信系统中的低噪声频率合成器第6章新的DDS结构6.1混合DDS6.1.1混合DDS结构6.1.2800MHz混合DDS6.2DDS后接重复分频和混频器6.2.1总的要求6.2.25100结构作为偏移合成器6.2.3混频和分频链的前后端6.3综合技术结构6.4IIR滤波方法6.4.1IIR谐振器6.4.2用TMS320C30产生正弦波6.5复位方法6.5.1无稳定性控制的IIR滤波器6.5.2有稳定性控制的IIR滤波器6.5.3有稳定性控制和小□值的IIR滤波器6.5.4DCSW方法6.5.5IIR-ALT方法6.6实现与试验结果6.6.1数值输出6.6.2模拟输出附录附录A:拉普拉斯变换附录B:z变换附录C:DDS输出的傅里叶变换附录D:正交调制器相位误差的数字相位预矫正
2023/9/12 9:37:32 14.51MB dds 数字频率合成 白居宪
1
针对机载相机广域高效航拍作业需求,采用新型级联光学成像结构,设计了一种宽覆盖高分辨率机载相机光学系统。
该系统由对称前置同心物镜和中继转像透镜阵列组成,对称前置同心物镜获取剩余像差均匀的宽视场曲面像,中继转像透镜阵列对该曲面像进行视场细分、剩余像差校正及中继成像。
所设计的机载相机光学系统焦距为60mm、F数为3.4、视场角可达132°。
基于一阶理论和像差特性,在不同飞行高度对地观测时,研究了机载相机光学系统的成像质量与宽视场曲面像的关系,获得系统在不同飞行高度实现清晰成像的方法。
通过像质评价,结果表明,优化设计的系统在低空、中空及高空进行对地观测时,像面光线追迹点列图方均根半径均优于1.6μm,在奈奎斯特频率为230lp/mm处,调制传递函数均达0.4,系统成像性能优异且像质均匀。
新型级联光学成像系统适用于不同飞行高度的机载相机。
2023/9/9 23:56:15 17.46MB 光学设计 级联光学 机载相机 宽覆盖
1
美萍房产中介管理软件是美萍公司推出的一款专业的房地产中介管理系统,它集房源管理、客户管理、销售管理、出租管理,统计分析等强大功能为一身,软件界面简洁优美,操作直观简单,无需专门培训即可正常使用。
美萍房产中介管理系统能广泛适用房介经营商、地产代理商等房屋中介销售出租机构使用。
美萍房屋中介管理软件是您加强房源管理、客户管理,员工管理,提高工作效率的强大助手。
下载后,解压直接用,为单机版
2023/9/6 23:12:27 3.98MB 美萍 房产中介
1
共 222 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡