北邮程序设计实验报告

合集下载

北京邮电大学微机原理软件实验报告

北京邮电大学微机原理软件实验报告

北京邮电大学微机原理软件实验报告信息与通信工程学院微机原理软件实验报告班级:姓名:学号:班内序号:时间:微机原理软件实验·报告实验一DEBUG 的使用一、实验目的1.掌握汇编程序的编辑,编译,连接和执行的全过程;2.学习和掌握用DEBUG 调试程序的方法。

二、实验内容1. 用编辑软件,输入以下汇编语言源程序:DAT SEGMENTA DB 20 ;(自定)B DB 15 ;(自定)Y DB 3 DUP (0)Z DB 0, 0DAT ENDSSTA SEGMENT STACKDW 50 DUP (?)STA ENDSCOD SEGMENTASSUME CS: COD, DS: DATSTAR PROC FARPUSH DSXOR AX, AXPUSH AXMOV AX, DATMOV DS, AXMOV AX, STAMOV SS, AXMOV AL, AMOV Z, ALMOV Z+1, ALCALL SUB1MOV AL,B微机原理软件实验·报告MOV Z,ALMOV Z+1,ALCALL SUB1MOV AL,AMOV Z,ALMOV AL,BMOV Z+1,ALCALL SUB1ADD WORD PTR Y,AXADC BYTE PTR[Y+2],0RETSTAR ENDPSUB1 PROCMOV AL, ZMOV AH, Z+1MUL AHADD WORD PTR Y, AXADC BYTE PTR[Y+2], 0RETSUB1 ENDPCOD ENDSEND STAR2. 通过编译,连接形成可执行文件。

3. 用DEBUG 将可执行文件调入,并进行调试。

1) 用D 命令观察数据区在内存中的具体内容,记录单元A 和B 的具体地址。

2) 用U 命令对目标代码反汇编,观察反汇编后的结果。

注意发现源程序的起始位置,并记录这个起始地址。

3) 用T 命令作单步跟踪调试。

比较每条指令执行后的结果和原来的理解是否一致,得出程序运行的结果:它们是写在什么单元,具体内容是什么;并判断结果是否正确。

北邮程序设计实验报告

北邮程序设计实验报告

实验名称:程序设计实验实验时间:2023年X月X日实验地点:北邮计算机实验室一、实验目的1. 熟悉C语言编程环境,掌握基本的程序设计方法。

2. 通过实际编程,提高逻辑思维和问题解决能力。

3. 理解算法设计的重要性,掌握常用的算法设计方法。

二、实验内容本次实验主要分为以下几个部分:1. 编写一个计算两个整数相加的程序。

2. 编写一个计算两个整数相减的程序。

3. 编写一个计算两个整数相乘的程序。

4. 编写一个计算两个整数相除的程序(要求考虑除数为0的情况)。

5. 编写一个判断两个整数是否相等的程序。

三、实验步骤1. 打开C语言编程环境,创建一个新的项目。

