天津理工大学课程设计实验报告
天津理工大学_操作系统_存储器的分配与回收算法实现_实验报告

实验报告学院(系)名称:计算机与通信工程学院【实验过程记录(源程序、测试用例、测试结果及心得体会等)】源程序:MemoryBlock.java://内存块类,包含各种操作public class MemoryBlock {static final int BLOCK_SIZE = 4096;private int baseBlock; //内存块基地址private int blockNum; //大小private boolean inUse; //是否已分配private MemoryBlock prev, next;public MemoryBlock(int blockNum) {this.baseBlock = 0;this.blockNum = blockNum;inUse = false;prev = null;next = null;}public MemoryBlock(int base, int blockNum) {this.baseBlock = base;this.blockNum = blockNum;inUse = false;prev = null;next = null;}public int getBlockNum() {return blockNum;}public void setBlockNum(int blockNum) {this.blockNum = blockNum;}public MemoryBlock getPrev() {return prev;}public void setPrev(MemoryBlock prev) {this.prev = prev;public MemoryBlock getNext() {return next;}public void setNext(MemoryBlock next) {this.next = next;}public boolean inUse() {return inUse;}public void setUse() {inUse = true;}public void free() {inUse = false;}public int getBaseBlock() {return baseBlock;}public void setBaseBlock(int baseBlock) { this.baseBlock = baseBlock;}//分配内存块,如果可分配,则返回剩余内存块public MemoryBlock allocate(int blockNum) { if(this.blockNum - blockNum>0) {int newBase = baseBlock + blockNum;int newBlock = this.blockNum-blockNum;this.blockNum = blockNum;setUse();return new MemoryBlock(newBase, newBlock);}else if(this.blockNum - blockNum ==0) {this.blockNum = 0;}return null;}//判断内存块是否能合并public boolean merge(MemoryBlock memBlock) {if(baseBlock+blockNum==memBlock.getBaseBlock()) {setBlockNum(blockNum+memBlock.blockNum);memBlock.setBaseBlock(0);memBlock.setBlockNum(0);return true;}elsereturn false;}@Overridepublic String toString() {String inUse = null;if(inUse())inUse = "已分配";else inUse = "未分配";return"内存块 [基地址=" + baseBlock + ", 大小=" + blockNum +", " + inUse + "]";}}MemoryTable.java://虚类MemTable,提供内存链表的各种基本方法public abstract class MemoryTable {//MemoryBlock链表表头protected MemoryBlock memList;public MemoryTable(int blockNum) {memList = new MemoryBlock(0, blockNum);}//把newBlock插入到memBlock前面public void insertBefore(MemoryBlock memBlock, MemoryBlock newBlock){if(memBlock.getPrev() != null)memBlock.getPrev().setNext(newBlock);if(memList == memBlock)memList = newBlock;newBlock.setPrev(memBlock.getPrev());newBlock.setNext(memBlock);memBlock.setPrev(newBlock);}//在memBlock后插入newBlockpublic void insert(MemoryBlock memBlock, MemoryBlock newBlock) { if(memBlock.getNext() != null)memBlock.getNext().setPrev(newBlock);newBlock.setNext(memBlock.getNext());memBlock.setNext(newBlock);newBlock.setPrev(memBlock);}//删除块的连接关系,但不释放块public void remove(MemoryBlock memBlock) {if(memBlock == memList)memList = memBlock.getNext();if(memBlock.getNext()!=null)memBlock.getNext().setPrev(memBlock.getPrev());if(memBlock.getPrev()!=null)memBlock.getPrev().setNext(memBlock.getNext());}public void print() {MemoryBlock memBlock = memList;int i=0;while(memBlock != null) {System.out.print(i+" ");System.out.println(memBlock);i++;memBlock = memBlock.getNext();}}//合并邻接的空闲内存public void merge(MemoryBlock newBlock) {MemoryBlock memBlock = memList;while(memBlock != null) {if(!memBlock.inUse()) {if(memBlock.merge(newBlock)) {memBlock.setBlockNum( memBlock.getBlockNum() +newBlock.getBlockNum());remove(newBlock);break;}if(newBlock.merge(memBlock)) {newBlock.setBlockNum( newBlock.getBlockNum() + memBlock.getBlockNum());break;}}memBlock = memBlock.getNext();}}//分配内存(抽象函数)public abstract boolean allocate(int blockNum);//释放内存(抽象函数)public abstract boolean free(int baseBlock);}FirstFit.java:public class FirstFit extends MemoryTable{public FirstFit(int blockNum) {super(blockNum);}@Overridepublic boolean allocate(int blockNum) {MemoryBlock memBlock = memList;while(memBlock!=null) {if(!memBlock.inUse()) {if(memBlock.getBlockNum()>blockNum) {MemoryBlock newBlock = memBlock.allocate(blockNum);insert(memBlock, newBlock);return true;}else if(memBlock.getBlockNum()==blockNum) {memBlock.setUse();}}memBlock = memBlock.getNext();}return false;}//分配内存(类内使用)void freeMemory(MemoryBlock freeBlock) {MemoryBlock prev = freeBlock.getPrev();MemoryBlock next = freeBlock.getNext();freeBlock.free();while(!prev.inUse() && (prev.merge(freeBlock))) {prev.setBlockNum( prev.getBlockNum() +freeBlock.getBlockNum());remove(freeBlock);freeBlock = prev;if(freeBlock.getPrev()!=null)prev = freeBlock.getPrev();else return;}}if(freeBlock.getNext()!=null) {while(!next.inUse() && (freeBlock.merge(next))) {freeBlock.setBlockNum ( next.getBlockNum() +freeBlock.getBlockNum());remove(next);freeBlock = next;if(freeBlock.getNext()!=null)next = freeBlock.getNext();else return;}}}@Overridepublic boolean free(int baseBlock) {MemoryBlock memBlock = memList;while(memBlock != null) {if(memBlock.getBaseBlock() == baseBlock) {freeMemory(memBlock);return true;}memBlock = memBlock.getNext();}return false;}}BestFit.java:public class BestFit extends MemoryTable {private MemoryBlock usedMemory;public BestFit(int blockNum) {super(blockNum);usedMemory = null;}@Overridepublic boolean allocate(int blockNum) {MemoryBlock memBlock = memList;MemoryBlock minBlock = null;for(;memBlock!=null; memBlock = memBlock.getNext()) { if(!memBlock.inUse()&&(memBlock.getBlockNum()>=blockNum)) { minBlock = memBlock;break;}}if(minBlock != null) {remove(minBlock);if(minBlock.getBlockNum()!=blockNum) {MemoryBlock newBlock = minBlock.allocate(blockNum);insertUnused(newBlock);}insertUsed(minBlock);return true;}elsereturn false;}boolean freeMemory(MemoryBlock freeBlock) {if(freeBlock != null) {freeBlock.free();removeUsed(freeBlock);insertUnused(freeBlock);return true;}return false;}@Overridepublic boolean free(int baseBlock) {MemoryBlock memBlock = usedMemory;while(memBlock != null) {if(memBlock.getBaseBlock() == baseBlock) {freeMemory(memBlock);merge(memBlock);return true;}memBlock = memBlock.getNext();return false;}//在已分配链表删除public void removeUsed(MemoryBlock memBlock) {if(memBlock == usedMemory)usedMemory = memBlock.getNext();if(memBlock.getNext()!=null)memBlock.getNext().setPrev(memBlock.getPrev());if(memBlock.getPrev()!=null)memBlock.getPrev().setNext(memBlock.getNext());}//插入未分配链表void insertUnused(MemoryBlock newBlock) {if(memList == null)memList = newBlock;else {MemoryBlock memBlock = memList;MemoryBlock preBlock = null;while(memBlock!=null) {if(newBlock.getBlockNum()<=memBlock.getBlockNum()) { insertBefore(memBlock, newBlock);return;}preBlock = memBlock;memBlock = memBlock.getNext();}insert(preBlock, newBlock);}}//插入已分配链表void insertUsed(MemoryBlock newBlock) {if(usedMemory == null)usedMemory = newBlock;else {MemoryBlock memBlock = usedMemory;while(memBlock.getNext() != null)memBlock = memBlock.getNext();memBlock.setNext(newBlock);newBlock.setPrev(memBlock);}}public void print() {super.print();MemoryBlock memBlock = usedMemory;int i=0;while(memBlock != null) {System.out.print(i+" ");System.out.println(memBlock);i++;memBlock = memBlock.getNext();}}}WorstFit.java:public class WorstFit extends MemoryTable {//已分配链表private MemoryBlock usedMemory;public WorstFit(int blockNum) {super(blockNum);usedMemory = null;}@Overridepublic boolean allocate(int blockNum) {MemoryBlock maxBlock = memList;if(maxBlock.getBlockNum()<blockNum)return false;remove(maxBlock);if(maxBlock.getBlockNum()!=blockNum) {MemoryBlock newBlock = maxBlock.allocate(blockNum);insertUnused(newBlock);}insertUsed(maxBlock);return true;}boolean freeMemory(MemoryBlock freeBlock) {if(freeBlock != null) {freeBlock.free();removeUsed(freeBlock);insertUnused(freeBlock);}return false;}@Overridepublic boolean free(int baseBlock) {//已分配链表MemoryBlock memBlock = usedMemory;while(memBlock != null) {if(memBlock.getBaseBlock() == baseBlock) {freeMemory(memBlock);merge(memBlock);return true;}memBlock = memBlock.getNext();}return false;}public void removeUsed(MemoryBlock memBlock) {if(memBlock == usedMemory)usedMemory = memBlock.getNext();if(memBlock.getNext()!=null)memBlock.getNext().setPrev(memBlock.getPrev());if(memBlock.getPrev()!=null)memBlock.getPrev().setNext(memBlock.getNext());}void insertUnused(MemoryBlock newBlock) {if(memList == null)memList = newBlock;else {MemoryBlock memBlock = memList;MemoryBlock preBlock = null;while(memBlock!=null) {if(newBlock.getBlockNum()>=memBlock.getBlockNum()) { insertBefore(memBlock, newBlock);return;}preBlock = memBlock;memBlock = memBlock.getNext();}insert(preBlock, newBlock);}}void insertUsed(MemoryBlock newBlock) {if(usedMemory == null)usedMemory = newBlock;else {MemoryBlock memBlock = usedMemory;while(memBlock.getNext() != null)memBlock = memBlock.getNext();memBlock.setNext(newBlock);newBlock.setPrev(memBlock);}}public void print() {super.print();MemoryBlock memBlock = usedMemory;int i=0;while(memBlock != null) {System.out.print(i+" ");System.out.println(memBlock);i++;memBlock = memBlock.getNext();}}}测试用例:Main.java:public class Main {public static void main(String[] args) {testFirstFit();System.out.println();testBestFit();System.out.println();testWorstFit();}public static void testFirstFit() {MemoryTable mem = new FirstFit(1024);System.out.println("测试首次适应法:");mem.allocate(512);mem.allocate(256);mem.allocate(128);mem.print();mem.free(512);mem.free(768);mem.print();}public static void testBestFit() {MemoryTable mem = new BestFit(1024);System.out.println("测试最佳适应法:");mem.allocate(1);mem.allocate(2);mem.allocate(3);mem.print();mem.free(0);mem.free(1);mem.print();}public static void testWorstFit() {MemoryTable mem = new WorstFit(1024);System.out.println("测试最坏适应法:");mem.allocate(1);mem.allocate(2);mem.allocate(3);mem.print();mem.free(0);mem.free(3);mem.print();}}测试结果:测试首次适应法:分配 512 内存分配 256 内存分配 128 内存内存单元:0 内存块 [基地址=0, 大小=512, 已分配]1 内存块 [基地址=512, 大小=256, 已分配]2 内存块 [基地址=768, 大小=128, 已分配]3 内存块 [基地址=896, 大小=128, 未分配]释放 512 处内存释放 768 处内存内存单元:0 内存块 [基地址=0, 大小=512, 已分配]1 内存块 [基地址=512, 大小=512, 未分配]测试最佳适应法:分配 1 内存分配 2 内存分配 3 内存内存单元:0 内存块 [基地址=6, 大小=1018, 未分配]0 内存块 [基地址=0, 大小=1, 已分配]1 内存块 [基地址=1, 大小=2, 已分配]2 内存块 [基地址=3, 大小=3, 已分配]释放 0 处内存释放 1 处内存内存单元:0 内存块 [基地址=0, 大小=3, 未分配]1 内存块 [基地址=6, 大小=1018, 未分配]0 内存块 [基地址=3, 大小=3, 已分配]测试最坏适应法:分配 1 内存分配 2 内存分配 3 内存内存单元:0 内存块 [基地址=6, 大小=1018, 未分配]0 内存块 [基地址=0, 大小=1, 已分配]1 内存块 [基地址=1, 大小=2, 已分配]2 内存块 [基地址=3, 大小=3, 已分配]释放 0 处内存释放 3 处内存内存单元:0 内存块 [基地址=3, 大小=1021, 未分配]1 内存块 [基地址=0, 大小=1, 未分配]0 内存块 [基地址=1, 大小=2, 已分配]心得体会:1.使用类来进行一些方法的重用2.释放内存时,根据不同的分配方法进行相邻的内存合并3.链表应根据具体情况优化从而简化代码。
天津理工大学软件工程实验报告II

