编译原理 C编译器
可将C语言的裴波纳契和pi.c的翻译为汇编语言。满分7分。
上机大作业——简化C编译器实现
总体要求
一、要求实现的语言特性
1. 基本要求
1数据类型:int,char
2语句:赋值(=),if,while,for;赋值 循环 条件判断
3算术运算:+,-,*,/,%,++,--,&,|,^,~,<>
4关系运算:==,>,=,<=,!=
5逻辑运算:&&(与),||(或),!(非);构造与算数相同
6复合语句:{、}括起来的语句;要求识别 if、while中使用
7注释语句;识别注释 然后丢弃
8简单的输入输出
2. 选作功能
1数组,指针;数组怎么实现 第八章介绍数组的翻译
2函数
3其他特性(浮点运算、结构/类、连接C标准库等等)
生成的目标代码
生成x86汇编语言程序。;不要求二进制 由编译器编译成二进制
要求提交的内容
1C语言子集的描述:词法结构的正则表达式定义、语法结构的CFG定义。
;简化子集的描述
2编译器源程序文本,包括Lex、Yacc等程序和C/C++程序。;两种语言工具 构造词法分和语法分析部分 passive generate
3编译器演示程序,可将C语言子集测试程序编译为目标代码——汇编程序,用汇编器转换为二进制程序后运行无误,如斐波那契数列程序,应能翻译为正确的汇编程序。
编译原理简易C编译器
只能实现斐波那契数列,没有实现pi.c,得分五分
上机大作业——简化C编译器实现
总体要求
一、要求实现的语言特性
1. 基本要求
1数据类型:int,char
2语句:赋值(=),if,while,for;赋值 循环 条件判断
3算术运算:+,-,*,/,%,++,--,&,|,^,~,<>
4关系运算:==,>,=,<=,!=
5逻辑运算:&&(与),||(或),!(非);构造与算数相同
6复合语句:{、}括起来的语句;要求识别 if、while中使用
7注释语句;识别注释 然后丢弃
8简单的输入输出
2. 选作功能
1数组,指针;数组怎么实现 第八章介绍数组的翻译
2函数
3其他特性(浮点运算、结构/类、连接C标准库等等)
生成的目标代码
生成x86汇编语言程序。;不要求二进制 由编译器编译成二进制
要求提交的内容
1C语言子集的描述:词法结构的正则表达式定义、语法结构的CFG定义。
;简化子集的描述
2编译器源程序文本,包括Lex、Yacc等程序和C/C++程序。;两种语言工具 构造词法分和语法分析部分 passive generate
3编译器演示程序,可将C语言子集测试程序编译为目标代码——汇编程序,用汇编器转换为二进制程序后运行无误,如斐波那契数列程序,应能翻译为正确的汇编程序。
实现语法分析器-编译原理
这个里面的都是测试数据,总共得分5分。从控制台输入,不能从文件中读取。实现了基本功能,加分项目都没有去实现,没有函数数组这些的实现。这是用C++语言写的,新建parser类别要选C++,其他对于VS的配置和C语言一样。for语句用的是枚举所有情况,你可以自行修改。
对预备工作中自然语言描述的简化C编译器的语言特性的语法,设计上下文无关文法进行描述
借助Yacc工具实现语法分析器
考虑语法树的构造:
1.语法树数据结构的设计:节点类型的设定,不同类型节点应保存哪些信息,多叉树的实现方式
2.实现辅助函数,完成节点创建、树创建等功能
3.利用辅助函数,修改上下文无关文法,设计翻译模式
4.修改Yacc程序,实现能构造语法树的分析器
考虑符号表处理的扩充
1.完成语法分析后,符号表项应增加哪些标识符的属性,保存语法分析的结果
2.如何扩充符号表数据结构,Yacc程序如何与Lex程序交互,正确填写符号表项
以一个简单的C源程序验证你的语法分析器,可以文本方式输出语法树结构,以节点编号输出父子关系,来验证分析器的正确性,如下例:
main()
{
int a, b;
if (a == 0)
a = b + 1;
}
可能的输出为:
0 : Type Specifier, integer, Children:
1 : ID Declaration, symbol: a Children:
2 : ID Declaration, symbol: b Children:
3 : Var Declaration, Children: 0 1 2
4 : ID Declaration, symbol: a Children:
5 : Const Declaration, value:0, Children:
6 : Expr, op: ==, Children: 4 5
7 : ID Declaration, symbol: a Children:
8 : ID Declaration, symbol: b Children:
9 : Const Declaration, value:1, Children:
10: Expr, op: +, Children: 8 9
11: Expr, op: =, Children: 7 10
12: if statement, Children: 6 11
13: compound statement, Children: 3 12
1005: 最邻近点对
要求用分治算法(O(nlogn)复杂度)实现寻找n个点中最邻近点对,输出最邻近距离的平方。其中0<=x<10000,0<=y<10000,(x,y是整数) 点数1<n<=30000
输入
第一行表示点的数目n;
接下来的n行中,每一行依次表示点的x坐标,y坐标。
输出
输出n个点中最邻近点对距离的平方。
样例输入
8
1 1
2 2
4 4
8 8
2 3
5 6
7 9
11 11
样例输出
1
MFC 绘制一个跟随鼠标移动的靶子
MFC 绘制一个跟随鼠标移动的靶子
MFC 鼠标移动改变光标符号
MFC 鼠标移动改变光标符号
汇编-文件复制
执行时文件源和目标在命令行参数指定,文件源可以是[路径\文件名],目标可以是[路径名(包括当前路径"." )],或[路径\文件名]
说明:
1.按照上述的基本要求实现DOS窗口下的文件复制功能(包括复制文件时产生的错误检出功能);
2.在上述功能上进行基本扩充。
要求使用:INT 21H FUNCTION
3C 建立文件
3D 打开文件
3E 关闭文件
3F 读文件或设备
40 写文件或设备
62 取程序段前缀(注意,程序段前缀的 offset 80H 是参数区的启始地址,
第1个BYTE是参数的长度,
其余的是参数)
里面含有三个代码,都可以运行,都是这个作业的,可以参考一下。
汇编 放一段音乐?
和HACK作业一起提交的,作业要求好像是按下按钮,响一段音乐。
汇编 监视窗口绘图
Project 1
Please draw a Arabic numeral except one on the memory monitor
请在内存监视窗口画出一个除1之外的阿拉伯数字。
Project 2
Please use loop algorithm,draw a blot,which is keep moving in a certain path and keep changing the bright from 255->0->255->.., on the memory monitor.
请使用循环语句,在内存监视窗口画出一个不断前进,同时亮度由255-》0—》255-》0-》。。。循环变化的亮点。
汇编 显示扫描码和ASCLL码
作业说明:
1.按下任意一个键盘按键,输出所按下键盘的对应扫描码和对应的字符码。
2.基本要求:
能够输出字符数字键(任意26个字母、数字和标点等基本按键)的扫描码和字符码;
加分项:
输出扩展功能键和控制键(如“Ctrl、Alt和Capslock等”)的扫描码;
3.提示:
利用基本BIOS和DOS中断实现,可参考课本代码,但切忌抄袭。
汇编 程序破解-HACK
要求:
1.提交一个可执行文件及源代码,完成hack.exe的所有功能,并将程序从键盘接收的信息存入指定(可自己设定)的文本文件中
2.提交的代码要与hack.exe源代码有90%以上的相似性
3.程序记录的信息要至少包涵键盘输入的字符
4.附加功能 记录每次键盘被按下时的系统时间 并存入文件中
提示及建议:
1.使用dos 中debug 功能对程序进行研究,需要使用的基本功能如下:
1)-u 反汇编 获取程序大部分源代码
2)-p -t 用于逐行执行程序 其中p功能不跳入子程序 t功能跳入子程序
3)-e 用于查看内存
(关于debug 的详细用法及示例说明讲解见公邮” dubug学习.rar “ 文件
2.以读取键盘输入的中断为突破口破解程序
3.注意程序中对子程序的调用及破解方法
4.反汇编并不能得到数据段的内容,数据段的重要信息要通过地址从内存中读取
5.信息输出的文件名及路径名可写在程序数据段中也可从命令行输入,不做要求
JAVA-画笔小程序
做一个画笔小程序。
基本功能要求:
1.这个画图程序,最基本的功能是,作为一个画笔,能利用它实现在屏幕上任意绘画、书写的功能;
2.利用这个画图程序,通过选择画直线、画圆形、画矩形等功能选项并且在屏幕上拖动鼠标操作能实现画出相应图形的功能;
3.这个画图程序,还应该做到能够改变画笔颜色的功能;
4.这个画图程序,还应该具备能够清除已绘制图画的功能。
JAVA-CD租售店
CD租售店
请实现一个CD出租销售店的模拟程序,该CD租售店,具有可租cd列表,可售cd列表。并具有租、还cd,销售、进货CD方法。假设cd店中可租CD列表5张,可售CD列表5种,每种10张,请实现以下线程
进货线程:只有一个,固定的每1秒启动一次,但是如果临时缺货则购买线程发送消息紧急启动一次,每次补齐可售CD列表。
销售线程:可以有两个或两个以上,启动的时间为500ms以内的随机数。购买数量为5以内的随机数。如果cd数量不足则随机选择等候或放弃。
租借线程:租借CD店的可租借CD,启动时间为300ms以内的随机数。租借序号为1-5随机序号的CD,如果该CD已经出租则随机选择等候或者放弃。如果可以借到CD则随机等候200~300ms然后归还。
程序运行2分钟以后停止。最后列出购买、进货、租借还的纪录(时间及行为)。
程序运行两次,以record.txt方式提交两次的程序输出。
提交源程序。
JAVA-泛型的使用
任意给出两组个数相同的集合a和b。 ( 例如,a为{2,1,2,2}, b为{1,0,0,1} ),编写带有泛型传递参数的程序求:
统计a中包含多少种不同的值。(如上述例子中,a中包含2和1两种不同的数)(求秩)
a中每一个数与b中同一位置的数称为对应关系,统计a中每种数对应的b的取值有几种。 (如上述例子中,a为2时,对应的b有1和0两种取值;a为1时,对应的b中只有0这一种取值)
Set及比较器的使用
要求:将5个学生姓名写入一个Set集合中,学生具有学号,姓名以及成绩列表等属性。学生以学号区分。(注意hashcode与equals的定义,排序依据学号进行)。构造函数中随机生成学生成绩(10个成绩)。定义不同的Comparator,分别按照成绩列表的最高分,最低分,平均分进行排序。求出学生成绩的最高分,最低分,平均分,并按照从高到低的顺序打印出学生的姓名及各类成绩。(实现类不同的接口)(注意hashcode与equals的定义,排序依据学号进行)
打印内容如下:
JAVA 生成随机数
编写一个彩票开奖的模拟程序,注意类的定义,必须使用继承的方式实现不同的玩法:
首先提示用户选择玩法
玩法1:21选5(5个不同的数字,中5,4,3个数字)
输入5个数(从1,2,…,21选)
玩法2:6+1(可以重复,选的号码在相同的位数上中了几多个,只算从一到九不算0)
输入7个数字(代表购买彩票的号码,最后一位特别号)
根据用户选择的玩法,随机生成开奖号码,与用户输入的号码比较,判断是否中奖、中几等奖,并输出结果。(中奖性的属性,判断是否中奖的方法定义成抽象用子类实现)
C++运算符重载
在前面的Rational类中添加运算符重载。测试程序周三可从作业邮箱下载,文件名为TestRational.cpp
要求支持以下运算符:+= -= *= /= [] ++ -- 单目+ 单目- << >>
< <= > >= == != + - * /
ACM拓扑排序(可输出环)
假设给我们一个任意的图,它可能是也可能不是DAG(有向无圈图),推广拓扑排序算法,以使得给定有向图G的输入,它的输出是以下两者之一:
(a) 一个拓扑排序,于是确定了G为DAG;
或者
(b) G中的一个圈,于是确定了G不是DAG.
注意到输出的解可能不是唯一的,输出任意一个答案即可。
输入
第一行两个数n,m,代表节点数和边数
m行,每行两个数代表一条有向边
测试数据范围:(1<=n<=50,0<=m<2500)
输出
YES
一个拓扑序,数字之间用逗号分隔。
或者
NO
一个圈,数字之间用逗号分隔。
样例输入
5 5
1 2
1 3
2 5
3 4
4 5
5 7
1 2
1 3
2 1
2 5
3 4
4 2
4 5
样例输出
YES
1,2,3,4,5
NO
1,3,4,2,1
提示
考虑不连通,自环,重边。
Case1:
YES //( DAG)
1,2,3,4,5 //(Topological Ordering)
Case2:
NO //(Not A DAG)
1,3,4,2,1 //(Cycle)
C++练习:课程类
练习:课程类
添加学生时,若数组容量不够,则创建一个更大的数组,并将内容拷贝到新的数组
实现dropStudents函数
添加一个新的函数clear(),删除该课程的所有学生
在该类中实现自定义的析构函数和拷贝构造函数,达到深拷贝的目的
编写测试程序,测试实现的类
创建并使用词典类
正整数n, m从键盘输入,创建一个vector v,大小为n*m,随机填充该向量(0-99之间的整数);创建二维的vector v,将v的每一行排序,并输出排序后的结果。排序要求调用标准库函数。
2、设计一个简单的词典类Dict,每个单词包括英文单词及对应的中文含义,并有一个英汉翻译成员函数,通过查词典的方式将一段英语翻译成对应的汉语
词典类Dict接口:add( )(添加单词)和trans( )(英汉翻译)成员函数
以多文件方式建立工程
南开大学数据结构课件
全部数据结构课件,2016年的期末复习课件,2014年数据结构的期末试题。
数据库系统基础视频1
2006年的视频,差别不太大。
数据库系统 袁晓洁课件及作业说明
完整PPT,含2016上机考试数据库、2016认证考试题目、04和05年的考题(和16年很像)、三次作业说明(作业找不到了)。
斯坦福大学数据库
我收集到的斯坦福大学的数据库的题,跟袁晓洁老师的出题类型很像,有一定的参考意义。
上机实验4-哈夫曼树
1.(编码)输入一段文本,利用霍夫曼编码对其进行压缩编码,首先需要计算各字符的频率并保存在文本中,然后根据该文本建立霍夫曼树,确定各字符对应的霍夫曼编码。
输入:inputfile1.txt:
输出:outputfile1.txt:各字符的频率与对应的霍夫曼编码
2.(解码)输入一段由0和1组成的编码后的文本,利用建立的霍夫曼编码表将其还原成编码前的文本信息。
输入:inputfile2.txt:由0和1组成的编码序列
输出:outputfile2.txt:解码后的文本信息
按照上面列出的输入输出要求实现霍夫曼编码与解码,并要求以文本格式输出霍夫曼树(或图形化输出),同时本次实验要求霍夫曼树的父节点的权重比子节点大,左孩子的权重比右孩子权重大,便于统一检查。
我的txt文件存储在D盘根目录,可以把inputfile1和2移到D根目录直接运行。
上机实验3-二叉树
1.输入一个中缀表达式,构造表达式树,以文本方式输出树结构。
输入:例如,输入a+b+c*(d+e)
输出:以缩进表示二叉树的层次,左(根),右(叶),上(右子树),下(左子树)
2.编写二叉树类的成员函数,分别实现以下功能:
①交换二叉树中所有节点的左右子树。(将结果输出至文本文件中)
②按层次顺序遍历二叉树:首先访问根节点,然后是它的两个孩子节点,然后是孙子节点,依此类推。(将结果输出至屏幕)
求二叉树的宽度,即同一层次上最多的节点数。(将结果输出至屏幕)
含实验报告
作业二-用栈求解汉诺塔
学习栈的原理
熟悉链表的构建与使用,利用链表实现栈
利用栈求解汉诺塔问题
问题描述
汉诺塔问题:
现有三个塔座,在塔1上叠有64个碟子,所有碟子按从大到小的次序从塔底堆放至塔顶。在塔1旁边还有另外两个塔座(塔2和塔3)。
要求每次移动一个碟子,将塔1上的64个碟子借助塔3全部移到塔2上,且在任何时候都不能把一个碟子放在比它小的碟子上。
实验要求:
1.由于从每个塔上移走碟子是按照LIFO的方法进行的,因此可以把每个塔表示成一个堆栈。
2.三座塔在任何时候都总共拥有n个碟子,因此使用链表形式的堆栈总共只需要申请n个元素所需要的空间,但是使用公式化描述的堆栈时,塔1和塔2的容量都必须是n,而塔3的容量必须是n-1,故总共需要3n-1的空间。
3.本次实验要求使用链表形式的栈。
4.链表的每个节点存储数据信息和指向下一个节点的指针
5.栈中保存每次移动后的状态
实验一——排序
1.实验要求 使用简单数组实现下面各种排序算法,并进行比较。
2.排序算法:
1、插入排序
2、冒泡排序
3、快速排序
4、简单选择排序
要求:
1、测试数据分成三类:正序、逆序、随机数据
2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其 中关键字交换计为3次移动)。
3、对于这三类数据,比较上述排序算法中不同算法的执行时间。
4、对2和3的结果进行分析,验证上述各种算法的时间复杂度
如果没有传错就是这些代码