英文中に現れる異なる単語の数を表示するプログラムがわかりません。
例えば 「the a the」と入力されたら
the=2
a=1
と表示されるプログラムです。
なんとかカウントはされるのですが出力がうまくいきません。同じ単語も表示されてしまいます。
どなたかご教授お願いします。
WindowsXP、コンパイラはBCCを使っています。
#include <stdio.h>
#include <string.h>
#define MAX 256
int main()
{
struct {
char word[MAX];
int counter;
}list[50];
int i,j,total=0;
i=0;
while(scanf("%s",list[i].word)!=EOF){ /*キーボードから文字列をすべて読み込む*/
total++;
i++;
}
list[0].counter=1;
for(i=0;i<=total;i++,list[i].counter=0){ /*比較*/
for(j=1;j<=total;j++){
if(strcmp(list[i].word,list[j].word)==0){
list[i].counter++;
}
}
}
for(i=0;i<=total;i++){
printf("%s %d\n",list[i].word,list[i].counter); /*出力 the=2 a=1 the=1となってしまう*/
}
return(0);
}
No.3ベストアンサー
- 回答日時:
#2補足を手直ししてみました。
------------------------------
#include <stdio.h>
#include <string.h>
#define MAX 256
int main(){
struct {
char word[MAX];
int counter;
}list[50];
int i,j,total,find;
char text[MAX];
total=0;
while(scanf("%s",text)!=EOF){
find=-1;
for(i=0;i<total;i++){
if(strcmp(list[i].word,text)==0){
find=i;
}
}
if(find<0){ /* 見つからない */
strcpy(list[total].word,text);
list[total++].counter=1;
} else {
list[find].counter++;
}
}
for(i=0;i<total;i++){
printf("%s %d\n",list[i].word,list[i].counter);
}
return(0);
}
回答ありがとうございます。
無事 完成させることができました。
>if(find<0){
strcpy(list[total].word,text);
list[total++].counter=1;
の部分が少々わからなかったのですが、一つ一つ追っていくことで理解できました。
本当にありがとうございます。
あとよろしければ教えていただきたいのですが、
totalはtotal=0としておかないと実行時にエラーが出るのに
list[i].counterは初期化しておかなくても正常にカウントされていくのは何故でしょうか。
おかしな値が出てしまうような気がするのですが。
No.5
- 回答日時:
#3補足>list[i].counterは初期化しておかなくても正常にカウントされていくのは何故でしょうか。
始めて見つかった単語が出てきた時に
>list[total++].counter=1;
として、1回として数えています。
つまり、ここで初期化していることになります。
すみません、説明不足でした。
このプログラムではなく、全く初期化していないプログラムでも正常にカウントされていくので
不思議だなと思ったのです。
何度もありがとうございます。
No.4
- 回答日時:
この辺の構文解析きっちりやるなら、是非ともトークン関数を調べてみることをお勧めします。
strtok()でお調べ下さい。
非常に参考になる筈です。
参考URL:http://www1.cts.ne.jp/~clab/hsample/Func/Func08. …
No.2
- 回答日時:
while(scanf(…
で読み込むループで
input_word[MAX]に読み込んで
すでに登録されている部分に同じワードが見つからない時
追加してカウント(=1する)
既に登録してある時
見つかったlistをカウント
したらどうでしょうか
回答ありがとうございます。
そういうタイプのもかいてみたのですが、やはりうまくいきません。
#include <stdio.h>
#include <string.h>
#define MAX 256
int main()
{
struct {
char word[MAX];
int counter;
}list[50];
int i,j,total=1;
char text[MAX];
scanf("%s",list[0].word);
list[0].counter++;
while(scanf("%s",text)!=EOF){
for(i=0;i<=total;i++){ /*ここの繰り返し条件がおかしいと思うのですが よくわかりません*/
if(strcmp(list[i].word,text)==0){
list[i].counter++;
}
else{
strcpy(list[i+1].word,text); /*i+1も おそらくおかしいです*/
list[i+1].counter++;
}
}
total++;
}
for(i=0;i<=total;i++){
printf("%s %d\n",list[i].word,list[i].counter);
}
return(0);
}
解決策が思い浮かびません。
どうすればいいでしょうか。
No.1
- 回答日時:
> list[0].counter=1;
ここで1で初期化しているから、最初のthe=2になっています。初期化するなら0で初期化しましょう。
> for(j=1;j<=total;j++){
jのスタートがなぜに1で固定なのでしょうか?
同じ比較を何回もしないようにするのであればここはiからスタートすべきです。
for( j = i ; <= total; j++ ) {
まとめると比較部分はこんな感じ
--------------------------
list[0].counter=0; /*<<<0で初期化*/
for(i=0; i <= total ; i++, list[i].counter=0 ){ /*比較*/
for(j=i ; j <= total ; j++){ /*<<< iから*/
if( strcmp( list[i].word, list[j].word ) == 0){
list[i].counter++;
}
}
}
-----------------------------------
しかしこのアルゴリズムではどうしても同じ単語の重複はでてきます。(3つめのtheのところに1が立つ)
それを回避するにはlistのメンバーにすでにチェックされたかどうかを示すフラグを追加するなどするとよいとおもいます。
回答ありがとうございます。
> list[0].counter=1;
としたのは
> for(j=1;j<=total;j++){
との兼ね合いからか、2文字目からのカウントがうまくできなかったからです(実際の文字数ー1になってしまう)
直したら出来ました、ありがとうございます。
チェックは色々試しましたがうまくできませんでした。
もう一度やってみたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10進数からN進数に変換するプロ...
-
VisualStudioでC++クラスを追加...
-
C言語について。
-
どうして+3
-
プログラム言語について c言語...
-
C++でデスクトップGUIアプリ開...
-
int16_t の _t は何?
-
2つほどお聞きしたいことがあり...
-
gccを行ってもexeファイルが生...
-
VisualStudio2022でC言語プログ...
-
C言語って古いですか?
-
ストリームについて。
-
QT(C++)の学習方法について
-
Cのコンパイルでコメントアウト...
-
C言語について。
-
Windows Formアプリからコンソ...
-
パソコン
-
今ってプログラミング言語は何...
-
プログラミング言語についてc++...
-
次の記述について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
この曲のピアノの最後の和音が...
-
【python】辞書作成(ネスト)を...
-
Python - Excel で Webからデー...
-
C# GetFilesで複数のファイルの...
-
どちのほうがすきですか?
-
Scheme 中置式から後置式へ
-
複数のIP取得
-
Pythonの配列を入力する方法に...
-
構造体のアクセスについて
-
STLのlistで重複するものだけを...
-
XML::DOM / XML::XPathでソート
-
Ademの関係(Schemeについて教...
-
C言語:単語カウント
-
ギブアップ!!
-
C言語 leetcode21 Merge Two So...
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
formで特定のinputを送信しない...
-
16進の10進変換について
-
実行時エラー 3020の対策
おすすめ情報