演算法與程式設計實習報告

2021-09-28 16:17:47 字數 3896 閱讀 6682

報告班級:

姓名:李明

學號:12345678

第一題一、題目:

一、題目:統計字母的使用頻率

二、目的與要求

1. 目的:

通過編寫程式統計字母的使用頻率,培養學生綜合利用c語言進行程式設計的能力,熟悉字串的操作方法,加強函式的運用,提高軟體系統分析能力和程式文件建立、歸納總結的能力。

2. 基本要求:

1)要求用c語言程式設計,在visual c++環境下除錯完成;

2)要求按照程式功能分成幾個功能模組來實現,各個功能模組分別使用函式來完成;

3)要求應用本課所講授的程式語言知識來解決問題

三、設計方法和基本原理

1. 課題功能描述

本程式的功能,就是要統計英文本母的使用頻率。

2. 問題詳細描述

為統計英文本母的使用頻率,輸入乙個不包括空格的由英文本母組成的字串,長度不超過200個字元。統計26個英文本母的使用頻率,不區分大小寫。最後按使用頻率從大到小輸出字母(小寫字母)和使用頻率(出現的次數)。

3. 問題的解決方案

按照程式要求,本程式應採用模組化設計方法,設計幾個功能模組。例如(僅供參考):

l 將字串中的大寫字母轉換為小寫字母

l 統計輸入的字串中字母的使用頻率

l 按使用頻率從大到小進行排序

主函式中控制輸入、函式呼叫和輸出。

四、主要技術問題的描述

根據三的分析,主要問題在於:

1) 為統計字母的使用頻率,定義乙個長度為26的int陣列存放所統計的各個字母的使用頻率。

2) 在統計字母的使用頻率時,不要使用if語句或switch語句,利用字母的ascii碼與陣列元素下標之間的關係來求得。

3) 按使用頻率從大到小進行排序時,建議使用指標陣列更為方便。

五、創新要求

實現程式功能後,可進行創新設計:

1) 使用多檔案,即主函式和各個函式分別存放在不同的.c檔案中,在標頭檔案中進行函式原型宣告。

2) 讀入一篇英文文件,並對其進行字母頻率分析。

二、功能描述

1.程式執行第一步進行模式選擇:從螢幕讀入一串字母或從檔案中讀取文章(從螢幕讀入時字串長度不超過200)。

2.讀取文章完畢後,統計各個字母的使用頻率,並按從大到小的順序列印出來,同時,對使用次數相同的字母按字母表順序列印,對使用次數為0的字母不予列印。

(下頁流程圖)

三、解決方案

四、主要函式描述

1. main函式:

功能:負責變數的定義、模式的選擇及函式的呼叫。

2.chang函式

功能:負責將大小寫字母統一成小寫字母後返回小寫字母。

3.cal函式

功能:負責統計某一字母的使用頻率並輸出。

4.fread函式

功能:讀入位於e:\\ldk的文件ldk.txt,通過呼叫函式統計字母頻率並相應輸出。

5.fprint函式

功能:按字母使用頻率從大到小的順序輸出字母及其使用頻率。

五、實驗心得

通過這次「統計字母頻率」演算法程式設計的實習,我學習並掌握了函式的呼叫、形參為指標或陣列的傳遞方法以及讀取檔案資料的方法。

同時,在實習過程中,也遇到了許多問題:

1. 在檔案呼叫的過程中,使用課本上的「while(ch!=eof)」不能實現對檔案結尾的判斷,造成函式進入死迴圈,不能及時退出。

解決方法:後來,運用老師講述的除錯方法,發現程式在執行到文件結尾的時候,從文件中讀取的值為-1,於是我把判斷文件結尾的條件改為了「while(ch!=-1)」,從而使函式正常地跳出了迴圈。

心得:當自己的程式出現邏輯錯誤且自己不知道錯誤的地點時,用除錯的方法一步步觀察程式的執行方式,就可以發現錯誤的原因並加以改正。

2. 在輸出字母及其使用頻率的過成中,曾因為不知道運用轉義字元而重新定義了乙個陣列用來存放a~z的英文本母,在一次翻書的過程中突然看見了轉義字元的使用方法,從而使自己的程式大幅度的簡化。

雖然這並不屬於程式的語法或邏輯錯誤,但這次經過使我明白了:程式的編譯每個人可能都有不同的方法,但方法與方法之間是存在差別的,只有用心思考,才能以最簡單明瞭的方式實現程式的功能。

