1 #include <stdio.h>
2 #include <string.h>
3 using namespace std;
4
5 struct cha
6 {
7 char aa[50];//存储单词(不重复)
8 int num;//该单词出现的次数
9 int Mark[100];//标记该单词出现过的行
10 };
11
12 cha CHA[1000];
13
14 struct Mystr
15 {
16 char bb[50];//存储 :字符串
17 int rol;//存储:字符串 所在行
18 };
19
20
21 void Standard_String(char cans[]) //标准化字符串
22 {
23 int i=0;
24 while(cans[i]!='\0')
25 {
26 if(cans[i]>='A'&&cans[i]<='Z')//字母全小写
27 cans[i]+='a'-'A';
28 else if((! ((cans[i]>='A'&&cans[i]<='Z')||(cans[i]>='a'&&cans[i]<='z')))&&cans[i]!=' ')
29 cans[i]=' '; //符号全变为空格
30 ++i;
31 }
32
33 char standard[501]; //存放标准字符串
34 i=0;int j=0;
35 while(cans[i]==' ')//去开头空格
36 ++i;
37 while(cans[i]!='\0')
38 {
39 while(cans[i] != ' ' && cans[i]!='\0')
40 {
41 char ctem=cans[i];
42 standard[j++]=ctem;
43 ++i;
44 }
45 standard[j++]=' ';
46 while(cans[i] == ' '&&cans[i]!='\0')
47 ++i;
48 }
49 standard[j]='\0';
50 strcpy(cans,standard);
51 }
52
53
54
55 int main()
56 {
57 char cc[500][501]; //存储 原版文本
58 char Standard_File[500][501]; //存储标准化后的文本,用于查找字符串
59 Mystr ans[1000];//存储字符串
60 char tem[50];
61 int i=0,m;
62
63
64
65
66
67 /***************************读取文件*******************************/
68 FILE* fp;
69 if((fp=fopen("E:\\cc.txt","r"))==NULL)
70 {
71 printf("cannot open file\n");
72 return 0;
73 }
74 int fcount=0;//记录文本的行数
75 while(!feof(fp))
76 {
77 i=0;
78 while(!feof(fp))//100个字符为一行存入cc中
79 {
80 fgets(cc[fcount],500,fp);
81 char ctem[501];
82 strcpy(ctem,cc[fcount]);
83 Standard_String(ctem);//字符串标准化
84 strcpy(Standard_File[fcount++],ctem);
85 }
86 }
87 fclose(fp);
88 /***************************************************************************/
89
90
91
92
93
94
95
96
97 /**************************扣取单词,统计单词个数*******************************/
98
99 int count=0;//单词数
100 for(m=0;m<fcount;m++)
101 {
102 i=0;
103 while(cc[m][i]==' ')//去开头空格
104 ++i;
105 while(cc[m][i]!='\0')
106 {
107 ++count;
108 int j=0;
109 //printf("%d : ",count);
110 while( ( (cc[m][i]>='a'&&cc[m][i]<='z')||(cc[m][i]>='A'&&cc[m][i]<='Z')||cc[m][i]=='\'')&&cc[m][i]!='\0')
111 {
112 char ctem=cc[m][i];
113 if(cc[m][i]>='A'&&cc[m][i]<='Z') ctem+='a'-'A';
114 printf("%c",ctem);
115 ans[count].bb[j++]=ctem;
116 ++i;
117 }
118 ans[count].bb[j]='\0';
119 ans[count].rol=m;//记录每个单词所在的行号
120 printf("\n");
121 while( (!( (cc[m][i]>='a'&&cc[m][i]<='z')||(cc[m][i]>='A'&&cc[m][i]<='Z')||cc[m][i]=='\'' ))&&cc[m][i]!='\0' )
122 ++i;
123 }
124 }
125 printf("一共 %d 个单词\n",count);
126
127 /***************************************************************************/
128
129
130
131
132
133
134
135
136
137 /****************************按照字符顺 冒泡排序*********************/
138 int is=0;//是否排序完成
139 int Tct=count;
140 while(is==0)
141 {
142 is=1;
143 for(i=1;i<Tct;i++)
144 {
145 if(strcmp(ans[i].bb,ans[i+1].bb)>0)
146 {
147 is=0;
148 Mystr Mtem=ans[i];
149 ans[i]=ans[i+1];
150 ans[i+1]=Mtem;
151 }
152 }
153 --Tct;
154 }
155 /*********************************************************************************/
156
157
158
159
160
161
162
163
164
165
166 /***************************记录单词出现的次数和所在的行号**************************/
167
168 printf("\n");
169 printf("\n");
170 int count2=-1;//不同的单词的个数
171 for(i=1;i<=count;i++)
172 {
173 if(strcmp(ans[i].bb,ans[i+1].bb)==0)
174 {
175 strcpy(CHA[++count2].aa,ans[i].bb);
176
177 if(CHA[count2].Mark[ans[i].rol]!=1)//标记该单词出现过的行号
178 CHA[count2].Mark[ans[i].rol]=1;
179 if(CHA[count2].Mark[ans[i+1].rol]!=1)//标记该单词出现过的行号
180 CHA[count2].Mark[ans[i+1].rol]=1;
181
182 strcpy(tem,ans[i].bb);
183 CHA[count2].num+=2;
184 i+=2;
185 while(strcmp(tem,ans[i].bb)==0)
186 {
187 ++CHA[count2].num;
188 if(CHA[count2].Mark[ans[i].rol]!=1)//标记该单词出现过的行号
189 CHA[count2].Mark[ans[i].rol]=1;
190 ++i;
191 }
192 --i;
193 }
194 else if (strcmp(ans[i].bb,ans[i+1].bb)!=0)
195 {
196 strcpy(CHA[++count2].aa,ans[i].bb);
197
198 if(CHA[count2].Mark[ans[i].rol]!=1)//标记该单词出现过的行号
199 CHA[count2].Mark[ans[i].rol]=1;
200 CHA[count2].num++;
201 }
202 }
203
204 /*********************************************************************************/
205
206
207
208
209
210 /******************************按照次数排序*************************************/
211
212 printf("\n");
213 printf("\n");
214 is=0;//是否排序完成
215 Tct=count2;
216 while(is==0)
217 {
218 is=1;
219 for(i=0;i<Tct;i++)
220 {
221 if(CHA[i].num<CHA[i+1].num)
222 {
223 is=0;
224 cha ctem=CHA[i];
225 CHA[i]=CHA[i+1];
226 CHA[i+1]=ctem;
227 }
228 }
229 --Tct;
230 }
231 if(count2!=0)
232 {
233 printf("先按次数再按字符序的排序如下:\n\n");
234 for(i=0;i<=count2;i++)
235 printf("第%d个: 出现次数为:%d次 %s\n",i+1,CHA[i].num,CHA[i].aa);
236 }
237
238 /*********************************************************************************/
239
240
241
242
243
244
245
246 /******************************输出 次数 频率*************************************/
247
248 printf("\n");
249 printf("\n");
250 for(i=0;i<=count2;i++)
251 printf("字符:%s 次数为:%d 频率:%0.3lf\n",CHA[i].aa,CHA[i].num,(double)CHA[i].num/count);
252 printf("\n");
253 printf("\n");
254 /*********************************************************************************/
255
256
257
258
259
260
261
262
263 /***********************************查找***************************************/
264
265
266 printf("查找单词请输入‘1’,查找字符串请输入‘2’:");
267 int mark1;
268 while(scanf("%d",&mark1)!=EOF)
269 {
270 int find=0;
271 /***********************查找单词************************/
272 if(mark1==1)
273 {
274 char word[50];
275 printf("请输入要查找的单词:\n");
276 scanf("%s",word);
277 printf("\n");
278
279 for(i=0;i<=count2;i++)
280 {
281 if(strcmp(word,CHA[i].aa)==0)
282 {
283 find=1;
284 for(m=0;m<fcount;m++)
285 {
286 if(CHA[i].Mark[m]==1)
287 printf("找到第%d行:%s\n",m+1,cc[m]);
288 }
289
290 break;
291 }
292 }
293
294 if(find==0) printf("该单词不存在!!\n");
295 }
296 /***************************查找字符串************************/
297 else
298 {
299 char word2[50];
300 printf("请输入要查找的字符串:\n");
301 getchar();
302 gets(word2);
303 Standard_String(word2);//字符串标准化
304 int len2 = strlen(word2);
305 printf("\n");
306 for(m=0;m<fcount;m++)
307 {
308 int len1=strlen(Standard_File[m]);
309
310 if(len1<len2) continue;
311
312 for(i=0;i+len2<=len1;i++)
313 {
314 while((i+len2<=len1)&&word2[0]!=Standard_File[m][i])
315 ++i;
316
317 if(i+len2>len1) continue;
318
319 char ctem[50];
320 strncpy(ctem,Standard_File[m]+i,len2);
321 ctem[len2]='\0';
322 if(strcmp(ctem,word2)==0)
323 {
324 printf("找到第%d行:%s\n",m+1,cc[m]);
325 break;
326 }
327 }
328 }
329 }
330 printf("\n查找单词请输入‘1’,查找字符串请输入‘2’:");
331 }
332
333 /*********************************************************************************/
334
335 return 1;
336 }