掲示板利用宣言

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

 私は

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

掲示板2

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

No.25529

文字の頻度
投稿者---スケイス(2006/01/21 00:53:25)


ファイルに含まれる文字の頻度を調べるプログラムをつくっているのですが、どうもうまくいきません。ご教授おねがいします。ファイルの入力、出力、ソートはできています。

/#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
    char a;
    int ascii[52],count[52];
    int b,c,d,e;
    FILE *fp;
    
    for(b=0;b<26;b++)
    {
        ascii[b]=b+65;
        ascii[b+26]=b+97;
    }
    
    for(b=0;b<52;b++)
    count[b];
    
    if((fp=fopen( argv[1], "r"))==NULL)
    {
        printf("File not open...\n");
        exit(1);
    }
    
    while(feof(fp)==0)
    {
        fscanf(fp,"%c",&a);
        if(isalpha(a)!=0)
        {
            for(b=0;b<52;b++)
            {
                if(a==ascii[b])
                count[b]++;
            }
        }
    }
    
    fclose(fp);
    
    
    for(b=0;b<51;b++)
    {
        for(c=b+1;c<52;c++)
        {
            if(count[b]<count[c])
            {
                d=ascii[b];
                ascii[b]=ascii[c];
                ascii[c]=d;
                
                e=count[b];
                count[b]=count[c];
                count[c]=e;
            }
        }
    }
    
    fp=fopen("out.txt","w");
    for( b = 0 ; b <52 ; b++ )
    {
        printf("%c\t%d\n",ascii[b],count[b]);
        fprintf(fp,"%c\t%d\n",ascii[b],count[b]);
    }
    fclose(fp);

    return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字の頻度 25531 RiSK 2006/01/21 00:57:09
<子記事> Re:文字の頻度 25533 επιστημη 2006/01/21 01:05:53
<子記事> Re:文字の頻度 25535 iijima 2006/01/21 01:17:04


No.25531

Re:文字の頻度
投稿者---RiSK(2006/01/21 00:57:09)


>ファイルに含まれる文字の頻度を調べるプログラムをつくっているのですが、どうもうまくいきません。ご教授おねがいします。ファイルの入力、出力、ソートはできています。

で,うまくいかないのは何ですか?


この投稿にコメントする

削除パスワード

No.25533

Re:文字の頻度
投稿者---επιστημη(2006/01/21 01:05:53)


> char a;
> int ascii[52],count[52];
> int b,c,d,e;

"読めるもんなら読んでみろ"と言わんばかりのコードなので僕は読みません。
# aってなに? bってなに? cってなに? dってなに? eってなに?


この投稿にコメントする

削除パスワード

No.25535

Re:文字の頻度
投稿者---iijima(2006/01/21 01:17:04)


次の2行は何をしたいのかな〜

    for(b=0;b<52;b++)
    count[b];



この投稿にコメントする

削除パスワード

No.25549

Re:文字の頻度
投稿者---スケイス(2006/01/21 12:23:03)


>次の2行は何をしたいのかな〜
それぞれの値の結果を初期化しています。
>で,うまくいかないのは何ですか
出力時に、テキストの中に含まれている文字を大幅に超えたものが出力されてしまうのです。
>aってなに? bってなに? cってなに? dってなに? eってなに?
aは一文字ずつfscanfで入力させるためのものです。bとcは多き順番に並べるときのループの回数。dとeは結果を格納しておく場所です。


この投稿にコメントする

削除パスワード

No.25550

Re:文字の頻度
投稿者---επιστημη(2006/01/21 12:42:49)


>>aってなに? bってなに? cってなに? dってなに? eってなに?
>aは一文字ずつfscanfで入力させるためのものです。bとcは多き順番に並べるときのループの回数。dとeは結果を格納しておく場所です。

だったらもっとマシな変数名にしましょう。



この投稿にコメントする

削除パスワード

No.25551

Re:文字の頻度
投稿者---επιστημη(2006/01/21 12:55:37)


>>次の2行は何をしたいのかな〜
>それぞれの値の結果を初期化しています。

それじゃ初期化になりません。



