《MIS系统软件》实验报告(共20页).doc
精选优质文档-倾情为你奉上学生学号 实验课成绩学 生 实 验 报 告 书实验课程名称MIS系统软件开课学院管理学院指导教师姓名学生姓名学生专业班级2010-2011学年第一学期实验项目名称加密解密算法实验成绩实 验 者专业班级组 别同 组 者实验日期2010年 11月22日第一部分:实验预习报告1、 实验目的、意义通过简单的加密解密算法的实现理解系统中加密解密的基本思想,熟练掌握使用C语言基本语句。2、 实验基本原理与方法单字母替换加密方法恺撒密码加密方法是把英文字母按字母表的顺序编号作为明文,将密钥定为m,加密算法为将明文加上密钥m,得到密码表,通过相反的过程由密文得到明文。单字母替换加密方法单表置换密码 由密钥Key构造字符置换表,完成加密和解密过程。多字母替换加密方法维吉利亚密码假设明文m=m1 m2 m3 mn;密钥k=k1k2 k3 kn,对应密文c=c1 c2 c3 cn,密文为:ci=(mi+ki )mod 26 ,26个字母的序号依次为025,ci , mi ,ki是分别是密文明文密钥中第i个字母的序号。转换加密方法 通过将明文每m个字符一组按顺序分为若干个字符串,再按照先列后行形成密文,并分析给出解密的方法。 或者通过给出一个密钥字符串,将明文按密钥字符串长度按顺序分为若干组字符串,再按照密钥字符串各个字符的顺序形成密文,并分析给出解密的方法。3、 主要仪器设备及耗材实验室提供计算机和上网条件,C语言上机环境。4、 实验方案与技术路线(综合性、设计性实验)(1)选定一种加密解密算法,对该算法实现的思路进行分析;(2)编程实现选定的算法(3)对所编写的程序进行调试(4)对程序运行的结果进行截图(5)对实验结果进行分析第二部分:实验过程记录实验原始记录(包括实验数据记录,实验现象记录,实验过程发现的问题等)(1)实验数据和文件(2)程序运行主菜单界面(3)单字母替换加密主菜单界面下,选择1,进入单字母替换加密算法,直接由屏幕输入字符,过程如下:输入字符串“zhuli”,但击回车键,屏幕输出加密后的字符“asfor”(钥为默认值),同时显示出子菜单,进行下一步的选择。进行解密操作步骤如下:输入字符串“asfor”,但击回车键,屏幕输出解密后的字符“zhuli”,同时显示出子菜单,进行下一步的选择。返回主菜单步骤如下:(4)凯撒加密算法文件操作在主菜单下,选择选项2,则进入子菜单二,如下图选择1,进行文件的加密操作,操作步骤如下图:选择in.txt文件,对其加密,采用凯瑟加密算法,密钥设置为2,加密后的内容写入文件out.txt文件中。in.txt文件和out.txt文件中的内容如下图所示:接着选择解密文件,对out.txt文件中的内容进行解密,操作步骤如下:output.txt文件中的内容如下,与源文件内容相同:(5)暴力破解文件过程如下选择子菜单2中的菜单3项,输入要破解的文件名,屏幕显示文件的内容,如下图第三部分 结果与讨论(可加页)实验结果分析(包括数据处理、实验现象分析、影响因素讨论、综合分析和结论等)程序设计类实验:包括原程序、输入数据、运行结果、实验过程发现的问题及解决方法等;分析与设计、软件工程类实验:编制分析与设计报告,要求用标准的绘图工具绘制文档中的图表。系统实施部分要求记录核心处理的方法、技巧或程序段;其它实验:记录实验输入数据、处理模型、输出数据及结果分析(1)源代码#include<stdio.h>#include<conio.h> #include<stdlib.h>#include<dos.h>/#include<graphics.h>#define M 100char encrypt(char ch,int n)/*加密函数,把字符向右循环移位n*/while(ch>='A'&&ch<='Z')return ('A'+(ch-'A'+n)%26);while(ch>='a'&&ch<='z')return ('a'+(ch-'a'+n)%26);return ch;void exit( int exit_code ); void sleep(int n)int i=0,j=0;for(j=0;j<=n;j+)for(i=0;i<2000;i+)i+;void menu1()/*菜单,1.字母倒排序,2.恺撒密码*/ system("CLS"); printf("n=信管0804班祝黎="); printf("n1.字母倒排序"); printf("n2.恺撒密码"); printf("n3.Quitn"); printf("=n"); printf("Please select a item:"); return;void menu()/*菜单,1.加密,2.解密,3.暴力破解,密码只能是数字*/system("CLS");/clrscr();printf("n=");printf("n1.Encrypt the file");printf("n2.Decrypt the file");printf("n3.Force decrypt file");printf("n4.Quitn");printf("=n");printf("Please select a item:");return;void main()int i,n;char ch0,ch1,ch2;int s,j,a;char str1M='0', str2M='0'FILE *in,*out;char infile20,outfile20;/textbackground(0);/textcolor(10);system("CLS");/clrscr();sleep(3);/*等待3秒*/menu1();ch0=getch();printf("%c",ch0);while(ch0!='3')if(ch0='1')/system("CLS");/clrscr();printf("n");printf("1. 加密n");printf("2. 解密n");printf("3. 返回上级菜单n"); /printf("4. Quitn");printf("the way you choose:");scanf("%d",&a);switch(a) case 1: printf("请输入要加密的原文n");fflush(stdin);gets(str1);s=strlen(str1);for(j=0;j<s;j+)str2j=219-str1j;printf("得到密文是:n");puts(str2); break; case 2: printf("请输入要解密的密文:n");fflush(stdin);gets(str1);s=strlen(str1);for(j=0;j<s;j+)str2j=219-str1j;printf("得到原文:n");puts(str2); break; case 3: /menu1(); break; default:printf("输入错误"); menu1();ch0=getch();/if(ch0='1')if(ch0='2')system("CLS");/clrscr();menu();ch2=getch();while(ch2!='4')if(ch2='1') system("CLS");/clrscr(); printf("nPlease input the infile:"); scanf("%s",infile);/*输入需要加密的文件名*/ if(in=fopen(infile,"r")=NULL)printf("Can not open the infile!n");printf("Press any key to exit!n");getch();exit(0); printf("Please input the key:"); scanf("%d",&n);/*输入加密密码*/ printf("Please input the outfile:"); scanf("%s",outfile);/*输入加密后文件的文件名*/ if(out=fopen(outfile,"w")=NULL) printf("Can not open the outfile!n");printf("Press any key to exit!n");fclose(in);getch();exit(0); while(!feof(in)/*加密*/ fputc(encrypt(fgetc(in),n),out); printf("nEncrypt is over!n"); fclose(in); fclose(out); sleep(1);/if(ch2='1') if(ch2='2') system("CLS");/clrscr();printf("nPlease input the infile:");scanf("%s",infile);/*输入需要解密的文件名*/if(in=fopen(infile,"r")=NULL) printf("Can not open the infile!n");printf("Press any key to exit!n");getch();exit(0); printf("Please input the key:"); scanf("%d",&n);/*输入解密密码(可以为加密时候的密码)*/ n=26-n; printf("Please input the outfile:"); scanf("%s",outfile);/*输入解密后文件的文件名*/ if(out=fopen(outfile,"w")=NULL) printf("Can not open the outfile!n");printf("Press any key to exit!n");fclose(in);getch();exit(0); while(!feof(in) fputc(encrypt(fgetc(in),n),out); printf("nDecrypt is over!n"); fclose(in); fclose(out); sleep(1); /if(ch2='2') if(ch2='3') system("CLS");/clrscr(); printf("nPlease input the infile:"); scanf("%s",infile);/*输入需要解密的文件名*/ if(in=fopen(infile,"r")=NULL) printf("Can not open the infile!n");printf("Press any key to exit!n");getch();exit(0); printf("Please input the outfile:"); scanf("%s",outfile);/*输入解密后文件的文件名*/ if(out=fopen(outfile,"w")=NULL) printf("Can not open the outfile!n");printf("Press any key to exit!n");fclose(in);getch();exit(0); for(i=1;i<=25;i+)/*暴力破解过程,在察看信息正确后,可以按'Q'或者'q'退出*/ rewind(in);rewind(out);system("CLS");/clrscr();printf("=n");printf("The outfile is:n");printf("=n");while(!feof(in) ch1=encrypt(fgetc(in),26-i); putch(ch1); fputc(ch1,out);printf("n=n");printf("The current key is: %d n",i);/*显示当前破解所用密码*/printf("Press 'Q' to quit and other key to continue.n");printf("=n");ch1=getch();if(ch1='q'|ch1='Q')/*按'Q'或者'q'时退出*/system("CLS");/clrscr();printf("nGood Bye!n");fclose(in);fclose(out);sleep(3);exit(0); printf("nForce decrypt is over!n"); fclose(in); fclose(out); sleep(1);/if(ch2='3') menu();ch2=getch();/while(ch2!='4')menu1();ch0=getch();/if(ch0='2')/while(ch0!='3')system("CLS");/clrscr();printf("nGood Bye!n");sleep(3);(2)结论采用单字母替换加密能够轻易实现字符或文件的加密工作,但同时也容易被破解,要想有更安全的加密,则需选择更加安全的算法。实验报告评语及成绩(请按优,良,中,及格,不及格五级评定) 成绩: 教师签字:实验项目名称进程管理实验实验成绩实 验 者专业班级组 别同 组 者实验日期2010 年11月28日第一部分:实验预习报告1、 实验目的、意义用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。2、 实验基本原理与方法进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。 每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。 每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。 进程的运行时间以时间片为单位进行计算。如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。3、 主要仪器设备及耗材实验室提供计算机和上网条件,C语言上机环境。4、 实验方案与技术路线(综合性、设计性实验)第二部分:实验过程记录实验原始记录(包括实验数据记录,实验现象记录,实验过程发现的问题等)(1)输入一个进程号和优先级以及运行时间,如下:依次执行,执行过程如下:当运行的时间达到时,进程结束,如下第三部分 结果与讨论(可加页)实验结果分析(包括数据处理、实验现象分析、影响因素讨论、综合分析和结论等)程序设计类实验:包括源程序、输入数据、运行结果、实验过程发现的问题及解决方法等;分析与设计、软件工程类实验:编制分析与设计报告,要求用标准的绘图工具绘制文档中的图表。系统实施部分要求记录核心处理的方法、技巧或程序段;其它实验:记录实验输入数据、处理模型、输出数据及结果分析(1)源程序#include <stdio.h>#include <stdlib.h> #include <conio.h>#include<windows.h> #define getpch(type) (type*)malloc(sizeof(type) #define NULL 0 struct pcb /* 定义进程控制块PCB */ char name10; char state; int super; int ntime; int rtime; struct pcb* link; *ready=NULL,*p; typedef struct pcb PCB; void sort() /* 建立对进程进行优先级排列函数*/ PCB *first, *second; int insert=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; void input() /* 建立进程控制块函数*/ int i,num; system("CLS");/clrscr(); /*清屏*/ printf("n 请输入进程号:"); scanf("%d",&num); for(i=0;i<num;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函数*/ int space() int l=0; PCB* pr=ready; while(pr!=NULL) l+; pr=pr->link; return(l); void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ printf("n qname t state t super t ndtime t runtime n"); printf("|%st",pr->name); printf("|%ct",pr->state); printf("|%dt",pr->super); printf("|%dt",pr->ntime); printf("|%dt",pr->rtime); printf("n"); void check() /* 建立进程查看函数 */ PCB* pr; printf("n * 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/ disp(p); pr=ready; printf("n *当前就绪队列状态为:n"); /*显示就绪队列状态*/ while(pr!=NULL) disp(pr); pr=pr->link; void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ printf("n 进程 %s 已完成.n",p->name); free(p); void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ (p->rtime)+; if(p->rtime=p->ntime) destroy(); /* 调用destroy函数*/ else (p->super)-; p->state='w' sort(); /*调用sort函数*/ void main() /*主函数*/ int len,h=0; input(); len=space(); while(len!=0)&&(ready!=NULL) getchar(); h+; printf("n The execute number:%d n",h); p=ready; ready=p->link; p->link=NULL; p->state='R' check(); running(); printf("n 按任一键继续."); getchar(); printf("nn 进程已经完成.n"); getchar(); (2)结论“最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。 静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。 动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。实验报告评语及成绩(请按优,良,中,及格,不及格五级评定) 成绩: 教师签字:专心-专注-专业