這是一道我們軟件工程的個人作業,得到了這個題目,我第一個念頭就是用C語言來編寫,畢竟別的語言不太精通只能選擇C語言!
程序說明:對於這個問題我的理解就是要通過結構體來實現對單詞和出現次數的統計,先將文章讀入,然后通過每次讀入一個字符來判斷它是否是字母,如果不是字母,那么就說明一個單詞已經結束了,通過這樣來確定單詞的結束!通過將單詞存入一個緩沖的數組,然后再和結構體的數組進行對比,如果單詞有重復,那就將該單詞出現的次數加一,如果沒有出現,那就繼續運行!最后通過一個冒泡排序算法,將A[i].num從大到小排序,最后輸出出現字數最多的前十個!
程序代碼:
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
struct word
{
char str[30]; //單詞
int num; //單詞出現的次數
}A[1000];
int sum; //單詞的總個數
void chuli(char s[])
{
int i,j;
int flag=0; //flag為零時沒有重復的
for(i=0;i<=sum;i++)
{
if(strcmp(A[i].str,s)==0)
{
A[i].num++;
flag=1;
sum++;
}
}
if(flag==0)
{
for(j=0;j<30;j++)
A[sum].str[j]=s[j];
A[sum].num++;
sum++;
}
}
void paixu()
{
int i,j;
struct word a;
for(i=0;i<sum;i++)
{
for(j=i+1;j<sum;j++)
if(A[i].num<A[j].num)
{
a=A[j];
A[j]=A[i];
A[i]=a;
}
}
}
int main()
{
char ch,s[30];
int i,flag=0;
FILE *fp;
fp=fopen("d:\\a.txt","r");
if(fp==NULL)
{
printf("此文件不存在!\n");
}
sum=0;
ch=NULL;
for(i=0;i<1000;i++)
A[i].num=0;
while(ch!=-1)
{
for(i=0;i<30;i++)
s[i]='\0';
ch=fgetc(fp);
if((65<=ch&&ch<=90)||(ch>=97&&ch<=122))
{
for(i=0;;i++)
{
s[i]=ch;
ch=fgetc(fp);
if((65<=ch&&ch<=90)||(ch>=97&&ch<=122))continue;
else break;
}
chuli(s);
}
}
paixu();
printf("該文章共有:%d個單詞\n",sum);
printf("該文章中單詞出現頻率最高的前十個從小到大依次為:\n");
for(i=0;i<10;i++)
printf("%s出現次數為:%d\n",A[i].str,A[i].num);
return 0;
}
程序不足:區分了單詞的大小寫,因為有些單詞的首字母是否大寫表示的單詞意思不同,我就將這中情況看做不同的單詞!
程序截圖: