查找算法演示程序

查找算法演示程序
查找算法演示程序

学院

目录

1 摘要 (3)

1.1设计题目 (3)

1.2设计内容 (3)

1.3开发工具 (3)

1.4应用平台 (3)

2 详细设计 (3)

2.1程序结构 (3)

2.2主要功能 (4)

2.3函数实现 (4)

2.4开发日志 (4)

3 程序调试及运行 (5)

3.1程序运行结果 (5)

3.2程序使用说明 (9)

3.3程序开发总结 (9)

4 附件(源程序) (9)

1 摘要

1.1 设计题目

(1)算法型大作业7.查找算法。

1.2 设计内容

本程序是一个演示顺序查找算法和折半查找算法的演示程序。由用户输入查找的数据表列和查找的数据并选择查找方法,系统在将数表排序后,可以在屏幕上演示在排序后的表列中按所选查找法查找该数据的具体过程,支持多次演示、错误提醒,程序暂停演示功能。

1.3 开发工具

开发工具为Visual C++ 6.0和CB西北工业大学课堂教学版10.5.7600j。

1.4 应用平台

Windows 2000/XP/7

2 详细设计

2.1 程序结构

1、本程序的工程含有6个文件,其中main.cpp、shunxufa.cpp、zhabanfa.cpp、sort.cpp、putout.cpp5个cpp文件和include.h1个头文件,两者共同存在于工程“大作业”中。其中main.cpp文件为程序的主体部分,main函数调用4个cpp文件中的函数。

2、四个cpp文件中的函数分别为sort、putout、shunxufa、zhabanfa四个函数形参互不影响,在头文件include.h中声明。

3、整个运行过程中,有主函数输入输出数据。main函数调用其余函数执行功能,查找完成后选择性退出。

2.2 主要功能

1、该程序的主要功能为实现查找算法的演示程序。主函数实现了数据的输入和输出及让用户选择哪个排序方法,子函数则分别完成,排序、输出折半后的数表、顺序排序和折半排序功能。

2、操作通过输入控制,用户输入数据选择性调用函数执行功能,程序运行后显示相应结果,最后选择性退出。

2.3 函数实现

1、本程序中含有一个主函数,四个子函数以及主函数中若干个起重要作用的函数语句。4个子函数依次为sort、putout、shunxufa、zhabanfa,分别执行排序、输出折半后的数表、顺序排序和折半排序功能,按要求显示结果。

2、main函数通过调用4个子函数并根据用户输入的相关信息执行程序,输出结果反馈给用户。

2.4 开发日志

6月16日,选定题目,开始基本构思,考虑大体的程序算法及程序结构;

6月17日,考虑选用多文件结构程序,复习多文件结构程序的并深入理解,通过编写sinx、cosx数学函数演示程序进一步熟练运用多文件结构程序。

6月18日,开始分段编写调试部分程序,借鉴已有程序对所编程序优化。

6月19日,编写主要程序,构建多文件工程,并不断调试,完善功能。

多文件工程如下图:

6月21日,进一步完善演示功能,加入更多的提示性信息和控制语句,使程序基本上达到了演示效果。

6月22日,完善代码,总体调试检查程序并完成开发报告。

3 程序调试及运行

3.1 程序运行结果

1、主功能菜单

2、初始数据输入与排序

3、选择顺序法查找

4、选择折半法查找

5、程序选择性退出

3.2 程序使用说明

在CB西北工业大学课堂教学版10.5.7600j下运行该程序

本程序使用较为简单,只需要按照程序提示做符合要求的操作,就可以完成查找算法演示的功能,若不小心做了错误的操作,在程序允许的范围内可以重新操作,因此要仔细阅读程序说明部分和运行中的相关提示,按要求操作。另外,在程序演示过程中有很多暂停语句,用户只要按任意键就可继续运行。

3.3 程序开发总结

通过这次程序开发,我对程序员有了更深刻的认识。我意识到程序员不仅要有过人的思维,还要有足够的耐心,以及合作的意识、独立解决困难的意识和应用已有知识解决问题的能力。

通过这次程序开发,我明白了网络对与学习,特别是程序设计方面的巨大推动作用,通过上网搜索,我基本了解了system、exit、fllush(清除文件缓冲区)等语句的一些用法,并且获得了许多优化方法,还知晓了很多有用的网站,以后在学习中我会更多的利用这点。

编写该大作业使我对规范化编写程序有了了解,也使我对程序的调试有所了解,知道了如何写程序报告。这对我们的程序理解有很大的帮助,能使我们对自己编写的程序有更深的了解,使我们更了解自己的算法思想。

同时,这次出现开发也让我看到了自己知识的匮乏,为我以后的努力学习提供了鞭策和动力。

4 附件(源程序)

源程序代码分为6个文件,main.cpp、sort.cpp、putout.cpp、shunxufa.cpp和zhabanfa.cpp以及一个头文件include.h,六者共同存在于工程“大作业”中。

各文件源代码如下:

main.cpp文件源代码:

#include

#include

#include

#define N 501

#include "include.h"

int main()

{

int a[N];

int i,n,num,xx;

char c;

double k=0;

puts("\n");

printf(" 查找算法演示器\n");

puts("\n");

printf("**********系统功能菜单********** \n\n");

printf("—----------------------------------— \n");

printf(" 1.对输入的数据表列进行排序\n ");

printf("2.演示顺序查找功能\n ");

printf("3.演示折半查找功能\n ");

printf("4.多次演示功能\n ");

printf("5.数据输入错误提醒功能及程序暂停功能\n ");

printf("—----------------------------------— \n");

printf("**********开始演示********** \n");

s_e:printf("请输入你想要在其中查找数据的数据表列的数据个数(1--500):\n");// scanf("%d",&n);

while(n<1 || n>500)

{

printf("你输入的数不正确,请重新输入。\n");

goto s_e;}

printf("请输入你要在其中查找数据的数据表列(%d个数据用空格间隔大小排序不限):\n",n);

for(i=0;i<=n-1;i++)

scanf("%d",&a[i]);

sort(a,n);

printf("\n输出表列(从小到大排列)\n");

putout(a,0,n-1);

r_s: printf("请你输入要查找的数:\n");

scanf("%d",&num);

printf("\n请选择输入1(顺序查找)或2(折半查找)\n");

scanf("%d",&xx);

if(xx==1) shunxufa(a,num,n);

else zhebanfa(a,num,n);

c_e:{ fflush(stdin);

printf("请选择是否继续查找\n");

printf("是——y,否——n\n");

c=getchar();

if(c!='y'&&c!='n')

{

printf("选择错误!");

goto c_e;

}

else

{

if(c=='y') goto r_s;

else goto end;

}

}

end: printf("程序结束\n");

system("pause");

printf("谢谢使用,再见!\n");

for(k=0;k<1.9e8;k++)

;

exit(0);

return 0;

}

include.h文件源代码:

int zhebanfa(int a[],int num,int n);

void sort(int A[],int n1);

void putout(int B[],int m1,int m2);

int shunxufa(int a[],int num,int n);

shunxufa.cpp文件源代码:

#include

int shunxufa(int a[],int num,int n)

{

int yy=0,i;

for(i=0;i<=n-1;i++)

if(a[i]==num) {yy=1;

printf("找到数%6d 排序后的位置%2d\n",num,i+1);} if(yy==0) {

printf("%d 这个数在表列中没有找到。\n",num);

}

return 0;

}

zhebanfa.cpp文件源代码:

#include

#include

#include

#include "include.h"

int zhebanfa(int a[],int num,int n)

