c語言密碼生成

2022-11-20 06:39:03 字數 3871 閱讀 8702

計算機實習報告

一題目分析

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中的字元為止。

(2) 子函式sort(char a, int l)

用選擇排序的方法,將字串a中的字元按字母順序排列,等同於字元陣列公升序排列。首先將a[0]取出,和它後面的字元比較,用k記錄最小的那個字元的位置,然後和a[0]交換位置;接下來將a[1]取出,和它後面的字元比較,依次類推,直到l個字元排序完畢。

(3) 主函式

先輸入用來生成密碼的一串字元chars,n記錄其長度,若n=l,呼叫sort(char a, int l)將chars中的字元按字母順序排列。然後用l次迴圈取出chars中所有長為l的字元組,用wyp(char a, int l)判斷是否符合要求,是就輸出,不是就給出提示。

三調式分析

這次實習要編寫的程式多次用到多重迴圈,由於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)

/*子函式 sort */

/*字元有小到大排列*/

void sort(char a, int l)

}/*主函式*/

void main()

{ int i,j,k,m,n,r,t,n,l=5l用來記錄要生成的密碼的長度 */

char chars[20],str_out[10];

printf("please input the chars:"); /* 輸入用來生成密碼的字元集合 */

label: scanf("%s", chars);

學生成績管理系統 C語言

課程設計 課程名稱 高階語言程式設計與編譯 設計題目 學生成績管理系統 院系 電腦科學與資訊工程系 學生姓名 張賀賀 智鵬焦海濤 學號 201003030017201003030017 201003030017 專業班級 軟體工程 指導教師周晏 2011 6 21 課程設計任務書 目錄一設計要求 4...

c語言學生成績管理系統

c語言課程設計 設計題目 學生成績管理系統 院系 專業 電子資訊工程 班級 學號 姓名 目錄1 概述 1.1 課程設計目的 1.2 課程設計要求 1.3 設計要求具體說明 2 詳細設計說明 2.1 總體設計方案 2.2 程式描述 2.3 功能結構 2.4 主要模組描述 3 程式測試 4 課程設計總結...

用c語言編寫學生成績管理系統

printf 按任意鍵繼續 n getch menu while flag 1 voidmenu void 輸入各個同學的學生資訊 voidinputscore void printf 成功輸入 按任意鍵繼續後請輸入8進行儲存 n 計算各個同學的總分 voidtotal void 計算各個同學的平均...