掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.27052

ビンソート
投稿者---ジャギ(2006/06/01 15:35:11)


#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define MAX 256

int fgetw(char word[],FILE *fp)
{
  int ch,index=0;

  while(isspace(ch = fgetc(fp)));
  if(ch!=EOF){
    word[index++]=ch;
    while(isalnum(ch=fgetc(fp)))
      word[index++]=ch;
    word[index]='\0';
  }
  return( ch );
}
main(int argc, char *argv[]){
  char *file_name,wk[MAX];
  FILE *fp;
  int num=0;
  struct node{
    char word[MAX];
    int count;
    struct node *next;
  };
  struct node *top_pt=NULL, *wk_pt;

  if(argc<2){
    printf("ファイル名を指定!\n");
    exit(1);
  }
  file_name = argv[1];
  printf("Data File:%s\n\n",file_name);
  if((fp=fopen(file_name,"r"))==NULL){
    perror(file_name);
    exit(1);
  }
  while( fgetw(wk,fp) != EOF){
    if((wk_pt = (struct node *)malloc(sizeof(struct node))) ==NULL){
       printf("メモリ確保に失敗\n");
       exit(1);
       }
    strcpy(wk_pt->word,wk);
    wk_pt->count=1;
    wk_pt->next=top_pt;
    top_pt=wk_pt;
    num++;
  }
  printf("#Word %d.\n",num);
  printf("-----------------------------------\n");
  fclose(fp);

  for(wk_pt=top_pt;wk_pt!=NULL;wk_pt=wk_pt->next)
    printf("%10s %3d\n",wk_pt->word,wk_pt->count);

  for(wk_pt=top_pt;wk_pt!=NULL;wk_pt=top_pt){
    top_pt =wk_pt->next;
    free(wk_pt);
  }}



演習でtext.txtファイルを読みこんで単語ごとにわけてファイルを現れる単語の回数を数え、単語とその出現回数を表示するというものがあり挑戦しました。
テキストファイルの内容は
As you increase your knowledge of UNIX and develop new uses
for your system, you may want to learn more about UNIX
commands. you have to read manuals.というものがサンプルであげられています。
そこで上のようなプログラムをつくるところまではできたのですが
これだとto 2 ではなく to 1 to 1 と同じ単語がでてきても別のものとして
数えて表示してしまい美しくありません。
どうすればこれが美しく表示されるものになるのでしょうか?
おちからをおかしください。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ビンソート 27055 kz3 2006/06/02 00:23:02


No.27055

Re:ビンソート
投稿者---kz3(2006/06/02 00:23:02)



while( fgetw(wk,fp) != EOF){ if((wk_pt = (struct node *)malloc(sizeof(struct node))) ==NULL){ printf("メモリ確保に失敗\n"); exit(1); } strcpy(wk_pt->word,wk); wk_pt->count=1; wk_pt->next=top_pt; top_pt=wk_pt; num++; }
> ビンソート ビンソートじゃないです。 > これだとto 2 ではなく to 1 to 1 と同じ単語がでてきても別のものとして > 数えて表示してしまい美しくありません 現れた単語をただ追加しているだけだからです。 出現回数のカウントを忘れています。



この投稿にコメントする

削除パスワード

No.27056

Re
投稿者---student(2006/06/02 00:32:09)


ビンソートとバケツソートってなんかにていたような気がする


この投稿にコメントする

削除パスワード

No.27061

Re:ビンソート
投稿者---ぽろっぺ(2006/06/03 14:23:58)


俺もこんな問題やってるんですけどこまってます。
>studentさんへ。
結局このジャギさんの問題はどこをどう直せばいいんですかね?
ずうずうしくて申し訳ありませんが模範をのせていただければ幸いです。
よろしくお願いいたします。


この投稿にコメントする

削除パスワード

No.27062

Re:ビンソート
投稿者---επιστημη(2006/06/03 14:33:40)


>ずうずうしくて申し訳ありませんが模範をのせていただければ幸いです。
>よろしくお願いいたします。

読み込んだ単語が:
(1) 頻度表に登録済みならcountを+1する
(2) そうでなければ頻度表に(count=1で)追加する

元コードでは(1)を忘れています。

※ このコードは出現頻度(ヒストグラム)を求めているだけで、ビンソートではありません。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