{

int count;

int top,bottom,mid;

int flag=1;

int loc=-1;

count=0;

flag=1;

top=n-1;

bottom=0;

mid=(top+bottom)/2;

while(flag)

{

count++;

if( (num>a[top]) || (num

{

loc=-1;

flag=0;

}

else if(a[mid]==num)

{

loc=mid;

printf("第%d次折半\n",count);

printf(" 中间数据为%d\n",a[mid]);

system("pause");

printf("找到数%6d 排序后的位置%2d\n",num,loc+1);

loc=1;

goto s_s;

}

else if(a[mid]>num)

{

printf("第%d次折半\n",count);

printf(" 中间数据为%d\n",a[mid]);

printf(" 因为%d<%d ",num,a[mid]);

printf("所以在左半部分查找\n 折半后查找数表为:\n");

top=mid-1;

mid=(top+bottom)/2;

putout(a,bottom,top);

system("pause");

}

else if(a[mid]

{

printf("第%d次折半\n",count);

printf(" 中间数据为%d\n",a[mid]);

printf(" 因为%d>%d ",num,a[mid]);

printf("所以在右半部分查找\n 折半后查找数表为:\n");

bottom=mid+1;

mid=(top+bottom)/2;

putout(a,bottom,top);

system("pause");

}

}

if(loc==-1)

{

printf("%d 这个数在表列中没有找到。\n",num);

goto s_s;

}

s_s:

return 0;

}

putout.cpp文件源代码:

#include

void putout(int B[],int m1,int m2)

{

int x1;

for(x1=m1;x1<=m2-1;x1++)

printf("%6d",B[x1]);

printf("%6d\n",B[x1]);

}

sort.cpp文件源代码:

#include

void sort(int A[],int n1)

{

int x,y,z;

for(x=0;x

for(y=0;y

{

if(A[y]>A[y+1])

{

z=A[y];

A[y]=A[y+1];

A[y+1]=z;

}

}

}

数据结构实验——查找算法的实现

实验五 查找算法实现

1、实验目的 熟练掌握顺序查找、折半查找及二叉排序树、平衡二叉树上的查找、插入和删除的方法,比较它们的平均查找长度。 2、问题描述 查找表是数据处理的重要操作,试建立有100个结点的二叉排序树进行查找,然后用原数据建立AVL树,并比较两者的平均查找长度。 3、基本要求 (1)以链表作为存储结构,实现二叉排序树的建立、查找和删除。 (2)根据给定的数据建立平衡二叉树。 4、测试数据 随即生成 5、源程序 #include<> #include<> #include<> #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)<(b)) #define LQ(a,b) ((a)>(b)) typedef int Keytype; typedef struct { Keytype key; //关键字域 }ElemType; typedef struct BSTnode { ElemType data; int bf; struct BSTnode *lchild,*rchild; }BSTnode,*BSTree; void InitBSTree(BSTree &T) {T=NULL; } void R_Rotate(BSTree &p) {BSTnode *lc; lc=p->lchild; p->lchild=lc->rchild; lc->rchild=p; p=lc; } void L_Rotate(BSTree &p) {BSTnode *rc; rc=p->rchild; p->rchild=rc->lchild;

进程调度算法模拟 (操作系统课程设计报告)

福建农林大学计算机与信息学院 课程设计报告 课程名称:操作系统 实习题目:进程调度算法模拟 姓名: 系:计算机科学与技术系 专业:计算机科学与技术 年级:2012 学号: 指导教师: 职称:副教授 年月日

福建农林大学计算机与信息学院计算机类 课程设计结果评定

目录 1.本选题课程设计的目的 (4) 2.本选题课程设计的要求 (4) 3.本选题课程设计报告内容 (4) 3.1前言 (4) 3.2进程调度算法模拟的环境 (4) 3.3系统技术分析 (4) 3.4系统流程图及各模块 (5) 3.5程序调试情况 (8) 4.总结 (11) 参考文献 (11) 程序代码 (12)

1.设计目的 课程设计将课本上的理论知识和实际有机的结合起来,锻炼学生的分析系统,解决实际问题的能力。提高学生分析系统、实践编程的能力。 2.设计要求 利用学到的操作系统和编程知识,完成具有一定难度的系统分析研究或系统设计题目。其中:专题系统理论研究应包括研究目的、目标,论点和论据以及证明推导等;分析、设计系统应包括编写、调试程序以及最后写出设计报告或系统说明文档文件,系统说明文档包括系统界面、变量说明、系统功能说明、编程算法或思路、流程图和完整程序。具体要求如下: 1、对系统进行功能模块分析、控制模块分析正确; 2、系统设计要实用; 3、编程简练,可用,功能全面; 4、说明书、流程图要清楚。 3.设计方案 3.1前言 本程序包括三种算法,用C或C++语言实现,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。 3.2本选题设计的环境 WindowsXP下的Microsoft Visual C++ 6.0 3.3系统技术分析 (1)编程实现对N个进程采用某种进程调度算法(如动态优先权调度算法、先来先服务算法、短进程优先算法、时间片轮转调度算法)调度执行的模拟。(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:进程标识数ID。 进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。

时间片轮转进程调度模拟算法的实现

武汉理工大学华夏学院课程设计报告书 课程名称:操作系统原理 题目:时间片轮转进程调度模拟算法的实现系名:信息工程系 专业班级:计算机1132班 姓名:李杰 学号: 10210413209 指导教师: 司晓梅 2015年 6 月 26日

武汉理工大学华夏学院信息工程系 课程设计任务书 课程名称:操作系统原理课程设计指导教师:司晓梅 班级名称:计算机1131-2 开课系、教研室:自动化与计算机 一、课程设计目的与任务 操作系统课程设计是《操作系统原理》课程的后续实践课程,旨在通过一周的实践训练, 加深学生对理论课程中操作系统概念,原理和方法的理解,加强学生综合运用操作系统原理、 Linux系统、C语言程序设计技术进行实际问题处理的能力,进一步提高学生进行分析问题 和解决问题的能力,包含系统分析、系统设计、系统实现和系统测试的能力。 学生将在指导老师的指导下,完成从需求分析,系统设计,编码到测试的全过程。 二、课程设计的内容与基本要求 1、课程设计题目 时间片轮转进程调度模拟算法的实现 2、课程设计内容 用c/c++语言实现时间片轮转的进程调度模拟算法。要求: 1.至少要有5个以上进程 2.进程被调度占有CPU后,打印出该进程正在运行的相关信息 提示: 时间片轮转调度算法中,进程调度程序总是选择就绪队列中的第一个进程,也就是说按照先来先服务原则调度,但一旦进程占用处理机则仅使用一个时间片。在使用完一个时间片后,进程还没有完成其运行,它必须释放出处理机给下一个就绪的进程,而被抢占的进程返回到就绪队列的末尾重新排队等待再次运行。 1)进程运行时,只打印出相关提示信息,同时将它已经运行的时间片加1就可以了。 2)为进程设计出PCB结构。PCB结构所包含的内容,有进程名、进程所需运行时间、已运行时间和进程的状态以及指针的信息等。 3、设计报告撰写格式要求: 1设计题目与要求 2 设计思想 3系统结构 4 数据结构的说明和模块的算法流程图 5 使用说明书(即用户手册):内容包含如何登录、退出、读、写等操作说明 6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况)

进程调度算法模拟实验

华北科技学院计算机系综合性实验 实验报告 课程名称操作系统C 实验学期2012至2013学年第2学期学生所在系部计算机系 年级专业班级 学生姓名学号 任课教师杜杏菁 实验成绩 计算机系制

《操作系统C》课程综合性实验报告 开课实验室:基础六机房2013年6月3日 实验题目进程调度算法模拟 一、实验目的 通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。 二、设备与环境 1.硬件设备:PC机一台 2.软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C \C++\Java等编程语言环境。 三、实验内容 (1)用C语言(或其它语言,如Java)实现对N个进程采用某种进程调度算法(如动态优先权调度)的调度。 (2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段: ?进程标识数ID。 ?进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。 ?进程已占用CPU时间CPUTIME。 ?进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。 ?进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进 入阻塞状态。 ?进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将 转换成就绪状态。 ?进程状态STATE。 ?队列指针NEXT,用来将PCB排成队列。 (3)优先数改变的原则: ?进程在就绪队列中呆一个时间片,优先数增加1。 ?进程每运行一个时间片,优先数减3。 (4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。

进程调度算法的模拟实现

操作系统课程设计报告题目:进程调度算法的模拟实现_ 专业计算机科学与技术 学生姓名 班级 学号 指导教师 发放日期2015.1.30 信息工程学院

目录 1 概述 (1) 2 设计原理 (1) 2.1先来先服务算法 (1) 3 详细设计与编码 (2) 3.1 模块设计 (2) 3.2 系统流程图 (2) 3.3 系统详细设计 (2) 4 结果与分析 (6) 4.1 测试方案 (6) 4.2 测试结果 (6) 4.3 测试结果分析 (9) 5 设计小结 (10) 6 参考文献 (10) 附录程序代码 (12)

进程调度算法的模拟实现 进程调度算法的模拟实现 1 概述 选择一个调度算法,实现处理机调度,进程调度算法包括:先来先服务算法,短进程优先算法,时间片轮转算法,动态优先级算法。可选择进程数量,本程序包括四种算法,用C或C++语言实现,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。 2 设计原理 2.1先来先服务(FCFS)算法 每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源创建进程,然后放入就绪队列 2.2 时间片轮转法(RR)算法 系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。 2.3短作业优先(SJF)算法 短作业优先调度算法是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。 2.4最高优先权优先(HRRN)算法 优先权调度算法是为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入最高优先权优先调度算法。动态优先权是指在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。

进程调度算法实验报告

实验报告 实验一:进程调度算法 一、实验目的 1.利用高级语言实现三种不同及进程调度算法: 短作业优先算法、时间片轮转调度算法和优先级调度算法。 2.通过实验理解有关进程控制块,进程队列等的概念。 二、实验原理 各调度算法思想: 1.先来先服务算法(FCFS): 按照进程进入就绪队列的先后次序来分配CPU,一旦一个进程占有CPU,就一直运行下去,知道该进程完成工作,才释放CPU。 2.时间片轮转算法: 系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择队列中的第一个进程执行,且仅能执行一个时间片,在使用完一个时间片后,即使进程并未完成其运行,也必须将CPU交给下一个进程;如果一个时间片未使用完就完成了该进程,则剩下的时间分配给下一个进程。 3.优先权调度算法;在创建进程时就确定优先权,确定之后在整个程序运行期间不再改 变,根据优先级排列,系统会把CPU分配给优先权最高的进程。 三、实验步骤、数据记录及处理 1、算法流程

抽象数据类型的定义:PCB块结构体类型 struct PCB { int name; int arrivetime; // 到达时间 int servicetime; // 服务时间 //int starttime[max]; // 开始时间 int finishtime; // 完成/ 结束时间 int turntime; // 周转时间 int average_turntime; // 带权周转时间 int sign; // 标志进程是否完成 int remain_time; // 剩余时间 int priority; // 优先级 }pcb[max]; 主程序的流程以及各程序模块之间的层次( 调用) 关系:主程序中从键盘得到进程的数量,创建PCB,调用layout ()函数显示选择界面。 Layout ()函数中选择相应的算法并调用相关函数如:FCFS()、time_segment(); Priority() ,这三个函数分别实现先来先服务算法,时间片轮转算法和优先级算法,最后分别打印。 程序流程图:

二分法查找算法

二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1,2,3,4,5,6,7,8,9},查找元素6,用二分查找的算法执行的话,其顺序为: 1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6,7,8,9}中查找, 2.寻找{6,7,8,9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。 二分查找算法就是不断将数组进行对半分割,每次拿中间元素和goal进行比较。 #include using namespace std; //二分查找 int binary_search(int* a, int len, int goal); int main() { const int LEN = 10000; int a[LEN]; for(int i = 0; i < LEN; i++) a[i] = i - 5000; int goal = 0; int index = binary_search(a, LEN, goal);

if(index != -1) cout< goal) high = middle - 1; //在右半边 else low = middle + 1; } //没找到

数据结构查找算法课程设计

存档编号: 西安******** 课程设计说明书 设计题目: 查找算法性能分析 系别:计算机学院 专业:计算机科学 班级:计科*** 姓名:王*** (共页) 2015年01月07 日

***** 计算机科学专业课程设计任务书 姓名:*** 班级:计科**** 学号:**** 指导教师:**** 发题日期:2015-01-05 完成日期:2015-01-09 一需求分析

1.1问题描述 查找又称检索,是指在某种数据结构中找出满足给定条件的元素。查找是一种十分有用的操作。而查找也有内外之分,若整个查找过程只在内存中进行称为内查找;若查找过程中需要访问外存,则称为外查找,若在查找的同时对表做修改运算(插入或删除),则相应的表成为动态查找表,反之称为静态查找表。 由于查找运算的主要运算是关键字的比较,所以通常把查找过程中对关键字的平均比较次数(也叫平均查找长度)作为一个查找算法效率优劣的标准。 平均查找程度ASL定义为: ASL=∑PiCi(i从1到n) 其中Pi代表查找第i个元素的概率,一般认为每个元素的查找概率相等,Ci代表找到第i个元素所需要比较的次数。 查找算法有顺序查找、折半查找、索引查找、二叉树查找和散列查找(又叫哈希查找),它们的性能各有千秋,对数据的存储结构要求也不同,譬如在顺序查找中对表的结果没有严格的要求,无论用顺序表或链式表存储元素都可以查找成功;折半查找要求则是需要顺序表;索引表则需要建立索引表;动态查找需要的树表查找则需要建立建立相应的二叉树链表;哈希查找相应的需要建立一个哈希表。 1.2基本要求 (1)输入的形式和输入值的范围; 在设计查找算法性能分析的过程中,我们调用产生随机数函数: srand((int)time(0)); 产生N个随机数。 注:折半查找中需要对产生的随机数进行排序,需要进行排序后再进行输入,N<50; (2)输出形式; 查找算法分析过程中,只要对查找算法稍作修改就可以利用平均查找

进程模拟调度算法课程设计

一.课程概述 1.1.设计构想 程序能够完成以下操作:创建进程:先输入进程的数目,再一次输入每个进程的进程名、运行总时间和优先级,先到达的先输入;进程调度:进程创建完成后就选择进程调度算法,并单步执行,每次执行的结果都从屏幕上输出来。 1.2.需求分析 在多道程序环境下,主存中有着多个进程,其数目往往多于处理机数目,要使这多个进程能够并发地执行,这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之执行。分配处理机的任务是由处理机调度程序完成的。由于处理机是最重要的计算机资源,提高处理机的利用率及改善系统必(吞吐量、响应时间),在很大程度上取决于处理机调度性能的好坏,因而,处理机调度便成为操作系统设计的中心问题之一。本次实验在VC++6.0环境下实现先来先服务调度算法,短作业优先调度算法,高优先权调度算法,时间片轮转调度算法和多级反馈队列调度算法。 1.3.理论依据 为了描述和管制进程的运行,系统为每个进程定义了一个数据结构——进程控制块PCB(Process Control Block),PCB中记录了操作系统所需的、用于描述进程的当前情况以及控制进程运行的全部信息,系统总是通过PCB对进程进行控制,亦即,系统是根据进程的PCB 而不是任何别的什么而感知进程的存在的,PCB是进程存在的惟一标志。本次课程设计用结构体Process代替PCB的功能。 1.4.课程任务 一、用C语言(或C++)编程实现操作模拟操作系统进程调度子系统的基本功能;运用多 种算法实现对进程的模拟调度。 二、通过编写程序实现进程或作业先来先服务、高优先权、按时间片轮转、短作业优先、多 级反馈队列调度算法,使学生进一步掌握进程调度的概念和算法,加深对处理机分配的理解。 三、实现用户界面的开发

数据结构经典算法 C语言版

//插入排序法 void InsertSort() { int s[100]; int n,m,j,i=0,temp1,temp2; printf("请输入待排序的元素个数:"); scanf("%d",&n); printf("请输入原序列:"); for (i=0; is[n-1]); s[n]=m; for (i=0; im) { temp1=s[i]; s[i]=m; for (j=i+1; j

//堆排序 static a[8] = {0,25,4,36,1,60,10,58,}; int count=1; void adjust(int i,int n) { int j,k,r,done=0; k = r = a[i]; j = 2*i; while((j<=n)&&(done==0)) { if(j=a[j]) done = 1; else { a[j/2] = a[j]; j = 2* j; } } a[j/2] = r; } void heap(int n) { int i,j,t; for(i =n/2;i>0;i--) adjust(i,n); printf("\n初始化成堆===> "); for(i = 1;i < 8;i++) printf("%5d",a[i]); for(i = n-1;i>0;i--) { t = a[i+1]; a[i+1] = a[1]; a[1] = t; adjust(1,i); printf("\n第%2d步操作结果===>",count++); for(j = 1;j<8;j++) printf("%5d",a[j]); } }

进程调度算法模拟程序设计C++

(1)用C语言(或其它语言,如Java)实现对N个进程采用某种进程调度算法(如动态优先权调度)的调度。 (2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:?进程标识数ID。 ?进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。 ?进程已占用CPU时间CPUTIME。 ?进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。 ?进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间 片后,进程将进入阻塞状态。 ?进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME 个时间片后,将转换成就绪状态。 ?进程状态STATE。 ?队列指针NEXT,用来将PCB排成队列。 (3)优先数改变的原则: ?进程在就绪队列中呆一个时间片,优先数增加1。 ?进程每运行一个时间片,优先数减3。 (4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。 (5)分析程序运行的结果,谈一下自己的认识。 实验代码 #include "iostream.h" #include "windows.h" //#define N 3 typedef struct{ int ID; int PRIORITY; int CPUTIME;

int ALLTIME; int STARTBLOCK; int BLOCKTIME; int STATE;//0-运行1-阻塞2-就绪3-结束4-未到达 int REACH; int TIME; }PROCESS; void textcolor (int color) { SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), color ); } void main(){ int i,time,max,l,l1,time1,flag=0,total=0,N,server[10],sum=0; PROCESS pro[10]; textcolor(13); cout<<"注意:本程序中状态代表如下"<>N; cout<<"请设置时间片长度:"; cin>>time; cout<<"请输入各进程初始状态:"<>pro[i].ID>>pro[i].PRIORITY>>pro[i].REACH;

折半查找算法及程序实现教案

折半查找算法及程序实现 一、教材分析 教学重点:以图示法方式,演示折半查找算法的基本思想。 教学难点:由折半查找算法的思想到程序代码编写的转换,尤其是其中关键性语句的编写是教学中的难点。 二、学情分析 学生应该已经掌握程序设计的基本思想,掌握赋值语句、选择语句、循环语句的基本用法和VB基本操作,这节课学生可能会遇到的最大问题是:如何归纳总结对分查找解决不同情况问题的一般规律,鉴于此,在教学中要积极引导学生采取分解动作、比较迁移等学习策略。 三、教学目标 知识与技能:理解对分查找的概念和特点,通过分步解析获取对分查找的解题结构,初步掌握对分查找算法的程序实现。 过程与方法:通过分析多种不同的可能情况,逐步归纳对分查找的基本思想和方法,确定解题步骤。 情感态度与价值观:通过实践体验科学解题的重要性,增强效率意识和全局观念,感受对分查找算法的魅力,养成始终坚持、不断积累才能获得成功的意志品质。 四、教学策略与手段 1、教学线索:游戏引领---提出对分查找原理--- 解析对分查找的算法特征---实践解决问题。 2、学习线索:分解问题---归纳问题---实践提升,在三个阶段的不断推进中明确对分查找算法,总结规律。 五、教学过程

1、新课导入 (1)热身:游戏(2分钟) 找同学上来找一本上千页电话册里面的一个名字。(课程导入我写的不是很详细,自己设计哦) (2)教师引导:所以我不希望只有他一个人体验这种方便,我们教室里还有一大帮人,其实这种什么不止用于查找电话铺,还可以运用到实际生活中,教室里有这么多人,坦白说,按学校的老方法一个人一个人的数,对所有老师来说都及其费力,那我们想想,是不是数数2368,这样好点对吗?。不要小看这种想法,他其实是非常棒的,他能把解决问题的时间缩短一半,因此我们提出了这种算法 2、新课: 首先我们一起来看一看折半查询算法中的“折半”的含义。 师:何为折半呢? 生:减半;打一半的折扣。 例如,我手里拿着一根绳子,现在我们来进行折半试验,首先拿住绳子的两个端点, 然后从中点的位置进行对折,这样绳子就缩短为原来长度一半,然后将一半的绳子继续执行与刚才相同的操作,使得绳子的长度逐渐的缩短,直到绳子长度短得不能再进行折半了。 师:那什么时候就不能再折半了呢? 生:即绳子的两个端点合二为一为止。 折半查找算法的思想与绳子折半的过程基本相同。下面我们先通过图示来看看折半查找算法究竟是什么? 教学步骤二:分解对分查找算法(5分钟)

各种查找算法性能分析

项目名称:各种查找算法的性能测试 项目成员: 组编号: 完成时间: 目录 前言 (2) 正文 (2) 第一章简介 (2) 1.1顺序查找问题描述 (2) 1.2二分查找问题描述 (2) 第二章算法定义 (2) 2.1顺序查找算法定义 (2) 2.2二分查找算法定义 (3) 第三章测试结果(Testing Results) (5) 3.1 实验结果表 (5) 3.2 散点图记录 (5) 第四章分析和讨论 (6) 4.1顺序查找分析 (6) 4.2二分查找分析 (6) 附录:源代码(基于C语言的) (7) 声明 (13)

前言 查找问题就是在给定的集合(或者是多重集,它允许多个元素具有相同的值)中找寻一个给定的值,我们称之为查找键。 对于查找问题来说,没有一种算法在任何情况下是都是最优的。有些算法速度比其他算法快,但是需要较多的存储空间;有些算法速度非常快,但仅适用于有序数组。查找问题没有稳定性的问题,但会发生其他的问题(动态查找表)。 在数据结构课程中,我们已经学过了几种查找算法,比较有代表性的有顺序查找(蛮力查找),二分查找(采用分治技术),哈希查找(理论上来讲是最好的查找方法)。 第一章:简介(Introduction) 1.1顺序查找问题描述: 顺序查找从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功。 1.2二分查找问题描述: (1)分析掌握折半查找算法思想,在此基础上,设计出递归算法和循环结构两种实现方法的折半查找函数。 (2)编写程序实现:在保存于数组a[i]有序数据元素中查找数据元素k是否存在。数元素k要包含两种情况:一种是数据元素k包含在数组中;另一种是数据元素k不包含在数组中 (3)数组中数据元素的有序化既可以初始赋值时实现,也可以设计一个排序函数实现。(4)根据两种方法的实际运行时间,进行两种方法时间效率的分析对比。 第二章:算法定义(Algorithm Specification) 2.1顺序查找 从表的一端向另一端逐个进行记录的关键字和给定值(要查找的元素)的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查找记录;反之,若直至第一个记录,其关键

二分查找算法详解

二分查找算法详解 二分查找算法,是一种在有序数组中查找某一特定元素的搜索算法。 注意两点: (1)有序:查找之前元素必须是有序的,可以是数字值有序,也可以是字典序。为什么必须有序呢?如果部分有序或循环有序可以吗? (2)数组:所有逻辑相邻的元素在物理存储上也是相邻的,确保可以随机存取。 算法思想: 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。 这里我们可以看到: (1) 如果查找值和中间值不相等的时候,我们可以确保可以下次的搜索范围可以缩小一半,正是由于所有元素都是有序的这一先决条件 (2) 我们每次查找的范围都是理应包含查找值的区间,当搜索停止时,如果仍未查找到,那么此时的搜索位置就应该是查找值应该处于的位置,只是该值不在数组中而已算法实现及各种变形: 1. 非降序数组A, 查找任一个值==val的元素,若找到则返回下标位置,若未找到则返回-1 2. 非降序数组A, 查找第一个值==val的元素,若找到则返回下标位置,若未找到则返回-1 (类似:查找数组中元素最后一个小于val 值的位置) 3. 非降序数组A, 查找最后一个值==val的元素,若找到则返回下标位置,若未找到则返回-1 (类似:查找数组中元素第一个大于val 值的位置) 4. 非降序数组A, 查找任一值为val的元素,保证插入该元素后数组仍然有序,返回可以插入的任一位置 5. 非降序数组A, 查找任一值为val的元素,保证插入该元素后数组仍然有序,返回可以插入的第一个位置 6. 非降序数组A, 查找任一值为val的元素,保证插入该元素后数组仍然有序,返回可以插入的最后一个位置 7. 非降序数组A, 查找任一个值==val的元素,若找到则返回一组下标区间(该区间所有值==val),若未找到则返回-1 8. 非降序字符串数组A, 查找任一个值==val的元素,若找到则返回下标位置,若未找到则返回-1(类似:未找到时返回应该插入点) 9. 循环有序数组中查找== val 的元素,若找到则返回下标位置,若未找到则返回-1 1. 非降序数组A, 查找任一个值==val的元素,若找到则返回下标位置,若未找到则返回-1 1 int binary_search(int* a, int len, int val) 2 { 3 assert(a != NULL && len > 0); 4 int low = 0; 5 int high = len - 1;

大数据结构-实验8查找地算法

8.1 实现顺序查找的算法 一,实验目的 1.熟悉掌握各种查找方法,深刻理解各种查找算法及其执行的过程; 2.学会分析各种查找算法的性能。 二,实验内容 8.1 实现顺序查找的算法 编写一个程序,输出在顺序表{3,6,2,10,1,8,5,7,4,9}中采用顺序查找法查找 关键字5的结果。 8.2 实现折半查找算法 编写一个程序,输出在顺序表{1,2,3,4,5,6,7,8,9,10}中采用折半查找方法查 找关键字9的结果。要求:(1)用非递归方法;(2)用递归方法。 8.3 实现二叉排序树的基本运算 编写一个程序实现二叉排序树的基本运算,并在此基础上完成如下功能: (1)由{4,9,0,1,8,6,3,5,2,7}创建一个二叉排序树bt; (2)判断bt是否为一棵二叉排序树(提示:在遍历过程中检查是否符合二叉 排序树定义); (3)采用非递归方法查找关键字为6的结点,并输出其查找路径(提示:查找过程中保留经过的结点信息,找到后顺序输出之)。 8.4 实现哈希表的相关运算 编写一个程序,实现哈希表的相关运算,并在此基础上完成如下功能: (1)建立{16,74,60,43,54,90,46,31,29,88,77}哈希表A[0…12],哈希函数为H(k)=key % 11,并采用线性探测法解决冲突。输出哈希表; (2)在上述哈希表中查找关键字为29的记录; (3)在上述哈希表中删除关键字为77的记录,再将其插入,然后输出哈希表。 要求:输出格式 哈希地址:0 1 2 (12) 关键字值:…………………… 三,源代码及结果截图 8.1 //实现顺序查找的算法 #include #define MAXL 100 //定义表中最多记录个数 typedef int KeyType; typedef int InfoType; typedef struct { KeyType key; //KeyType为关键字的数据类型 InfoType data; //其他数据 } NodeType;

操作系统模拟进程调度算法

操作系统 ——项目文档报告 进程调度算法 专业: 班级: 指导教师: 姓名: 学号:

一、核心算法思想 1.先来先服务调度算法 先来先服务调度算法是一种最简单的调度算法,该算法既可以用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将他们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。 2.短作业(进程)优先调度算法 短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。它们可以分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度。SJ(P)F调度算法能有效地降低作业(进程)的平均等待时间,提高系统吞吐量。该算法对长作业不利,完全未考虑作业的紧迫程度。 3.高响应比优先调度算法 在批处理系统中,短作业优先算法是一种比较好的算法,其主要不足之处是长作业的运行得不到保证。如果我们能为每个作业引人动态优先权,并使作业的优先级随着等待时间的增加而以速率a提高,则长作业在等待一定的时间后,必然有机会分配到处理机。该优先权的变化规律可描述为: 优先权=(等待时间+要求服务时间)/要求服务时间 即优先权=响应时间/要求服务时间 如果作业的等待时间相同,则要求服务的时间越短,其优先权越高,因而该算法有利于短作业。 当要球服务的时间相同时,作业的优先权决定于其等待时间,等待时间越长,优先权越高,因而它实现的是先来先服务 对于长作业,作业的优先级可以随着等待时间的增加而提高,当其等待时间足够长时,其优先级便可以升到很高,从而也可获得处理机。 4.时间片轮转算法 在时间片轮转算法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,由一个计数器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。换言之,系统能在给定的时间内响应所有用户的请求。 二、核心算法流程图

数据结构折半查找算法

#include #include #define MAX_LENGTH 100 typedef int KeyType; typedef struct { int key; }ElemType; typedef struct { ElemType elem[MAX_LENGTH]; // 0号单元空出int length; }SSTable; int Search_Bin(SSTable ST,KeyType key) { int low,high,mid; low = 1;high = ST.length; while(low <=high) { mid = (low+high)/2; if(key ==ST.elem[mid].key) return mid; else if(key

for(i=1;i<=ST.length;i++) { printf("please input ST.elem:"); scanf("%d",&ST.elem[i]); } printf("please input keyword:"); scanf("%d",&key); result=Search_Bin(ST,key); if(result==0) printf("Don't find\n"); else printf("Find the key,the position is %d\n",result); }

模拟一种处理机调度算法

课程设计报告 设计名称:模拟实现一种处理机调度算法 学生姓名: xxx 专业:计算机科学与技术 班别: xxxxxxxx 学号: xxxxxx 指导老师: xxxxx 日期: 2014 年 6 月 20 日

初始条件: 1.预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。 2.实践准备:掌握一种计算机高级语言的使用。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1.模拟进程调度,能够处理以下的情形: ⑴能够选择不同的调度算法(要求中给出的调度算法); ⑵能够输入进程的基本信息,如进程名、优先级、到达 时间和运行时间等; ⑶根据选择的调度算法显示进程调度队列; ⑷根据选择的调度算法计算平均周转时间和平均带权周 转时间。 2.设计报告内容应说明: ⑴需求分析; ⑵功能设计(数据结构及模块说明); ⑶开发平台及源程序的主要部分; ⑷测试用例,运行结果与运行情况分析; ⑸自我评价与总结: i)你认为你完成的设计哪些地方做得比较好或比较出 色; ii)什么地方做得不太好,以后如何改正;

iii)从本设计得到的收获(在编写,调试,执行过程中 的经验和教训); iv)完成本题是否有其他方法(如果有,简要说明该方 法); 进程调度模拟设计——先来先服务、优先级法1、背景: 当计算机系统是多道程序设计系统时,通常会有多个进程或线程同时竞争CPU。只要有两个或更多的进程处于就绪状态,这种情形就会发生。如果只有一个CPU可用,那么就必须选择下一个要运行的进程。在操作系统中,完成选择工作的这一部分称为调度程序,该程序使用的算法成为调度算法。 进程调度的核心问题是采用什么样的算法把处理机分配给进程,好的算法将提高资源利用率,减少处理机的空闲时间,避免有些作业长期得不到相应的情况发生等,从而设计出受欢迎的操作系统。较常见的几种进程调度算法有:先来先服务调度算法;短作业优先调度算法;时间片轮转调度算法;优先级调度算法;高响应比优先算法和多级反馈队列调度算法等。 2.1设计目的 无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机

各种查找算法的性能比较测试(顺序查找、二分查找)

算法设计与分析各种查找算法的性能测试

目录 摘要 (3) 第一章:简介(Introduction) (4) 1.1 算法背景 (4) 第二章:算法定义(Algorithm Specification) (4) 2.1 数据结构 (4) 2.2顺序查找法的伪代码 (5) 2.3 二分查找(递归)法的伪代码 (5) 2.4 二分查找(非递归)法的伪代码 (6) 第三章:测试结果(Testing Results) (8) 3.1 测试案例表 (8) 3.2 散点图 (9) 第四章:分析和讨论 (11) 4.1 顺序查找 (11) 4.1.1 基本原理 (11) 4.2.2 时间复杂度分析 (11) 4.2.3优缺点 (11) 4.2.4该进的方法 (12) 4.2 二分查找(递归与非递归) (12) 4.2.1 基本原理 (12) 4.2.2 时间复杂度分析 (13) 4.2.3优缺点 (13) 4.2.4 改进的方法 (13) 附录:源代码(基于C语言的) (15) 声明 ................................................................................................................ 错误!未定义书签。

摘要 在计算机许多应用领域中,查找操作都是十分重要的研究技术。查找效率的好坏直接影响应用软件的性能,而查找算法又分静态查找和动态查找。 我们设置待查找表的元素为整数,用不同的测试数据做测试比较,长度取固定的三种,对象由随机数生成,无需人工干预来选择或者输入数据。比较的指标为关键字的查找次数。经过比较可以看到,当规模不断增加时,各种算法之间的差别是很大的。这三种查找方法中,顺序查找是一次从序列开始从头到尾逐个检查,是最简单的查找方法,但比较次数最多,虽说二分查找的效率比顺序查找高,但二分查找只适用于有序表,且限于顺序存储结构。 关键字:顺序查找、二分查找(递归与非递归)

数据结构与算法——查找方法综合实例

查找方法综合实例 1.问题描述 任意给出一组关键字序列,如{34, 44, 43, 12, 53, 55, 73, 64, 77},n=9。应用常用的查找方法——顺序查找和二分查找方法进行查找。 2.设计要求 编写完整的可运行程序。要求使用菜单的方式,使用户可以任意选择查找方法进行查找给定的关键字,并输出查找后的结果。 3.数据结构 typedef int Keytype; typedef struct{ Keytype key; … } SElemType; typedef struct{ SElemType *elem; int length; } SeqTable; 4.源代码 #include #define MAXSIZE 11 typedef int Keytype; typedef struct { Keytype key; } SElemType; typedef struct { SElemType *elem; //数据元素存储空间基址 int length; //表的长度 } SeqTable; void Print(SElemType r[],int n) { int i; for(i=1;i<=n;i++)

printf("%3d",r[i]); printf("\n"); } //冒泡排序 void BubbleSort(SElemType r[],int n) //对表中的第1到第n个记录进行冒泡排序,r[0]为临时交换空间{ int i,j,Exchanged; for(i=1;i<=n;i++) { Exchanged=0; //Exchanged=0未发生交换 for(j=1;jr[j+1].key) { r[0]=r[j]; r[j]=r[j+1]; r[j+1]=r[0]; Exchanged=1; //Exchanged=1发生交换 } if(Exchanged==0) //若未交换,排序结束 break; } Print(r,n); } //顺序查找 int SearchSeq(SeqTable ST,Keytype key) //在顺序表ST中顺序查找其关键字key的数据元素 { int i; ST.elem[ST.length].key=key; //监视哨 for(i=1;ST.elem[i].key!=key;i++) ; if(i

相关文档
最新文档