算法实验报告
快速排序
1. 问题描述:
实现对数组的普通快速排序与随机快速排序
(1)实现上述两个算法
(2)统计算法的运行时间
(3)分析性能差异,作出总结
2. 算法原理:
2.1快速排序
快速排序是对冒泡排序的一种改进。它的基本思想是:选取一个基准元素,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比基准元素小,另外一部分的所有数据都要比基准元素大,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
设要排序的数组是A[0]……A[N-1],首先选取一个数据(普通快速排序选择的是最后一个元素, 随机快速排序是随机选择一个元素)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]赋给A[i];
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]赋给A[j];
5)重复第3、4步,直到i=j;(3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i,j指针位置不变。另外,i==j这
一过程一定正好是i+或j-完成的时候,此时令循环结束)。
2.2随机快速排序
快速排序的最坏情况基于每次划分对主元的选择。基本的快速排序选取第一个或者最后一个元素作为主元。这样在数组已经有序的情况下,每次划分将得到最坏的结果。一种比较常见的优化方法是随机化算法,即随机选取一个元素作为主元。这种情况下虽然最坏情况仍然是O(n^2),但最坏情况不再依赖于输入数据,而是由于随机函数取值不佳。实际上,随机化快速排序得到理论最坏情况的可能性仅为1/(2^n)。所以随机化快速排序可以对于绝大多数输入数据达到O(nlogn)的期望时间复杂度。
3. 实验数据
本实验采用对80,000个随机数据进行十次排序,并取出平均值。分别用普通快速排序和随机快速排序对数据排序。用毫秒作为运行计数单位,观测两种算法所用的时间的不同。
4. 实验截图
如下图所示的时间,普通快速排序所用的平均时间为181毫秒,而随机化版本的快速排序所用时间仅仅为119毫秒。
5. 结果分析
5.1 时间分析
从实验截图得到的结果来看,随机化版本的快速排序所用时间比普通快速排序所用的平均时间少。
快速排序的平均时间复杂度为O(nlogn),最坏时间时间可达到O(n^2),最坏情况是当要排序的数列基本有序的时候。根据快速排序的工作原理我们知道,
选取第一个或者最后一个元素作为主元,快速排序依次将数列分成两个数列,然后递归将分开的数列进行排序。当把数列平均分成两个等长的数列时,效率是最高的,如果相差太大,效率就会降低。
我们通过使用随机化的快速排序随机的从数列中选取一个元素与第一个,或者最后一个元素交换,这样就会使得数列有序的概率降低。
随机化快速排序的平均时间复杂度为O(nlogn),最坏时间时间也会达到O(n^2),这种机率已经降得很小。
5.2 空间分析
普通快速排序与随机快速排序在对序列的操作过程中都只需花费常数级的空间。空间复杂度S(1)。但需要注意递归栈上需要花费最少logn 最多n的空间
6源码
快速排序源码C++实现
#include
#include
using namespace std;
void QuickSort(int arr[],int lo,int hi)
{
//这里的lo和hi是数组的下标;
if(lo>=hi) {return;}
int fi = lo;//0开始
int la = hi;//最大下标开始
int key = arr[fi];
while(fi < la)
{
while(fi
--la;
arr[fi] = arr[la];
while(fi ++fi; arr[la] = arr[fi]; } arr[fi] = key; QuickSort(arr,lo,fi-1); QuickSort(arr,fi+1,hi); } int main() { int arr[100000],n; cout<<"请输入要排序的个数(您不能够超过100000个数字):"< cin>>n; for(int i = 0;i { arr[i]=rand(); } FILETIME beg,end; GetSystemTimeAsFileTime(&beg); QuickSort(arr,0,n-1); GetSystemTimeAsFileTime(&end); for(int i= 0;i cout< cout< cout<<"当输入"< "<<100*(end.dwLowDateTime-beg.dwLowDateTime)<<"us"< return 0; } 随机快速排序源码C++实现 #include #include #include using namespace std; void RadomQuickSort(int arr[], int lo, int hi) { if(lo>=hi) return; int ram=(int)(rand()%(hi-lo+1))+lo; int key=arr[ram]; arr[ram]=arr[hi]; arr[hi]=key; int x = arr[hi]; int i = lo - 1; for (int j = lo; j < hi; j++) { if (x >= arr[j]) { i++; int t=arr[i]; arr[i]= arr[j]; arr[j]= t; } } int t=arr[i+1]; arr[i+1]= x; arr[hi]=t; RadomQuickSort(arr, lo, i); RadomQuickSort(arr, i+2, hi); } int main() { int arr[100000],n; cout<<"请输入要排序的个数(您不能够超过100000个数字):"< cin>>n; for(int i=0; i { arr[i]=rand(); } FILETIME beg,end; GetSystemTimeAsFileTime(&beg); RadomQuickSort(arr,0,n-1); GetSystemTimeAsFileTime(&end); for(int i=0;i cout< cout< cout<<"当输入"< "<<100*(end.dwLowDateTime-beg.dwLowDateTime)<<"us"< return 0; } 背包问题 1. 问题描述: 0-1背包问题,部分背包问题 1)实现0-1背包的动态规划算法求解 给定N中物品和一个背包。物品i的重量是W i ,其价值位V i ,背包的容量为 C。问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大。在选择物品的时候,对每种物品i只有两种选择,即装入背包或不装入背包。不能讲物品i装入多次,也不能只装入物品的一部分。因此,该问题被称为0-1背包问题。 2)实现部分背包的贪心算法求解 每一个物品都可以分割成单位块,单位块的利益越大显然总收益越大,所以它局部最优满足全局最优,可以用贪心法解答 2. 算法原理: 2.1 0-1背包问题 令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为就j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数: (1) V(i,0)=V(0,j)=0 (2) V(i,j)=V(i-1,j) j i V(i,j)=max{V(i-1,j) ,V(i-1,j-w i )+v i ) } j>w i (1)式表明:如果第i个物品的重量大于背包的容量,则装人前i个物品得到的最大价值和装入前i-1个物品得到的最大价是相同的,即物品i不能装入背包。 (2)个式子表明:如果第i个物品的重量小于背包的容量,则会有一下两种情况:(a)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入 容量位j-w i 的背包中的价值加上第i个物品的价值v i; (b)如果第i个物品没有 装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。 2.2 部分背包问题 因为每一个物品都可以分割成单位块,单位块的利益越大显然总收益越大,所以它局部最优满足全局最优,可以用贪心法解答。 (1)先将单位块收益按从大到小进行排序; (2)初始化背包的剩余体积和当前价值; (3)从前到后考虑所有物品:a.如果可以完全放入,当前价值加上物品总价值,剩余体积减去物品总体积;b.如果可以部分放进,当前价值加上物品价值*剩余体积,使剩余体积为0. 3. 实验数据 对于部分背包问题与0-1背包问题我们给定相同的物品情况与包的容量。 给定物品:[weight: 10 value: 60][weight: 20 value: 100][weight: 30 value: 120] 给定包的容量: 50 4. 实验截图 4.1 0-1背包问题 4.2 部分背包问题 5. 结果分析 5.1 正确性分析 (1) 0-1背包问题 因为物品不能拆分,所以对于只有50kg容量的背包可以放的物品,列出所有的情况为: [weight: 10 value: 60] [weight: 20 value: 100] 总价值为160 [weight: 10 value: 60] [weight: 30 value: 120] 总价值为180 [weight: 20 value: 100][weight: 30 value: 120] 总价值为220 所有结果中,选取[weight: 20 value: 100][weight: 30 value: 120]时的总价值最大,为220.与我们用动态规划做出来的数据是一致的。所以我们的算法正确。 (2) 部分背包问题 物品可以拆分,所以首先选取单位价格最大的物品放入包中,在给出的物品中可知: [weight: 10 value: 60] 平均价值60 [weight: 20 value: 100] 平均价值50 [weight: 30 value: 120] 平均价值40 所以先放平均价值高的物品,将[weight: 10 value: 60],[weight: 20 value: 100]装进去以后,还能装20kg的[weight: 30 value: 120]。所以总的价值为240.与我们用贪心算法做出来的结果是一样的。 5.2 时间复杂度 5.2.1动态规划法求解0-1背包的问题 主要的方法solve()。如下图所示包含两重循环,totalWeight是指背包的总重量,n表示拥有物品的个数。 所以对于动态规划法求解0-1背包的问题的时间复杂度为O(Cn)与背包的容量和物品的个数有关,所以如果背包的重量很大的时候,用的时间会很大。 5.2.2贪心算法求解部分背包问题 在贪心算法中,需要时间最多的就是对平均价值量进行排序,用快速排序的方法时间复杂度为O(nlgn). 所以在时间上他比动态规划的时间要短。速度会更快一点。 6实验代码: #include using namespace std; #define N 7 //物品的个数为N-1,6 #define C 16 //背包的容量为C-1,15 int max(int number1,int number2); //声明所需函数int KSA(int w[],int v[]); //声明0/1背包问题算法void main() { int v[N]={0,6,4,3,2,8}; int w[N]={0,2,3,6,2,4}; cout<<"背包容量为:"< cout<<"物品的价值分别是:"; for(int j=0;j<=5;j++) { cout<<" "< } cout< cout<<"物品的重量分别是:"; for(int i=0;i<=5;i++) { cout<<" "< } cout< cout<<"最大价值为:"; cout< system("pause"); } int max(int number1,int number2) //所需函数max { if(number1>number2) return number1; else return number2; } int KSA(int w[],int v[]) //0/1背包问题算法 { int V[N][C]; int x[N]; int i; int j; for (i=0;i<=N-1;i++) //初始化第0列 { V[i][0]=0; } for (j=0;j<=C-1;j++) //初始化第0行 { V[0][j]=0; } for(i=1;i<=N-1;i++) //计算第i行,进行第i次迭代 { for(j=1;j<=C-1;j++) { if(j V[i][j]=V[i-1][j]; else V[i][j]=max(V[i-1][j],V[i-1][j-w[i]]+v[i]); } } int k=C-1; //求装入背包的物品 for(i=N-1;i>0;i--) { if(V[i][k]>V[i-1][k]) { x[i]=1; k=k-w[i]; } else x[i]=0; } return V[N-1][C-1]; //返回背包取得的最大值 } 一个任务调度问题 1. 问题描述: 在单处理器上具有期限和惩罚的单位时间任务调度问题 (1)实现这个问题的贪心算法 (2)将每个Wi替换为max{W1,W2,W3,…,Wn}-Wi,运行算法比较结果. 2. 算法原理: 考虑一个给定的调度. 我们说一个任务调度迟了, 也就是说它在规定的时间之后完成; 否则, 这个任务在该调度中是早的. 一个任意的调度总可以安排成早任务优先的形式, 其中早的任务总是在迟的任务之前。为了搞清这一点, 请 注意如果某个早任务 a(i)跟在某个迟任务 a(j)之后,就可以交换 a(i)和 a(j)的位置,并不影响 a(i)是早的 a(j)是迟的状态。 类似的,任意一个调度可以安排成一个规范形式 , 其中早的任务先于迟的任务 , 且按期限单调递增顺序对早任务进行调度。为了做到这一点, 将调度安排成早任务优先形式。然而, 只要在该调度中有两个分别完成于时间 k 和 k+1 的早任务 a(i)和 a(j) 使得 d(j) 如此, 寻找最优调度问题就成为找一个由最优调度中早的任务构成的集合A 的问题. 一旦 A 被确定后, 就可按期限的单调递增顺序列出 A 中的所有元素,从而给出实际的调度, 然后按任意顺序列出迟的任务(S-A), 就可以产生出最优调度的一个规范次序. 称一个任务的集合 A 是独立的, 如果存在关于 A 中任务的一个调度, 使得没有一个任务是迟的. 显然, 某一调度中早任务的集合就构成一个独立的任务集 3. 实验数据 输入:没有输入,有一个结构体task,系统会随机生成task的期限和惩罚输出:分别输出随机生成task的集合后的早任务集合,迟任务惩罚以及将每个Wi替换为max{W1,W2,W3,…,Wn}-Wi后的早任务集合,迟任务惩罚. 输入任务包含截止日期、惩罚如下表所示: 表3-1 将每个Wi替换为max{W1,W2,W3,…,Wn}-Wi,数据变成了如下表格所示的数据: 表3-2 4. 实验截图 运行结果如下图所示。 对于表3-1输入的数据,总惩罚为50,受惩罚的任务为编号为5,6的任务。对于表3-2的任务数据,总的惩罚为10,受惩罚的任务为编号为1,2的任务 5. 结果分析 可以看出将每个wi替换为max{W1,W2,W3,…,Wn}-Wi后的早任务集合基本上包括了没有替换时的早任务集合,并且替换后的迟任务惩罚大于没有替换时的迟任务惩罚。 6源代码 C#语言实现的 Task.cs public class Task:IComparable { public int int_num { get; set; } public int int_deadline { get; set; } public int int_punish { get; set; } public Task() { } public Task(int num,int deadline,int punish) { int_num = num; int_deadline = deadline; int_punish = punish; } public int CompareTo(object obj) { if (obj is Task) { Task tempStudent = obj as Task; return this.int_https://www.sodocs.net/doc/4613592049.html,pareTo(tempStudent.int_deadline); } throw new NotImplementedException("obj is not a Task!"); } } Program.cs中主要代码 public static void Main(string[] args) { Task a1 = new Task(1, 4, 70); Task a2 = new Task(2, 2, 60); Task a3 = new Task(3, 4, 50); Task a4 = new Task(4, 3, 40); Task a5 = new Task(5, 1, 30); Task a6 = new Task(6, 4, 20); Task a7 = new Task(7, 6, 10); Task[] tasks = new Task[7] { a1, a2, a3, a4, a5, a6, a7 }; TaskSchedule(tasks); Console.WriteLine(""); Console.WriteLine(""); Console.WriteLine("替换后:"); Task[] tasksnew = new Task[7] { a1, a2, a3, a4, a5, a6, a7 }; int max = tasksnew[0].int_punish; for (int i = 1; i < tasksnew.Length; i++) { if (tasksnew[i].int_punish > max) { max = tasksnew[i].int_punish; } } for (int i = 0; i < tasksnew.Length; i++) { tasksnew[i].int_punish = max - tasksnew[i].int_punish; } IEnumerable query = from items in tasksnew orderby items.int_punish descending select items; Task[] tasklist = new Task[7] { null,null,null,null,null,null,null}; int index = 0; foreach (var item in query) { tasklist[index] = item as Task; index++; } TaskSchedule(tasklist); Console.ReadKey(); } private static void TaskSchedule(Task[] tasks) { List List for (int i = 0; i < 7; i++) { lists.Add(tasks[i]); listscopy.Add(tasks[i]); //加进去之后对di进行排序 listscopy.Sort(); //判断di与是第几个元素的大小 for (int j = 0; j < listscopy.Count; j++) { if (listscopy[j].int_deadline < j + 1) { lists.RemoveAt(lists.Count - 1); listscopy.RemoveAt(j); break; } } } Console.WriteLine("最终的最优调度为a:"); lists.Sort(); foreach (var item in lists) { Console.Write("a" + item.int_num + "\t"); } Console.WriteLine(""); foreach (var item in lists) { Console.Write(item.int_deadline + "\t"); } Console.WriteLine(""); foreach (var item in lists) { Console.Write(item.int_punish + "\t"); } List Console.WriteLine("被惩罚的任务为a:"); foreach (var item in list) { Console.Write("a" + item.int_num + "\t"); } Console.WriteLine(""); foreach (var item in list) { Console.Write(item.int_deadline + "\t"); } Console.WriteLine(""); Console.WriteLine("总的惩罚数为a:"); foreach (var item in list) { Console.Write("+"); Console.Write(item.int_punish + "\t"); } Console.Write("= "); int punishcount = 0; foreach (var item in list) { //Console.Write(item.int_punish + " "); punishcount += item.int_punish; } Console.Write(punishcount); } 常见平衡树的实现与比较 1. 问题描述: 实现3种树中的两种:红黑树,AVL树 (1)实现基本操作(初始化、插入、删除) (2)比较算法之间的时间、空间性能 因为我实现的是红黑树和高度平衡二叉查找树,故只对他们进行讨论 2. 算法原理: 2.1 红黑树 红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求: 性质1. 节点是红色或黑色。 性质2. 根节点是黑色。 性质3 每个叶节点(NIL节点,空节点)是黑色的。 性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) 性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。 这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、 删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。2.2 A VL树 节点的平衡因子是它的左子树的高度减去它的右子树的高度。带有平衡因子1、0 或 -1 的节点被认为是平衡的。当对树进行插入删除操作的时候,与树的高的有关系,当满足平衡二叉树性质时,树的高度就与节点成lg关系。使得插入删除操作不会出现O(n)的情况 AVL树的基本操作一般涉及运做同在不平衡的二叉查找树所运做的同样的算法。但是要进行预先或随后做一次或多次所谓的"AVL 旋转"。 向AVL树插入可以通过如同它是未平衡的二叉查找树一样把给定的值插入树中,接着自底向上向根节点折回,于在插入期间成为不平衡的所有节点上进行旋转来完成 从AVL树中删除可以通过把要删除的节点向下旋转成一个叶子节点,接着直接剪除这个叶子节点来完成。 3. 实验数据 对红黑树初始化并插入操作,插入节点41,38,31,12,19,8.然后输出红黑树并且输出颜色,用于判断正确性。再删除19节点,输出并判断正确性。 分别对红黑树与ALV树进行插入操作。随机插入1,000,000个数据,测试使用的时间分别是多少。和删除500,000个数字,测试所用时间 4. 实验截图 5. 结果分析 5.1 时间复杂度分析 红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保 (1) 红黑树 插入操作public void Add(int value) //添加一个元素 时间与深度有关,所以时间复杂度为O(lgn)。 插入调整操作private void BinaryNode LL(BinaryNode root)//LL型旋转,LR(BinaryNode root)//LR型旋转、RR(BinaryNode root)//RR型旋转、RL(BinaryNode root)//RL型旋转 旋转操作最多两次,旋转操作为常数时间,while循环次数为O(lgn)时间。 所以综上时间为O(lgn)时间内完成。 对于删除操作public Node RemoveNode(BinaryNode node) 时间与深度有关,所以时间复杂度为O(lgn) 删除调整操作private void rb_Delete_Fixup(Node node) 旋转操作最多三次,旋转操作为常数时间,while循环次数为O(lgn)时间。 (2) AVL树 向AVL树插入可以通过如同它是未平衡的二叉查找树一样把给定的值插入树中,接着自底向上向根节点折回,于在插入期间成为不平衡的所有节点上进行旋转来完成。因为折回到根节点的路途上最多有 1.5 乘 log n 个节点,而每次AVL 旋转都耗费恒定的时间,插入处理在整体上耗费 O(log n) 时间。 从AVL树中删除可以通过把要删除的节点向下旋转成一个叶子节点,接着直接剪除这个叶子节点来完成。因为在旋转成叶子节点期间最多有 log n个节点被旋转,而每次 AVL 旋转耗费恒定的时间,删除处理在整体上耗费 O(log n) 时间。 (3) 红黑树与AVL树比较 从实验截图的结果来看,分别向两个树中随机插入1,000,000个数据,红黑树所用时间为265毫秒,而ALV树需要718毫秒的时间,所以,红黑树的效率要比AVL树要高一点,但是操作复杂。 6源代码 高度平衡二叉查找树源代码C#实现 BinaryNode.cs public class BinaryNode { private int _data; //数据 private BinaryNode _left; //左孩子 private BinaryNode _right; //右孩子 private int _BF; //平衡因子 //构造方法 public BinaryNode(int value) { _data = value; } //属性 public int Data //数据 { get { return _data; } set { _data = value; } } public BinaryNode Left //左孩子 { get { return _left; } set { _left = value; } } public BinaryNode Right //右孩子 { get { return _right; } set { _right = value; } } public int BF { get { return _BF; } set { _BF = value; } } public override string ToString() { return _data.ToString(); } } BinarySearchTree.cs public class BinarySearchTree { public BinaryNode _head; //头指针 public BinaryNode[] path = new BinaryNode[32]; //记录访问路径上的结点 public int p; //表示当前访问到的结点在path上的索引 public bool Add(int value) //添加一个元素 { //如果是空树,则新结点成为二叉排序树的根 if (_head == null) { _head = new BinaryNode(value); _head.BF = 0; return true; } p = 0; //prev为a上一次访问的结点,current为当前访问结点 BinaryNode prev = null, current = _head; while (current != null) { path[p++] = current; //将路径上的结点插入数组 //如果插入值已存在,则插入失败 if (current.Data == value) { return false; } prev = current; 实验、 Linux Ubuntu的安装、创建新的虚拟机VMWare 实验 Shell编程 1.实验目的与内容 通过本实验,了解Linux系统的shell机制,掌握简单的shell编程技巧。 编制简单的Shell程序,该程序在用户登录时自动执行,显示某些提示信息,如“Welcome to Linux”, 并在命令提示符中包含当前时间、当前目录和当前用户名等基本信息。 2.程序源代码清单 #include<> #include close(pfd[1]); close(pfd[0]); wait(&state); wait(&state); } 实验内核模块 实验步骤: (1).编写内核模块 文件中主要包含init_clock(),exit_clock(),read_clock()三个函数。其中init_clock(),exit_clock()负责将模块从系统中加载或卸载,以及增加或删除模块在/proc中的入口。read_clock()负责产生/proc/clock被读时的动作。 (2).编译内核模块Makefile文件 # Makefile under ifneq ($(KERNELRELEASE),) #kbuild syntax. dependency relationshsip of files and target modules are listed here. obj-m := else PWD := $(shell pwd) KVER ?= $(shell uname -r) KDIR := /lib/modules/$(KVER)/build all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: rm -rf .*.cmd *.o *. *.ko .tmp_versions *.symvers *.order endif 编译完成之后生成模块文件。 (3).内核模块源代码 #include 实验一进程管理 一、目的 进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。 二、实验内容及要求 1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删)。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 2、系统资源(r1…r w),共有w类,每类数目为r1…r w。随机产生n进程P i(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。 3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。建立进程就绪队列。 4、编制进程调度算法:时间片轮转调度算法 本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。 三、实验环境 操作系统环境:Windows系统。 编程语言:C#。 四、实验思路和设计 1、程序流程图 2、主要程序代码 //PCB结构体 struct pcb { public int id; //进程ID public int ra; //所需资源A的数量 public int rb; //所需资源B的数量 public int rc; //所需资源C的数量 public int ntime; //所需的时间片个数 public int rtime; //已经运行的时间片个数 public char state; //进程状态,W(等待)、R(运行)、B(阻塞) //public int next; } ArrayList hready = new ArrayList(); ArrayList hblock = new ArrayList(); Random random = new Random(); //ArrayList p = new ArrayList(); int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒) //对进程进行初始化,建立就绪数组、阻塞数组。 public void input()//对进程进行初始化,建立就绪队列、阻塞队列 { m = int.Parse(textBox4.Text); n = int.Parse(textBox5.Text); a = int.Parse(textBox6.Text); b = int.Parse(textBox7.Text); c = int.Parse(textBox8.Text); a1 = a; b1 = b; c1 = c; r = m - n; time1Inteval = int.Parse(textBox9.Text); timer1.Interval = time1Inteval; for (i = 1; i <= n; i++) { pcb jincheng = new pcb(); jincheng.id = i; jincheng.ra = (random.Next(a) + 1); jincheng.rb = (random.Next(b) + 1); jincheng.rc = (random.Next(c) + 1); jincheng.ntime = (random.Next(1, 5)); jincheng.rtime = 0; 信号与系统实验报告 一、实验目的 1. 熟悉连续时间系统的单位冲激响应、阶跃响应的意义及求解方法 2. 熟悉连续(离散)时间系统在任意信号激励下响应的求解方法 3. 熟悉应用MATLAB实现求解系统响应的方法 二、实验原理 1.连续时间系统求解各种响应 impulse( ) 函数 函数impulse( )将绘制出由向量a和b所表示的连续系统在指定时间范围内的单位冲激响应h(t)的时域波形图,并能求出指定时间范围内冲激响应的数值解。 以默认方式绘出由向量a和b所定义的连续系统的冲激响应的时域波形。 绘出由向量a和b所定义的连续系统在0 ~ t0时间范围内冲激响应的时域波形。 绘出由向量a和b所定义的连续系统在t1 ~ t2时间范围内,并且以时间间隔p均匀取样的冲激响应的时域波形。 只求出由向量a和b所定义的连续系统在t1 ~ t2时间范围内,并且以时间间隔p均匀取样的冲激响应的数值解,但不绘出其相应波形。 step( ) 函数 函数step( )将绘制出由向量a和b所表示的连续系统的阶跃响应,在指定的时间范围内的波形图,并且求出数值解。和impulse( )函数一样,step( )也有如下四种调用格式: step( b,a) step(b,a,t0) step(b,a,t1:p:t2) y=step(b,a,t1:p:t2) 上述调用格式的功能和impulse( )函数完全相同,所不同只是所绘制(求解)的是系统的阶跃响应g(t),而不是冲激响应h(t)。 lsim( )函数 根据系统有无初始状态,lsim( )函数有如下两种调用格式: ①系统无初态时,调用lsim( )函数可求出系统的零状态响应,其格式如下: 《面向对象编程技术》试卷 注:1)请将答案写在答题纸上,写在试卷上不算分。答题纸在试卷的最后页。 2)交卷时,试卷和答题纸一起交。 一、单选题 (每小题1.5分,共30分) 1. C++中,以下有关构造函数的叙述不正确的是 ______ 。 A. 构造函数名必须和类名一致 B. 构造函数在定义对象时自动执行 C. 构造函数无任何函数类型 D. 在一个类中构造函数有且仅有一个 2.以下叙述不正确的是 ______ 。 A. 在类的定义中,通常是成员变量描述对象的属性;用成员函数描述对象的行为 B. 类的一个成员只能具有一种访问控制属性 C. 构造函数和析构函数是特殊的成员函数,因此不允许重载 D. 通过对象只能访问类的公有成员 3. 以下关于虚函数的叙述不正确的是 ______ 。 A. 虚函数属于成员函数 B. 虚函数不允许说明成静态的 C. 凡是虚函数必须用virtual说明 D. 虚函数可以被继承 4. cout是I0流库预定义的______ 。 A.类 B. 对象 C. 包含文件 D. 常量 5.面向对象程序设计中的数据隐藏指的是______ 。 A.输入数据必须输入保密口令 B.数据经过加密处理 C. 对象内部数据结构上建有防火墙D.对象内部数据结构的不可访问性6.拷贝(复制)构造函数的作用是______ 。 A.进行数据类型的转换 B.用对象调用成员函数 C.用对象初始化对象D.用一般类型的数据初始化对象 7. 下列不是描述类的成员函数的是______ 。 A.构造函数 B.析构函数 C.友元函数 D.拷贝构造函数 8. 如果类A被说明成类B的友元,则______ 。 A. 类A的成员即类B的成员 B. 类B的成员即类A的成员 C. 类A的成员函数不得访问类B的成员 D. 类B不一定是类A的友元 9. 对于任何一个类,析构函数最多有______ 个。 A. 0 B. 1 C. 2 D. n 10. 下列特性中,C与C++共有的是______ 。 A.继承 B.封装 C.多态性 D.函数定义不能嵌套 11. 在公有继承的情况下,基类公有和保护成员在派生类中的访问权限______ 。 A. 受限制 B. 保持不变 C. 受保护 D. 不受保护 12. 通过______ 调用虚函数时,采用动态束定。 A. 对象指针 B. 对象名 C. 成员名限定 D. 派生类名 13. C++ 类体系中,不能被派生类继承的有______ 。 A. 成员转换函数 B. 构造函数 C. 虚函数 D. 静态成员函数 14. 假定 ab 为一个类,则执行 ab x;语句时将自动调用该类的______ 。 A. 有参构造函数 B. 无参构造函数 C. 拷贝构造函数 D. 赋值构造函数 15. 静态成员函数不能说明为______ 。 A. 整型函数 B. 浮点函数 C. 虚函数 D. 字符型函数 16. 在 C++ 中,数据封装要解决的问题是______ 。 A. 数据规范化排列 B. 数据高速转换 C. 避免数据丢失 D. 保证数据完整性 实验报告 实验课程: 计算机操作系统学生姓名:XXX 学号:XXXX 专业班级:软件 2014年12月25日 目录 实验一熟悉Windows XP中的进程和线程.. 3实验二进程调度 (7) 实验三死锁避免—银行家算法的实现 (18) 实验四存储管理 (24) 实验一熟悉Windows XP中的进程和线程 一、实验名称 熟悉Windows XP中的进程和线程 二、实验目的 1、熟悉Windows中任务管理器的使用。 2、通过任务管理器识别操作系统中的进程和线程的相关信息。 3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。 三、实验结果分析 1、启动操作系统自带的任务管理器: 方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“taskmgr.exe”。 2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并 完成下表: 表一:统计进程的各项主要信息 3、启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。再 从任务管理器中分别找到下列程序:winlogon.exe、lsass.exe、csrss.exe、smss.exe,试着结束它们,观察到的反应是任务管理器无法结束进程, 原因是该系统是系统进程。 4、在任务管理器中找到进程“explorer.exe”,将之结束掉,并将桌面上你打开的所 有窗口最小化,看看你的计算机系统起来什么样的变化桌面上图标菜单都消失了、得到的结论explorer.exe是管理桌面图标的文件(说出explorer.exe进程的作用)。 5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进 程“explorer.exe”的各项信息,并填写下表: 进程:explorer.exe 中的各个线程 中南大学信息科学与工程学院实验报告 姓名:安磊 班级:计科0901 学号: 0909090310 指导老师:宋虹 目录 课程设计内容 ----------------------------------- 3 uC/OS操作系统简介 ------------------------------------ 3 uC/OS操作系统的组成 ------------------------------ 3 uC/OS操作系统功能作用 ---------------------------- 4 uC/OS文件系统的建立 ---------------------------- 6 文件系统设计的原则 ------------------------------6 文件系统的层次结构和功能模块 ---------------------6 文件系统的详细设计 -------------------------------- 8 文件系统核心代码 --------------------------------- 9 课程设计感想 ------------------------------------- 11 附录-------------------------------------------------- 12 课程设计内容 在uC/OS操作系统中增加一个简单的文件系统。 要求如下: (1)熟悉并分析uc/os操作系统 (2)设计并实现一个简单的文件系统 (3)可以是存放在内存的虚拟文件系统,也可以是存放在磁盘的实际文件系统 (4)编写测试代码,测试对文件的相关操作:建立,读写等 课程设计目的 操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。 本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。 I.uC/OS操作系统简介 μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。 μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。 严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全 可以由用户自己根据需要分别实现。 uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。 uC/OS操作系统的组成 μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。如下图: 防火墙实验报告 一.实验过程 1.编写Python源代码,命名为pyretic_firewall.py。保存在 ~/pyretic/pyretic/examples中。 2.编写firewall-policies.csv源文件。保存在~/pyretic/pyretic/examples中。 3.在虚拟机mininet仿真器中创建网络拓扑。 4.在宿主机中连接虚拟机,运行程序。 5.运用tcpdump测试实验结果。 二.pyretic_firewall.py源代码及重要代码解释 from pyretic.lib.corelib import * from pyretic.lib.std import * #以上代码引用库函数 # insert the name of the module and policy you want to import from pyretic.examples.pyretic_switch import act_like_switch import os import csv from csv import DictReader #以上代码引用自己所需的一些模块 policy_file = "%s/pyretic/pyretic/examples/firewall-policies.csv" % os.environ[ 'HOME'] #以上代码为指定引用的文件的路径 #以下代码为main函数 def main(): # start with a policy that doesn't match any packets # 初始化not_allowed变量 not_allowed = none # and sdd traffic that isn't allowed 一、给定关系 R(A,B) 和 S(B,C) ,将下面的关系代数表达式转换为相应的SQL语句: π (attribute-list) [ (condition) [ R ? S ] ] 二、Megatron 747 磁盘具有以下特性: 1)有8个盘面和8192个柱面 2)盘面直径为英寸,内圈直径为英寸 3)每磁道平均有256个扇区,每个扇区512字节 4)每个磁道10%被用于间隙 5)磁盘转速为 7200 RPM 6)磁头启动到停止需要1ms,每移动500个柱面另加1ms 回答下列有关Megatron 747的问题(要求写出式子并且计算出结果,精确到小数点后两位): 1)磁盘容量是多少GB 2)如果一个块是8KB,那么一个块的传输时间是多少ms 3)平均寻道时间是多少ms 4)平均旋转等待时间是多少ms 三、下面是一个数据库系统开始运行后的undo/redo日志记录,该数据库系统支持simple checkpoint (1)(2)(3) 1) 实时操作系统课程实验报告 专业:通信1001 学号:3100601025 姓名:陈治州 完成时间:2013年6月11日 实验简易电饭煲的模拟 一.实验目的: 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,基于多任务的模式的编程方法。锻炼综合应用多任务机制,任务间的通信机制,内存管理等的能力。 二.实验要求: 1.按“S”开机,系统进入待机状态,时间区域显示当前北京时间,默认模式“煮饭”; 2.按“C”选择模式,即在“煮饭”、“煮粥”和“煮面”模式中循环选择; 3.按“B”开始执行模式命令,“开始”状态选中,时间区域开始倒计时,倒计时完成后进入“保温”状态,同时该状态显示选中,时间区域显示保温时间; 4.按“Q”取消当前工作状态,系统进入待机状态,时间区域显示北京时间,模式为当前模式; 5.按“X”退出系统,时间区域不显示。 6.煮饭时长为30,煮粥时长为50,煮面时长为40. 三.实验设计: 1.设计思路: 以老师所给的五个程序为基础,看懂每个实验之后,对borlandc的操作有了大概的认识,重点以第五个实验Task_EX为框架,利用其中界面显示与按键扫描以及做出相应的响应,对应实现此次实验所需要的功能。 本次实验分为界面显示、按键查询与响应、切换功能、时钟显示与倒计时模块,综合在一起实验所需功能。 2.模块划分图: (1)界面显示: Main() Taskstart() Taskstartdispinit() 在TaskStartDispInit()函数中,使用PC_DispStr()函数画出界面。 (2)按键查询与响应: Main() Taskstart() 在TaskStart()函数中,用if (PC_GetKey(&key) == TRUE)判断是否有按键输入。然后根据key 的值,判断输入的按键是哪一个;在响应中用switch语句来执行对应按键的响应。 (3)切换功能: l计数“C”按 键的次数 M=l%3 Switch(m) M=0,1,2对应于煮饭,煮粥,煮面,然后使用PC_DispStr()函数在选择的选项前画上“@”指示,同时,在其余两项钱画上“”以“擦出”之前画下的“@”,注意l自增。 四.主要代码: #include "stdio.h" #include "includes.h" #include "time.h" #include "dos.h" #include "sys/types.h" #include "stdlib.h" #define TASK_STK_SIZE 512 #define N_TASKS 2 OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; OS_STK TaskStartStk[TASK_STK_SIZE]; INT8U TaskData[N_TASKS]; 第一次实验报告 1、实验任务 根据下面的需求描述,使用Sybase Power Designer设计相应的数据库概念模型,并转换成Oracle或MS SQL Server上的物理数据库结构: 某银行准备开发一个银行业务管理系统,通过调查,得到以下的主要需求: 银行有多个支行。各个支行位于某个城市,每个支行有唯一的名字。银行要监控每个支行的资产。银行的客户通过其身份证号来标识。银行存储每个客户的姓名及其居住的街道和城市。客户可以有帐户,并且可以贷款。客户可能和某个银行员工发生联系,该员工是此客户的贷款负责人或银行帐户负责人。银行员工也通过身份证号来标识。员工分为部门经理和普通员工,每个部门经理都负责领导其所在部门的员工,并且每个员工只允许在一个部门内工作。每个支行的管理机构存储每个员工的姓名、电话号码、家庭地址及其经理的身份证号。银行还需知道每个员工开始工作的日期,由此日期可以推知员工的雇佣期。银行提供两类帐户——储蓄帐户和支票帐户。帐户可以由2个或2个以上客户所共有,一个客户也可有两个或两个以上的帐户。每个帐户被赋以唯一的帐户号。银行记录每个帐户的余额、开户的支行以及每个帐户所有者访问该帐户的最近日期。另外,每个储蓄帐户有其利率,且每个支票帐户有其透支额。每笔贷款由某个分支机构发放,能被一个或多个客户所共有。每笔贷款用唯一的贷款号标识。银行需要知道每笔贷款所贷金额以及逐次支付的情况(银行将贷款分几次付给客户)。虽然贷款号不能唯一标识银行所有为贷款所付的款项,但可以唯一标识为某贷款所付的款项。对每次的付款需要记录日期和金额。 2、实验过程 (1)确定实体和属性 由上面的需求描述我们可以很容易得出以下几个实体: ●员工(身份证号,姓名,电话号码,家庭地址,开始工作日 期) ●存储账户(账户号,余额,利率) ●支票账户(账户号,余额,透支额) ●客户(身份证号,姓名,街道,城市) ●支行(支行名称,城市,资产) ●贷款(贷款号,总额) ●支付(日期,金额) 图1 PS: 1、在此ER图中我没有设计账户类,然后派生出存储账户和支票账户,因为在客户的需求中,只有两种账户类型,除了支票账户类型就是存储账户类型,没有所谓的“一般的账户”,所以就不 约束优化设计实验报告 力学系型号:联想y470 CPU:i5-2450M 内存:2GB 系统:win7-64位 求解问题: 如上是以下三个约束方法共同需要求解的问题,预估结果:在(x1,x2,x3)≈(23,13,12)点附近存在极值。其中,每个方法对应的初始条件分别为: (1)随机试验法 设计变量范围: 随机试验点数:N=1000 精度:eps=0.001 (2)随机方向法 初始点:x0=(25,15,5) 初始步长:a0=0.5 精度:eps=0.001 (3)线性规划单纯形法 初始复合形:X=[20 23 25 30;10 13 15 20;10 9 5 0] 顶点个数:n=4 精度:eps=0.01 计算结果: 程序说明:主程序为main,运行main后按提示即可得到相应约束方法的求解结果。 程序如下: 1、主程序 clear; global kk; kk=0; disp('1.随机试验法'); disp('2.随机方向法'); disp('3.线性规划单纯形法'); while 1 n0=input('请输入上面所想选择约束优化方法的编号(1、2、3):'); if n0==1||n0==2||n0==3 break; end disp('此次输入无效.'); end disp(' '); disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'); [xx,yy]=fmins(n0); fprintf('迭代次数为:%8.0f\n', kk); disp('所求极值点的坐标向量为:'); fprintf(' %16.5f\n', xx); fprintf('所求函数的极值为:%16.5f\n', yy); 2、调用函数 function [xx,yy]=fmins(n0) if n0==1 tic;[xx,yy]=suijishiyan();toc; elseif n0==2 tic;[xx,yy]=suijifangxiang();toc; elseif n0==3 tic;[xx,yy]=danchunxing();toc; 1.ipv4 的替代方案; 2.单链表原地逆向转置; 3.折半查找算法 4.简述操作系统中系统调用过程; 5.在数据库中什么是关系,它和普通二维表啥区别; 6.什么是原子操作; 7.路由协议有哪些; 8.进程的三种状态,以及之间转换的过程; 9.快速排序的基本过程; 10.什么叫视图?视图在数据库的第几层; 11.二叉树的搜索; 12.什么叫冲突?解决冲突的办法都有哪些; 13.java 与 C++区别; 14.深度、广度搜索的过程; 15.迪杰斯克拉算法的过程; 16.关系模式和关系; 17.数据链路停发协议,就是流量控制; 18.虚拟存储器及相关算法;段存储器; 19.进程线程树图; 20.传输等待协议; 21.堆栈排序及其与快速排序的不同; 22.386 的保护模式是什么; 23.页表; 24.ER图; 25.关系范式 26.链表查询某个元素,平均时间复杂度是多少; 27.路由协议有哪些; 28.网络服务质量包括哪些方面; 29.并发控制是为了保证事务的?; 30.什么是 DMA; 31.两个时钟不同步的设备怎么通信; 32.操作系统的调度算法有哪些; 33.单链表的原地逆置算法 34.数据库的两级模式以及它们的关系和作用(貌似是这样) 35.操作系统的进程调度算法有哪些,并介绍其中两种 36.计算机的一条指令有几个机器周期,为什么 37.原子操作, pv 操作的要点和注意事项 38.内核、芯片(记不清了) 39.DMA控制器的组成和工作原理 40.简述最短路径的迪杰斯特拉算法 41.什么是 P 操作与 V 操作。 42.一个深度为 N的满二叉树有多少个结点。 43.实现一个队列的方法 44.折半查找调节与时间复杂度 河北大学工商学院 课程设计 题目:操作系统课程设计 学部信息学部 学科门类电气信息 专业计算机 学号2011482370 姓名耿雪涛 指导教师朱亮 2013 年6月19日 主要内容 一、设计目的 通过模拟操作系统的实现,加深对操作系统工作原理理解,进一步了解操作系统的实现方法,并可练习合作完成系统的团队精神和提高程序设计能力。 二、设计思想 实现一个模拟操作系统,使用VB、VC、CB等windows环境下的程序设计语言,以借助这些语言环境来模拟硬件的一些并行工作。模拟采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、设备管理、文件管理和用户接口四部分。 设计模板如下图: 注:本人主要涉及设备管理模块 三、设计要求 设备管理主要包括设备的分配和回收。 ⑴模拟系统中有A、B、C三种独占型设备,A设备1个,B设备2个,C设备2个。 ⑵采用死锁的预防方法来处理申请独占设备可能造成的死锁。 ⑶屏幕显示 注:屏幕显示要求包括:每个设备是否被使用,哪个进程在使用该设备,哪些进程在等待使用该设备。 设备管理模块详细设计 一、设备管理的任务 I/O设备是按照用户的请求,控制设备的各种操作,用于完成I/O 设备与内存之间的数据交换(包括设备的分配与回收,设备的驱动管理等),最终完成用户的I/O请求,并且I/O设备为用户提供了使用外部设备的接口,可以满足用户的需求。 二、设备管理函数的详细描述 1、检查设备是否可用(主要代码) public bool JudgeDevice(DeviceType type) { bool str = false; switch (type) { case DeviceType.a: { 嵌入式实时操作系统实验报告 任务间通信机制的建立 系别计算机与电子系 专业班级***** 学生姓名****** 指导教师 ****** 提交日期 2012 年 4 月 1 日 一、实验目的 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,任务使用信号量的一般原理。掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理及解决优先级反转的策略——优先级继承的原理。 二、实验内容 1.建立并熟悉Borland C 编译及调试环境。 2.使用课本配套光盘中第五章的例程运行(例5-4,例5-5,例5-6),观察运行结果,掌握信号量的基本原理及使用方法,理解出现优先级反转现象的根本原因并提出解决方案。 3.试编写一个应用程序,采用计数器型信号量(初值为2),有3个用户任务需要此信号量,它们轮流使用此信号量,在同一时刻只有两个任务能使用信号量,当其中一个任务获得信号量时向屏幕打印“TASK N get the signal”。观察程序运行结果并记录。 4. 试编写一个应用程序实现例5-7的内容,即用优先级继承的方法解决优先级反转的问题,观察程序运行结果并记录。 5.在例5-8基础上修改程序增加一个任务HerTask,它和YouTask一样从邮箱Str_Box里取消息并打印出来,打印信息中增加任务标识,即由哪个任务打印的;MyTask发送消息改为当Times为5的倍数时才发送,HerTask接收消息采用无等待方式,如果邮箱为空,则输出“The mailbox is empty”, 观察程序运行结果并记录。 三、实验原理 1. 信号量 μC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样μC/OS-II 才能支持信号量。 实验报告 / EX1 黑盒测试 目录 一引言 (1) 1.1标识 (1) 1.2系统概述 (1) 1.3文档概述 (1) 二引用文件 (2) 三测试结果概述 (3) 3.1对被测试软件的总体评估 (3) 3.2测试环境的影响 (3) 3.3改进建议 (3) 四详细的测试结果 (4) 4.1 等价类划分测试(test1-trans-ecdiv) (4) 4.1.1测试用例设计 (4) 4.2 边界值测试(test1-trans-boundary) (5) 4.2.1测试用例设计 (5) 4.3 因果图测试(test1-trans-cegraph) (6) 4.3.1测试用例设计 (6) 五测试记录 (9) 六评价 (10) 6.1能力 (10) 6.2缺陷和限制 (10) 6.3建议 (10) 6.4结论 (10) 七测试活动总结 (11) 7.1人力消耗 (11) 7.2物质资源消耗 (11) 八注解 (12) 附录 (13) 一引言 1.1标识 本文档适用系统:Windows 7; 本文档使用软件:test1.exe注【1】 1.2系统概述 本文档测试软件为“人民币数字大写转换程序”,具体功能如下: 1)中文大写金额数字应用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、 亿、元、角、分、零、整(正)等字样。 2)中文大写金额数字到"元"为止的,在"元"之后,应写"整"(或"正")字,在"角"之后, 可以不写"整"(或"正")字。 3)中文大写金额数字前应标明"人民币"字样,大写金额数字有"分"的,"分"后面不写 "整"(或"正")字。 4)大写金额数字应紧接"人民币"字样填写,不得留有空白。 5)阿拉伯数字小写金额数字中有"0"时,中文大写应按照汉语语言规律、金额数字构 成和防止涂改的要求进行书写。 1.3文档概述 本文档为上述“人民币数字大写转换程序”的黑盒测试报告,是在导师的指导下,独立进行研究工作所取得的成果,所有数据、图片资料真实可靠。尽我所知,除文中已经注明引用的内容外,本文档的研究成果不包含他人享有著作权的内容。对本文档所涉及的研究工作做出贡献的其他个人和集体,均已在文中以明确的方式标明。 注【1】:test1为具备将数字转换成人民币大写功能的exe可执行文件,由我的软件测试技术的课程队友XXX编写开发。 中科大考博辅导班:2019中科大软件学院考博难度解析及经验分享中国科学院大学2019年博士研究生招生统一实行网上报名。报考者须符合《中国科学院大学2019年招收攻读博士学位研究生简章》规定的报考条件。考生在报考前请联系所报考的研究所(指招收博士生的中科院各研究院、所、中心、园、台、站)或校部相关院系,了解具体的报考规定。 下面是启道考博辅导班整理的关于中国科学技术大学软件学院考博相关内容。 一、院系简介 中国科学技术大学是中国科学院直属的唯一院校,是一所以前沿科学和高新技术为主、科技人文与科技管理兼备的综合性全国名校,为国家教育重点建设的9所世界知名高水平研究型大学之一,在国际上享有较高的声誉。学校力争在2018年建校60周年前后,把学校建设成为“规模适度、质量优异、结构合理、特色鲜明”的世界知名的高水平研究型大学。目前,校本部共有10个学院、25个系和少年班,43个本科专业;一级学科博士学位授权点17个,国家重点学科19个,二级学科博士学位授权点89个,二级学科硕士学位授权点105个,有工商管理(MBA)、公共管理(MPA)和工程硕士3个专业硕士学位授权点;17个博士后流动站,45个博士后流动站专业,具备培养学士、硕士、博士的完整教育体系。其严谨务实的学风、创新探索的精神、高水平级的成果、国际化办学的追求,都使得这所年轻的研究型大学受到国际社会越来越强的关注 二、招生信息 中国科学技术大学软件学院博士招生专业有1个: 085271电子与信息 研究方向:不区分研究方向 三、报考条件 (1)中华人民共和国公民;拥护中国共产党的领导,愿意为祖国社会主义现代化建设服务;品德良好,遵纪守法,学风端正,无任何考试作弊、学术剽窃及其它违法违纪行为; (2)身体健康状况符合我校规定的体检要求,心理正常; (3)申请者原则上应来自国内重点院校或所在高校学习专业为重点学科; (4)专业基础好、科研能力强,在某一领域或某些方面有特殊学术专长及突出学术成果; (5)对学术研究有浓厚的兴趣,有较强的创新意识、创新能力和专业能力; 操作系统教程 实 验 指 导 书 姓名: 学号: 班级:软124班 指导老师:郭玉华 2014年12月10日 实验一WINDOWS进程初识 1、实验目的 (1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。 (2)掌握WINDOWS API的使用方法。 (3)编写测试程序,理解用户态运行和核心态运行。 2、实验内容和步骤 (1)编写基本的Win32 Consol Application 步骤1:登录进入Windows,启动VC++ 6.0。 步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序: E:\课程\os课\os实验\程序\os11\debug>hello.exe 运行结果 (如果运行不成功,则可能的原因是什么?) : 有可能是因为DOS下路径的问题 (2)计算进程在核心态运行和用户态运行的时间 步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。 步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。 步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。 E:\课程\os课\os实验\程序\os12\debug>time TEST.exe 步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) : 因为程序是个死循环程序 步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。 屏蔽i循环: 屏蔽j循环: _______________________________________________________________________________调整循环变量i的循环次数:操作系统-Linux课程实验报告
操作系统实验报告--实验一--进程管理
中科大信号与系统 实验报告2
中科大软件学院C+考试试卷
计算机操作系统实验课实验报告
嵌入式操作系统实验报告
中科大高级计算机网络实验报告
中科大软院数据库考试题
实时操作系统报告
中科大软院金老师的数据库实验一
中科大《优化设计》课程大作业之约束优化实验报告
(完整版)中科大软院常见复试题目.doc
操作系统课程设计实验报告
嵌入式实时操作系统实验报告
中科大-软件测试实验一-人民币数字大写转换黑盒测试实验报告
中科大考博辅导班:2019中科大软件学院考博难度解析及经验分享
操作系统实验报告