一、程序概述
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 }//主函数