统计c源程序中的关键字出现的频率.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构课程设计报告 姓名 方元元 学号一、题目 统计c源程序中的关键字出现的频率 二、算法思想描述 本程序是扫描一个c源程序,有Hash表存储程序中出现的关键字,并统计该程序中的关键字出现的频度。用线性探测法解决Hash冲突。设Hash函数为:Hash(key)=[(key的第一个字母序号)*100+(key的最后一个字母序号)] MOD 41。 算法思想如下: 建立一个结构体数组的hash表,存放读入的关键字和其出现的次数。先初始化并建立该hash表,先初始化为”0”,0,再从文件中一个个读入所有关键字,存放在hash表中相应位置。 从另一文件中一行行读入,找出其中非注释中的,也非“”中的,长度2-8个字符的小写字符串,用hash查找,看该单词是否关键字,如是其出现次数加一,若不是就继续下一个这样的字符串,直至文件尾。在找这样的字符串途中,遇到无法匹配的单或双引号打印出出现在第几行。 Hash表建立好后打印出来。 其中核心算法分为两块:1.hash表的建立和hash查找。2.寻找上述的字符串。 1.建立Hash表的算法: 该函数实参为已建立的hash表和在c源程序中找到的一个小写字母字符串。 从该字符串key为下标处依次开始查找,到数组末尾是返回数组头(key=(key+1)%44;),分两种情况: ①若先找到空位,说明该字符串不是关键字。则不改变hash表。 ②若先找到了该关键字的纪录,则该字符串是关键字,++hash[key].num; 2.寻找疑似关键字字符串的算法 功能:依次找出被非标识符且非”、//、/*、*/隔开的,长度为2-8个字符,非注释中的,也非“”中的小写字母字符串,因为它可能是关键字。 首先,一行行读入c源程序,用续行符相连的几行当一行一起读入。 (1)、case 0和case 1:双引号中的不算,跳过。 ① “”匹配中,“……\”不算,“……\\”算。 ②单引号中的双引号不算,而且单引号中不会有关键字,所以单引号中的也跳过。 ③‘ ’匹配中,‘\’不算,‘\\’算 (2)、case 2:注释中的不算,跳过。分为/*……*/ // ①设一个标志符flag,当找到/* 但在该行没找到*/ 时,flag=1;此时在下行中寻找*/ ,以此类推,直至找到*/ 后flag=0,以后字符恢复有效。 ②当找到//时放弃该行之后的所有字符,读入下一行…… (3)、case 3:读到大写字母、下划线或数字时,肯定该字符串不是关键字,则清除已存在s中的字符串,并跳过紧接在后面的允许在标识符中出现的字符。 (4)、case 4:读到的是小写字母,则存放到字符串s中。 (5)、case 5:本算法以除“、‘、//、/*、*/之外的不能在标识符中出现的字符隔开整行字符串,并判断被隔开的长度2-8个字符,不含大写字母、下划线、数字的字符串(即小写字母字符串)是否关键字,是则增加其统计个数(判断方法为hash查找)。 三、程序结构 如图,main()函数调用了四个子函数, chu_shi_hash()、create_hash()、Guan_Jian_Zi()、print()。 其中,chu_shi_hash()把hash表初始化为“0000” 0,标记空位,便于以后操作。C create_hash()实现hash表的创建,从放关键字的文件一个个关键字,它调用了两个子函数,equal()判断两数组是否相等,用来确定某处是否空位.copy()把一个数组赋给另一数组,在确定插入位置插入该关键字。 Guan_Jian_Zi()从c源程序中依次找到可能是关键字的字符串,然后用hash查找判断它是否关键字,是则增加其统计次数。它调用了两个子函数:PanDuan(char) 和chang_hash(Hash,const char ch[]),前者用来判断一个字符的的类别,后者在hash表中查找判断ch[]是否关键字,是则增加其在hash表中的统计量。 而chang_hash()调用了函数equal(),用来确定某处是否空位或ch[]。 print(hash)用来打印hash表。 四、测试结果 先用一个短些的,便于数出关键字次数的program1.txt测试 其结果是: 经核对后,证明结果是正确的。于是又用一个大些的program.txt测试,结果是: 该c源程序能处理不匹配的“”或‘’,上面的测试故意在program.txt尾部设置不匹配的‘ 和“以测试该功能。 此程序统计的关键字不包括注释中的,字符串中的,续行符分开的,如in\ t 可以识别,在文件gjz.txt 中的关键字,编译器认定是关键字的,本程序也认为是

文档评论(0)

docindoc + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档