标题:文件操作与字符处理 求高人指点 总是执行不了
只看楼主
余米
Rank: 1
来 自:开平
等 级:新手上路
帖 子:13
专家分:1
注 册:2012-1-21
结帖率:100%
已结贴  问题点数:6 回复次数:7 
文件操作与字符处理 求高人指点 总是执行不了
在当前目录中存在文件名为“case1.txt”的文本文件,现读取该文本的内容,统计文章中每个单词的出现次数,并输出出现次数最多的前5个单词及其出现次数:


#include<stdio.h>
#include<string.h>
#include<ctype.h>

struct
{
  char word[21];
  int count;

}leader[6];                    //设置结构体,用于存放出现次数最多的前5个的单词及其出现次数;




int main()
{


   FILE *fp;
   char str[10000][21]={"\0"},temp[21]="",a;
   int  i=0,j=0,n=0,c[10000]={0},t=0,max;



if((fp=fopen("case1.txt","r"))==NULL)
      return 0;                                 //打开文件;

while(fscanf(fp,"%c",a)>0)                     //从文件中读取一个字符;
    {

       if(isalpha(a))                          //判断它是否是字母;
       {
          temp[n]=a;                           //如果是就放入字符数组temp中;
          n++;
       }
       else
       {
          strlwr(temp);                        //如果遇到非字母的字符,就将字符数组temp中的大写字母变小
          strcpy(str[i],temp);                 //写,并将其放入二维字符数组str中;


          for(t=0;t<21;t++)                    //清空字符数组temp;
          {
              strcpy(temp[t],"\0");
          }
          i++;
          n=0;
 
       }
    }


for(n=0;n<i-1;n++)                                              //统计相同单词的个数,并将统计数放入数组
  for(j=n+1;j<i;j++)                                            //c中
  {
   if(((strcmp(str[n],str[j]))==0)&&(str[n]!="\0"))
      c[n]=c[n]+1;
      strcpy(str[j],temp);
  }

for(n=0;n<5;n++)                              //统计出现次数最多的前5个的单词,并将它和它的出现次数放入
 {                                            //结构体中;
   for(j=0;j<i+1;j++)
  {   max=c[0];
      if(c[j]>max)
    {
      max=c[j];
       t=j;
    }
  }

   strcpy(leader[n].word,str[j]);
   leader[n].count=max;
   c[j]=0;
 }


for(n=0;n<5;n++)                                    //对出现次数最多的五个单词进行排序;
  for(j=n+1;j<5;j++)
  {
   if((leader[n].count==leader[j].count)&&(strcmp(leader[j].word,leader[n].word)))
   {
     strcpy(leader[5].word,leader[j].word);
     strcpy(leader[j].word,leader[n].word);
      strcpy(leader[n].word,leader[5].word);
   }
  }

 for(n=0;n<5;n++)                                    //输出那五个单词及其出现次数;
  {
   printf("%s  %d",leader[n].word,leader[n].count);
  }

 fclose(fp);
  return 0;
  }
搜索更多相关主题的帖子: 单词 word 文本文件 include leader 
2012-01-31 15:18
余米
Rank: 1
来 自:开平
等 级:新手上路
帖 子:13
专家分:1
注 册:2012-1-21
得分:0 
有人么?请99我!!!!!!!!!!!!!!
2012-01-31 15:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:3 
沒細看你的代碼哪錯了,只看了題目要求和你用讀字符方法實現的思路,就知道你方向性錯誤。不用這樣寫的。

授人以渔,不授人以鱼。
2012-01-31 15:21
余米
Rank: 1
来 自:开平
等 级:新手上路
帖 子:13
专家分:1
注 册:2012-1-21
得分:0 
怎样写啊??
2012-01-31 15:53
余米
Rank: 1
来 自:开平
等 级:新手上路
帖 子:13
专家分:1
注 册:2012-1-21
得分:0 
我是新手啊,求指出具体错误的地方
2012-01-31 15:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
思路:用fscanf(fp, "%s", str)一次讀入一個完整的單詞,這是scanf()函數的最佳特性,過濾空白字符得到單詞。讀入單詞放入數組,放入之前要先檢測數組中是否已有這個單詞(我不知道你轉換字符大小寫那些動作是什麼意思,題目似乎沒有要求,但你做也無妨),這點消耗是不可少的。排序可以玩點技巧,添加單詞的同時就排序,像你現在用的事後排序也可以,小數據量下差不了多少。

其實這個題目的難點不是讀入數據和排序輸出,而是單詞簿動態增長,本來應該用鏈表實現,但你如果沒學到,用現在的定尺寸數組也可以。

這裡,你首先要分解如下幾個功能:
1.讀入單詞
2.字符串比較(有現成函數,不知道可以自己寫)
3.在单词簿中查找單詞
4.排序
把這幾個功能分割為函數,主程序才清晰,排錯也容易。

授人以渔,不授人以鱼。
2012-01-31 16:05
余米
Rank: 1
来 自:开平
等 级:新手上路
帖 子:13
专家分:1
注 册:2012-1-21
得分:0 
用fscanf(fp, "%s", str)不会把其他字符读进去么?
2012-01-31 17:19
BianChengNan
Rank: 8Rank: 8
等 级:贵宾
威 望:13
帖 子:302
专家分:972
注 册:2011-11-30
得分:3 
以下是引用余米在2012-1-31 17:19:58的发言:

用fscanf(fp, "%s", str)不会把其他字符读进去么?
关于这个函数的用法 可以到msdn上查找,或者baidu肯定能找到的

我的群:149544757 C/C++/Assembly 喜欢交流的朋友进,进群请写消息
2012-02-01 10:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-360183-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.102500 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved