一、程序概述
1、此次编写的程序为邹欣老师《构建之法》科书2.4.2 wordcount程序。
2、我写的wordcount程序要实现的功能整体可以总结为:
① 统计word文档中的字符数、单词数;
② 统计word文档中的符号数,即除了数字和字母以外的符号,像标点符号,括号等;
③ 统计行数并且输出每一行的类别,即是代码行还是注释行;
④ 程序有界面、选择功能和返回退出功能。
3、编程工具:VC++ 6.0;
编程语言:C/C++。
二、程序执行及调试
1、运行程序,需要输入所要统计文本文档的文件名,我建立了一个word文档,里面存储的也正好为本次的代码。
2、进入菜单界面,如图所示,菜单界面有5个选项,分别为显示字符数、单词数和行数,显示符号数,显示行数及行分类 ,显示所有和退出5个选项。
3、输入1,选择“显示字符数、单词数和行数”选项,则进行统计字符数、单词数和行数并输出显示。
4、选择2,“显示符号数”,进行符号数统计并显示。
5、选择3,“显示行数及行分类”统计并显示行数及分类,一共到178行,因为太多,就不一一展示了。
如图,其中第10行和第28行为注释行,程序显示“注释行”,没有出现问题。
6、选择4,“显示全部”,就会把所有信息全部显示出来。
7、选择5,退出,则退出程序。
三、总结
在此次程序中,因为要求界面的整洁,所以我是用了代码system("cls")进行清屏操作,不然会一直执行下去,满屏幕的菜单和数据混在一起不美观,数据也容易丢失,所以每次用完一个功能,记录下数据,就会执行system("cls")代码进行清屏,执行下一项功能,记录下一个数据。
其次我运用了文件操作C中的fseek(file,-1L,SEEK_CUR)代码,因为在一个字符一个字符的查找时,有时会查找过,但还要继续使用前一个字符,这时候就需要使用文件指针的操作fseek(file,-1L,SEEK_CUR),使文件指针向前移动,从而可以继续使用前一个字符。
此次程序主要锻炼我的文件操作,发现了很多自身的不足,例如不会运用C++的文件操作,其实C++的文件操作很简单,只不过类型较多,而此次只运用了读操作,所以我只用了C的文件操作,但是C++的文件操作必须要掌握,我会继续学习,完善自己!
四、源代码
1 #include "iostream" 2 #include "string" 3 #include "stdio.h" 4 5 using namespace std; 6 7 FILE *file; 8 int chars=0,words=0,lines=1,symbols=0,s[500]; 9 char c; 10 //定义全局变量 11 12 void index() 13 { 14 cout<<" ********************主菜单*********************"<<endl; 15 cout<<" * *"<<endl; 16 cout<<" * 1、显示字符数、单词数和行数 *"<<endl; 17 cout<<" * *"<<endl; 18 cout<<" * 2、显示符号数 *"<<endl; 19 cout<<" * *"<<endl; 20 cout<<" * 3、显示行数及行分类 *"<<endl; 21 cout<<" * *"<<endl; 22 cout<<" * 4、显示所有 *"<<endl; 23 cout<<" * *"<<endl; 24 cout<<" * 5、退出 *"<<endl; 25 cout<<" * *"<<endl; 26 cout<<" ***********************************************"<<endl; 27 cout<<" * 请选择需要的功能:"; 28 }//主菜单函数 29 30 void analyse() 31 { 32 while((c=fgetc(file))!=EOF) 33 { 34 chars++; 35 if (((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))||((c>='0')&&(c<='9'))) 36 { 37 words++; 38 while((c=fgetc(file))!=EOF) 39 { 40 chars++; 41 if (((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))||((c>='0')&&(c<='9'))) 42 { 43 } 44 else if (c=='\n') 45 { 46 s[lines]=1; 47 lines++; 48 break; 49 } 50 else if (c==' ') 51 break; 52 else 53 { 54 symbols++; 55 break; 56 } 57 } 58 } 59 else if (c=='/') 60 { 61 if ((c=fgetc(file))=='/') 62 { 63 symbols+=2; 64 s[lines]=2; 65 fseek(file,-1L,SEEK_CUR); 66 } 67 } 68 else if (c=='\n') 69 { 70 if (s[lines]!=2) 71 s[lines]=1; 72 lines++; 73 } 74 else if (c==' ') 75 { 76 } 77 else 78 symbols++; 79 } 80 if (s[lines]!=2) 81 s[lines]=1; 82 }//分析所有字符数、单词数、行数及行类的函数 83 84 int main () 85 { 86 char name[30],b; 87 int a,i,j; 88 cout<<" * 请输入源文件名:"; 89 for(;;) 90 { 91 cin>>name; 92 if((file=fopen(name,"r"))!=NULL) 93 break; 94 else 95 cout<<" * 文件路径错误!请重新输入源文件名:"; 96 } 97 analyse(); 98 fclose(file); 99 index(); 100 cin>>a; 101 while (a!=5) 102 { 103 switch (a) 104 { 105 case 1:cout<<" * 字符数:"<<chars<<endl; 106 cout<<" * 单词数:"<<words<<endl; 107 cout<<" * 行数 :"<<lines<<endl; 108 cout<<" * 按任意键返回:"; 109 b=getchar(); 110 b=getchar(); 111 break; 112 case 2:cout<<" * 符号数:"<<symbols<<endl; 113 cout<<" * 按任意键返回:"; 114 b=getchar(); 115 b=getchar(); 116 break; 117 case 3:cout<<" * 行数:"<<lines<<endl; 118 for (i=1;i<=lines;i++) 119 { 120 if (s[i]==1) 121 { 122 if (i<10) 123 cout<<" * 第"<<i<<"行为 代码行"<<endl; 124 else if (i<100) 125 cout<<" * 第"<<i<<"行为 代码行"<<endl; 126 else 127 cout<<" * 第"<<i<<"行为 代码行"<<endl; 128 } 129 else if (s[i]==2) 130 { 131 if (i<10) 132 cout<<" * 第"<<i<<"行为 注释行"<<endl; 133 else if (i<100) 134 cout<<" * 第"<<i<<"行为 注释行"<<endl; 135 else 136 cout<<" * 第"<<i<<"行为 注释行"<<endl; 137 } 138 } 139 cout<<" * 按任意键返回:"; 140 b=getchar(); 141 b=getchar(); 142 break; 143 case 4:cout<<" * 字符数:"<<chars<<endl; 144 cout<<" * 单词数:"<<words<<endl; 145 cout<<" * 符号数:"<<symbols<<endl; 146 cout<<" * 行数 :"<<lines<<endl; 147 for (j=1;j<=lines;j++) 148 { 149 if (s[j]==1) 150 { 151 if (j<10) 152 cout<<" * 第"<<j<<"行为 代码行"<<endl; 153 else if (j<100) 154 cout<<" * 第"<<j<<"行为 代码行"<<endl; 155 else 156 cout<<" * 第"<<j<<"行为 代码行"<<endl; 157 } 158 else if (s[j]==2) 159 { 160 if (j<10) 161 cout<<" * 第"<<j<<"行为 注释行"<<endl; 162 else if (j<100) 163 cout<<" * 第"<<j<<"行为 注释行"<<endl; 164 else 165 cout<<" * 第"<<j<<"行为 注释行"<<endl; 166 } 167 } 168 cout<<" * 按任意键返回:"; 169 b=getchar(); 170 b=getchar(); 171 break; 172 } 173 system("cls"); 174 index(); 175 cin>>a; 176 } 177 return 0; 178 }//主函数