您的当前位置:首页正文

c语言密码生成

2024-03-03 来源:东饰资讯网


计算机实习报告

一 题目分析

1 实验题目:

实现一个简单的密码生成系统。一个有效的密码由L(3<=L<=15)个小写字母(来自传统的拉丁字母集'a'...'z')组成,至少有一个元音字母

('a','e','i','o'或者'u'),至少有两个辅音字母(除去元音以外的字母),并且按字母表顺序出现(例如,'acd'是有效的,而'dac'不是)。

给定一个期望长度L和若干个小写字母,写一个程序,打印出所有的长度为L、能由这些字母组成的有效密码。密码必须按字母表顺序打印出来。

2 题目分析

本次计算机实习的任务实现一个密码生成系统,也就是在输入的一串字符

中,找出L个(L是给定的长度)组成一组,而且要满足如下要求:(1)每组中至少有一个元音字符,和至少两个辅音字符 ;(2)按字母表顺序出现;(3)打印出所有的长度为L、能由这些字母组成的有效密码。

关键部分是(3),在输入的一串字符中找出所有由L个字符组成的密码,

不能有遗漏。这可以用循环实现。其次是(2),这相当于数组排列。然后用循环逐个判断每一组中的L个字符,检查是否符合要求(1)。

二 程序设计

1 设计思想

(1)首先从键盘输入用来生成密码的字符,保存在字符数组chars[]中; (2)测试chars[]的长度N,对给定的密码长度L(N>=L);

(3) 编写一个子函数sort( ),实现将其中的字符按字母表顺序排列; (4) 用多重循环,取出由chars[]中的字符组成的所有长为L的字符串,存到

str_out[]中;

(5) 编写子函数wyp( ),判断str_out[]是否满足含有至少一个元音字符和至

少两个辅音字符,满足返回值为0,否则返回值为1;

(6) 如果str_out[]满足要求,打印出来,利用循环,直到找出所有满足要求

的生成密码str_out[]。

2 流程图

(1)子函数wyp(char a[], int L)

通过传参判断长为L的串a[ ]中是否含有至少一个元音字符和至少两个辅音字符。可以先将五个元音字符a,e,i,o,u保存在一个串yuanyin[ ]中,取出a[0],通过循环,判断是否为元音字符,是的话用count1记录,不是的话用count2记录;然后再判断a[1],只到完全判断a[]中的字符为止。

开始传参数组a[],长度L count1=0,count2=0i=0i=1C0unt2>=2N返回0返回1 结束

(2) 子函数sort(char a[], int L)

用选择排序的方法,将字符串a[]中的字符按字母顺序排列,等同于字符数组升序排列。首先将a[0]取出,和它后面的字符比较,用k记录最小的那个字符的位置,然后和a[0]交换位置;接下来将a[1]取出,和它后面的字符比较,依次类推,直到L个字符排序完毕。

开始传参:数组a,长度Li=0ia[j]Yk=j (3) 主函数

结束

先输入用来生成密码的一串字符chars[],N记录其长度,若N=L,调用sort(char a[], int L)将chars[]中的字符按字母顺序排列。然后用L次循环取出chars[]中所有长为L的字符组,用wyp(char a[], int L)判断是否符合要求,是就输出,不是就给出提示。

开始i<=N-L+1NL=5Y输入字符到charsi++N=strlen(chars)NSort(chars,N)i=0j<=N-L+2Str_out[0]=chars[i]j=i+1YStr_out[1]=chars[j]i++K=j+1k<=N-L+3NYStr_out[2]=chars[k]i++Nm=k+1m<=N-L+4YStr_out[3]=chars[m]i++n=m+1n<=N-L+4NYYWyp(str_out,L)==1NStr_out[4]=chars[n]Str_out[5]=’\\n’This string %6s is incorrect!Print out n++

结束

三 调式分析

这次实习要编写的程序多次用到多重循环,由于for(;;)语句最为灵活,简单宜用,能清楚的判断循环次数和循环条件,所以一直用它作为循环语句。

子函数是分别编制的,它们是相对独立的。编制程序时基本上是在每编完一个子函数后就在主函数中调用,单独测试其功能,看其是否满足要求。如果有问题就在该子函数中查找问题所在。

在测试的时候发现输出的一组正确的密码后面会有乱码出现,而循环的条件和过程并没有错误。检查后发现错误的原因是每组密码都是以%s的格式输出的,而字符数组的后面并没有’\\0’才会这样。

在排序子函数sort(char a[], int L)的编制中,刚开始用的是冒泡法,这种方法在最坏的情况下需要交换L*(L-1)/2次;而改用选择法排序只需要L次即可,在L很大的情况下,算法复杂度会降低很多。