2. 编写计算两个整数相加的程序:```c#include <stdio.h>int main() {int a, b, sum;printf("请输入两个整数:\n");scanf("%d %d", &a, &b);sum = a + b;printf("两个整数相加的结果为:%d\n", sum); return 0;}```3. 编写计算两个整数相减的程序:```c#include <stdio.h>int main() {int a, b, sub;printf("请输入两个整数:\n");scanf("%d %d", &a, &b);sub = a - b;printf("两个整数相减的结果为:%d\n", sub); return 0;}```4. 编写计算两个整数相乘的程序:```c#include <stdio.h>int main() {int a, b, mul;printf("请输入两个整数:\n");scanf("%d %d", &a, &b);mul = a b;printf("两个整数相乘的结果为:%d\n", mul);return 0;}```5. 编写计算两个整数相除的程序(考虑除数为0的情况):```c#include <stdio.h>int main() {int a, b, div;printf("请输入两个整数:\n");scanf("%d %d", &a, &b);if (b == 0) {printf("除数不能为0,请重新输入。

北京邮电大学-计算机实习-实验报告

北京邮电大学-计算机实习-实验报告

高校知识高校知识一.人民币金额大写转换器1.1功能说明1.1.1总体功能说明从键盘输入一个十亿以内的正整数,把它转换为人民币金额大写(不考虑用户输入错误的情况)。

1.1.2用户界面1)正常输入高校知识学院:电子工程学院2017年4月2)错误提示1.1.3使用说明在金额数值文本框中输入数值(不超过9位),点击开始转换按钮,金额大写文本框即可显示大写金额。

1.2程序设计说明1.2.1使用工具开发工具:VS2017语言:c#应用类型:windows窗体应用1.2.2程序流程输入金额数值(int)输出大写金额(string)调用转换方法进行转换点击按钮动作触发1.2.3关键算法说明转换方法:以每个数位为一个单位,逐个处理。

基本转换方法是直接将数字(整型)转化为大写数字和单位(字符串),位数-大写对应关系为:1-元,2-十,3-百,4-千,5-万,6-十,7-百,8-千,9-亿。

每一位的处理方式是转换或不转换。

遇到数字零需要特殊处理,最后需要检查万位并且特殊处理。

1)对数字零的处理。

防止出现多个连续的零,整十整百等不出现零。

即:第一类:以一个或多个零结尾,不转换。

第二类:连续多个零合并为一个零。

解决方法:检查前一位,如果是零,则当前位的零不转换,否则转换。

人为设定第一位的前一位数值是零。

2)万位处理。

当前算法存在缺陷,采用以下方法修正。

如果5-8位均为零,则“万”字省略,不需要修正。

否则,“万”字需要有,当万位为零时需要增加输出“万”。

1.2.4数据结构说明所有常量,变量和方法存在于Form1 类中。

1.2.5关键算法描述1.private void button1_Click(object sender, EventArgs e)2.{3.int number = 0;4.int[] num = new int[9] { 0, 0, 0, 0, 0, 0, 0, 0, 0 };5.int len = 0;6.int i;7.int j = 0;8.int temp;9.textBox2.Text = ""; //清空金额大写文本10.try11. {12. number = Convert.ToInt32(textBox1.Text); //金额数值文本框获得的数据为字符型,转换为整型13. }14. catch //异常处理,如果输入错误,则出现提示15. {16.textBox1.Text = "";17. textBox2.Text = "输入错误,请输入9位以内的正整数";18. }19.while(number != 0) //字符型转换为字符数组20.{21.num[len] = number % 10;22.number /= 10;23.len++;24.}25.26.for(i = 0; i < len; i++) //非零位直接转换27.{28.temp = num[i];29.if(num[i] != 0)30.{31.ans[j++] = unit[i];32.ans[j++] = cap[temp];33.}34.else if(num[i] == 0 && i == 0) //个位为零,只转换单位35.{36.ans[j++] = unit[0];37.}38.else if(num[i] == 0 && i == 4) //万为为零39.{40.if(len == 9 && num[5] == 0 && num[6] == 0 && num[7] == 0) { }//整个万级为零则省略“万”字41.else ans[j++] = unit[4]; //万为为零但需要显示“万”字42.}43.else if(num[i] == 0 && i != 0 && i != 4) //其他位为零的情况44.{45.if(num[i - 1] != 0) //如果前一位(低位)不为零,则转换“零”,否则不转换(无操作)46.{47.ans[j++] = cap[0];48.}49.}50.}51.for(i = j - 1; i >= 0; i--) //显示转换结果52.{53.textBox2.Text += ans[i];54.}55.}1.3设计总结1.3.1性能评价优点:界面简洁,操作简单。

北邮,信息工程,大二上,小学期,C语言,大作业,实验报告

北邮,信息工程,大二上,小学期,C语言,大作业,实验报告

北邮,信息工程,大二上,小学期,C语言,大作业,实验报告北京邮电大学信息与通信工程学院10级小学期C程序设计实践实验报告题目:实验室物料管理系统班级:班姓名:学号:手机号:邮箱:一.功能描述:1.基本功能:(1)添加记录能够添加一条或多条记录,记录包括物料类别、名称、型号、价格、库存等数据。

(2)显示记录显示当前所有记录。

(3)更新记录能够修改已存在记录的信息,可按型号选择要更新的纪录并且选择更新的方式。

(4)删除记录实现删除指定型号记录的功能。

(5)查询记录实现按型号查找的基本功能。

(6)保存文件存储所有记录到文本文档wrecord.txt。

(7)读取文件从rrecord.txt读入所有记录,同时能实现在读入后继续添加记录并执行操作。

(8)统计总量能实现将各类别记录的库存总量存入文本文件total.txt的功能。

(9)排序实现基本功能的按库存量顺序排序,并且存储到文件。

(10)退出系统结束软件操作,释放内存后退出。

2.扩展功能:(1)统计时加入借出量的统计,使物料管理更健全。

(2)进入时需要输入用户名和密码,通过区分采购员和教师给与用户不同的功能使用权限,使程序的针对性更强。

(3)可以选择按照单价或型号进行查找,并给与用户随时退出到主菜单的选项。

(4)可以选择按照库存量或单价进行排序,并将结果打印。

二.数据结构描述:struct info{int type_a;//类型,因为是1到5,所以采用int型变量char name_b[10000];//名称char model_c[10000];//型号,因为二者都可能是字符数字混合,所以采用char型变量float price;//价格,有可能精确到分,所以选择float型变量,并且保留两位显示int inside;//库存int outside;//借出struct info *next;};三.程序模块描述:1.void buy(void);和void use(void);分别对应两种权限的使用者:采购员和实验室老师。

北邮微机原理软件实验报告

北邮微机原理软件实验报告

实验一1.实验要求:编一程序,将地址偏移量为100H单元开始的256个单元分别写入00H,01H,……,FFH数据;统计写入的数据块的0元素、正元素、负元素的个数,并分别将统计结果送入上述数据块后的三个单元中;用DOS功能调用显示上面数据快各单元(包括统计结果)内容,要求每行显示16个数据,两个数据之间用空格隔开。

程序设计思路:分配256个单元存放数据00H,01H,……,FFH,3个单元存放统计结果。

约定:DH存放0的个数,BH存放负数的个数,BL存放正数的个数,然后进行将256个数据一一与0进行比较,得到 DH、BH、BL。

将DH、BH、BL 存入SI的最后三个单元。

最后在以高、低4位,依次将每个单元的数据输出。

2. 程序流程:4.子程序:DISP PROC NEAR ;Show number MOV DL,AL MOV AH,2 INT 21H RET DISP ENDP开始初始化;SI 前256个单元存放00 H……FFH;CX=256;DH=0;BX=0;CMP AL ,0;MOV AL ,[SI] CX=0?将DH ,BX 存入SI ;INC SI ;CX=259;YESINC DH ;INC BHINC BL显示高4位显示低4位; 添加空格; INC SI ;BH=0??BH=16;CX=0?SF=ELSZF=1N ONO YE SN O终止YE实验二1.实验要求:编一程序,把键入的十六进制数转换成十进制,要求:(1)在屏幕上显示转换的十进制数,键入的最大值为FFFFH;(2)若键入非16进制的数,则提示错误;(3)程序中至少用一个子程序和宏命令。

2.程序设计思路:首先判断键入的字符是否为合法的十六进制字符,若是十六进制,将其转化成二进制数值,放入BX中,然后接收下一个字符,并将上一个字符左移4位,再讲此时的BX与接收到的BX相加,直到键入回车,停止接收。

然后通过除以10000,依次将余数除以1000、100、10、1,将二进制转化为十进制,再显示出来。

北邮编程实验报告

北邮编程实验报告

实验名称:编程基础实验实验日期:2023年X月X日实验地点:北邮计算机实验室实验指导教师:XXX老师实验目的:1. 熟悉编程环境,掌握基本的编程技能。

2. 理解编程的基本概念和语法规则。

3. 培养逻辑思维和问题解决能力。

实验内容:本次实验主要涉及以下几个方面:1. 编程环境搭建2. 基本语法学习3. 编程实践实验步骤:一、编程环境搭建1. 安装编程软件:首先,在北邮计算机实验室的计算机上安装了Visual Studio Code,这是一个功能强大的代码编辑器,可以支持多种编程语言。

2. 配置环境变量:为了方便调用编程软件,我们将环境变量设置好,使得在命令行中输入软件名称即可启动。

二、基本语法学习1. 数据类型:学习了整型、浮点型、字符型等基本数据类型,并掌握了它们的特点和适用场景。

2. 运算符:了解了算术运算符、关系运算符、逻辑运算符等,并学会了如何使用它们进行简单的计算和判断。

3. 控制语句:学习了if-else语句、for循环、while循环等,掌握了如何控制程序的执行流程。

4. 函数:了解了函数的定义、调用和参数传递,学会了如何封装代码,提高代码的可读性和可重用性。

三、编程实践1. 编写计算器程序:根据所学知识,编写了一个简单的计算器程序,实现了加减乘除等基本运算。

2. 编写排序算法:学习了冒泡排序、选择排序、插入排序等基本排序算法,并实现了它们的代码。

3. 编写学生信息管理系统:根据实际需求,设计并实现了一个学生信息管理系统,包括添加、删除、修改和查询学生信息等功能。

实验结果:通过本次实验,我成功完成了以下任务:1. 熟悉了编程环境,掌握了基本的编程技能。

2. 理解了编程的基本概念和语法规则。

3. 培养了逻辑思维和问题解决能力。

实验总结:1. 编程环境搭建:在北邮计算机实验室,我成功安装了Visual Studio Code编程软件,并配置了环境变量。

2. 基本语法学习:通过学习,我掌握了数据类型、运算符、控制语句和函数等基本语法,为后续编程实践打下了基础。

北邮windows程序设计实验报告

北邮windows程序设计实验报告

Windows程序设计实验报告实验一:绘图和绘钟实验二:简易扫雷程序班级:姓名:学号:班内序号:时间:2014. 5. 4实验一:绘图和绘钟一、实验要求:利用MFC类编写windows程序,实现基本绘图功能,并在课堂所讲绘图功能上新加入自己其他的绘图功能。

二、实验概述:①由于前期一直坚持听课,所以实现基本绘图功能的代码是按照老师的架构来做的,后来新加的功能是参阅孙鑫所著的《VC++深入详解》一书,在理解的基础上添加到之前的程序框架中的。

做实验时先从课堂上讲的建立单文档开始,在熟悉了MFC单文档的程序框架后,按照老师给的画简单图形的代码,并对应自己借的书籍,了解了画图代码的编写。

之后又逐步进行了改进,增加了更多其他的功能。

②利用MFC编写绘图和绘钟的程序是在Visual Studio 2013的环境下编写的;③绘钟程序采取的是简洁风格,先绘制了表盘,之后用数学方法绘制钟表盘小格。

利用Invalidate函数刷新钟表区域,利用SetTimer函数来对指针进行刷新。

点击显示后再次点击即可关闭时钟。

④线型线宽的设置中,增加了单选框和示例框,线型的选择中由于线型定义中对应0~8,所以就按照顺序排列线型,从而减去了switch/case语句。

点击单选框后利用Invalidate函数让窗口无效,在下一次WM_PAINT时重绘窗口,示例框线条在OnPaint函数中绘制。

⑤绘图所能实现的功能有:1.能够实现图片文件和位图文件的打开;2.可以将所绘制图形以位图形式保存;3.以对话框形式实现对线型线宽的设置;4.设置八种线型,增加示例框,能在选择时预览;5.增加画图面板滚动条,能上下左右拉动绘图区域;6.实现图形重绘功能,在拉动或最小化图形窗口以及滚动区域后图形不消失,实现了对所绘矩形,椭圆,线条和扇形的重绘;7.以系统自带对话框形式实现对颜色及字体的修改;8.画图功能:直线,曲线,椭圆,扇形,带边界的扇形,位图填充的矩形,可遮挡的空心矩形;⑥绘钟所能实现的功能有:1.实现闹钟功能,以对话框形式设置响铃时间;2.能够绘制出模拟时钟,并获取正确的系统时间;3.能够实现秒针每一秒移动一下的动画效果;4.时钟下边以数字时钟的方式显示当前系统时间;三、代码分析1.整体代码分为三部分:①窗口绘图:用于绘制各种图形(包括直线,曲线,扇形等);②绘图设置:用于颜色,字体和线型线宽的设置等;③绘制时钟:绘制与系统时间同步的模拟时钟。

北邮计算机组成原理课程设计 代码与实验报告

北邮计算机组成原理课程设计 代码与实验报告

北京邮电大学课程设计报告注:评语要体现每个学生的工作情况,可以加页。

计算机组成原理课程设计实验报告采用硬布线控制器的顺序模型处理器设计与调试一、实验目的(1)融会贯通计算机组成原理各章节教学内容,通过知识的综合应用,加深对CPU各模块工作原理及相互联系的认识,建立清晰的整机概念。

(2)掌握硬布线控制器的设计方法。

(3)学习运用可编程逻辑技术进行逻辑设计和调试的基本步骤和方法(4)学习运用VHDL语言,用编写编译下载程序到altera芯片运行。

(5)培养科学研究的独立工作能力,获得工程设计与组装调试的实践经验二、实验设备TEC-8实验系统一台PC计算机一台逻辑笔一只USB下载器一根三、设计与调试任务(1)设计一个硬连线控制器,和TEC-8模型计算机的数据通路结合在一起,构成一个完整的CPU,该CPU要求:能够完成控制台操作:启动程序运行、读存储器、写存储器、读寄存器、写寄存器;能够执行表中的指令,完成规定的操作。

(2)在Quarts下对硬布线控制器设计方案进行编辑和编译。

(3)将编译后的硬布线控制器下载到TEC-8实验台上的EPM7128中,使其成为一个硬布线控制器。

(4)根据指令系统,编写检测硬布线控制器正确性的测试程序,并用测试程序对硬布线控制器在单拍方式下进行调试,直到成功。

四、实验原理(1)硬布线控制器基本原理硬布线控制器是一种把控制部件看作产生专门固定时序控制信号的逻辑电路,这种逻辑电路是一种由门电路和触发器构成的复杂树形逻辑网络。

当执行不同机器指令时,通过激活一系列彼此很不相同的控制信号来实现对指令的解释。

每个微操作控制信号C是一系列输入量的逻辑函数,即用组合逻辑来实现C=f(Im,Mi,Tk,Bj)Im是机器指令操作码译码器的输出信号,Mi是节拍电位信号,Tk是节拍脉冲信号,Bj表示来自执行部件的反馈信息,是状态条件信号。

在TEC-8实验系统中,节拍脉冲信号Tk,(T1~T3)已经直接输送给数据通路。

北邮程序设计实践绘图程序实验报告

北邮程序设计实践绘图程序实验报告

程序设计实践设计报告课题名称:MFC简单绘图程序的实现学生姓名:班级:2012211109班内序号:学号:**********日期:2014.5.51.课题概述1.1课题目标和主要内容本实验基于Microsoft Visual Studio 2010 实现MFC简单绘图功能。

实验内容:●GDI绘图的实现●实现菜单方式,用菜单修改设置;●基于C++面向对象实现不同类之间的关联调用实验目标:●理解MFC应用程序的运行机制;●掌握使用MFC构建Windows应用程序的基本结构及编程的基本方法;●理解和掌握MFC应用程序消息处理机制及应用;●掌握MFC设备上下文和绘图的基本理论知识1.2系统的主要功能功能描述:1) 在单文档菜单中,在菜单行中可插入一个菜单项,命名为绘图,在下拉菜单中可分别设置绘制的图形形状,如直线、矩形、点及椭圆等,线宽选项,有1-5可供选择,还可以设置线的类型以及线色,通过弹出的颜色对话框选择需要的颜色,如果不选择线宽、线色以及线型,则按默认的画笔,画刷来绘制选择的图形。

2) 选择好图形后,通过鼠标可以绘制出相应的直线,矩形或椭圆,鼠标的按下确定图形的起点,鼠标的拖动则确定了图形的终点,即通过鼠标的拖动来决定图形的大小,当鼠标弹起,此图形则绘制完毕。

3) 增添工具栏,设置绘制的图形形状,线色以及填充色,可更方便地选择相应的功能2. 系统设计2.1 系统总体框架系统框架图如下:设计思想:按功能模块,分步骤进行MFC设计:(1)新建一个单文档MFC程序,并添加顶层菜单“绘图”,并添加子菜单项;(2)画图功能的实现;(3)添加一个设置对话框(线型和线宽);(4)增加颜色子菜单项,可通过颜色对话框设置颜色。

2.2 系统详细设计[1] 模块划分图及描述[2] 类关系图及描述MFC 单文档中系统自动生成的类较多。

程序中主要用到的类有:CdrawdrawView 、CSettingDlg 、其中,CdrawdrawView 是主对话框类,可以实现主要功能。

北邮小学期C++程序设计实验报告

北邮小学期C++程序设计实验报告

实验报告计算机学院2010211312班10211490实验一简单C++程序设计一、实验目的:1、熟悉C++编程环境,掌握在Dev-C++开发环境下编写、编译、调试和执行C++程序的方法。

2、掌握C++基本语法、数据类型和程序控制结构,能够编写简单C++程序。

二、实验内容和要求:1、猜价格游戏编写C++程序完成以下功能:(1)假定有一件商品,程序用随机数指定该商品的价格(1-1000的整数);(2)提示用户猜价格,并输入:若用户猜的价格比商品价格高或低,对用户做出相应的提示;(3)直到猜对为止,并给出提示。

三、算法设计思路:以时钟作为随机种子产生随机数并将其约束在1-1000范围内,座位商品价格供用户猜。

提示用户输入,根据用户输入的答案与正确价格比较提示用户重新输入,直到猜出正确价格时终止循环,并给出正确提示。

四、实验总结。

初步体会C++编程的语法特点,感悟与C的不同之处。

在助教提示下及时改正,产生1-1000之间的随机数应使用语句rand ()%1000+1而非rand()%1000,否则只能产生0-999,体会细节的重要。

实验二类与对象一、实验目的:1、理解面向对象程序设计的基本思想。

2、掌握面向对象程序设计的重要概念——类和对象。

3、掌握用类分析问题的基本方法,并用C++编程实现。

二、实验内容和要求:1、矩形编写C++程序完成以下功能:(1)定义一个Point类,其属性包括点的坐标,提供计算两点之间距离的方法;(2)定义一个矩形类,其属性包括左上角和右下角两个点,提供计算面积的方法;(3)创建一个矩形对象,提示用户输入矩形左上角和右下角的坐标;(4)观察矩形对象以及Point类成员的构造函数与析构函数的调用;(5)计算其面积,并输出。

2、友元编写C++程序完成以下功能:(1)定义一个Boat和Car两个类,他们都具有私用属性——重量;(2)编写一个函数,计算两者的重量和。

double TotalWeight(Boat& b, Car& c);三、算法设计思路1、定义point类,其中包含计算两点间距离的方法,即两点间坐标公式。

北邮软件实验报告

北邮软件实验报告

北邮软件实验报告北邮软件实验报告一、引言软件实验是计算机科学与技术专业的重要课程之一,旨在培养学生的软件开发能力和解决问题的能力。

本次实验是北邮软件实验的一部分,通过实践操作和理论学习,掌握软件开发的基本原理和技巧。

本报告将对实验过程进行整理和总结,以便更好地理解和应用所学知识。

二、实验背景本次实验的主题是软件开发,通过一个具体的项目,学生需要完成一个小型软件的设计、开发和测试。

这个项目涉及到数据库管理、用户界面设计和算法实现等多个方面的知识和技能。

通过实践操作,学生可以更好地理解软件开发的流程和方法,提高自己的编程能力和问题解决能力。

三、实验目标本次实验的目标是培养学生的软件开发能力和解决问题的能力。

通过实践操作,学生需要掌握以下技能:1. 熟悉软件开发的基本流程,包括需求分析、设计、编码、测试和维护等阶段;2. 掌握数据库管理的基本原理和技巧,能够设计和操作数据库;3. 理解用户界面设计的基本原则和方法,能够设计和实现用户友好的界面;4. 学会使用编程语言和工具进行软件开发,能够编写高质量的代码;5. 培养团队合作和沟通能力,能够与他人协作完成一个项目。

四、实验过程本次实验的实践操作包括以下几个步骤:1. 需求分析:根据实验要求和项目需求,分析用户需求,明确软件功能和性能要求;2. 设计:根据需求分析结果,设计软件的系统架构、数据库结构和用户界面;3. 编码:使用编程语言和工具,根据设计文档编写代码,实现软件功能;4. 测试:对编写的代码进行测试,确保软件功能正常运行,修复bug;5. 维护:根据用户反馈和需求变化,对软件进行维护和更新。

在实验过程中,我们遇到了一些问题和挑战。

例如,需求分析阶段需要与用户进行沟通和交流,确保理解用户需求的准确性;编码阶段需要仔细编写代码,避免出现错误和漏洞;测试阶段需要充分测试软件的各种功能,确保软件的质量和稳定性。

通过克服这些问题和挑战,我们逐渐掌握了软件开发的技巧和方法。

北邮嵌入式系统设计实验-实验报告

北邮嵌入式系统设计实验-实验报告

北邮嵌入式系统设计实验-实验报告嵌入式试验报告学院:xxx班级:xxx学号:xxx姓名:xxx成员:xxx一、基础学问部分1.多线程试验本章主要讲解线程的概念和线程间的同步方式。

试验一主要介绍线程的概念和线程的创建,试验二、试验三、试验四分离介绍了信号量、互斥锁、条件变量的作用和使用。

1.1 线程的介绍线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。

线程是程序中一个单一的挨次控制流程。

进程内一个相对自立的、可调度的执行单元,是系统自立调度和分派CPU 的基本单位指运行中的程序的调度单位。

在单个程序中同时运行多个线程完成不同的工作,称为多线程。

线程是允许应用程序并发执行多个任务的一种机制,是程序运行后的任务处理单元,也是SylixOS操作系统任务调度的最小单元。

在多核CPU中,同时可以有多个线程在执行,实现真正意义上的并行处理。

线程入口函数是一个能够完成特定任务的函数,因此线程入口函数的编写上与一般函数没有太多区分。

线程的创建函数如下:●创建线程失败,函数返回非0的错误代码,胜利返回0;●*thread pthread_t类型的缓冲区,保存一个线程的线程ID;●*attr 设置线程属性,设置为NULL标识创建的新线程使用默认属性;●*(*start_routine) 线程入口函数函数名●*arg 向所创建线程传入的参数1.2 信号量的概念信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。

在进入一个关键代码段之前,线程必需猎取一个信号量;一旦该关键代码段完成了,那么该线程必需释放信号量。

其它想进入该关键代码段的线程必需等待直到第一个线程释放信号量。

信号量是一个在进程和线程中都可以使用的同步机制。

信号量类似于一个通知,某个线程发出一个通知,等待此通知的线程收到通知后,会执行预先设置的工作。

北邮操作系统进程管理实验报告及源代码

北邮操作系统进程管理实验报告及源代码

进程管理实验报告1. 实验目的:(1)加深对进程概念的理解, 明确进程和程序的区别;(2)进一步认识并发执行的实质;(3)分析进程争用资源的现象, 学习解决进程互斥的方法;(4)了解Linux系统中进程通信的基本原理。

2. 实验预备内容(1)阅读Linux的sched.h源码文件, 加深对进程管理概念的理解;(2)阅读Linux的fork()源码文件, 分析进程的创建过程。

3.环境说明本次实验使用的是win7下的VMWare workstation虚拟机, 安装了ubuntu系统在ubuntu系统下使用code::blocks IDE编写代码并执行程序的4.实验内容:1.进程的创建:(1)实验题目和要求:编写一段程序, 使用系统调用fork() 创建两个子进程。

当此程序运行时, 在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”, 子进程分别显示字符“b”和“c”。

试观察记录屏幕上的显示结果, 并分析原因。

(2)程序设计说明:参照书上的例子进行设计, 详见源代码(3)程序运行结果截图:(4)程序分析:a,b,c随机出现, 因为父进程与两个子进程之间并没有同步措施, 所以a,b,c随机打印出来, 也就是三个进程的活动次序是随机进行的, 不同的系统可能有不同的进程调度方式。

(5)源程序:#include<sys/types.h>#include<stdio.h>#include<unistd.h>int main(){pid_t pid1,pid2;if((pid1=fork())<0){printf("Fork Failed.\n");exit(-1);}else if((pid1=fork())==0)printf("b\n");else{if((pid2=fork())<0){printf("Fork Failed.\n");exit(-1);}else if((pid2=fork())==0)printf("c\n");else{wait(NULL);printf("a\n");exit(0);}}return 0;}2.进程的控制:要求一:(1)实验题目和要求:修改已经编写的程序, 将每个进程输出一个字符改为每个进程输出一句话, 再观察程序执行时屏幕上出现的现象, 并分析原因。

北邮程序设计实践报告(计算器)附源代码

北邮程序设计实践报告(计算器)附源代码

程序设计实践设计报告课题名称:计算器设计学生姓名:班级:班内序号:学号:日期:2014年5月10日星期六1.课题概述1.1课题目标和主要内容本案例以编写基于MFC的简易计算器软件为例,通过学习MFC事件驱动机制、MFC界面设计、MFC控件使用,并掌握MFC应用程序的设计方法,独立完成一个MFC的一个MFC的应用程序。

本案例的重点是学习如何使用MFC基本控件和事件驱动机制完成一个Windows下交互式应用软件。

本次实验所用的开发平台为Visual Studio 2008。

1.2系统的主要功能基本功能单击数字键,显示当前数值单击“+”、“-”、“*”、“/”建进行运算单击“=”,显示运算结果单击“C”,清楚已有结果进行连续四则运算扩展功能进行浮点运算进行平方、绝对值、倒数运算进行三角函数运算2. 系统设计2.1 系统总体框架2.2 系统详细设计[1] 模块划分图及描述(1)对话框:此模块实现的是与用户的交互,本案例使用了两类控件:编辑框和按钮。

(2)事件驱动函数:例如:void CcalculatorDlg::OnBnClickedBtn1(){// TODO: 在此添加控件通知处理程序代码ClickNum("1");}此模块处理的是程序如何响应鼠标的单击,主要由消息映射和消息处理函数两部组成。

(3)运算函数:例如:void CcalculatorDlg::Compute(char chOper){UpdateData(TRUE);m_nTemp2=(float)atof(m_strResult);switch(chOper){case'+':m_nTemp2=m_nTemp1+m_nTemp2; break;case'-':m_nTemp2=m_nTemp1-m_nTemp2; break;case'*':m_nTemp2=m_nTemp1*m_nTemp2; break;case'/':m_nTemp2=m_nTemp1/m_nTemp2; break;case'%':{int n1=(int)m_nTemp1;int n2=(int)m_nTemp2;m_nTemp2=(float)(n1%n2); break;}case'=':m_nTemp2=m_nTemp1; break;}m_nTemp1=m_nTemp2;m_strResult.Format("%f",m_nTemp2);m_IsFirstNum=TRUE;UpdateData(FALSE);}此模块是本实验的核心内容,它控制着整个程序的逻辑功能,它所实现的主要是逻辑运算以及数据交换。

北邮程序设计实践报告(聊天程序)附源代码

北邮程序设计实践报告(聊天程序)附源代码

程序设计实践设计报告课题名称:聊天程序学生姓名:班级:班内序号:学号:日期:2014/6/61.课题概述1.1课题目标和主要内容聊天程序虽然形态各异,但就其本质,却是相同的。

这种程序一般由两大部分组成:服务器端聊天程序和客户端聊天程序。

服务器端聊天程序负责接收来自客户端的聊天信息,并且根据客户端的要求把这些信息转发到另外一个活多个客户中。

客户端聊天程序则负责建立与维护与服务器端的连接,向服务器发送本客户的聊天内容,同时从服务器接收对方的响应。

1.2系统的主要功能(1)可以手动输入服务器IP地址和端口号进行连接(客户端功能)。

(2)可以手动建立服务器接受其他客户端的连接要求(服务端功能)。

(3)可以发送消息给服务端,显示服务端传来消息(客户端功能)。

(4)可以接收客户端发送的消息,并将消息传给所有在线的客户端(服务端功能)。

2. 系统设计2.1 系统总体框架2.2 系统详细设计服务端:[1] 模块划分图及描述(1)在特定的端口上等待来自聊天客户的连接请求,并且需要维护一个客户连接表,以记录所有成功的连接。

(2)及时接收各个聊天客户发送过来的信息,然后把这些信息转发到一个或多个客户连接。

(3)监控这些连接的状态,在客户主动离开或发生故障时从列表中删除相应的表项,并及时更新连接表。

[2] 类关系图及描述CServerSocket类的主要功能是实现OnAccept()消息,负责监听服务端口,是一个服务Socket。

此类头文件代码如下:// CServerSocket command targetclass CChatDlg;class CServerSocket : public CSocket{// Attributespublic:CChatDlg * m_dlg;UINT m_uPort;BOOL Init(UINT port, CChatDlg* dlg);// Operationspublic:CServerSocket(){};virtual ~CServerSocket(){};// Overridespublic:// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CServerSocket)//使用类向导添加的public:virtual void OnAccept(int nErrorCode);//}}AFX_VIRTUAL// Generated message map functions//{{AFX_MSG(CServerSocket)// NOTE - the ClassWizard will add and remove member functions here.//}}AFX_MSG// Implementationprotected:};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before theprevious line.#endif// !defined(AFX_SERVERSOCKET_H__03952A19_3B2C_45BD_B9BB_FBBD072ED603__INCLUDED_)[3] 存储结构、内存分配此模块用到了列表的存储结构客户端:[1] 模块划分图及描述(1)建立和维护与服务器的连接,并且随时监测连接的状态。

北邮小学期c++实验报告and程序文件

北邮小学期c++实验报告and程序文件

C++实验课总结张涛实验一:简单c++程序设计一、1、猜价格游戏编写C++程序完成以下功能:(1)假定有一件商品,程序用随机数指定该商品的价格(1-1000的整数);(2)提示用户猜价格,并输入:若用户猜的价格比商品价格高或低,对用户作出相应的提示;(3)直到猜对为止,并给出提示。

#include<iostream>#include<time.h>using namespace std;//使用命名空间std.int main(){srand(time(NULL));//将时钟数作为随机数种子int price,guess;price = rand() % 1000 + 1;//取余,获得1~1000的随机数cout << "please input the price:" << endl;do{cin >> guess;//记录玩家所输入数值if(guess > price)cout << "The price is lower than your guess,please input the price again:" << endl;if(guess < price)cout << "The price is higher than your guess,please input the price again:" << endl;//给予玩家比较大小的提示}while (guess != price);//循环结构cout << "The price you give is right.It cost " << price << "." <<endl;//获得正确答案system("pause");return 0;}2、计算N 以内的所有素数编写C++程序完成以下功能:(1)提示用户输入N;(2)计算出从2到N之间的所有素数;(3)将结果保存在一个文本文件中。

北邮《语法分析程序》实验报告

北邮《语法分析程序》实验报告

语法分析程序实验报告需求分析题目:语法分析程序的设计与实现。

实验内容:编写语法分析程序,实现对算术表达式的语法分析。

要求所分析算术表达式由如下的文法产生。

numE idF F F T F T T T T E T E E |)(||/|*||→→-+→ 实验要求:在对输入表达式进行分析的过程中,输出所采用的产生式。

方法1:编写LL(1)语法分析程序,要求如下。

(1) 编程实现算法4.2,为给定文法自动构造预测分析表。

(2) 编程实现算法4.1,构造LL(1)预测分析程序。

方法2:编写语法分析程序实现自底向上的分析,要求如下。

(1) 构造识别所有活前缀的DFA 。

(2) 构造LR 分析表。

(3) 编程实现算法4.3,构造LR 分析程序。

概要设计1. LL(1)语法分析程序 (1).原文法numE idF F F T F T T T T E T E E |)(||/|*||→→-+→(2).消除左递归和回溯E->TRR->+TRR->-TRR->eT->FWW->*FWW->/FWW->eF->idF->(E)F->num(3). FISRT集和FOLLOW集FIRST(S) = { id, num, ( }FOLLOW (S) = { $ }FIRST(E) = { id, num, ( }FOLLOW (E) = { $ , + , - , ) } FIRST(T) = { id, num, ( } FOLLOW (T) = { $ , + , - , * , / , ) } FIRST(F) = { id, num, ( } FOLLOW (F) = { $ , + , - , * , / , ) }(4).LL(1)预测分析表2. LR 实现,自底向上分析 (1).原文法numE idF F F T F T T T T E T E E |)(||/|*||→→-+→(2).文法对应的拓广文法为:1 E -> E+T2 E -> E -T3 E -> T4 T -> T*F5 T -> T/F6 T -> F7 F -> (E)8 F -> id9 F -> num(3). FISRT 集和FOLLOW 集FIRST(S) = { id, num, ( } FOLLOW (S) = { $ }FIRST(E) = { id, num, ( } FOLLOW (E) = { $ , + , - , ) }FIRST(T) = { id, num, ( } FOLLOW (T) = { $ , + , - , * , / , ) } FIRST(F) = { id, num, ( } FOLLOW (F) = { $ , + , - , * , / , ) }(4).构造项目集规范族I 0 = closure({S ->·E}) = {S ->·E, E ->·E+T, E ->·E -T, E ->·T, T ->·T*F, T ->·T/F, T ->·F, F ->·id, F ->·(E), F ->·num}; 从I 0出发:I 1 = go(I 0, E) = closure({S ->E·, E ->E·+T, E ->E·-T}) = {S ->E·, E ->E·+T, E ->E·-T}; I 2 = go(I 0, T) = closure({E ->T·, T ->T·*F, T ->T·/F}) = {E ->T·, T ->T·*F, T ->T·/F}; I 3 = go(I 0, F) = closure({T ->F·}) = {T ->F·}; I 4 = go(I 0, id) = closure({F ->id·}) = {F ->id·};I 5 = go(I 0, () = closure({F ->(·E)}) = {F ->(·E), E ->·E+T, E ->·E -T, E ->·T, T ->·T*F, T ->·T/F,T->·F, F->·id, F->·(E), F->·num};I6 = go(I0, num) = closure({F->num·}) = {F->num·};从I1出发:I7= go(I1, +) = closure({E->E+·T}) = {E->E+·T, T->·T*F, T->·T/F, T->·F, F->·id, F->·(E), F->·num};I8= go(I1, -) = closure({E->E-·T}) = {E->E-·T, T->·T*F, T->·T/F, T->·F, F->·id, F->·(E), F->·num};从I2出发:I9 = go(I2, *) = closure({T->T*·F}) = {T->T*·F, F->·id, F->·(E), F->·num};I10 = go(I2, /) = closure({T->T/·F}) = {T->T/·F, F->·id, F->(E), F->·num};从I5出发:I11 = go(I5, E) = closure({F->(E·), E->E·+T, E->E·-T}) = {F->(E·), E->E·+T, E->E·-T};从I7出发:I12 = go(I7, T) = closure({E->E+T·, T->T·*F, T->T·/F}) = {E->E+T·, T->T·*F, T->T·/F};从I8出发:I13 = go(I8, T) = closure({E->E-T·, T->T·*F, T->T·/F}) = {E->E-T·, T->T·*F, T->T·/F};从I9出发:I14 = go(I9, F) = closure({T->T*F·}) = {T->T*F·};从I10出发:I15 = go(I10, F) = closure({T->T/F·}) = {T->T/F·};从I11出发:I16 = go(I11, )) = closure({F->(E)·}) = {F->(E)·};LR分析表如下:goto[0,E] = 1; goto[0,T] = 2; goto[0,F] = 3;action[0,id] = S4; action[0,(] = S5; action[0,num] = S6;action[1,$] = ACC.; action[1,+] = S7; action[1,-] = S8;;action[2,)] = action[2,+] = action[2,-] = action[2,$] = R4;action[2,*] = S9; action[2,/] = S10;action[3,)] = action[3,+] = action[3,-] = action[3,*] = action[3,/] = action[3,$] = R7;action[4,)] = action[4,+] = action[4,-] = action[4,*] = action[4,/] = action[4,$] = R8;goto[5,E] = 11; goto[5,T] = 2; goto[5,F] = 3;action[5,id] = S4; action[5,(] = S5; action[5,num] = S6;action[6,)] = action[6,+] = action[6,-] = action[6,*] = action[6,/] = action[6,$] = R10;goto[7,T] = 12; goto[7,F] = 3;action[7,id] = S4; action[7,(] = S5; action[7,num] = S6;goto[8,T] = 13; goto[8,F] = 3;action[8,id] = S4; action[8,(] = S5; action[8,num] = S6;goto[9,F] = 14;action[9,id] = S4; action[9,(] = S5; action[9,num] = S6;goto[10,F] = 15;action[10,id] = S4; action[10,(] = S5; action[10,num] = S6;action[11,)] = S16; action[11,+] = S7; action[11,-] = S8;action[12,)] = action[12,+] = action[12,-] = action[12,$] = R2; action[12,*] = S9; action[12,/] = S10;action[13,)] = action[13,+] = action[13,-] = action[13,$] = R3; action[13,*] = S9; action[13,/] = S10;action[14,)] = action[14,+] = action[14,-] = action[14,*] = action[14,/] = action[14,$] = R5;action[15,)] = action[15,+] = action[15,-] = action[15,*] = action[15,/] = action[15,$] = R6;action[16,)] = action[16,+] = action[16,-] = action[16,*] = action[16,/] = action[16,$] = R9; DFA:(5).LR分析表运行结果LL(1):测试用例:(1+(a+b)*5/6)测试用例:1测试用例:a2+kLR:测试用例:(1+(a+b)*5/6)测试用例:1测试用例:a2+k源代码#include<stdlib.h>#include<string>#include<iostream>#include<fstream>#include<vector>using namespace std;//非终结字符类class Char{public:string FIRST; //first集string FOLLOW; //follow集Char(){}; //构造函数~Char(){};//析构函数void first(string s){ FIRST=FIRST+s; } //读入first集void follow(string s){ FOLLOW=FOLLOW+s; } //读入follow集};//产生式类class Gene{public:char left; //产生式左部非终结符string right; //产生式右部字符串string FIRST; //右部的first集string FOLLOW; //左部的follow集Gene(){};~Gene(){};void product(string a){left=a[0];int k=a.size();for(int i=3;i<k;i++)right[i-3]=a[i];}void first(string a){ FIRST=FIRST+a; }void follow(string a){ FOLLOW=FOLLOW+a; }};int find(string s,char ch){int k=s.size();for(int i=0;i<k;i++)if(ch==s[i])return i;return 0;}void LL1(){string G1[11];//存入LL(1)文法//G1[0]="E->TA";G1[1]="A->+TA";G1[2]="A->-TA";G1[3]="A->e";G1[4]="T->FB";G1[5]="B->*FB";G1[6]="B->/FB";G1[7]="B->e";G1[8]="F->d";G1[9]="F->(E)";G1[10]="F->n";cout<<"\n*********************************LL(1)********************************** **";cout<<"\n消除左递归和回溯:"<<endl;for(int i=11;i>0;i--){cout<<G1[11-i]<<"\t";if(i%3==0)cout<<endl;}cout<<endl;//存入非终结字符的first集follow集Char E;E.first("d(n");E.follow("$)");Char A;A.first("+_e");A.follow("$)");//A=E'Char T;T.first("d(n");T.follow("+-$)");Char B;B.first("*/e");B.follow("+-$)");//B=T'Char F;F.first("d(n");T.follow("*/+-$)");//定义一个Gene类的vector存入全部产生式的左部和右部vector <Gene> g(11);g[0].product(G1[0]);g[0].FIRST=T.FIRST;g[0].FOLLOW=E.FOLLOW;g[1].product(G1[1]);g[1].FIRST="+";g[1].FOLLOW=A.FOLLOW;g[2].product(G1[2]);g[2].FIRST="-";g[2].FOLLOW=A.FOLLOW;g[3].product(G1[3]);g[3].FIRST="e";g[3].FOLLOW=A.FOLLOW;g[4].product(G1[4]);g[4].FIRST=F.FIRST;g[4].FOLLOW=T.FOLLOW;g[5].product(G1[5]);g[5].FIRST="*";g[5].FOLLOW=B.FOLLOW;g[6].product(G1[6]);g[6].FIRST="/";g[6].FOLLOW=B.FOLLOW;g[7].product(G1[7]);g[7].FIRST="e";g[7].FOLLOW=B.FOLLOW;g[8].product(G1[8]);g[8].FIRST="d";g[8].FOLLOW=F.FOLLOW;g[9].product(G1[9]);g[9].FIRST="(";g[9].FOLLOW=F.FOLLOW;g[10].product(G1[10]);g[10].FIRST="n";g[10].FOLLOW=F.FOLLOW;//预测分析表的构造string M[6][10];//初始化分析表,表的第一行和第一列分别存入终结符和非终结符M[0][0]="\0";M[0][1]="+";M[0][2]="-";M[0][3]="*";M[0][4]="/";M[0][5]="d";M[0][6]="(";M[0][7]=")";M[0][8]="n";M[0][9]="$";M[1][0]="E";M[2][0]="A";M[3][0]="T";M[4][0]="B";M[5][0]="F";for(int i=1;i<6;i++){for(int j=1;j<10;j++){M[i][j]="err"; //初始化,把除第一行和第一列的元素均设为"err"}}//算法4.2string VN="0EATBF"; //用数组记录分析表的行和列,方便后面查找需要填入表格的位置string VT="0+-*/d()n$";for(int i=0;i<11;i++){int m=g[i].FIRST.size();int row=find(VN,g[i].left);for(int j=0;j<m;j++){if(g[i].FIRST[j]!='e'){int line=find(VT,g[i].FIRST[j]);M[row][line]=G1[i];}else{int t=g[i].FOLLOW.size();for(int k=0;k<t;k++){int line=find(VT,g[i].FOLLOW[k]);M[row][line]=G1[i];}}}}cout<<"\n**************************LL(1)预测分析表*****************************"<<endl;for(int i=0;i<6;i++){for(int j=0;j<10;j++)cout<<M[i][j]<<"\t";cout<<endl;}//算法4.1string w="";string state="";string output="";//output为输出串cout<<"提示:可用分析成功用例:和(num+(id+id)*num/num)"<<endl;cout<<"请输入待分析字符串:";cin>>w;cout<<endl;w+='$'; //输入串末尾加上'$'结束符cout<<"步骤"<<"\t"<<"栈"<<"\t\t"<<"输入"<<"\t\t"<<"输出"<<"\t"<<endl;int sum=0; //步骤数state="$E"; //将'$E'入栈char X; //定义X为栈顶文法符号int p=0;char a; // p指向输入串的第一个字符,a是p所指向的输入符号,后面为了输出方便直接改输入串,所以p一直是0while(X!='$'){ //栈非空,分析继续int len=state.size(); //求出栈中元素个数if(len>=8)cout<<sum<<"\t"<<state<<"\t"<<w<<"\t\t"; //控制输出格式对齐elsecout<<sum<<"\t"<<state<<"\t\t"<<w<<"\t\t"; //控制输出格式对齐if(w.size()<8)cout<<"\t"; //控制输出格式对齐X=state[len-1]; // X是栈顶文法符号a=w[p] ; // a是p所指向的输入符号if((a>='A'&& a<='Z')||(a>='a'&& a<='z'))a='d';if(a>='0'&& a<='9')a='n';if((X=='$')||!(X>='A'&&X<='Z')){ //X是终结符或$if(X==a){//if(cheak(X,a)){ //栈顶符号和输入串首字符匹配成功state.erase(state.size()-1,1); //从栈顶弹出Xw.erase(0,1); //p前移一个位置if(X=='$'){output="分析成功"; //输出句赋值}elseoutput="匹配成功";}else break;}else if(X>='A'&&X<='Z'){ //X是非终结符int row=find(VN,X); //找到X在分析表中的行数int line=find(VT,a); //找到a在分析表中的列数output=M[row][line]; //将M[X,a]中的产生式赋值给输出句state.erase(state.size()-1,1); //从栈顶弹出Xif(output[3]!='e'){ //如果产生式右部不为e(空符),则逆向压栈for(int k=output.size()-1;k>=3;k--){state+=output[k];}}else if(output[3]=='e'){} //如果产生式右部为e(空符),不用压栈else break; //否则出错跳出循环}cout<<output<<"\t"<<endl; //输出分析动作sum++; //步骤数+1}if(output=="分析成功")cout<<"该字符串分析成功\n\n"<<endl;}void LR(){string G2[10]; //存入LR文法G2[0]="A->E";G2[1]="E->E+T";G2[2]="E->E-T";G2[3]="E->T";G2[4]="T->T*F";G2[5]="T->T/F";G2[6]="T->F";G2[7]="F->d";G2[8]="F->(E)";G2[9]="F->n";cout<<"\n*********************************LR************************************ ";cout<<"\n采用LR分析法的拓广文法如下:"<<endl;for(int i=0;i<10;i++){cout<<G2[i]<<"\t";if(i%3==0)cout<<endl;}//***********************构造分析表********************************************string M[18][13];//初始化分析表,在表的第一行和第一列分别存入终结符和状态M[0][0]="\0";M[0][1]="+";M[0][2]="-";M[0][3]="*";M[0][4]="/";M[0][5]="d";M[0][6]="(";M[0][7]=")";M[0][8]="n";M[0][9]="$";M[0][10]="E";M[0][11]="T";M[0][12]="F";M[1][0]="0";M[2][0]="1";M[3][0]="2";M[4][0]="3";M[5][0]="4";M[6][0]="5";M[7][0]="6";M[8][0]="7";M[9][0]="8";M[10][0]="9";M[11][0]="10";M[12][0]="11";M[13][0]="12";M[14][0]="13";M[15][0]="14";M[16][0]="15";M[17][0]="16";for(int i=1;i<18;i++){for(int j=1;j<13;j++){M[i][j]="err"; //分析表除第一行和第一列外初始化为"err"}}//********************************存入LR分析表*********************************M[1][5]="s4";M[1][6]="s5";M[1][8]="s6";M[1][10]="1";M[1][11]="2";M[1][12]="3";M[2][1]="s7";M[2][2]="s8";M[2][9]="acc";M[3][1]="r3";M[3][2]="r3";M[3][3]="s9";M[3][4]="s10";M[3][7]="r3";M[3][9]="r3";M[4][1]="r6";M[4][2]="r6";M[4][3]="r6";M[4][4]="r6";M[4][7]="r6";M[4][9]="r6";M[5][1]="r7";M[5][2]="r7";M[5][3]="r7";M[5][4]="r7";M[5][7]="r7";M[5][9]="r7";M[6][5]="s4";M[6][6]="s5";M[6][8]="s6";M[6][10]="11";M[6][11]="2";M[6][12]="3";M[7][1]="r9";M[7][2]="r9";M[7][3]="r9";M[7][4]="r9";M[7][7]="r9";M[7][9]="r9";M[8][5]="s4";M[8][6]="s5";M[8][8]="s6";M[8][11]="12";M[8][12]="3";M[9][5]="s4";M[9][6]="s5";M[9][8]="s6";M[9][11]="13";M[9][12]="3";M[10][5]="s4";M[10][6]="s5";M[10][8]="s6";M[10][12]="14";M[11][5]="s4";M[11][6]="s5";M[11][8]="s6";M[11][12]="15";M[12][1]="s7";M[12][2]="s8";M[12][7]="s16";M[13][1]="r1";M[13][2]="r1";M[13][3]="s9";M[13][4]="s10";M[13][7]="r1";M[13][9]="r1";M[14][1]="r2";M[14][2]="r2";M[14][3]="s9";M[14][4]="s10";M[14][7]="r2";M[14][9]="r2";M[15][1]="r4";M[15][2]="r4";M[15][3]="r4";M[15][4]="r4";M[15][7]="r4";M[15][9]="r4";M[16][1]="r5";M[16][2]="r5";M[16][3]="r5";M[16][4]="r5";M[16][7]="r5";M[16][9]="r5";M[17][1]="r8";M[17][2]="r8";M[17][3]="r8";M[17][4]="r8";M[17][7]="r8";M[17][9]="r8";cout<<"**********************************LR分析表********************************"<<endl;cout<<"状态\t\t\t\taction\t\t\t\t\t\t\tgoto\t"<<endl;for(int i=0;i<18;i++){for(int j=0;j<13;j++)cout<<M[i][j]<<"\t";cout<<endl;}//****************************算法4.3*******************************************string V1="0+-*/d()n$ETF"; //用字符串存入分析表的第一行,以便后面查找字符的列数string w=""; //w为输入符号串string state=""; //用一个string类型来代替栈stackstring output=""; //output为输出串,即分析动作cout<<"提示:可用分析成功用例:(num+(id+id)*num/num)"<<endl;cout<<"请输入待分析符号串:"; //读入待分析串cin>>w;cout<<endl;w+='$'; //在输入串尾加上'$'符号cout<<"步骤"<<"\t"<<"栈"<<"\t\t\t\t"<<"输入"<<"\t\t"<<"\t分析动作"<<"\t"<<endl;int sum=0; //记录步骤state="0"; //栈初始化,放入'0'int S=0; //栈顶符号(即状态号)int p=0;char a; //p指向输入串的第一个字符,a是p所指向的输入符号,后面为了输出方便直接改输入串,所以p一直是0do{int len=state.size();if(len>=16) cout<<sum<<"\t"<<state<<"\t\t"<<w<<"\t\t\t"; //输出格式控制else if(len>=8)cout<<sum<<"\t"<<state<<"\t\t\t"<<w<<"\t\t\t"; //输出格式控制else cout<<sum<<"\t"<<state<<"\t\t\t\t"<<w<<"\t\t"; //输出格式控制if(w.size()<8)cout<<"\t"; //输出格式控制if((state.size()>1)&&(state[len-2]=='1'))S=10+(state[len-1]-'0');//得到现在的栈顶符号elseS=state[len-1]-'0';a=w[p] ;// a是p所指向的输入符号if((a>='A'&& a<='Z')||(a>='a'&& a<='z'))a='d';if(a>='0'&& a<='9')a='n';int row=S+1; //得到状态S的行号int line=find(V1,a); //找到输入串首字符a在分析表中的列数if(M[row][line][0]=='s'){ //当M[S,a]为shift时state+=a; //依次入栈a和Sstate+=M[row][line][1];if(M[row][line].size()==3)state+=M[row][line][2]; //当S是大于10的状态时需要入栈两次(这是用string而不用栈的弊端)w.erase(0,1); //相当于推进poutput="shift "; //输出句赋值output+=M[row][line][1]; // 输出句赋值if(M[row][line].size()==3)output+=M[row][line][2];}else if(M[row][line][0]=='r'){ //当M[S,a]为reduce时int abc=M[row][line][1]-'0'; //得到reduce需用到的产生式编号string re=G2[abc]; //用re存储该产生式string re1=re; //用re1备份该产生式re.erase(0,3); //去掉产生式的左部及箭头int be=2*re.size(); //用be记录栈顶待弹出的字符的数目(产生式右部的字符数目2倍)for(int p=be;p>0;p--){ //弹栈len=state.size(); //这也是用string而不用栈的弊端,弹栈时若状态号是两位数需要弹栈两次if(state[len-2]=='1'&&state[len-1]>='0'&&state[len-1]<='9')state.erase(state.size()-2,2);elsestate.erase(state.size()-1,1);}len=state.size(); //取现在的栈顶符号,先求出sta字符串的长度if((state.size()>1)&&(state[len-2]=='1'))S=10+(state[len-1]-'0');//取现在的栈顶符号else S=state[len-1]-'0';int row1=S+1; //得当前栈顶状态的行数int line1=find(V1,re1[0]); //得产生式左部字符的列数int len_r;len_r=M[row1][line1].size(); //查找分析表M中的goto函数的需要入栈的状态if(len_r==1)S=M[row1][line1][0]-'0'; //分析表中的状态是string类型的,所以需要转换成int型else S=10+(M[row1][line1][1]-'0');state+=re1[0]; //先入栈reduce产生式的左部if(S>=10){state+='1';state+=(S%10+'0');}elsestate+=(S+'0');//再入栈goto得到的状态output="reduce by "; //对输出句(分析动作)赋值output+=re1; //对输出句(分析动作)赋值}else if(M[row][line][0]=='a')output="acc"; //当分析表中元素为acc时,分析成功else break; //否则出错跳出循环cout<<output<<"\t"<<endl; //输出分析动作if(output[0]=='a')break; //当分析成功,跳出循环sum++; //分析步骤数+1}while(1);if(output=="acc")cout<<"该字符串分析成功\n\n"<<endl;}main(){cout<<"所分析算数表达式由如下文法产生:"<<endl;cout<<"E->E+T | E-T | T\nT->T*F | T/F | F\nF->id | (E) | num\n"<<endl;while(1){int x;cout<<"\n请选择所需分析方法:\n1.LL(1) 2.LR 0.退出"<<endl;cin>>x;while(x<0 || x>2 || cin.fail()){cout<<"输入错误,请重新输入:";cin.clear(); //清除流标记cin.sync(); //清空流cin>>x;}if(x==1)LL1(); //LL(1)语法分析程序else if(x==2)LR(); //LR分析程序elsebreak;}system("pause");return 0;}。

北邮程序设计实践报告

北邮程序设计实践报告

1.课题概述1.1课题目标和主要内容课程以培养学生动手实践能力为目的,重点是在学习C++程序设计和数据结构的基础上,使学生从实践中学习如何综合运用C++和数据结构的相关知识解决实际应用中的问题,了解程序设计的基本思想在具体实际应用中的体现,掌握分析问题、解决问题的方法,从而提高学生的编程能力,达到编程熟练、会调试、代码书写规范的基本要求,具备简单应用程序的设计、实现能力。

本次试验使用VS2008 的API平台1.2系统的主要功能简单的绘图程序,可以画出不同颜色的直线,矩形,圆形等。

2. 系统设计2.1 系统总体框架2.2 系统详细设计[1] 模块划分图及描述[2] 类关系图及描述[3] 程序流程图及描述2.3 关键算法分析算法1:窗口过程函数[1] 算法功能当按下菜单,或者点击窗口时,窗口需要运行这个消息处理函数。

[2] 算法基本思想在API里定义了一个函数为回调函数,当系统需要向窗口发送消息时,就会调用窗口给出的回调函数WindowProc,如果WindowProc函数不处理这个消息,就可以把它转向DefWindowProc函数来处理,这是系统的默认消息处理函数。

[3]代码逻辑LRESULT CALLBACK ccc_win_proc(HWND hwnd, //窗口句柄UINT message,WPARAM wParam,LPARAM lParam){ PAINTSTRUCT ps; // the display's paint struct HDC mainwin_hdc; //设备描述表static int menuId=0;int wmId = LOWORD(wParam);int wmEvent = HIWORD(wParam);switch (message) {case WM_CREATE:SetTimer(hwnd,1,1000,NULL);break;case WM_TIMER:InvalidateRect(hwnd,NULL,TRUE);break;case WM_COMMAND: //处理菜单消息switch (wmId) {case IDM_FIG1:menuId=IDM_FIG1;InvalidateRect(hwnd,NULL,TRUE);break;case IDM_FIG2:……………………} break;case WM_PAINT: //窗口刷新消息mainwin_hdc = BeginPaint(hwnd, &ps); //UpdateRegion为空//ccc_win_main(); //调用用户的绘图程序if (menuId){ cwin.open(hwnd, mainwin_hdc);switch (menuId){ case IDM_FIG1:……绘图程序……………………}EndPaint(hwnd, &ps); break;case WM_LBUTTONDOWN:getp1();break;case WM_LBUTTONUP:getp2();break;case WM_DESTROY:PostQuitMessage(0);break;default: // 调用默认的消息处理函数, 对其他的消息进行处理return DefWindowProc(hwnd, message, wParam, lParam); }return 0; }算法2:绘图函数(以矩形为例)[1] 算法功能运行函数时,绘出相应图形。

北邮微机原理软件实验报告

北邮微机原理软件实验报告

微机原理软件实验报告实验二分支、循环程序设计1. 开始独立进行汇编语言程序设计。

2. 掌握基本分支,循环程序设计。

3. 掌握最简单的DOS功能调用。

二.实验内容1. 安排一个数据区,内存有若干个正数,负数和零。

每类数的个数都不超过92. 编写一个程序统计数据区中正数,负数和零的个数。

3. 将统计结果在屏幕上显示。

四•源代码 DATA SEGMENTZDW 0 ;数据中0的个数 A DW 0 ;数据中大于0的个数 BDW 0 ;数据中小于0的个数 NUM DW 9,8,0,-7,6,-5,-4,3,2,-1,0,-8,-1,9,0,0,1;设定的一组数据,其中 4 个 0,7 个正数,6个负数,符合题目要求N DW ($-NUM)/2;该组数据的个数 TYPE0 DB 0DH, 0AH, 'Number of zeros : $'TYPE1 DB 0DH, 0AH, 'Number of greater than 0 : $'TYPE2 DB 0DH, 0AH, 'Number of less than 0 : $'LOCATE DW TYPE0, TYPE1, TYPE2DATA ENDSSTACK SEGMENT STACKDW 128 DUP(?)STACK ENDSCODE SEGMENTASSUME DS:DATA, SS:STACK, CS:CODESTART: MOV AX, DATAMOV DS, AXMOV AX, STACKMOV SS, AX初始化DS 、SS 指向STA MOV BX, OFFSET NUM;将NUM 中第一个数字的地址送入 MOV CX, N;将N 中数字个数送入CX LOOP1: MOV AX, [BX];取出 NUM 中的第一个数字 CMPAX, 0 ;与零相比 JZ IFZ ;判断结果为是 0,跳转到IFZ 处继续执行JC IFL INC WORD PTR AJMP CONTINUEIFL: INC WORD PTR BJMP CONTINUE ;否则,A 自加,然后继续执行程序 ;B 计数加1IFZ: INC Z CONTINUE: ;Z 计数加1ADD BX, 2 LOOP LOOP1 MOV CX, 3;指针+2,继续送入下一数字;循环CX 次判断;共显示3个字符串 XOR BX, BXDISP:MOV DX, LOCATE[BX]MOV AH, 09H;DOS 09号功能调用,显示字符串 INT 21HBXSAL AX, 1;判断结果是小于0,跳转到IFL转换为ASCII 码 ;DOS 02号功能调用,显示字符;指针 +2 ( DW ) 返回DOS 系统五.运行结果 S C\W - debug b.rxe Scurue listing IMIL.LST]:INLI CRF149774 * 4H882 R#t 囲 刖nhol SPACR froe9 Warning Errors H Severs ErrorsC;\mas»5>1ink b.objMicrosoft (R) Overlay Linker Version 3.SO pnp^right (C) Microsoft Corp 1S83-1987 All rights resertfed.R IM File (BTKE1.List File [NULHflPl: Libraries [.LIBI:C:\mash5>dehuri b.exe -gNumber of zeros : 4Ni J rah (ir of grcri I or thrin B ; 7 Miiwber of Jthan 0 : 6 卩ro<jran terminated nornallv 六.预习题1•十进制数0 -- 9所对应的ASCII 码是什么?如何将十进制数0 -- 9在屏幕 上显示出来?答:0—9 的 ASCII 码值依次为:30H,31H,32H,33H,34H,35H,36H,37H,38H,39H 。

北邮编译原理词法分析程序报告

北邮编译原理词法分析程序报告

token_table.open("token.txt",ios_base::out);//
记号
token_table<<"
单词 \t\t 记号 "<<endl;
保存错误 保存语句数单
保存注释 输出的
while(C!=EOF){ get_char(); token="";
if((C>64
&&C<91) || (C>96 &&C<123) || C=='_'){
lready=rready=0;
lnum=1;
cnum=0;
wordnum=charnum=0;
buffer[lb_end]=buffer[rb_end]=EOF;
fillbuf(0);
errornum=0;
cout<<"-------------------------------------------------------------" <<endl;
,"unsigned","break","continue","else","for","long","s
igned"
,"switch","void","case","default","enum","goto","regi
ster"
,"static","typedef","volatile","char","do","extern","
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

程序设计实践设计报告课题名称:邮件客户端学生姓名:班级:2班内序号:16学号:2日期:2014.6.41.课题概述1.1课题目标和主要内容本课题主要通过MFC的方式,利用SOCKET以及SMTP相关知识,来实现邮件(可携带附件)的定向发送,借此来复习和巩固C++编程的基本思想;学习SOCKET以及SMTP的相关知识,了解复杂网络应用程序的设计方法,并独立完成一个网络应用。

1.2系统的主要功能1.邮件的发送(不携带附件)2.邮件的发送(携带附件)3.邮件接收2. 系统设计2.1 系统总体框架程序的功能由MyEmailClientDlg.cpp,SMTP.cpp,MailMessage.cpp,Base64.cpp, MIMECode.cpp,MIMEContentAgent.cpp,MIMEMessage.cpp,AppOctetStream.cpp, MyEmailClient.cpp,StdAfx.cpp,TextPlain.cpp来实现。

其中MIMECode.cpp, MIMEContentAgent.cpp,MIMEMessage.cpp, AppOctetStream.cpp, TextPlain.cpp来对MIME 协议进行封装,Base64.cpp来对Base64编码进行封装,SMTP.cpp是对SMTP协议进行封装,MailMessage.cpp是利用MIME协议对邮件内容的一个处理,最终通过MyEmailClientDlg.cpp 来实现邮件的发送的功能。

2.2 系统详细设计[1] 模块划分图及描述协议模块:包括网络应用程序中的各种协议,包括STMP协议,MIME协议等。

处理模块:主要实现对数据的进行编码以及解码。

实现模块:主要内容为邮件发送的具体步骤,相关按钮操作。

[2] 类关系图及描述协议类:CSMTP, CTEXTPlai, CMIMECode,C MIMEContentAgent,C MIMEMessage, CAppOctetStream, CTextPlain.主要为协议中信息处理的中作用编码类:Base64, MailMessage.主要为对邮件信息的处理实现类:CAboutDlg,CMyEmailClientApp,CMyEmailClientDlg.主要为MFC的框架构建以及邮件发送的实现。

[3] 程序流程图及描述[4] 存储结构、内存分配主要使用字符串数组来进行存储,同时还是用套接字来进行消息传输。

2.3 关键算法分析算法1:BOOL CSMTP::Connect()[1] 通过SMTP协议内容的判断对服务器之间的连接状况的判断[2] 将SMTP的协议工作原理进行细化,分为1.TCP连接。

2.客户端发送HELO命令。

3.客户端发送AUTH LOGIN命令。

4.用户名与密码的验证。

分别在每一个步骤后对服务器返回的消息进行分析,判断是否连接正常。

[3] 由于没有其他参量,时间复杂度为O(1)。

空间复杂度为O(1)。

[4]1判断套接字是否创建成功。

2判断是否连接到服务器。

3判断服务器是否响应。

4发送HELO命令,同时判断服务器响应是否正确。

5发送AUTH LOGIN命令,同时判断服务器响应是否正确。

6发送经过Base64编码过后的用户名,同时判断服务器响应是否正确。

7发送经过Base64编码过后的密码,同时判断服务器响应是否正确。

8一切正常,将变量m_bConnected=TRUE。

算法2:BOOL CSMTP::transmit_message(CMailMessage * msg)[1] 向服务器发送邮件[2] 根据SMTP发送邮件的工作原理,将其分为1.发送MAIL命令,告知服务器发件人的邮件地址。

2.发送RCPT命令,告知服务器的接收人的邮件地址。

3.发送DATA命令。

4.发送邮件内容。

5.发送结束符,结束此次发送。

[3] 由于FOR循环中包含msg->GetNumRecipients(),所以时间复杂度为O(n)。

空间复杂度为O(1)。

[4] 1.判断是否连接服务器正常。

2.发送MAIL指令及发件人信息,并判断服务器响应。

3.发送RCPT指令及收件人信息,多个收件人必须多次发送,最后判断服务器响应。

4. 发送DATA指令,并判断服务器响应。

5.发送邮件内容。

6.发送结束符,结束此次发送,并判断服务器响应。

算法3:BOOL CSMTP::get_response( UINT response_expected )[1] 根据服务器的响应来判断是否正常[2] 首先判断套接字是否接收成功,然后将得到的响应进行分析,判断结果[3] 时间复杂度为O(1),空间复杂度为O(1)[4] 1.判断是否接收套接字正常,不正常直接返回FALSE。

2.判断接收的套接字是否为预期的,正常直接返回TRUE。

3.对接收的服务器响应,进行判断。

如果错误,将错误原因赋值给m_sError。

算法4:void CMyEmailClientDlg::OnButtonAddFile()[1] 附件按钮响应,实现添加附件的功能[2] 从目录中选择的文件,一个一个显示到附件的列表框中。

[3] 由于和选择的附件数目有关,所以时间复杂度为O(n)。

空间复杂度为O(1)。

[4] 1.显示打开文件对话框。

2.将选择的文件写入pos变量中。

3.将pos中文件路径用字符串的方式显示到列表框中。

算法5:void CMyEmailClientDlg::OnSend()[1] 发送按钮响应,实现发送邮件的功能[2] 将填入界面中的信息分别赋予其对应变量,然后按照顺序调用对应的功能函数,实现邮件的发送。

[3] 由于收件人以及附件的数目不确定性,其时间复杂度为O(nm)。

空间复杂度为O(1)。

[4] 1.将填入的相应信息分别赋值给CMIMEMessage msg对象。

2.根据列表框中的附件字符串数目,然后根据MIME协议进行添加附件。

3.建立CSMTP对象,同时设置m_SMTP 的对应属性。

4.连接SMTP服务器,并判断是否成功。

5.发送邮件,并判断是否成功。

6.清空附件框,并断开SMTP服务器的连接。

2.4 其他直接使用了封装好的MIME协议,大大增强了代码的简洁性。

3.程序运行结果分析包括输入数据来源和格式、输出显示方式、主要界面、操作流程、响应时间,运行效果等。

输入数据来源和格式:1.键盘输入。

直接从键盘输入相应的信息,如用户名,发件人等信息。

格式一般为字符串2.鼠标输入。

利用鼠标从电脑选择附件,进行输入。

在列表框中显示的格式为字符串。

输出显示方式:主要为对话框直接显示消息。

主要界面:只包含一个主界面,点击附件按钮后,会弹出打开文件对话框。

操作流程:按照要求输入用户名(选择163或126邮箱,QQ邮箱使用前需要在邮箱中设置),密码。

然后输入发送邮件的发件人,收件人,标题,内容,可以选择附件。

最后点击发信即可。

退出时,可以点击退出。

运行效果:4.总结4.1课题的难点和关键点本次课题相对上次的课题难度加大不少,特别是要运用MFC进行编程,在之前我只是在控制台上学习编程。

此外,本次课题的难点在于网络应用程序的设计是老师上课时并未仔细说明,主要靠同学自己自学。

其中包括SMTP协议,MIME协议,以及Base64编码都是新的知识,虽然这几个文件的代码网上有,但是要自己学会使用。

在网络传输中,通过课本明白了套接字的作用及使用,让我对SMTP的协议有了更加深刻的理解。

关键点在于使用套接字与服务器进行交互,与服务器之间发送消息,并借此发送消息。

根据SMTP协议的工作原理,将每一步都使用套接字进行发送,并进行判断,成功的实现了与服务器之间的交互。

4.2本课题的评价对于本次课题,算是这个学期以来碰到的最难得实验。

特别是mfc的知识事先没有接触过,不得不通过查阅课外书籍,以及加上百度的力量。

本次课题十分经典,但因为涉及与网络编程,使编程的难度大大增加。

不仅考验我们对旧知识的重新运用,也考察了我们对新知识的学习与理解。

能够充分培养学生的合作意识,培养学生发现问题,解决问题的能力,充分发挥学生的想象力、创造力,激发学生主动学习的潜能。

在程序运行的时,存在很多警告,自己不能够充分解决。

主要是由于VS程序的升级,使得以前使用的函数存在危险。

但是由于知识水平的有限,在知道了改进的函数之后,仍然没有办法解决这个警告。

同时自己对于MIME协议理解的仍然不够深刻,无法彻底剖析以及独立完成。

以后,我会更加努力的学习网络知识,争取解决这么问题。

4.3心得体会本次试验可谓是折磨人,特别是在一大波期末考试来临之前要求完成。

可喜的是在查阅资料和借助他人一些代码的情况下,程序总算可以运行出来。

通过这次MFC的编程,让我又学会了一种新的编译办法。

相比之下,觉得MFC界面比控制台界面更加人性化。

在学习编程过程中,慢慢意识到编程的奥妙,特别是层与层之间的相互关系。

如果学会正确处理这些关系,那编程就会简单很多,这个心得也会影响到以后各科的学习,甚至是终生有益。

5. 参考文献[1]徐惠民等,C++高级语言程序设计案例与实践辅导,北京:人民邮电出版社,2012[2]徐雅静等,数据结构与stl,北京:北京邮电大学,2011[3]徐惠名等,C++高级语言程序设计,北京,人民邮电出版社,2012。

相关文档
最新文档