《MIS系统软件》实验指导书.docx
《《MIS系统软件》实验指导书.docx》由会员分享,可在线阅读,更多相关《《MIS系统软件》实验指导书.docx(18页珍藏版)》请在冰豆网上搜索。
《MIS系统软件》实验指导书
《MIS系统软件》实验指导书
课程名称:
MIS系统软件/OperationSystem
实验总学时数:
18
适应专业:
信息管理与信息系统
承担实验室:
管理学院计算机实验室
一、实验目的和任务
依据边学习、边实践的原则,让学生在学习过程中通过实验进一步巩固所学的理论与思想,培养学生的实际动手能力。
通过使用高级语言编写程序,加深对高级语言掌握和使用;通过用高级语言实现操作系统中的加密和进程管理的程序设计,从而加深对操作操作系统的理解和使用。
二、实验项目及学时分配
序号
实验项目名称
实验学时
实验类型
开出要求
1
加密解密算法
6
验证
必做
2
进程管理实验
12
综合
必做
三、参考资料
教材:
汤子瀛《计算机操作系统》
西安电子科技大学出版社2005年
实验指导书:
自编《MIS系统软件》实验指导2006年
参考书:
郁红英冯庚豹主编:
《计算机操作系统》
人民邮电出版社
LubomirF.BicAlanC.Shaw主编:
《操作系统原理》
清华大学出版社
庞丽萍主编:
《操作系统原理》
华中理工大学出版社
四、单项实验的内容和要求(包括实验所用的主要仪器设备,实验所需主要耗材)
实验一加密解密算法
1.实验目的与意义
1.通过简单的加密解密算法的实现理解系统中加密解密的基本思想
2.熟练掌握使用C语言基本语句
2.基本原理和方法
常见加密解密算法的实现思想
3.主要仪器设备及耗材
实验所用的主要仪器设备:
计算机(安装C语言)
实验所需主要耗材的品种及数量:
无
4.实验内容及步骤
(1)选定一种加密解密算法,对该算法实现的思路进行分析;
(2)编程实现选定的算法
(3)对所编写的程序进行调试
(4)对程序运行的结果进行截图
(5)对实验结果进行分析
5.部分参考代码
(1)单字母替换加密方法——字母倒排序
#defineM100
main()
{
ints,i,a;
charstr1[M]={'0'},str2[M]={'0'};
printf("menu\n");
printf("1.加密\n");
printf("2.解密\n");
printf("thewayyouchoose:
");
scanf("%d",&a);
switch(a)
{
case1:
{
printf("请输入要加密的原文\n");
gets(str1);
s=strlen(str1);
for(i=0;i
str2[i]=219-str1[i];
printf("得到密文是:
\n");
puts(str2);
}break;
case2:
{
printf("请输入要解密的密文:
\n");
gets(str1);
s=strlen(str1);
for(i=0;i
str2[i]=219-str1[i];
printf("得到原文:
\n");
puts(str2);
}break;
default:
printf("输入错误");
}
}
(2)kaiser加密算法
具体程序:
#include
#include
charencrypt(charch,intn)/*加密函数,把字符向右循环移位n*/
{
while(ch>='A'&&ch<='Z')
{
return('A'+(ch-'A'+n)%26);
}
while(ch>='a'&&ch<='z')
{
return('a'+(ch-'a'+n)%26);
}
returnch;
}
voidmenu()/*菜单,1.加密,2.解密,3.暴力破解,密码只能是数字*/
{
clrscr();
printf("\n=========================================================");
printf("\n1.Encryptthefile");
printf("\n2.Decryptthefile");
printf("\n3.Forcedecryptfile");
printf("\n4.Quit\n");
printf("=========================================================\n");
printf("Pleaseselectaitem:
");
return;
}
main()
{
inti,n;
charch0,ch1;
FILE*in,*out;
charinfile[20],outfile[20];
textbackground(BLACK);
textcolor(LIGHTGREEN);
clrscr();
sleep(3);/*等待3秒*/
menu();
ch0=getch();
while(ch0!
='4')
{
if(ch0=='1')
{
clrscr();
printf("\nPleaseinputtheinfile:
");
scanf("%s",infile);/*输入需要加密的文件名*/
if((in=fopen(infile,"r"))==NULL)
{
printf("Cannotopentheinfile!
\n");
printf("Pressanykeytoexit!
\n");
getch();
exit(0);
}
printf("Pleaseinputthekey:
");
scanf("%d",&n);/*输入加密密码*/
printf("Pleaseinputtheoutfile:
");
scanf("%s",outfile);/*输入加密后文件的文件名*/
if((out=fopen(outfile,"w"))==NULL)
{
printf("Cannotopentheoutfile!
\n");
printf("Pressanykeytoexit!
\n");
fclose(in);
getch();
exit(0);
}
while(!
feof(in))/*加密*/
{
fputc(encrypt(fgetc(in),n),out);
}
printf("\nEncryptisover!
\n");
fclose(in);
fclose(out);
sleep
(1);
}
if(ch0=='2')
{
clrscr();
printf("\nPleaseinputtheinfile:
");
scanf("%s",infile);/*输入需要解密的文件名*/
if((in=fopen(infile,"r"))==NULL)
{
printf("Cannotopentheinfile!
\n");
printf("Pressanykeytoexit!
\n");
getch();
exit(0);
}
printf("Pleaseinputthekey:
");
scanf("%d",&n);/*输入解密密码(可以为加密时候的密码)*/
n=26-n;
printf("Pleaseinputtheoutfile:
");
scanf("%s",outfile);/*输入解密后文件的文件名*/
if((out=fopen(outfile,"w"))==NULL)
{
printf("Cannotopentheoutfile!
\n");
printf("Pressanykeytoexit!
\n");
fclose(in);
getch();
exit(0);
}
while(!
feof(in))
{
fputc(encrypt(fgetc(in),n),out);
}
printf("\nDecryptisover!
\n");
fclose(in);
fclose(out);
sleep
(1);
}
if(ch0=='3')
{
clrscr();
printf("\nPleaseinputtheinfile:
");
scanf("%s",infile);/*输入需要解密的文件名*/
if((in=fopen(infile,"r"))==NULL)
{
printf("Cannotopentheinfile!
\n");
printf("Pressanykeytoexit!
\n");
getch();
exit(0);
}
printf("Pleaseinputtheoutfile:
");
scanf("%s",outfile);/*输入解密后文件的文件名*/
if((out=fopen(outfile,"w"))==NULL)
{
printf("Cannotopentheoutfile!
\n");
printf("Pressanykeytoexit!
\n");
fclose(in);
getch();
exit(0);
}
for(i=1;i<=25;i++)/*暴力破解过程,在察看信息正确后,可以按'Q'或者'q'退出*/
{
rewind(in);
rewind(out);
clrscr();
printf("==========================================================\n");
printf("Theoutfileis:
\n");
printf("==========================================================\n");
while(!
feof(in))
{
ch1=encrypt(fgetc(in),26-i);
putch(ch1);
fputc(ch1,out);
}
printf("\n========================================================\n");
printf("Thecurrentkeyis:
%d\n",i);/*显示当前破解所用密码*/
printf("Press'Q'toquitandotherkeytocontinue......\n");
printf("==========================================================\n");
ch1=getch();
if(ch1=='q'||ch1=='Q')/*按'Q'或者'q'时退出*/
{
clrscr();
printf("\nGoodBye!
\n");
fclose(in);
fclose(out);
sleep(3);
exit(0);
}
}
printf("\nForcedecryptisover!
\n");
fclose(in);
fclose(out);
sleep
(1);
}
menu();
ch0=getch();
}
clrscr();
printf("\nGoodBye!
\n");
sleep(3);
}
实验二进程管理实验
1.实验目的与意义
用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
2.基本原理和方法
进程调度算法:
采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:
进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
进程的运行时间以时间片为单位进行计算。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
3.主要仪器设备及耗材
实验室提供的计算机设备和基本的网络环境,安装实验中所要使用的应用软件(TurboCforWindows集成实验与学习环境,或者Turboc++3.1forWindows)。
4.实验内容及步骤
(1)选定一种进程调度算法,对该算法实现的思路进行分析;
调度算法的流程图如下:
(2)编程实现所选定的进程调度算法
(3)对所编写的程序进行调试
(4)对程序运行的结果进行截图
(5)对实验结果进行分析
5.部分参考代码
#include"stdio.h"
#include
#include
#definegetpch(type)(type*)malloc(sizeof(type))
#defineNULL0
structpcb{/*定义进程控制块PCB*/
charname[10];
charstate;
intsuper;
intntime;
intrtime;
structpcb*link;
}*ready=NULL,*p;
typedefstructpcbPCB;
sort()/*建立对进程进行优先级排列函数*/
{
PCB*first,*second;
intinsert=0;
if((ready==NULL)||((p->super)>(ready->super)))/*优先级最大者,插入队首*/
{
p->link=ready;
ready=p;
}
else/*进程比较优先级,插入适当的位置中*/
{
first=ready;
second=first->link;
while(second!
=NULL)
{
if((p->super)>(second->super))/*若插入进程比当前进程优先数大,*/
{/*插入到当前进程前面*/
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else/*插入进程优先数最低,则插入到队尾*/
{
first=first->link;
second=second->link;
}
}
if(insert==0)first->link=p;
}
}
input()/*建立进程控制块函数*/
{
inti,num;
clrscr();/*清屏*/
printf("\n请输入进程号?
");
scanf("%d",&num);
for(i=0;i{
printf("\n进程号No.%d:
\n",i);
p=getpch(PCB);
printf("\n输入进程名:
");
scanf("%s",p->name);
printf("\n输入进程优先数:
");
scanf("%d",&p->super);
printf("\n输入进程运行时间:
");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0;p->state='w';
p->link=NULL;
sort();/*调用sort函数*/
}
}
intspace()
{
intl=0;PCB*pr=ready;
while(pr!
=NULL)
{
l++;
pr=pr->link;
}
return(l);
}
disp(PCB*pr)/*建立进程显示函数,用于显示当前进程*/
{
printf("\nqname\tstate\tsuper\tndtime\truntime\n");
printf("|%s\t",pr->name);
printf("|%c\t",pr->state);
printf("|%d\t",pr->super);
printf("|%d\t",pr->ntime);
printf("|%d\t",pr->rtime);
printf("\n");
}
check()/*建立进程查看函数*/
{
PCB*pr;
printf("\n****当前正在运行的进程是:
%s",p->name);/*显示当前运行进程*/
disp(p);
pr=ready;
printf("\n****当前就绪队列状态为:
\n");/*显示就绪队列状态*/
while(pr!
=NULL)
{disp(pr);
pr=pr->link;}
}
destroy()/*建立进程撤消函数(进程运行结束,撤消进程)*/
{
printf("\n进程[%s]已完成.\n",p->name);
free(p);
}
running()/*建立进程就绪函数(进程运行时间到,置就绪状态*/
{
(p->rtime)++;
if(p->rtime==p->ntime)
destroy();/*调用destroy函数*/
else
{
(p->super)--;
p->state='w';
sort();/*调用sort函数*/
}
}
main()/*主函数*/
{
intlen,h=0;
charch;
input();
len=space();
while((len!
=0)&&(ready!
=NULL))
{
ch=getchar();
h++;
printf("\nTheexecutenumber:
%d\n",h);
p=ready;
ready=p->link;
p->link=NULL;
p->state='R';
check();
running();
printf("\n按任一键继续......");
ch=getchar();
}
printf("\n\n进程已经完成.\n");
ch=getchar();
}
执笔:
江长斌
审阅:
日期:
2006.12
审定:
日期:
2006.12