四 使用说明

由于要生成的密码的长度是给定的,设L=5;根据提示输入N个用来生成密码的字符,如果N=L ,就把字符存在字符数组chars[]中,然后按照题目要求将生成的密码保存在str_out[],如果str_out[]中的字符满足要求就将它们全部输出来。对于不能满足要求的输出:This string ??? is incorrect!

五 测试结果

第一组:

测试目的:正常情况下验证程序 测试数据:acdehg 测试结果:

Please input the chars: acdehg The result is: acdeg acdeh acdgh acegh adegh cdegh

Type EXIT to return to Turbo C++. . .Microsoft(R) Windows DOS (C)Copyright Microsoft Corp 1990-2001.

D:\\TC\\BIN>

第二组:

测试目的:输入字符少于要求的情况 测试数据:cdab 测试结果:

Please input the chars: cdab

The number of chars you input is not enough! Please input again: acdbef The result is: abcde abcdf abcef abdef acdef bcdef

Type EXIT to return to Turbo C++. . .Microsoft(R) Windows DOS (C)Copyright Microsoft Corp 1990-2001.

D:\\TC\\BIN>

第三组:

测试目的:生成的密码有不满足要求的情况 测试数据:cdghaf 测试结果:

Please input the chars: cdghaf The result is: acdfg acdfh

acdgh acfgh adfgh

This string cdfgh is incorrect!

Type EXIT to return to Turbo C++. . .Microsoft(R) Windows DOS (C)Copyright Microsoft Corp 1990-2001.

D:\\TC\\BIN>

六 实习体会

这次实习的内容和以前C的学习有很大关系,由于遗忘,再加上当时对C的掌握和应用并不是那么熟练,编程能力也很弱,刚开始的时候不知道应该从何下手。后来利用实习的闲暇时间复习了一下相关知识,尤其是循环和字符数组部分的内容,慢慢的找出了一点头绪,通过不断的修改,基本上实现了题目的要求。同时也学会了用office visio绘制流程图,对C的运行环境在温故而知新的基础上也越来越得心应手了。集中这样一段时间系统的编一个程序,从拿到题目分析问题到最后成功的解决问题,然后写实习报告,对于我们今后编写其他程序,学习其他语言都是很有帮助的。

七 源程序代码

#include #include #include

/**************************************************************************************/ /*子函数 wyp */

/*检查元音,辅音字符个数是否正确*/

int wyp(char a[], int L)

{ int i, j, count1 = 0, count2 = 0;

char yuanyin[]=\"aeiou\";

for(i = 0; i < L; i++) for (j = 0; j <5 ; j ++)

{

if(a[i] == yuanyin[j])

count1++;

else

count2++;

}

if (count1 >= 1 && count2 >= 2)

return 0;

else }

/**************************************************************************************/ /*子函数 sort */ /*字符有小到大排列*/ void sort(char a[], int L) { char c; int i, j,k;

for(i = 0; i < L-1; i++) { k=i;

for (j = i + 1; j < L; j ++) }

/**************************************************************************************/ /*主函数*/

if (a[k] > a[j]) k=j; c= a[k];a[k] = a[i];a[i] = c; }

return 1;

void main()

{ int i,j,k,m,n,r,t,N,L=5; /* L用来记录要生成的密码的长度 */ char chars[20],str_out[10];

printf(\"Please input the chars:\"); /* 输入用来生成密码的字符集合 */ label: scanf(\"%s\

N=strlen(chars); /* 测试字符个数 */ if(N{ printf(\"The number of chars you input is not enough!\\n Please input again:\\n\"); goto label; }

sort(chars,N);

printf(\"The result is:\\n\");

for(i=0;i<=N-L+1;i++) /* 用L重循环找遍符合要求长度的密码 */

{ str_out[0]=chars[i]; for(j=i+1;j<=N-L+2;j++) { str_out[1]=chars[j]; for(k=j+1;k<=N-L+3;k++) { str_out[2]=chars[k]; for(m=k+1;m<=N-L+4;m++) { str_out[3]=chars[m]; for(n=m+1;n<=N;n++) { str_out[4]=chars[n];

str_out[5]='\\0'; if(wyp(str_out, L)&&strlen(str_out)==5)

/* 测试生成的密码是否符合要求,不符合返回值为1 */

printf(\"This string %6s is incorrect! \\n\

else

if(strlen(str_out)==5) printf(\"%6s \\n\

} } } } } }

/**************************************************************************************/

因篇幅问题不能全部显示,请点此查看更多更全内容