附錄:第一題源程式

#include

#define n 200

函式:chang

功能:判斷字母並將大寫字母轉換為小寫字母後返回

入口引數:字元指標

出口引數:相應的小寫字母

void chang(char *p

函式:cal

功能:統計某一字母的使用頻率

入口引數:被統計字母的位址指標,統計用陣列的位址指標

出口引數:void

void cal(char *p,int * q)

函式:find

功能:找出使用次數最大的字母,並按順序列印出來

入口引數:字元指標

出口引數:相應的小寫字母

void find(int b)

}函式:fread

功能:讀入位於e:\\ldk的文件ldk.txt,通過呼叫函式統計字母頻率並相應輸出

入口引數:void

出口引數:void

void fread()

; a[26]=-1;

if(!(fp=fopen("e:\\ldk\\ldk.txt","r")))

ch=fgetc(fp);

while(ch!=-1txt文件的結束符為-1

if(ch==-1)

continue;

ch=(('a'<=ch&&(ch)<='z'))?ch:(ch+32字母大小寫統一

if('a'<=ch&&(ch)<='z')

a[ch-'a']++;

ch=fgetc(fp獲取下乙個字元

}fclose(fp關閉檔案指標

fprint(a列印統計結果

return;

}main函式

void main()

,mode_nummode_num為模式選擇

b[26]=-1;

printf("please choose the mode:\n1--to read from the screen\n2--to read from file\n");

scanf("%d",&mode_num);

if(mode_num==1)

else

}第二題

一、題目:

問題描述:

n盞燈排成一排,從1到n按順序依次編號。有n個人也從1到n依次編號。第乙個人(1號)將燈全部關閉。

第二個人(2號)將凡是2和2的倍數的燈開啟。第三個人(3號)將凡是3和3的倍數的燈做相反的處理(如果該燈為開啟的,則將它關閉;如果該燈為關閉的,則將它開啟)。以後的人都和3號一樣,將凡是與自己編號相同的燈,以及是自己編號倍數的燈做相反處理。

請編寫程式實現。要求:程式中要顯示每乙個人所做工作的過程,例如:

當第i個人操作時,則顯示將i和i的倍數的燈做相反的處理過程;當第n個人操作之後,顯示燈的最後狀態。(建議:採用圖形法,顯示每一盞燈,並為每一盞燈加邊框,用不同的顏色顯示開燈或關燈)。

例如:當輸入n為7時;

當第乙個人操作時

則輸出結果為:

第1盞燈是黑的

第2盞燈是黑的

第3盞燈是黑的

第4盞燈是黑的

第5盞燈是黑的

第6盞燈是黑的

第7盞燈是黑的

當第二個人操作時

則輸出結果為:

第1盞燈是黑的

第2盞燈是亮的

第3盞燈是黑的

第4盞燈是亮的

第5盞燈是黑的

第6盞燈是亮的

第7盞燈是黑的

當第三個人操作時

則輸出結果為:

第1盞燈是黑的

第2盞燈是亮的

第3盞燈是亮的

演算法與程式設計實習報告

第一題 統計字母的使用頻率 一 題目 統計字母的使用頻率 目的與要求 1.目的 通過編寫程式統計字母的使用頻率,培養學生綜合利用c語言進行程式設計的能力,熟悉字串的操作方法,加強函式的運用,提高軟體系統分析能力和程式文件建立 歸納總結的能力。2.基本要求 1 要求用c語言程式設計,在visual c...

演算法與程式設計實習報告

題1 統計字母的使用頻率 一 題目 統計字母的使用頻率 目的與要求 1.目的 通過編寫程式統計字母的使用頻率,培養學生綜合利用c語言進行程式設計的能力,熟悉字串的操作方法,加強函式的運用,提高軟體系統分析能力和程式文件建立 歸納總結的能力。2.基本要求 1 要求用c語言程式設計,在visual c ...

《ACM程式設計與演算法》課程報告

2010 2011學年第2學期 acm程式設計與演算法 課程報告 班級 電氣0903 學號 20095690 姓名 劉星 格雷碼問題解題報告 一 研究報告 80分 1.題目描述 10分 在數字系統中只能識別0和1,各種資料要轉換為二進位制 才能進行處理,格雷碼是一種無權碼,採用絕對編碼方式,典型格雷...