版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
标准文案学生学号 0120903490*** 实验课成绩学生实验报告书实验课程名称开课学院指导教师姓名学生姓名学生专业班级
MIS系统软件管理学院*****2011 -- 2012 学年 第 二 学期大全标准文案实验项目名称加密解密算法实验成绩实验者**专业班级信管0901班组别同组者无实验日期2012年03月07日大全标准文案第一部分:实验预习报告1、实验目的、意义通过简单的加密解密算法的实现理解系统中加密解密的基本思想,熟练掌握使用C语言基本语句。2、实验基本原理与方法①单字母替换加密方法——恺撒密码加密方法是把英文字母按字母表的顺序编号作为明文,将密钥定为 m,加密算法为将明文加上密钥 m,得到密码表,通过相反的过程由密文得到明文。②单字母替换加密方法——单表置换密码由密钥Key构造字符置换表,完成加密和解密过程。③多字母替换加密方法——维吉利亚密码假设明文 m=m1m2m3⋯mn;密钥k=k1k2k3 ⋯kn,对应密文 c=c1c2c3 ⋯cn,密文为:ci=(mi+ki )mod26,26个字母的序号依次为 0~25,ci,mi,,ki 是分别是密文明文密钥中第 i个字母的序号。④转换加密方法通过将明文每m个字符一组按顺序分为若干个字符串,再按照先列后行形成密文,并分析给出解密的方法。或者通过给出一个密钥字符串,将明文按密钥字符串长度按顺序分为若干组字符串,再按照密钥字符串各个字符的顺序形成密文,并分析给出解密的方法。3、主要仪器设备及耗材实验室提供计算机和上网条件, C语言上机环境。4、实验方案与技术路线(综合性、设计性实验)大全标准文案第二部分:实验过程记录实验原始记录(包括实验数据记录,实验现象记录,实验过程发现的问题等)单表置换:先选定一个单词,例如 BEIJINGTSINGHUA,然后将它排列在密码对照表(两行 26列第一行存a到z的字母,第二行存对照的密码)下方,重复出现的字母以第一次现时对应的明文字母为准;后面以该单词中未出现的字母按顺序排列备齐,生成一个密码,然后可以用此密码本进行加密或解密。加密过程:首先输入加密明文如important,然后输入密钥如BEIJINGTSINGHUA。再然后建立临时密码表如下:(上一行是字母,下一行是密码)之后,将important 对照第一行的相应密匙如 i 对应H,依次输出。结果应为 HDLKOQBFQ;解密过程:首先输入密文如 HDLKOQBFQ,然后输入密匙 BEIJINGTSINGHUA。同理加密过程,可以对照密码表依次找到密文中对应的原文。结果应为 important 。2.凯撒密码:把英文字母按字母表的顺序编号作为明文,将密钥定为 m,加密算法为将明文加上密钥 m,得到密码表,通过相反的过程由密文得到明文。加密过程:首先输入明文为 Thisisasecret, 然后输入密钥 9,之后同样会形成两行对应的同1方法一样的密码表:ABCDEFGHIJKLMNOPQRSTUVWXYZXYZABCDEFGHIJKLMNOPQRSTUVW之后,将自动输出加密后的密文,结果为: cqrb!rb!j!bnlanc ;解密过程:输入需要解密的密文如: cqrb!rb!j!bnlanc ,然后输入密钥 9(为简便起见,同加密过程使用同样的密钥) ,则得到加密过程中的同样密码表,然后依次对应输出原文,结果为Thisisasecret 。3.轮转法:大全标准文案通过将明文每 m个字符一组按顺序分为若干个字符串,再按照先列后行形成密文,并分析给出解密的方法。加密过程:首先输入明文 itcanallowstudentstogetcloseupviews ,然后输入密匙5,之后输入的明文会按照每行 3个字符的形式进行排列,如此例中形成如下的排列:之后,输出加密后的密文则使用先列后行的方法,此例结果为:iasngovtlttesiclusteeaodtcuwnweolps;解密过程:首先输入密文 icteccnrbouicumsanb ,然后输入密匙 5,之后同样会将输入的密文按照每行 3个字符的形式排列,形成如下排列:icbcaccountnumberis之后,输出解密后的明文使用先列后行的方法,此例结果为 icbcaccountnumberis 。维吉利亚密码:假设明文 m=m1m2m3⋯mn;密钥 k=k1k2k3 ⋯kn,对应密文 c=c1c2c3 ⋯cn,密文为:ci=(mi+ki )mod26,26个字母的序号依次为 0~25,ci,mi,,ki 是分别是密文明文密钥中第 i个字母的序号。(如下图)加密过程:首先输入明文如 information ,然后输入密匙如 star,第一个字符的密文可以求得c1=(w+i)mod26=4,,此时对应编号 4的字母为 E,则明文W对应的密文为 E,依次类推,可以将所有明文加密得到密文: AGFFJFAKAHN;大全标准文案解密过程:首先输入密文 esioqgm,然后输入与密文字符数相等的密匙如 iloveyu ,将加密过程的原理反过来运用,如第一个密文字符为 E,则对应的编号为 4,然后求的明文为 W,依次类推,求得明文为: whutmis。大全标准文案第三部分 结果与讨论(可加页)实验结果分析(包括数据处理、实验现象分析、影响因素讨论、综合分析和结论等)程序设计类实验: 包括原程序、输入数据、运行结果、实验过程发现的问题及解决方法等;分析与设计、软件工程类实验:编制分析与设计报告,要求用标准的绘图工具绘制文档中的图表。系统实施部分要求记录核心处理的方法、技巧或程序段;其它实验:记录实验输入数据、处理模型、输出数据及结果分析运行结果分析:在vc++6.0的编译环境下,点击运行后出现加密算法选择的界面:(1)凯撒密码选择1后回车,阅读完介绍性文字后,再接着选择 1进行对输入字符串进行加密(例如输入字符串"******'sbirthdayis" ,接着输入密钥 7):大全标准文案得到密文:govbephv(z!ipyaokhf!pz!此时我为了对一段字符串进行凯撒解密"govbephv(z!ipyaokhf!pz!",同时输入密钥7,同样会得到加密前的明文:(2)单表置换密码按照提示,回车后又进入加密算法选择主界面,此时选择 2. 单表置换密码,加密下面一句话todayisapril1,2012,namelyAprilfool'sday :大全标准文案得到密文 pjuzvenzkmed1,2012,gzfxdvAkmedijjd'nuzv ,(没有处理空格及标点符号等特殊字符,但加密效果已有) 。为了证明对应的解密是否正确,现进行解密环节,把刚才密文解密,从截图中可以看到当时加密使用的密钥时zhouxiaoyeah解密后的字符串跟之前原明文完全一样。(3)维吉利亚密码维吉利亚密码由于需要产生一个维吉利亚字母代换表,此处为了学习方便,在程序运行过程中特意将该表也打印到了屏幕:输入明文:guoqingjiekuaile ,密钥:whutms(此例为课件上一例子)大全标准文案选择解密过程,帮刚才的密文重新翻译成明文:(4)轮换算法主要函数介绍大全标准文案凯撒密码:voidkaisa_de();// 解密voidkaisa_en();// 加密void_kaisa(); 调用上面两个子函数单表置换加密:voiddbzh_alphabeta();// 产生代换字符表voiddbzh_en();// 产生密文,即加密voiddbzh_de();// 产生明文,即解密void_danbiaozhihuan(); 被main()调用,运行时根据选择调用上面的三个函数维吉利亚密码:voidwjly_en(); 维吉利亚加密函数voidwjly_de(); 解密函数int_weijiliya(); 调用加密解密函数轮换法加密:大全标准文案voidlunhuan_en();voidlunhuan_de();void_lunhuan();实验中的问题1)各个加密函数之间的基本上完全独立,内部定义了太多的自己变量,从空间上看运行起来占用空间较大。可以尝试定义几个全局变量,让他们共用。如输入的密文,密钥,产生的明文等等。2)操作不够人性化。由于时间的原因,没有在程序的界面上话太多工夫,比如运行完加密或者解密过程后,该转到第一个主界面(四个加密算法的选择界面)还是仍然留在当前密码方法的界面,退出时时直接退出控制台程序还是退出到开始界面。此外,程序的容错处理还不完善,一下非法输入还不能很友好的处理。操纵的人性化四种加密算法源代码:#include<iostream>#include<string>#include<ctype.h>#include<conio.h>#include<stdlib.h>usingnamespacestd;#defineMING_WEN1000//设明文长度最大为1000charmingwen[MING_WEN];//存放明文charmiwen[MING_WEN];//存放密文charmiyuejvzi[100];//密钥句子charalphabeta[27];//代换字母表stringstr="abcdefghijklmnopqrstuvwxyz";voidkaisa_de();//解密voidkaisa_en();//加密void_kaisa();voiddbzh_alphabeta();//产生代换字符表voiddbzh_en();//产生密文voiddbzh_de();//产生密文void_danbiaozhihuan();voidwjly_en();voidwjly_de();voidCreate_miyuejvzi(char);int_weijiliya();voidlunhuan_en();voidlunhuan_de();void_lunhuan();大全标准文案voidmain(){intchoice;printf(" \n");// 起始输出界面printf("-----------------------------------------\n");printf(" 信息管理与信息系统 **班\n\n");printf(" ** 学号:0120903490**\n");while(1)/* 循环测试*/{printf("\n");printf("*****************************************\n");printf("\n");printf(" | 加密解密方法 \n");printf("\n");printf(" | 1 、凯撒密码 \n");printf(" | 2 、单表置换 \n");printf(" | 3 、维吉利亚密码 \n");printf(" | 4 、轮换法 \n");printf(" | 5 、退出 \n");printf("----------------------------------------\n");printf(" 请输入1--5进行选择:");scanf("%d",&choice);while(choice>5||choice<=0)// 如果输入数字不符要求,重新输入,直至正确为止{printf("\n 请输入选项前面的编号 :");scanf("%d",&choice);}switch(choice)// 调用不同的解密加密算法{case1:_kaisa();break;// 凯撒密码case2:_danbiaozhihuan();break;// 单表置换密码case3:_weijiliya();break;// 维吉利亚密码case4:_lunhuan();break;// 轮换法case5:exit(0);// 退出程序}system("pause");/* 暂停*/system("cls"); /*清屏*/}}//凯撒密码void_kaisa(){intchoice;大全标准文案do{system("CLS");printf("\n");printf("\t\t 凯撒加密\n\t\t\t 请选择操作:\n");printf("\t\t\t1. 加密\n\t\t\t2. 解密\n\t\t\t3. 退出\n");printf("____________________________________________________________________\n");printf("%15c",'');printf(" 注:---- 恺撒密码按 c=(m+9)%%26加密----\n");printf("%19c",'');printf("---- 除字母其他字符均按 c=(m+1)%%26加密----\n");printf("%19c",'');printf("---- 当其他其它字符 +1为字母时+26跳过字母加密 ----\n");printf("%19c",'');printf("---- 当其他其它字符 +1超出 ASCII 码表示范围时 -128 循环表示----\n");scanf("%d",&choice);getchar();if(choice==1){kaisa_en();break;}elseif(choice==2){kaisa_de();break;}elseif(choice==3){printf("\n%33c",'');printf("3: 退出\n");exit(0);}else{printf(" 输入错误,按任意键继续 :\n");getchar();system("cls");}}while(choice!=1||choice!=2);}凯撒加密voidkaisa_en()// 加密大全标准文案{intleng,i,miyue;charchc[MING_WEN],chp[MING_WEN];printf(" 请输入你要加密的明文 :\n");printf("%28c",'');gets(chc);printf(" 请输入密钥(如数字9):");scanf("%d",&miyue);leng=strlen(chc);printf("%28c",'');printf(" 密文:\n");printf("%28c",'');for(i=0;i<leng;i++){if(isupper(chc[i])){if(chc[i]+miyue>'Z'){chp[i]=chc[i]+miyue-26;printf("%c",chp[i]);}else{chp[i]=chc[i]+miyue;printf("%c",chp[i]);}}elseif(islower(chc[i])){if(chc[i]+miyue>'z'){chp[i]=chc[i]+miyue-26;printf("%c",chp[i]);}else{chp[i]=chc[i]+miyue;printf("%c",chp[i]);}}else{chp[i]=chc[i]+1;if(chp[i]=='A'||chp[i]=='a')//遇到+1为字母时的处理chp[i]+=26;elseif(chp[i]>127)//遇到+1超出ASCII码表示范围时chp[i]=char(chp[i]-128);printf("%c",chp[i]);}大全标准文案}printf("\n");}//凯撒解密voidkaisa_de()// 解密{intleng,i,miyue;charchc[MING_WEN],chp[MING_WEN];printf(" 请输入你要解密的密文 :\n");printf("%28c",'');gets(chc);printf(" 请输入密钥(如数字9):");scanf("%d",&miyue);leng=strlen(chc);printf("%28c",'');printf(" 明文:\n");printf("%28c",'');for(i=0;i<leng;i++){if(isupper(chc[i])){if(chc[i]-miyue<'A'){chp[i]=chc[i]-miyue+26;printf("%c",chp[i]);}else{chp[i]=chc[i]-miyue;printf("%c",chp[i]);}}elseif(islower(chc[i])){if(chc[i]-miyue<'a'){chp[i]=chc[i]-miyue+26;printf("%c",chp[i]);}else{chp[i]=chc[i]-miyue;printf("%c",chp[i]);}}else{chp[i]=chc[i]-1;大全标准文案if(chp[i]=='Z'||chp[i]=='z')// 遇到-1为字母时的处理chp[i]-=26;elseif(chp<0)// 遇到-1超出ASCII码表示范围时chp[i]=char(chp[i]+128);printf("%c",chp[i]);}}printf("\n");}///// 单表置换加密void_danbiaozhihuan(){system("CLS");intchoice;printf("\n");printf("\t\t 单表置换加密\n\t\t\t 请选择操作:\n");printf("\t\t\t1. 加密\n\t\t\t2. 解密\n\t\t\t3. 退出\n");scanf("%d",&choice);if(choice==1){printf("请输入你想加密的字符串(请不要超出%d个字符,不能输入中文):",MING_WEN);getchar();gets(mingwen);printf(" 你输入的明文是 :%s\n",mingwen);intmingwen_length=strlen(mingwen);// 明文长度dbzh_alphabeta();// 产生代换字符表dbzh_en();// 加密}if(choice==2){printf(" 请输入你想解密的字符串 :");getchar();gets(miwen);printf(" 你输入的密文是 :%s\n",miwen);intmiwen_length=strlen(miwen);// 密文长度dbzh_alphabeta();// 产生代换字符表dbzh_de();}}单表置换产生代换字符表voiddbzh_alphabeta(){inti,j;大全标准文案printf("请输入密钥句子,至少为1个字符,最多100个字符,且第一个字符必须是小写字母:\n");gets(miyuejvzi);// 输入的密钥句子,至少为 1个字符,最多 100个字符,且第一个必须为字母printf("%s",miyuejvzi);intlength=strlen(miyuejvzi);intpos=0;// 指示填充位置inttag=1;//alphabeta[0]=miyuejvzi[0];// 填充第0个位置for(i=1;i<length;i++){if(isalpha(miyuejvzi[i])!=0)// 是字母{tag=1;for(j=0;j<=pos;j++){if(alphabeta[j]==miyuejvzi[i])//alphabet 表中已经存在字母miyuejvzi[i]{tag=0;break;}}if(tag==1)alphabeta[++pos]=miyuejvzi[i];}}for(i=0;i<26;i++)// 把英文字母表中还没有出现在代换字母表中的字母存入代换字母表{tag=1;for(j=0;j<=pos;j++){if(alphabeta[j]==str[i])//alphabet 表中已经存在英文字母表中的第 i个字母{tag=0;break;}}if(tag==1)alphabeta[++pos]=str[i];}cout<<" 原始字母表为 "<<str<<endl;大全标准文案cout<<" 代换密码表为 "<<alphabeta<<endl;}单表置换加密voiddbzh_en()// 产生密文{对明文中的每一个字母加密计算出该字母在字母表中的序号,a序号为0,b序号为1...,依次类推//alphabeta[0]是序号为0的字母a的密文,alphabeta[1]是序号为1的字母的密文...,依次类推intpos;for(inti=strlen(mingwen);i>=0;i--){if(islower(mingwen[i]))// 假如当前字符是小写字母{pos=mingwen[i]-'a';// 计算出当前字母在字母表中的序号miwen[i]=alphabeta[pos];}else// 不是字母,原样复制miwen[i]=mingwen[i];}printf(" 明文为:%s\n",mingwen);printf(" 密文为:%s\n",miwen);}//单表置换解密(产生明文)voiddbzh_de(){for(inti=strlen(miwen);i>=0;i--){if(islower(miwen[i]))// 假如当前字符是小写字母{for(intj=0;j<26;j++){if(miwen[i]==alphabeta[j])// 当前密文字符 ,在代换字符表的第 j个位置 ,在其明文字符为 str[j];{mingwen[i]=str[j];break;}}}else// 不是字母,原样复制mingwen[i]=miwen[i];}printf(" 密文为:%s\n",miwen);printf(" 明文为:%s\n",mingwen);}大全标准文案////// 维吉尼亚加密int_weijiliya(){system("CLS");inti,j;char*alphabet="abcdefghijklmnopqrstuvwxyz";charvtable[26][26];printf("vigeneretable\n");printf("\t%s\n",alphabet);for(i=0;i<26;i++){printf("\n %c ",*alphabet);//for(j=0;j<26;j++){if(*alphabet+j<=122){vtable[i][j]=*alphabet+j-32;printf("%c",vtable[i][j]);}else{vtable[i][j]=*alphabet+j-58;printf("%c",vtable[i][j]);}}*alphabet++;printf("\n");}intchoice;printf("\n");printf("\t\tvigenere 密码(本算法规定:明文为小写字母,密文为大写字母)\n\t\t\t 请选择操作:\n");printf("\t\t\t1. 加密\n\t\t\t2. 解密\n\t\t\t3. 退出\n");scanf("%d",&choice);switch(choice){case1:printf(" 请输入明文(小写字母) :");getchar();gets(mingwen);printf(" 请输入密钥:");gets(miyuejvzi);wjly_en(); //加密break;case2:printf(" 请输入密文(大写字母) :");getchar();gets(miwen);printf(" 请输入密钥:");gets(miyuejvzi);wjly_de(); //解密break;case3:break;}大全标准文案return0;}维吉利亚加密voidwjly_en(){unsignedintmiyuejvzi_length,mingwen_length,i,j,d,mod;miyuejvzi_length=strlen(miyuejvzi);mingwen_length=strlen(mingwen);d=mingwen_length/miyuejvzi_length;//d 为明文长度除密钥长度后去整mod=mingwen_length%miyuejvzi_length;//mod 为取余if(d>0){for(i=1;i<d;i++){for(j=0;j<miyuejvzi_length;j++)miyuejvzi[i*miyuejvzi_length+j]=miyuejvzi[j];}for(i=0;i<mod;i++){miyuejvzi[d*miyuejvzi_length+i]=miyuejvzi[i];}for(i=0;i<strlen(miyuejvzi);i++){if(mingwen[i]+miyuejvzi[i]-'a'>122)miwen[i]=mingwen[i]+miyuejvzi[i]-'a'-32-26;elsemiwen[i]=mingwen[i]+miyuejvzi[i]-'a'-32;}}else{for(i=0;i<miyuejvzi_length;i++){if(mingwen[i]+miyuejvzi[i]-'a'>122)miwen[i]=mingwen[i]+miyuejvzi[i]-'a'-32-26;elsemiwen[i]=mingwen[i]+miyuejvzi[i]-'a'-32;}}printf(" 明文是:%s\n",mingwen);printf(" 密钥是:%s\n",miyuejvzi);printf(" 密文是:%s\n",miwen);}维吉利亚解密voidwjly_de(){unsignedintmiyuejvzi_length,miwen_length,i,j,d,mod;miyuejvzi_length=strlen(miyuejvzi);miwen_length=strlen(miwen);d=miwen_length/miyuejvzi_length;//d 为密文长度除密钥长度后去整mod=miwen_length%miyuejvzi_length;//mod 为取余大全标准文案if(d>0){for(i=1;i<d;i++){for(j=0;j<miyuejvzi_length;j++)miyuejvzi[i*miyuejvzi_length+j]=miyuejvzi[j];}for(i=0;i<mod;i++){miyuejvzi[d*miyuejvzi_length+i]=miyuejvzi[i];}for(i=0;i<strlen(miyuejvzi);i++){if(miwen[i]+32-miyuejvzi[i]>=0)mingwen[i]=miwen[i]-miyuejvzi[i]+32+'a';elsemingwen[i]=miwen[i]-miyuejvzi[i]+32+'a'+26;}}else{for(i=0;i<miyuejvzi_length;i++){if(miwen[i]+32-miyuejvzi[i]>=0)mingwen[i]=miwen[i]-miyuejvzi[i]+32+'a';elsemingwen[i]=miwen[i]-miyuejvzi[i]+32+'a'+26;}}printf(" 密文是:%s\n",miwen);printf(" 密钥是:%s\n",miyuejvzi);printf(" 明文是:%s\n",mingwen);}转换加密voidlunhuan_en(){charData[50];charShade[50];// 存取密文intdlg,i,j,m,cnt,k;for(i=0;i<50;i++){Data[i]='\0';}printf(" 请输入明文!\n");fflush(stdin);gets(Data);dlg=strlen(Data);for(i=0;i<dlg;i++){if(Data[i]==''){for(k=i+1;k<dlg;k++){大全标准文案Data[k-1]=Data[k];}dlg--;i--;}elseif((Data[i]<'A'||Data[i]>'Z')&&(Data[i]<'a'||Data[i]>'z')){printf(" 你输入的明文不正确 !\n");break;}elseif(Data[i]>='A'&&Data[i]<='Z'){Data[i]+=32;}}printf("\n 明文是:");puts(Data);cnt=(dlg-1)/5+1;for(i=dlg;i<cnt*5;i++){Data[i]='\0';}m=0;for(i=0;i<5;i++){for(j=0;j<cnt;j++){if(Data[i+5*j]=='\0'){m--;}else{Shade[m]=Data[i+5*j];}m++;}}Shade[dlg]='\0';printf("\n 密文是:");puts(Shade);printf("\n");}////// 轮换解密voidlunhuan_de(){大全标准文案inti,j,slg,m,cnt,k=0;charshade[50];charshow[50];for(i=0;i<50;i++){shade[i]='\0';}printf("\n 请输入密文!\n");fflush(stdin);gets(shade);slg=strlen(shade);for(i=0;i<slg;i++){if(shade[i]==''){printf("\n 本系统译文不支持空格 !请重新输入!");}elseif((shade[i]<'A'||shade[i]>'Z')&&(shade[i]<'a'||shade[i]>'z')){printf("\n 你输入的密文不正确 !\n");}elseif(shade[i]>='A'&&shade[i]<='Z'){shade[i]+=32;}}printf("\n 输入的密文是:");puts(shade);cnt=(slg-1)/5+1;for(i=slg;i<5*cnt;i++){shade[i]='\0';}m=0;if(slg%5==1){for(i=0;i<cnt;i++){show[i*5]=shade[k];k++;m=k-1;}for(j=1;j<5;j++){for(i=0;i<cnt-1;i++){show[i*5+j]=shade[m+1];大全标准文案m++;}}m=0;k=0;}elseif(slg%5==2){for(j=0;j<2;j++){for(i=0;i<cnt;i++){show[i*5+j]=shade[k];k++;m=k-1;}}for(j=2;j<5;j++){for(i=0;i<cnt-1;i++){show[i*5+j]=shade[m+1];m++;}}}else{for(i=0;i<cnt;i++){for(j=0;j<5;j++){if(shade[j*cnt+i]=='\0'){}else{show[m]=shade[j*cnt+i];m++;}}}}show[slg]='\0';printf("\n 明文是:");puts(show);printf("\n");}void_lunhuan()// 只实现先行后列的方法大全标准文案{intchoice;system("CLS");printf("\n");printf("\t\t 轮换加密\n\t\t\t 请选择操作:\n");printf("\t\t\t1. 加密\n\t\t\t2. 解密\n\t\t\t3. 退出\n");fflush(stdin);scanf("%d",&choice);switch(choice){case1:case'a':lunhuan_en();break;case2:lunhuan_de();break;default:break;}}---------------------------------------------------------------------------------------------------------------------------实验报告评语及成绩(请按优,良,中,及格,不及格五级评定)成绩:教师签字:大全标准文案实验项目名称进程管理实验实验成绩实验者**专业班级**组别同组者无实验日期2012年03月15日第一部分:实验预习报告1、实验目的、意义用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。2、实验基本原理与方法进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用 CPU时间、进程状态等等。进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生) 。进程的到达时间为进程输入的时间。每个进程的状态可以是就绪 W(Wait)、运行 R(Run)、或完成 F(Finish)三种状态之一就绪进程获得 CPU后都只能运行一个时间片。用已占用 CPU时间加1来表示。进程的运行时间以时间片为单位进行计算。如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用 CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减 1(即降低一级),然后把它插入就绪队列等待 CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。3、主要仪器设备及耗材实验室提供计算机和上网条件, C语言上机环境。4、实验方案与技术路线(综合性、设计性实验)大全标准文案第二部分:实验过程记录实验原始记录(包括实验数据记录,实验现象记录,实验过程发现的问题等)原理分析(1) 假定系统有五个进程,每一个进程用一个进程控制块 PCB来代表,进程控制块的格式为:进程名指针要求运行时间优先数状态其中,进程名——作为进程的标识,假设五个进程的进程名分别为 P1,P2,P3,P4,P5。指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。要求运行时间——假设进程需要运行的单位时间数。优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。状态——可假设有两种状态, “就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束” ,用“E”表示。在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。例:队首标志K2KPK2PK3PK4PK5P1123450KKKK45312312415342RRRRRPCB1PCB2PCB3PCB4PCB5处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:优先数-1要求运行时间-1来模拟进程的一次运行。提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。(5) 进程运行一次后,若要求运行时间 0,则再将它加入队列(按优先数大小插入,且置大全标准文案队首标志);若要求运行时间 =0,则把它的状态修改成“结束” (E),且退出队列。(6) 若“就绪”状态的进程队列不为空,则重复上面( 4)和(5)的步骤,直到所有进程都成为“结束”状态。在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。主要模块(1) 数据结构设计定义进程控制块:structpcb{charname[10];// 进程名charstate;// 进程状态intsuper;// 它的前一个运行的进程intntime;// 进程运行完成所需时间intrtime;// 当前进程已运行的时间structpcb*link;// 下一个要执行的进程};功能函数(忽略返回值及参数)Input() : 用于建立进程控制块。主要通过输入各进程信息,然后根据 sort() 进行优先级排序。Sort(): 进程优先级排序函数。通过建立链表来将各进程按照优先级高到低排好序。Running(): 进程运行时间到 ,置就绪状态(不考虑资源) 。Check(): 进程查看函数。用于查看当前运行的进程和就绪队列中的进程。Disp(): 专门用于显示当前进程。由 check()调用。大全标准文案第三部分 结果与讨论(可加页)实验结果分析(包括数据处理、实验现象分析、影响因素讨论、综合分析和结论等)程序设计类实验: 包括源程序、输入数据、运行结果、实验过程发现的问题及解决方法等;分析与设计、软件工程类实验:编制分析与设计报告,要求用标准的绘图工具绘制文档中的图表。系统实施部分要求记录核心处理的方法、技巧或程序段;其它实验:记录实验输入数据、处理模型、输出数据及结果分析1.输入与输出(1)在模拟一开始需要数据进程的个数,然后依次输入进程名,它的优先级别(整数) ,数据这一次录入后,以后就不需要输入,只需回车不断查看“进程”执行的情况。以后回车每次输出当前正在“运行”的“进程”和就绪队列中的情况,包括进程名、状态、优先级别、总共所需实际和已经运行多久。2.运行结果截图及分析大全标准文案某一录入的数据:进程0进程1进程2进程3进程4进程名Pcb1Pcb2Pcb3Pcb4Pcb5优先级别23124运行时间15342状态RRRRR第一次执行时,由于 pcb5的优先级是 4,为最高,故先它先执行。如下图:回车,执行第二次。由于pcb5还未完成,故优先级降1,与pcb2同级,然后pcb2要早于pcb5到达,所以当前运行的时pcb2,pcb5进入就绪队列:大全标准文案同理,到了第三次,pcb2还需要运行5-1=4个单位时间,优先级降1,pcb5重新又获得占用“CPU”,一个单位时间后,pcb5正好运行完成:以后的执行情况同理,剩下的进程中又三个处于 2级,但 pcb1最先到达,所以第四次执行进程pcb1(运行1次即可完成):经过实际运行发现,总够 15次后,pcb2最后一个运行完成:大全标准文案3.源程序及注释#include<stdio.h>#include<stdlib.h>#include<conio.h>#definegetpch(type)(type*)malloc(sizeof(type))#defineNULL0structpcb{/* 定义进程控制块 PCB*/charname[10];// 进程名charstate;// 进程状态intsuper;// 它的前一个运行的进程intntime;intrtime;structpcb*link;}*ready=NULL,*p;typedefstructpcbPCB;voidsort()/* 建立对进程进行优先级排列函数 */{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))/* 若插入进程比当前进程优先数大,*/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年海南省建筑安全员考试题库
- 2025年海南建筑安全员知识题库及答案
- 中国传统文化主题:对联
- 长度与时间的测量课件
- 《电路中的能量转化》课件
- 石油加工原油组成教学课件
- 病理生理学课件凝血和抗凝血平衡紊乱
- 一年级语文下册《语文园地六》课件
- 《心血管急症》课件
- 固定收益点评报告:把握跨年后的信用配置窗口
- 2023-2024学年安徽省安庆市高一上学期期末联考生物试题(解析版)
- 促醒中医治疗
- 广东省广州市海珠区2023-2024学年九年级上学期期末物理试题(含答案)
- GB/T 45083-2024再生资源分拣中心建设和管理规范
- 胃镜超声内镜护理配合
- 精神科护理工作计划例文
- 2024山地买卖合同模板
- 河北省承德市2023-2024学年高一上学期期末物理试卷(含答案)
- 【初中化学】二氧化碳的实验室制取教学课件-2024-2025学年九年级化学人教版上册
- 相互批评意见500条【5篇】
- 江苏徐州历年中考语文现代文阅读之非连续性文本阅读5篇(含答案)(2003-2023)
评论
0/150
提交评论