管理员类和工作人员类是控制类。
顾客类是边界类。
系统对象图:
附录(可包括源程序清单或其它说明)
心得体会:
通过本次实验,我基本掌握了Ration Rose画类图和对象图的基本操作,也让我感受到想和做有很大的差距,以前总觉得画类图很简单,但当真正画的时候,就感到有些困难,因为需要考虑每个类的属性,以及各个类之间的关系,以后实验课我会继续努力的。
天津理工大学
计算机科学与工程学院
实验报告
2017至2018学年第一学期
课程名称
软件工程
学号
年级
2015
专业
计算
教学班号
3
实验地点
7-215
实验时间
2017年11月14日第三节至11月14日第四节
考核标准
实验过程
25分
建模质量
20分
回答问题
15分
实验报告
30分
特色
功能
5分
考勤违纪情况
Welcome To
Download !!!
欢迎您的下载,资料仅供参考!
5分
实验成绩
成绩栏
考核内容
评价在实验课堂中的表现,包括实验态度、建模过程等内容。
○功能完善
○功能不全
○有小错
○质量很差
○正确
○基本正确
○有提示
○无法回答
○完整
○较完整
○一般
○内容少
○无报告
○有
○无
○有
○无
其它批改意见:
教师签字:
实验(二)
实验名称
系统分析与对象类建模
软件环境
Windows操作系统、Rational Rose等软件
天津理工大学数据结构实验报告2

