算法与编程实习报告 下载本文

算法与编程实习报告

第一题:统计字母的使用频率

一、题目:统计字母的使用频率

目的与要求

1.目的:

通过编写程序统计字母的使用频率,培养学生综合利用C语言进行程序设计的能力,熟悉字符串的操作方法,加强函数的运用,提高软件系统分析能力和程序文档建立、归纳总结的能力。

2.基本要求:

1)要求用C语言编程,在Visual C++环境下调试完成;

2)要求按照程序功能分成几个功能模块来实现,各个功能模块分别使用函数来完成; 3)要求应用本课所讲授的程序设计语言知识来解决问题

设计方法和基本原理

1.课题功能描述:本程序的功能,就是要统计英文字母的使用频率。

2.问题详细描述

为统计英文字母的使用频率,输入一个不包括空格的由英文字母组成的字符串,长度不超过200个字符。统计26个英文字母的使用频率,不区分大小写。最后按使用频率从大到小输出字母(小写字母)和使用频率(出现的次数)。

3.问题的解决方案 按照程序要求,本程序应采用模块化设计方法,设计几个功能模块。例如(仅供参考): ◆ 将字符串中的大写字母转换为小写字母 ◆ 统计输入的字符串中字母的使用频率 ◆ 按使用频率从大到小进行排序 主函数中控制输入、函数调用和输出。

主要技术问题的描述

根据三的分析,主要问题在于: 1)为统计字母的使用频率,定义一个长度为26的int数组存放所统计的各个字母的使用频率。

2)在统计字母的使用频率时,不要使用if语句或switch语句,利用字母的ASCII码与数组元素下标之间的关系来求得。

3)按使用频率从大到小进行排序时,建议使用指针数组更为方便。

创新要求

实现程序功能后,可进行创新设计:

1)使用多文件,即主函数和各个函数分别存放在不同的.c文件中,在头文件中进行函数原型声明。

2)读入一篇英文文档,并对其进行字母频率分析。

二、功能描述

1.程序运行第一步进行模式选择:从屏幕读入一串字母或从文件中读取文章(从屏

幕读入时字符串长度不超过200)。 2.读取文章完毕后,统计各个字母的使用频率,并按从大到小的顺序打印出来,同时,对使用次数相同的字母按字母表顺序打印,对使用次数为0的字母不予打印。

三、解决方案(流程图) 开始 Main函数 Y Mode_Num=1? N Chang函数 (大写字母转换为小写字母后返回) Fread函数 (读入一篇文档) Cal函数 (统计某一字母的使用频率) Fprint函数 (按顺序打印字母及使用频率) 结束

四、主要函数描述

1.Main函数:负责变量的定义、模式的选择及函数的调用。

2.change函数:负责将大小写字母统一成小写字母后返回小写字母。 3.calculate函数:负责统计某一字母的使用频率并输出。

4.read函数:读入位于f://单词开头大写.txt,通过调用函数统计字母频率 并相应输出。

5.fprint函数:按字母使用频率从大到小的顺序输出字母及其使用频率。

五、主要技术问题

程序如下:

#include #include #define N 200

/*判断字母并将大写字母转换为小写字母后返回*/ void change(char *p) {

int i=0;

for(i=0;*(p+i)!='\\0';i++)

*(p+i)=(('a'<=(*(p+i))&&(*(p+i))<='z'))?*(p+i):(*(p+i)+32); //判断字母 } 的值,将所有字母转换成小写 /*统计某一字母的使用频率*/

void calculate(char *p,int * q) {

int i=0,temp=0;

for(i=0;*(p+i)!='\\0';i++)

(*(q+(*(p+i)-'a')))++;//对相应统计字母的数组进行操作,统计相应字母的使用 } 频率 /*找出使用次数最多的字母并按顺序打印*/ void find(int b[]) {

int i=0,max=0,j=0,k=0;

while(k<26) //依次判断各个字母的使用次数 {

for(i=0;b[i]!=-1;i++) if(b[i]>max)

max = b[i],j=i; //记录最大使用次数为max if(max==0) return; b[j]=0;

printf(\ //按顺序打印各字母及其使用次数 k++; max=0; } }

/*读入位于f://单词开头大写.txt,通过调用函数统计字母频率并相应输出*/ void read() {

FILE *fp;//定义文件指针 char ch; int i;

int a[27]={0}; a[26]=-1;

if(!(fp=fopen(\单词开头大写.txt\ printf(\ exit(1); }

ch=fgetc(fp);

while(ch!=-1){//文档的结束符为-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);//关闭文件指针 for(i=0;i<=25;i++) {

printf(\统计并打印该文档中各字母的使用频率 printf(\ } return; }

void main()//主函数 {

char a[N]; int i;

int b[27]={0},Mode_Num;//Mode_Num为模式选择 b[26]=-1;

printf(\file\\n\

scanf(\ if(Mode_Num==1){

scanf(\输入字符串

change(a);//调用change函数,将所有字母统一为小写字母 calculate(a,b);//调用calculate函数,统计个字母的使用频率 for(i=0;i<=25;i++) {