この投稿にコメントする

削除パスワード

No.25552

Re:文字の頻度
投稿者---iijima(2006/01/21 13:41:15)


>>次の2行は何をしたいのかな〜
>それぞれの値の結果を初期化しています。
>>で,うまくいかないのは何ですか
>出力時に、テキストの中に含まれている文字を大幅に超えたものが出力されてしまうのです。

その2行直後で"count[b]"(b=0〜51)の値を表示させてみると、
問題の原因と解決方法が見え来ると思います。


この投稿にコメントする

削除パスワード

No.25553

Re:文字の頻度
投稿者---スケイス(2006/01/21 16:27:32)


初期化これじゃできませんね。
count[b]=0;
これで無事に実行できるようになりました。みなさんありがとうございました。

変数の名前はいつもaやb、iやjを使っていました。変数の名前はどのようにつければいいのでしょうか??^^;

このプログラムに置き換えの機能をつけたいのですが、方法が思いつかないので、どのように考えればいいのでしょうか?

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

{
    char* p;
    for(  *p != '\0'; ++p )
    {
        if( isalpha( *p ) )
        {
            if( !(isalpha(c) !=0 && '\n' && ' ') ){
                *p = ' ';
                ++*p;
        }
    }
}


こんな感じなのでしょうか??


この投稿にコメントする

削除パスワード

No.25554

Re:文字の頻度
投稿者---スケイス(2006/01/21 16:45:59)


すいません説明不足でした。スペース、改行、アルファベット以外をスペースに置き換えるためにはどのようにしたらいいでしょうか??


この投稿にコメントする

削除パスワード

No.25555

Re:文字の頻度
投稿者---RAPT(2006/01/21 16:48:39)


> スペース、改行、アルファベット以外をスペースに置き換える
char c = 文字;
if( c がスペース、改行、アルファベット以外 ){
    putchar(スペース);
}else{
    putchar( c );
}



この投稿にコメントする

削除パスワード

No.25556

Re:文字の頻度
投稿者---スケイス(2006/01/21 16:53:50)


ありがとうございます。このような感じでいいのでしょうか?
char c = 文字;
if(isalpha(c)!=0 &&' '&&'\n'){
    putchar(' ');
}else{
    putchar( c );
}



この投稿にコメントする

削除パスワード

No.25559

Re:文字の頻度
投稿者---iijima(2006/01/21 17:15:18)


>このような感じでいいのでしょうか?

    if(isalpha(c)!=0 &&' '&&'\n'){
        処理★
    }

これだと
「
isalpha関数の引数にcを渡したときの戻り値が0でない
かつ
' '(スペースの文字コード)が真(0以外)
かつ
'\n'(改行の文字コード)が真(0以外)
」
のときに「処理★」を行え、ということになりますが、それで良いでしょうか。

# 老婆心ながら、疑問点を人に聞く前に自分でテストするクセをつけた方が
# 良いと思いますよ。



この投稿にコメントする

削除パスワード

No.25557

Re:文字の頻度
投稿者---Blue(2006/01/21 16:54:21)


同じ質問?
http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+25377

それと、名前をコロコロ変えても、同一人物だとわかるように
この掲示板は出来ています。
人の親切(レス)を無視するような非常識な方にはまともなレスはつきませんよ。


この投稿にコメントする

削除パスワード

No.25558

Re:文字の頻度
投稿者---スケイス(2006/01/21 16:57:47)


Blueさんすいませんでした。blueさんのレスを見逃していました。
参考にさせていただきます。同じ名前で質問すると多重投稿になると思いまして名前を変えさせていただきました。すいませんでした。



この投稿にコメントする

削除パスワード

No.25561

Re:文字の頻度
投稿者---iijima(2006/01/21 17:37:19)


http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+25377

↑のスレッドと同じ人だったの?
あっちは「無事にできました」で解決したみたいだったけど。



この投稿にコメントする

削除パスワード

No.25567

Re:文字の頻度
投稿者---スケイス(2006/01/21 17:50:48)


あちらのほうは趣旨が間違っていたために終わらせていただきました^^;

文字の置き換えから、タイトル変えるのはおかしいかと思いまして。
一様文字の置き換えもPART様のアドバイスももらい以下のようにできました。
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>

int main(int argc, char **argv[])
{
    char a,*p,str[100];
    int ascii[52],count[52];
    int b,c,d,e;
    FILE *fp,*lp;
    
    for(b=0;b<26;b++)
    {
        ascii[b]=b+65;
        ascii[b+26]=b+97;
    }
    
    for(b=0;b<52;b++)
    count[b]=0;
    
    if((fp=fopen( argv[1], "r"))==NULL)
    {
        printf("File not open...\n");
        exit(1);
    }
    
    while(feof(fp)==0)
    {
        fscanf(fp,"%c",&a);
        if(isalpha(a)!=0)
        {
            for(b=0;b<52;b++)
            {
                if(a==ascii[b])
                count[b]++;
            }
        }
    }
    
    fclose(fp);
    
    
    for(b=0;b<51;b++)
    {
        for(c=b+1;c<52;c++)
        {
            if(count[b]<count[c])
            {
                d=ascii[b];
                ascii[b]=ascii[c];
                ascii[c]=d;
                
                e=count[b];
                count[b]=count[c];
                count[c]=e;
            }
        }
    }
    

    for( b = 0 ; b < 52 ; b++ )
    {
        printf("%c\t%d\n",ascii[b],count[b]);
    }
    
    fp=fopen(argv[1],"r");
    lp=fopen("output.txt","w");
    
    while( fgets( str,sizeof(str),fp) )
    {
        p=str;
       while( *p ) 
        {
            if(isalpha(*p)==0) *p=' ';
            p++;
        }
        fprintf(lp,"%s\n",str);
    }
    fclose(fp);
    fclose(lp);
    
    return 0;
}



今度はこれに、文字ではなく単語を取り出して、頻度の高い上位50個を表示させたいのですが、これはどのように考えればいいのでしょうか?



この投稿にコメントする

削除パスワード

No.25573

Re:文字の頻度
投稿者---iijima(2006/01/21 19:52:54)


# ちょっと粘着気味ですまんが
#
# > あちらのほうは趣旨が間違っていたために終わらせていただきました^^;
#
# なにがどう間違っていたのか分かりませんが、まじめに回答してくださった方々
# に対して、間違いの内容説明もお詫びの言葉もなく、「無事にできました」とい
# う“ウソ”でスレッドを打ち切ったということですね。
# しかも、今回、同じ問題を別の名前で質問した、と。
# かなりぶ厚い面の皮とぶっとい神経をお持ちのようですな。

以下本題:

        p=str;
        while( *p ) 
        {
            if(isalpha(*p)==0) *p=' ';
            p++;
        }


これだと改行もスペースに置き換わるので、「スペース、改行、アルファベット以外
をスペースに置き換える」にはなっていません。
# これも「趣旨が間違っていた」?


> 今度はこれに、文字ではなく単語を取り出して、頻度の高い上位50個を表示させた
> いのですが、これはどのように考えればいいのでしょうか?

私はパスします。



この投稿にコメントする

削除パスワード

No.25578

Re:文字の頻度
投稿者---スケイス(2006/01/21 22:11:00)


申し訳ありませんでした。確かに以下のだと改行もスペースになっていました。
        p=str;
        while( *p ) 
        {
            if(isalpha(*p)==0) *p=' ';
            p++;
        }



if(isalpha(*p)&&'\n'&&' '==0)
でアルファベット以外は全てスペースとなっておりました。この条件式に'\n'は含まないという書き方はどのようにすればよろしいのでしょうか?
アルファベット&&改行&&スペースとやりましたがどうもうまくいきませんでした。アドバイスのほうよろしくお願いします。


この投稿にコメントする

削除パスワード

No.25576

Re:文字の頻度
投稿者---επιστημη(2006/01/21 21:49:53)


>今度はこれに、文字ではなく単語を取り出して、頻度の高い上位50個を表示させたいのですが、これはどのように考えればいいのでしょうか?

考え方は今までと同じ。

1. 文字でなく、単語で切り出す
2. char ascii[52]:「長さ固定の文字の配列」では無理。
  「長さ可変の文字列の配列」を考えるべし。




この投稿にコメントする

削除パスワード

No.25577

Re:文字の頻度
投稿者---スケイス(2006/01/21 22:05:48)


επιστημη様回答ありがとうございます。
ポインタを使えっって考えて見ます。


この投稿にコメントする

削除パスワード

No.25579

Re:文字の頻度
投稿者---επιστημη(2006/01/21 22:20:16)


>ポインタを使えっって考えて見ます。

C++に乗り換えればさっくり解決しちゃうんだけどね (^^

std::map<std::string,int> histgram;
これひとつで文字列の頻度表のできあがり。
あとは単語で切り出して投げ込むだけ。

# 独り言。スルーしてください。



この投稿にコメントする

削除パスワード

No.25615

Re:文字の頻度
投稿者---Blue(2006/01/22 02:43:54)


ソートすることを考えると、
登録用のリスト(std::map)と、ソート用のリスト(std::vector)を
うまく使うしかないですかね?

なんかいいコンテナがあるのかな?


この投稿にコメントする

削除パスワード

No.25616

Re:文字の頻度
投稿者---επιστημη(2006/01/22 03:27:39)


>ソートすることを考えると、
>登録用のリスト(std::map)と、ソート用のリスト(std::vector)を
>うまく使うしかないですかね?

え? std::mapの要素はソートされてます。
ハッシュぢゃないから。



この投稿にコメントする

削除パスワード

No.25620

Re:文字の頻度
投稿者---iijima(2006/01/22 09:43:17)


>>ソートすることを考えると、
>>登録用のリスト(std::map)と、ソート用のリスト(std::vector)を
>>うまく使うしかないですかね?
>
>え? std::mapの要素はソートされてます。

仕様は「辞書順で表示」でなくて「頻度順で表示」のようです。


この投稿にコメントする

削除パスワード

No.25572

Re:文字の頻度
投稿者---επιστημη(2006/01/21 19:21:12)


>変数の名前はいつもaやb、iやjを使っていました。変数の名前はどのようにつければいいのでしょうか??^^;

ループ制御に用いるi,jはお約束だからいいとして、
意味のある変数には「その意味をコトバで説明しなくてもいい」ような名前。



この投稿にコメントする

削除パスワード

No.25588

Re:文字の頻度
投稿者---RiSK(2006/01/21 23:49:26)


>変数の名前はいつもaやb、iやjを使っていました。変数の名前はどのようにつければいいのでしょうか??^^;

何のための変数なのか(目的)を考えれば分かるでしょう。
一度,日本語プログラム言語「なでしこ」とかやってみると良いでしょう。

一文字識別子が好きならこういうコードでよだれが出るでしょう?
/*
 * ファイルに含まれる文字の頻度を調べるプログラム
 * ファイルの入力、出力、ソート
 */
typedef struct{
    int a,b;
}a;
static const char*const b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int c(a a[],int c){
    int d;
    for(d=0;d<c&&b[d];++d)a[d].a=b[d],a[d].b=0;
    return 1;
}
#include<stdio.h>
#include<string.h>
int d(const char*c,a a[],int d){
    FILE*e=fopen(c,"r");
    int f;
    const char*g;
    if(!e)return 0;
    for(;(f=fgetc(e))!=EOF;)(g=strchr(b,f))&&g&&g-b>=0&&g-b<d&&++a[g-b].b;
    return 1;
}
int e(const void*b,const void*c){
    return((const a*const)c)->b-((const a*const)b)->b;
}
int f(const a a[],int b){
    int c;
    FILE*d=fopen("out.txt","w");
    if(!d)return 0;
    for(c=0;c<b;++c)printf("%c\t%d\n",a[c].a,a[c].b),fprintf(d,"%c\t%d\n",a[c].a,a[c].b);
    return !fclose(d);
}
#include<stdlib.h>
#define A 52
int main(int b, char**g){
    a a[A];
    return !(b>1&&c(a,A)&&d(g[1],a,A)&&(qsort(a,A,sizeof(a[0]),e),f(a,A)));
}



この投稿にコメントする

削除パスワード

No.25590

Re:文字の頻度
投稿者---スケイス(2006/01/22 00:26:10)


RiSK様回答ありがとうございます。聞きたいのですが、if(isalpha(*p)==0) *p=' ';をのどのように変えれば、アルファベット・スペース・改行はそのままで、他の記号をスペースに置き換えられるのでしょうか?どうやってもできません。アドバイスお願いします。


この投稿にコメントする

削除パスワード

No.25595

Re:文字の頻度
投稿者---RiSK(2006/01/22 00:49:17)


> 聞きたいのですが、if(isalpha(*p)==0) *p=' ';をのどのように変えれば、アルファベット・スペース・改行はそのままで、他の記号をスペースに置き換えられるのでしょうか?

何の話ですか? 私のコードにはそんな部分はありません。
25555,25559,25573を読んでいないのですか?
すでにあなたはあなた自身の行動が原因で反感を買っています。
そんなんで図々しくも掲示板で名指しなんてしないでください。


>どうやってもできません。

どうやったのですか?
1.目的の動作
2.「やってみた」コード
3.やってみたコードの動作
を全部書いてみてください。
# あなたは回答者を無視しすぎだ。


25555における「、」が分からないのですか? Yes/No
「以外」が分からないのですか? Yes/No
if文が分からないのですか? Yes/No
!演算子が分からないのですか? Yes/No
&&演算子が分からないのですか? Yes/No
演算子の優先樹陰井川からないのですか? Yes/No
全部Yes/Noを答えてください。


この投稿にコメントする

削除パスワード

No.25596

Re:文字の頻度
投稿者---RiSK(2006/01/22 00:51:19)


ひでえtypo.自分で爆笑しちゃったヨ

>演算子の優先樹陰井川からないのですか? Yes/No

演算子の優先順位が分からないのですか? Yes/No


この投稿にコメントする

削除パスワード

No.25598

Re:文字の頻度
投稿者---スケイス(2006/01/22 01:09:31)


RiSK様のソースは初心者の私から見ると、難しすぎて理解ができません。本当はすばらしいソースだと思うのですか。自分の未熟さに残念です。
part様の通りにしたいのですが、ここの部分がif( c がスペース、改行、アルファベット以外 ){どうしても分からないので返事が出せませんでした。
iijima様の言っていることは分かるのですが、条件式のところがどうもいきませんでした。


1.目的の動作
テキストから入力されたアルファベット・スペース・改行はそのままにし、それ以外の記号をスペースに置き換える。
2.「やってみた」コード
            if(isalpha(*p)==0){
            *p=' ';


            if(isalpha(*p)==0 && ' '&& '\n'){
            *p=' ';


3.テキストに変化がない。アルファベットがスペースに置き換わった。改行がスペースになった。

>25555における「、」が分からないのですか? Yes/No
Yes
>「以外」が分からないのですか? Yes/No
Yes
>if文が分からないのですか? Yes/No
No
>!演算子が分からないのですか? Yes/No
No
>&&演算子が分からないのですか? Yes/No
No
>演算子の優先順位が分からないのですか? Yes/No
No

申し訳ありませんでした。


この投稿にコメントする

削除パスワード

No.25599

Re:文字の頻度
投稿者---nop(2006/01/22 01:14:51)


>ここの部分がif( c がスペース、改行、アルファベット以外 ){どうしても分からないので返事が出せませんでした。

では、以下のそれぞれは単独であればわかりますか?

1.「c」がアルファベット以外
2.「c」が改行以外
3.「c」がスペース以外


この投稿にコメントする

削除パスワード

No.25601

Re:文字の頻度
投稿者---スケイス(2006/01/22 01:19:06)


nop様回答ありがとうございます。
>1.「c」がアルファベット以外
(isalpha(*p)==0)
>2.「c」が改行以外
(isalpha(*p)!='\n')
>3.「c」がスペース以外
(isalpha(*p)!=' ')
こんな感じでしょうか?^^;




この投稿にコメントする

削除パスワード

No.25602

Re:文字の頻度
投稿者---επιστημη(2006/01/22 01:22:54)


>nop様回答ありがとうございます。
>>1.「c」がアルファベット以外
>(isalpha(*p)==0)
>>2.「c」が改行以外
>(isalpha(*p)!='\n')
>>3.「c」がスペース以外
>(isalpha(*p)!=' ')
>こんな感じでしょうか?^^;

…なんでやねん。
isalpha(*p) は *pがアルファベットか否かを返します。
「"アルファベットか否か"がスペースではない」ってどゆこと?





この投稿にコメントする

削除パスワード

No.25603

Re:文字の頻度
投稿者---nop(2006/01/22 01:26:14)


>こんな感じでしょうか?^^;

それは、実際に試せば正しいか正しくないかはわかるはずです。
何故、まず試してみようと思わないのですか?

まず、洗いざらい人に聞く前に自分で試してみる、
と言う癖を身につけましょう。
そして、その結果を書き込んで始めて

 「自分ではここまでやったけど、理解できなかった」

と人に言えるのです。
自分で試すこともせず、すぐに人に聞くだけでは、
何も得ることは出来ませんよ?


この投稿にコメントする

削除パスワード

No.25614

Re:文字の頻度
投稿者---スケイス(2006/01/22 02:34:25)


nopさん、一応全部ためしたんですが報告するのを忘れていました。
申し訳ありませんでした。nopさんのヒントで理解することができました。


この投稿にコメントする

削除パスワード

No.25604

Re:文字の頻度
投稿者---KING・王(2006/01/22 01:27:02)


すでに、επιστημηさんから回答および指摘がありますが、
関数を使用するなら、その仕様をまず調べ、確認しましょう。
isalpah()の仕様を全く理解できていないようです。

とりあえず、MSDNですが、下記などをしっかり読み、“理解”して下さい。
> http://www.microsoft.com/JAPAN/developer/library/vccore/_crt_isalpha.2c_.iswalpha.htm



この投稿にコメントする

削除パスワード

No.25600

Re:文字の頻度
投稿者---επιστημη(2006/01/22 01:16:27)


>テキストから入力されたアルファベット・スペース・改行はそのままにし、それ以外の記号をスペースに置き換える。

if(isalpha(*p)==0 && ' '&& '\n')

なんじゃそりゃ。

*p がアルファベットでない : isalpha(*p) == 0
*p がスペースでない : *p != ' '
*p が改行でない : *p != '\n'

この三つを && で繋ぐ。



この投稿にコメントする

削除パスワード

No.25605

Re:文字の頻度
投稿者---スケイス(2006/01/22 01:27:48)


επιστημη様、回答ありがとうございます。やはりそれでも改行がスペースになってしまいます。もう一度ソースを載せます。どこか悪いところがあるのでしょうか?

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

int main(int argc, char **argv[])
{
    char a,*p,str[100];
    int ascii[52],count[52];
    int b,c,d,e;
    FILE *fp,*lp;
    
    for(b=0;b<26;b++)
    {
        ascii[b]=b+65;
        ascii[b+26]=b+97;
    }
    
    for(b=0;b<52;b++)
    count[b]=0;
    
    if((fp=fopen( argv[1], "r"))==NULL)
    {
        printf("File not open...\n");
        exit(1);
    }
    
    while(feof(fp)==0)
    {
        fscanf(fp,"%c",&a);
        if(isalpha(a)!=0)
        {
            for(b=0;b<52;b++)
            {
                if(a==ascii[b])
                count[b]++;
            }
        }
    }
    
    fclose(fp);
    
    
    for(b=0;b<51;b++)
    {
        for(c=b+1;c<52;c++)
        {
            if(count[b]<count[c])
            {
                d=ascii[b];
                ascii[b]=ascii[c];
                ascii[c]=d;

                e=count[b];
                count[b]=count[c];
                count[c]=e;
            }
        }
    }
    

    for( b = 0 ; b < 52 ; b++ )
    {
        printf("%c\t%d\n",ascii[b],count[b]);
    }
    
    fp=fopen( argv[1], "r");
    lp=fopen("output.txt","w");
    while( fgets( str,sizeof(str),fp) )
    {
        p=str;
       while( *p )
        {
            if(isalpha(*p)==0 && *p != ' ' && *p != '\n'){
            *p=' ';
            }
            p++;
        }
        fprintf(lp,"%s\n",str);
    }
    fclose(fp);
    fclose(lp);
    
    return 0;
}


置き換え前
A STUDY IN SCARLET.\n
By A. CONAN DOYLE\n
置き換え後
A STUDY IN SCARLET__
By A CONAN DOYLE_

\nは改行コード
_はスペースです。


この投稿にコメントする

削除パスワード

No.25606

Re:文字の頻度
投稿者---επιστημη(2006/01/22 01:37:07)


>επιστημη様、回答ありがとうございます。やはりそれでも改行がスペースになってしまいます。もう一度ソースを載せます。どこか悪いところがあるのでしょうか?

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

void replace(char* p) {
  while ( *p ) {
    if ( isalpha(*p)==0 && *p != ' ' && *p != '\n'){
      *p='_';
    }
    p++;
  }
}

int main() {
  char str[] = "this !is \ntest.\n";
  printf("[%s]\n", str);
  replace(str);
  printf("[%s]\n", str);
  return 0;
}



実行結果:
[this !is
test.
]
[this _is
test_
]

問題ありませんけど。



この投稿にコメントする

削除パスワード

No.25608

Re:文字の頻度
投稿者---スケイス(2006/01/22 01:52:54)


επιστημη様、すいません
isalpha(*p)==0 && *p != '\n'
このようにすると無事にできました。スペースを含めるとどうもうまくいかないのかがよくわかりません。

OS:XP_Pro
実行、コンパイル:XonWindows3(Cygwin)
テキストエディタ:秀丸
改行コード:LF
文字コード:日本語EUC


この投稿にコメントする

削除パスワード

No.25607

Re:文字の頻度
投稿者---επιστημη(2006/01/22 01:43:42)


> やはりそれでも改行がスペースになってしまいます。

確認。

1. これをコンパイル/実行しているのはWindows? Linux? 他のなにか?
2. 食わせているファイルを生成したのはWindows? Linux? 他のなにか?


この投稿にコメントする

削除パスワード

No.25609

Re:文字の頻度
投稿者---スケイス(2006/01/22 02:05:07)


επιστημη様すいません、今コンパイルしてみたところできました。お騒がせしました。><;


この投稿にコメントする

削除パスワード

No.25610

Re:文字の頻度
投稿者---επιστημη(2006/01/22 02:09:31)


>επιστημη様すいません、今コンパイルしてみたところできました。お騒がせしました。><;

コードをいじらず、再コンパイルしただけ?
それともスペース判定を除外してコンパイル?




この投稿にコメントする

削除パスワード

No.25611

Re:文字の頻度
投稿者---スケイス(2006/01/22 02:22:49)


>コードをいじらず、再コンパイルしただけ?
>それともスペース判定を除外してコンパイル?

スペース判定を入れないでコンパイルしたら無事にできましたので、もう一度スペース判定を入れて再コンパイルしたら、できました。^^;自分でも何が原因だったのかさっぱり分かりません。
επιστημη様、たびたびご迷惑をおかけいたしまして申し訳ありませんでした。本当にみなさまありがとうございました。
次は、文字ではなく単語の優先順位の高い頻度順に表示するプログラムに改変していきたいと思います。単語の見分け方はスペースで判断させていいのでしょうか?



この投稿にコメントする

削除パスワード

No.25612

Re:文字の頻度
投稿者---επιστημη(2006/01/22 02:27:13)


> 単語の見分け方はスペースで判断させていいのでしょうか?

あのさー、それは仕様であって"あなた"が決めることでしょう?
「空白で区切られた文字の並びを単語とする」のか否か、やないですか!?




この投稿にコメントする

削除パスワード

No.25613

Re:文字の頻度
投稿者---スケイス(2006/01/22 02:30:20)


そのとうりですね。すいませんでした^^;





この投稿にコメントする

削除パスワード

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