Байду номын сангаас
int judge_huiwen(char a[],int n){ //判断一个字符串是否是回文 SeqStack *s; s=InitStack(); int i=1,j=1; while(i<=n/2){ Push(s,a[i]); i++; } if(n%2!=0)i++; while(i<=n&&j==1){ if(a[i]==Pop(s)) i++; else{j=0; break; } } return j;
使用栈,将字符串的前一半入栈,再依次出栈,与后一半进行比较,若不相等,则不 是回文,否则是回文 2.1 初始化栈s; 2.2 利用i记录循环次数,i的初始值为1,循环直到i=字符串的一半时结束 字符串下标为i的字符依次入栈。 2.3 若字符串长度为偶数,i值不变,否则i+1; 2.4 利用while循环,依次比较下标为i的字符串中的字符与出栈元素是否相等,以j=1, 作为标志,若不等j=0并打断循环 2.5 返回j的值,j=1,则字符串是回文,否则不是回文 3. 主函数 3.1 首先输入字符串的长度,然后依次输入字符; 3.2 输出字符串; 3.3 调用函数判断字符串是否是回文。
天津理工大学编译原理实验2语法分析

天津理工大学编译原理实验2语法分析实验报告学院(系)名称:计算机与通信工程学院姓名学号专业班级实验项目实验二:语法分析课程名称编译原理课程代码2016年4月21日第1、2节实验时间 2016年4月26日第3、4节实验地点计算机软件实验室7-220 2016年4月28日第1、2节批改意见成绩教师签字: 实验内容:可选择LL1分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法分析器:(1)E?E+T | E-T | T(2)T?T*F | T/F | F(3)F?P^F | P(4)P?(E) | i实验目的:1(掌握语法分析的基本概念和基本方法;2(正确理解LL1分析法、算符优先分析法、LR分析法的设计与使用方法。
实验要求:1(按要求设计实现能识别上述文法所表示语言的语法分析器,并要求输出全部分析过程;2(要求详细描述所选分析方法针对上述文法的分析表构造过程;3(完成对所设计语法分析器的功能测试,并给出测试数据和实验结果;4(为增加程序可读性,请在程序中进行适当注释说明;5(整理上机步骤,总结经验和体会;6(认真完成并按时提交实验报告。
第1页共13页【实验过程记录(源程序、测试用例、测试结果及心得体会等)】使用的是LL(1)分析法,其分析表的构造方法和构造过程如下: 实验源代码: #include<iostream>#include<cstring>#define size 1024using namespace std;int getLength(char str[size]) {int i=0;while(str[i]!='\0')i++;return i;}int getstringLength(string str) {int i=0;while(str[i]!='\0')i++;return i;}char gettop(char stack[size],int top) {if(stack[top]!='\0')return stack[top];elsereturn '#';}void popstack(char *stack,int *pointer){int p=*pointer;cout<<"\tPopup "<<stack[p]<<" out!";stack[p]='\0';(*pointer)--;}void pushstack(char *stack,int *pointer,string str) {int i=0;int length=getstringLength(str);cout<<" push "<<str<<" in stack reversed order."; for(i=length-1;i>=0;i--){(*pointer)++;第2页共13页stack[(*pointer)]=str[i];}}int getcol(char top) {switch(top){case '+':return 0;case '-':return 1;case '*':return 2;case '/':return 3;case '^':return 4;case ')':return 5;case '#':return 6;case '(':return 7;case 'i':return 8;default:cout<<"Error! This character string is not this grammer`s sentence."<<endl;return -1;}}void show(char str[size],int index){int length=getLength(str);if(index!=-1)cout<<"\t";for(int i=index+1;i<length;i++)cout<<str[i]; }int main(){char str[size];//接受字符串的数组char stack[size];//进行比对的栈int pointer=-1;//指向栈顶的指针int length=0;//记录字符串长度int index=0;//记录输入字符串第3页共13页char top;int i,j;//i表示行,j表示列string production;bool match=false;string table[7][9]={ // + - * / ^ ) # ( i/* E */ "error", "error", "error", "error", "error", "error", "error", "TX", "TX",/* X */ "+TX", "-TX", "error", "error", "error", "empty", "empty", "error", "error",/* T */ "error","error","error","error","error","error","error","FY","FY", /* Y */"empty","empty","*FY","/FY","error","empty","empty","error","error", /* F */ "error","error","error","error","error","error","error","PZ","PZ", /* Z */"empty","empty","empty","empty","^F","empty","empty","error","error", /* P */ "error","error","error","error","error","error","error","(E)","i"};cout<<"Please input character string: ";cin>>str;length=getLength(str);str[length]='#';str[length+1]='\0';// cout<<length<<endl;// cout<<table[0][0]; //已验证可以实现cout<<"符号栈\t当前符号\t输入串\t\t\t\t说明"<<endl;pointer++;stack[pointer]='#';pointer++;stack[pointer]='E';//初始化栈,使栈底是 #Ewhile(str[index]!='\0'){top=gettop(stack,pointer);switch(top){case 'E':i=0;//第1行j=getcol(str[index]);production=table[i][j];if(production=="error"){cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}else if(production=="empty"){cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);popstack(stack,&pointer);第4页共13页}else //说明可以进行分解非终结符{cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);popstack(stack,&pointer);pushstack(stack,&pointer,production);}break;case 'X':i=1;//第2行j=getcol(str[index]);production=table[i][j];if(production=="error"){cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}else if(production=="empty"){cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);popstack(stack,&pointer);}else //说明可以进行分解非终结符{cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);popstack(stack,&pointer);pushstack(stack,&pointer,production); }break;case 'T':i=2;//第3行j=getcol(str[index]);production=table[i][j];if(production=="error"){cout<<"Error! This character string is not this grammer`s sentence."<<endl;第5页共13页return 0;}else if(production=="empty"){cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);popstack(stack,&pointer);}else //说明可以进行分解非终结符{cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);popstack(stack,&pointer);pushstack(stack,&pointer,production);}break;case 'Y':i=3;//第4行j=getcol(str[index]);production=table[i][j];if(production=="error"){cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}else if(production=="empty"){cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);popstack(stack,&pointer);}else //说明可以进行分解非终结符{cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);popstack(stack,&pointer);pushstack(stack,&pointer,production);第6页共13页}break;case 'F':i=4;//第5行j=getcol(str[index]);production=table[i][j];if(production=="error"){cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}else if(production=="empty"){cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);popstack(stack,&pointer);}else //说明可以进行分解非终结符{cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);popstack(stack,&pointer);pushstack(stack,&pointer,production);}break;case 'Z':i=5;//第6行j=getcol(str[index]);production=table[i][j];if(production=="error"){cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}else if(production=="empty"){cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);popstack(stack,&pointer);第7页共13页}else //说明可以进行分解非终结符{cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);popstack(stack,&pointer);pushstack(stack,&pointer,production);}break;case 'P':i=6;//第7行j=getcol(str[index]);production=table[i][j];if(production=="error"){cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}else if(production=="empty"){cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);popstack(stack,&pointer);}else //说明可以进行分解非终结符{cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);popstack(stack,&pointer);pushstack(stack,&pointer,production); }break;case '+':switch(str[index]){case '+':cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";第8页共13页show(str,index);cout<<"\tMatch + ! ";//" Popup + and next char in."<<endl;popstack(stack,&pointer);match=true;break;default:cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}break;case '-':switch(str[index]){case '-':cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);cout<<"\tMatch - ! ";//Popup - and next char in."<<endl;popstack(stack,&pointer);match=true;break;default:cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}break;case '*':switch(str[index]){case '*':cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);cout<<"\tMatch * ! ";//Popup * and next char in."<<endl;popstack(stack,&pointer);match=true;break;default:cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}break;case '/':第9页共13页switch(str[index]){case '/':cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);cout<<"\tMatch / ! ";//Popup / and next char in."<<endl;popstack(stack,&pointer);match=true;break;default:cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}break;case '(':switch(str[index]){case '(':cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);cout<<"\tMatch ( ! ";//Popup ( and next char in."<<endl;popstack(stack,&pointer);match=true;break;default:cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}break;case ')':switch(str[index]){case ')':cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);cout<<"\tMatch ) ! ";//Popup ) and next char in."<<endl;popstack(stack,&pointer);match=true;break;第10页共13页default:cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}break;case '^':switch(str[index]){case '^':cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);cout<<"\tMatch ^ ! ";//Popup ^ and next char in."<<endl;popstack(stack,&pointer);match=true;break;default:cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}break;case 'i':switch(str[index]){case 'i':cout<<"\n";show(stack,-1);cout<<"\t"<<str[index]<<"\t";show(str,index);cout<<"\tMatch i ! ";//Popup i and next char in."<<endl;popstack(stack,&pointer);match=true;break;default:cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}break;case '#':switch(str[index]){case '#':cout<<"\n";show(stack,-1);第11页共13页cout<<"\t"<<str[index]<<"\t";show(str,index);cout<<"\tMatch # ! 分析成功~";//Popup # and next char in."<<endl;return 0;default:cout<<"Error! This character string is not this grammer`s sentence."<<endl;return 0;}break;}if(match){index++;match=false;}}return 0;}实验代码测试结果:下面图片是以给定文法画出的一个语法树。
光电技术课程设计报告1

课程设计报告姓名:吕宗鹏学号:20133649姓名:米冠霖学号:20133651姓名:施展学号:20133652专业与班级:13级应用物理一班指导教师:赵洪英课程设计名称:光电技术课程设计课程设计单位:理学院一、课程设计目的1、加强对555芯片的了解,巩固和加深课堂教学内容;2、提高动手能力和工作技能,培养科学工作作风;3、为学习后续课程和从事实践技术工作奠定坚实基础。
二、课程设计时间本课程设计采用课下独立设计和课上集中实践相结合的方式,课上实践包括电子元器件的识别和电路图的设计等,课下设计包括原理的分析和设计报告的整理等。
三、课程设计内容一、555芯片 1.555芯片简介555定时器由Hans R. Camenzind 于1971年为西格尼蒂克公司设计。
西格尼蒂克公司后来被飞利浦公司所并购。
不同的制造商生产的555芯片有不同的结构,标准的555芯片集成有25个晶体管,2个二极管和15个电阻并通过8个引脚引出(DIP-8封装)。
[2]555的派生型号包括556(集成了两个555的DIP-14芯片)和558与559。
NE555的工作温度范围为0-70°C ,军用级的SE555的工作温度范围为−55到+125 °C 。
555的封装分为高可靠性的金属封装(用T 表示)和低成本的环氧树脂封装(用V 表示),所以555的完整标号为NE555V 、NE555T 、SE555V 和SE555T 。
一般认为555芯片名字的来源是其中的三枚5K Ω电阻[3],但Hans Camenzind 否认这一说法并声称他是随意取的这三个数字。
555还有低功耗的版本,包括7555和使用CMOS 电路的TLC555。
[4]7555的功耗比标准的555低,而且其生产商宣称7555的控制引脚并不像其他555芯片那样需要接地电容,同时供电与地之间也不需要消除毛刺的去耦电容。
2.芯片原理555定时器的电路如图所示。
天津理工大学数电课程设计电子钟设计

《电子技术》课程设计报告《数字钟的设计》专业:班级:学号:姓名:指导教师:完成日期:2011 年12 月23 日设计任务书一、设计题目:“数字钟的设计”二、技术要求1. 设计一台能直接显示“时”、“分”、“秒”的数字钟,要求24小时为一计时周期。
2. 当电路发生走时误差时,要求电路具有校时功能。
三、给定条件及元器件1.要求电路主要采用中规模集成电路CMOS或TTL2. 电源电压为+5V。
3.要求设计在数字电路实验箱上完成。
(一):数字钟的组成和基本原理:数字钟设计周期为24小时,显示满刻度为23时59分59秒,另外应有校时和报时功能。
因此一个基本的数字时钟电路主要由五个部分组成。
其整机框图如下图:整机框图(1):晶体振荡器晶体振荡器的作用是产生时间标准信号。
数字钟的精度,主要取决于时间标准信号的频率及其稳定度。
一般为保证其稳定性,一般采用石英晶体振荡器经过分频得到这一信号。
选取晶振频率为32768Hz,采用十四级二进制计数器CD4060分频后,得到2Hz的信号,再由74LS74分频获得1Hz的秒信号。
CD4060简介:CD4060是十四进制串行计数器,即十四分频器,管脚图如下,它内部有十四级二分频器,即Q4—Q10,Q12—Q14,其它四脚没有引出,所以只能得到十种分频系数,最小为16,最大为256。
秒信号获取电路图如下:图1.秒信号获取电路(2):计数器数字钟的秒,分信号产生电路都是由六十进制计数器构成,时信号产生电路由二十四进制计数器构成。
它们可由74LS160实现。
采用整体复位法构成,电路图如下:图2.二十四进制计数器图3.六十进制计数器(3):译码显示电路当数字钟的计数器在CP脉冲的作用下,按60秒为一分,60分为一小时,24小时为一天的计数规律计数时,就应将其状态显示成数字信号,这就需要将计数器的状态进行译码并将其显示出来。
译码显示电路选用74LS248。
LTS547R LED简介:如下图LTS547R LED共阴数码管其内部实际上是一个八段发光二极管阴极连在一起的电路,当在a,b,c……g,dp加上正向电压时,二极管就亮。
天理密码学实验1

}
for(k=1;k<27;k++){
for(m=1;m<27;m++){
printf("%c ",square[k][m]);
}
printf("\n");
}
/**/
printf("VigenereCipher \nPleaseinput plain text:");
scanf("%s",word);
intkey_length=strlen(key);
intword_length=strlen(en_word);
inti,j,c,k,d;
for(i=0;i<word_length;i++){
if(en_word[i]>=65&&en_word[i]<=90){
c=i%key_length;
k=key[c]-96;
d=en_word[i]-square[k][1];
if(d>=0){
word[i]='a'+d;
}else{
word[i]='z'+d+1;
}
}else{
word[i]=en_word[i];
}
}
word[i]='\0';
return word;
}
实验中遇到的问题及解决方法:
【实验思路】
打出vigeneretable->输入关键字->用户输入明文->进行加密>得到密文;
【实验步骤】
1.建立win32 console application工作空间。
天津理工大学C语言-实验2

printf("sizeof(float)=%d\n", sizeof(float));
printf("sizeof(double)=%d\n", sizeof(double));
printf("sizeof(long double)=%d\n", sizeof(long double));
printf("sizeof(long)=%d\n", sizeof(l));
printf("sizeof(float)=%d\n", sizeof(f));
printf("sizeof(double)=%d\n", sizeof(d));
printf("sizeof(long double)=%d\n", sizeof(ld));
printf("%f\n", d);
printf("%lf\n", ld);
printf("\n");
printf("sizeof(char)=%d\n", sizeof(c));
printf("sizeof(short)=%d\n", sizeof(s));
printf("sizeof(int)=%d\n", sizeof(i));
}
运行结果:
return 0;
}
运行结果:
(
2、定义两个整型变量x和y,并从键盘接受输入,然后计算这两个数的和、差、积与商,并在屏幕上显示输出其计算结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MOV DX,MY8255_A
OUT DX,AL
CALL DALLY2
MOV AH,1 ;判断是否有按键按下
INT 16H
JMP LOOP1 ;无按键则跳回继续循环,有则退出
QUIT: MOV AX,4C00H ;结束程序退出
INT 21H
CLI
MOV AX,0000H ;恢复INTR原中断矢量
MOV AL,IM_BAK
OUT DX,AL
STI
MOV AX,4C00H ;返回到DOS
INT 21H
DALLY1 PROC NEAR ;软件延时子程序
PUSH CX
PUSH AX
MOV CX,0FFFFH
D1: MOV AX,100H
D2: DEC AX
JNZ D2
LOOP D1
POP AX
POP CX
MOV CX,019FH
A2: MOV AL,[BX]
ROL AL,1
MOV LB,AL
OUT DX,AL
CALL DALLY1
INC BX
LOOP A2
MOV AH,1 ;判断是否有按键按下
INT 16H
JZ LOOP4 ;无按键则跳回继续循环,有则退出
LOOP4:
MOV AL,LA
MOV AL,00000011B ;YELLOW
MOV AX,OFFSET MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口偏移地址
ADD DI,2
MOV AX,ES:[DI]
MOV CS_BAK,AX ;保存INTR原中断处理程序入口段地址
MOV AX,SEG MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口段地址
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,IP_BAK ;恢复INTR原中断处理程序入口偏移地址
MOV ES:[DI],AX
ADD DI,2
MOV AX,CS_BAK ;恢复INTR原中断处理程序入口段地址
MOV ES:[DI],AX
MOV DX,INTR_OCW1 ;恢复INTR原中断屏蔽寄存器的屏蔽字
OUT DX,AL
CALL DALLY3
MOV AH,1 ;判断是否有按键按下
INT 16H
JZ LOOP2 ;无按键则跳回继续循环,有则退出
LOOP2: MOV AL,LA
MOV AL,00000011B ;YELLOW
MOV LA,AL
MOV DX,MY8255_A
OUT DX,AL
CALL DALLY2
实验使用模块:8255实验模块,直流电机,LED灯,8259单次脉冲模块。
实验现象:交通灯依次闪烁,当绿灯时直流电机转动,单次脉冲单元可以给任意灯增加延时。
实验电路连接图:
实验代码:
INTR_IVADD EQU 01C8H ;INTR对应的中断矢量地址
INTR_OCW1 EQU 0A1H ;INTR对应PC机内部8259的OCW1地址
RET
DALLY1 ENDP
DALLY2 PROC NEAR ;软件延时子程序
PUSH CX
PUSH AX
MOV CX,5FFFH
D3: MOV AX,0FFFFH
D4: DEC AX
JNZ D4
LOOP D3
POP AX
POP CX
RET
DALLY2 ENDP
DALLY3 PROC NEAR ;软件延时子程序
MY8255_C EQU IOY0+02H*2 ;8255的C口地址
MY8255_MODE EQU IOY0+03H*2 ;8255的控制寄存器地址
STACK1 SEGMENTቤተ መጻሕፍቲ ባይዱSTACK
DW 256 DUP(?)
STACK1 ENDS
DATA SEGMENT
TTABLE DB 01H,03H,02H,06H,04H,0CH,08H,09H
MOV AH,1 ;判断是否有按键按下
INT 16H
JZ LOOP3 ;无按键则跳回继续循环,有则退出
LOOP3: MOV AL,LA
MOV AL,00001100B ;GREEN
MOV LA,AL
MOV DX,MY8255_A
OUT DX,AL
A1: MOV DX,MY8255_B
MOV BX,OFFSET TTABLE
INTR_OCW2 EQU 0A0H ;INTR对应PC机内部8259的OCW2地址
INTR_IM EQU 0FBH ;INTR对应的中断屏蔽字
IOY0 EQU 3000H ;片选IOY0对应的端口始地址
MY8255_A EQU IOY0+00H*2 ;8255的A口地址
MY8255_B EQU IOY0+01H*2 ;8255的B口地址
START: MOV AX,DATA
MOV DS,AX
MOV DX,MY8255_MODE ;定义8255工作方式
MOV AL,80H ;工作方式0,A口和B口为输出
OUT DX,AL
MOV DX,MY8255_B ;写B口发出的起始数据
MOV AL,01H
OUT DX,AL
MOV LB,AL
MOV DX,MY8255_A ;写A口发出的起始数据
OVER: MOV DX,INTR_OCW2 ;向PC机内部8259发送中断结束命令
MOV AL,20H
OUT DX,AL
MOV AL,20H
OUT 20H,AL
POP AX
IRET
MYISR ENDP
CODE ENDS
END START
实验效果图:
PUSH CX
PUSH AX
MOV CX,0FFFFH
D5: MOV AX,0FFFFH
D6: DEC AX
JNZ D6
LOOP D5
POP AX
POP CX
RET
DALLY3 ENDP
MYISR PROC NEAR ;中断处理程序MYISR
PUSH AX
JZ WAIT1
WAIT1: CALL DALLY2:如果有按键则调用设定好的延迟
MOV DX,INTR_OCW1 ;设置中断屏蔽寄存器,打开INTR的屏蔽位
IN AL,DX
MOV IM_BAK,AL ;保存INTR原中断屏蔽字
AND AL,INTR_IM
OUT DX,AL
LOOP1: MOV AL,LA
MOV AL,00110000B ;RED
MOV LA,AL
MOV DX,MY8255_A
LB DB ?
LA DB ? ;定义数据变量
CS_BAK DW ? ;保存INTR原中断处理程序入口段地址的变量
IP_BAK DW ? ;保存INTR原中断处理程序入口偏移地址的变量
IM_BAK DB ? ;保存INTR原中断屏蔽字的变量
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
实验报告
学院(系)名称:计算机与通信工程学院
姓名
马春雷
学号
20115508
专业
计算机科学与技术
班级
2011级2班
实验名称
可延时交通灯
课程名称
嵌入式课程设计
课程代码
实验时间
2014年9月22号—26号
实验地点
软件实验室1-109
批改意见
成绩
教师签字:
实验目的:模拟公路上交通灯现象,并增加行人控制灯时能力。
MOV AL,11000000B
OUT DX,AL
MOV LA,AL
CALL DALLY2
CALL DALLY2
MAIN:MOV AX,0000H ;替换INTR的中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,ES:[DI]
MOV IP_BAK,AX ;保存INTR原中断处理程序入口偏移地址