• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:頻度のプログラムについて)

C++プログラムで単語の頻度を出力する方法

このQ&Aのポイント
  • C++言語を使用して、入力した文字列から単語とその頻度を出力するプログラムを作成しています。
  • プログラムの中身は、mapを使用して単語をキー、その頻度を値とするデータ構造を定義しています。
  • プログラムのメイン部分では、入力された単語をmapに格納し、同じ単語が出現するたびに頻度をインクリメントしています。

質問者が選んだベストアンサー

  • ベストアンサー
  • KnKn9898
  • ベストアンサー率31% (40/127)
回答No.1

結構C++の基本的なところの質問だと思いますが。 structで書いてありますけどこれはクラス定義です。 struct Count{ // Countクラスを定義する。  int N; //メンバ変数N  Count() : // コンストラクタを定義、呼び出されたときにNの値を0とする  N(0){  }  operator int(){ // intへの型変換。Countクラスの値をintに代入するときなどに使われる。   return N;  }  void operator++(){ // ++ という演算子を定義。Nの値をひとつ増やす。   N++;  } }; という意味になります。 だから22行目の++は前置インクリメントではなく上記のメソッドで定義された演算子++の呼び出しです。この書き方だと前置のときの処理しか定義されていないのです。 http://sato-si.at.webry.info/200503/article_3.html 参照。 また、変換演算子については http://www.geocities.jp/ky_webid/cpp/language/029.html などを参考にしてください。

enigma2005
質問者

お礼

ご回答ありがとうございます。 細かい説明のおかげで納得できました。 参考URLも活用させていただきます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 最頻度のプログラム

    以下のような最頻度のプログラムを作成しました.最頻度が1つしか存在しないような場合はうまく動くと思います.しかし最頻度の数字が2つ以上存在すると,一番はじめに書い最頻度の数字しか表示しないと思います.どう改良すれば,すべての最頻度の数字を拾ってくれますかね. /*最頻値を求めるプログラム*/ #include<stdio.h> int main(void) { int i,j; int count=0,COUNT=0; double num[20]; double max; printf("最頻値を求めます.数字を20個入力してください.\n"); for(i=0;i<20;i++) { printf("%d\t",i+1); scanf("%lf",&num[i]); } for(i=0;i<20;i++) { count=0; for(j=i+1;j<20;j++) { if(num[i]==num[j]) { count++; } if(COUNT<count-1) { COUNT=count; max=num[i]; } } } printf("%lfが最頻値です.\n",max); return 0; }

  • インクリメントしてくれません

    配列mousの各要素を配列tousと照らし合わせ、マッチしたら変数countにインクリメントし、何回マッチングしたかを返す関数を作りました。 でも、なぜか1回しかインクリメントしてくれません。 確認のため試しにcount++部分をputf("テスト表示")に置き換えた場合マッチングした回数だけ「テスト表示」表示されました。 じゃあなぜ、変数countは一回しかインクリメントされないのでしょうか? #include <stdio.h> int DataMatch(int *, int *); void main() { int mous[6] = { 1, 15, 12, 23, 33, 42}; int tous[7] = {10, 15, 19, 23, 33, 42, 11}; int test; test = DataMatch(mous, tous); printf("%d%\n", test); } ////////////////////////////////////////////////// int DataMatch(int *buffer1, int *buffer2) { int i, j, count; for(i = 0; i < 6 ; i++ ){ for(count = 0, j = 0; j < 6; j++){ if(buffer1[i] == buffer2[j]){ count++;//インクリメントしてくれない! break; } } } return count; }

  • 自分で作成したプログラムについて…。

    visual stdio 2013 デスクトップ版のものを使い、下に書くプログラムを作ったのですが、 visual stdio 2013では、ファイルが開けませんとなり、途中で、終了してしまうのですが、mingwでは、ちゃんとファイルが開けて、プログラムが、最後まで動作するのですが、なぜでしょうか? 原因を詳しく教えてください。また、改善方法も教えてください。 プログラム #include <iostream> #include <fstream> #include <ctime> #include <cstdlib> #include <list> #include <string> using namespace std; int main() { srand((unsigned)time(NULL)); list<string> str; char sstr[255]; int count = 0; int i; ifstream in("ttest", ios::in | ios::binary); if (!in){ cout << "入力ファイルが開けません\n"; getchar(); return 1; } while (!in.eof()){ in.getline(sstr, 255); str.push_back(sstr); count++; } i = rand() % count ; list<string>::iterator p; p = str.begin(); for (int j = 2; j <= i; j++)p++; cout << *p; cout << endl; getchar(); return 0; }

  • プログラムについて(UNIX)

    以下のプログラムを部分的で結構ですので 解説していただけないでしょうか? 打ち込んだ数字を10進法に変換して、 その後どうなっているのかがよく分かりません。 よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<math.h> #define N 127 #define M 121 #define LENGTH 45539 int C[N] ; int d[LENGTH/N]; int b[LENGTH/N]; float r[LENGTH]; char message[LENGTH/N/7]; int PNread(int); int PXread(void); int main() { int i, m; /* Insert the process to input the user No. m here. */ printf("Input the user No. : "); scanf("%d", &m); if (m < 0 || m > M) { printf("You input a wrong user No.\n"); exit(-1); } printf("\nThe user No. m is %d. \n", m); /* Read the spread code for user No. m from data file */ if(PNread(m) == -1) exit(-1); /* Display the spread code. */ /* Here is an example to display the first 10 numbers */ if(PXread()== -1) exit(-1); int t,k; float hatD[LENGTH/N]; for(t=0; t < LENGTH/N; t++){ hatD[t]=0; for(k = t*N; k < (t+1)*N; k++) hatD[t]+= ((float)r[k]*C[k%N])/((float)N); d[t] = (hatD[t] >= 0)?1:-1; /*?はif文の省略形である*/ } for(t = 0; t < LENGTH/N; t++) b[t] = (d[t] >= 0) ? 0 : 1; /* 文字に変換する */ for(i = 0; i < LENGTH/N; i += 7) message[i/7] = b[i]*64 + b[i+1]*32 + b[i+2]*16 + b[i+3]*8 + b[i+4]*4 + b[i+5]*2 + b[i+6]; /* メッセージの表示 */ printf("Message:\n%s\n", message); return 0; } /* Function of spread code reading */ int PNread(int m) { FILE *in; /* Verify the data file */ if ((in = fopen("PN7.dat", "r"))== NULL) { /* Error message */ printf("Error: Cannot find the data file. \n"); return -1; } if(m>1) /* Set the file pointer to the m-th user's spread code */ fseek(in,(m-1)*N*sizeof(int),SEEK_SET); /* Read the spread code to array C */ fread(C,sizeof(int),N,in); fclose(in); return 1; } int PXread(void) { FILE *in; int count; float rtemp; if((in = fopen("Rx7_51.dat", "r"))== NULL) { printf("Error; Cannot find the date file. \n"); return -1; } for(count = 0; count < LENGTH; count++){ fscanf(in, "%f", &rtemp); r[count] = rtemp; } fclose(in); return 1; }

  • 素数のプログラムについて教えてください

    3000000以下の素数を降順に表示するプログラムをつくりたいのですが、int mainのところがわかりません。 #include <iostream> int PRIME(int m) int main() { int m, j; for(m = 3000000; m <= 2; m--) } int prime( int n ) { int i; for ( i = 2; i < n; i++ ) { if ( n % i == 0 ) { return 0; } } return 1; } 誰か教えていただけないでしょうか? よろしくお願いします。

  • 4桁の英字の3桁目を当てるプログラム

    乱数でとってくる4ケタの英字の3桁目を入力して当てるプログラムを 組もうとしているのですが、コンパイラしてもいまいちうまくいきません。 特に下に書いたプログラムのこの部分が違っていると思い どのように修正したらよいのか指摘していただきたいです。 human=getchar(); if(comp[2]!=human) { ero=1; } よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> int sleep(unsigned long x) { clock_t c1=clock(),c2; do{ if((c2=clock())==(clock_t)-1) { return 0; } }while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); return 1; } int main(void) { int num,val,i,j; char comp[21]; char human; int ero=0; int try_count=0; int seikai=0; clock_t start,end; int num1; char eiji[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; srand(time(NULL)); puts("英字記憶トレーニング"); do{ printf("挑戦するレベル(3~20):"); scanf("%d",&num1); }while(num1<3 || num1>20); printf("%d個の英字を記録しましょう。\n",num1); start=clock(); do{ for(i=0;i<num1;i++) { comp[i]=eiji[rand()%strlen(eiji)]; } comp[num1]='\0'; printf("%s",comp); fflush(stdout); sleep(125*num1); printf("\r%*s\r3番目の英字を入力してください:",num1,""); human=getchar(); if(comp[2]!=human) { ero=1; } if(ero==0) { printf("正解です。\n"); seikai++; } else { printf("\a間違いです。\n"); } try_count++; }while(try_count<2); end=clock(); printf("%d回中%d回成功しました。\n",try_count,seikai); printf("%.1f秒でした。\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }

  • プログラムを組んだのにエラーが出る!!!

    #include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { int i, j; int m, flag, count; FILE *fp; if (NULL == (fp = fopen("prime.txt", "w"))) { printf("Cannot open output file\n"); exit(1); } count = 0; for (i = 2; i < 1000; i++) { m =sqrt(i); flag = 1; for (j = 2; j <= m; j++) { if (i % j == 0) { flag = 0; break; } count++; } if (flag) { printf("%4d ", i); fprintf(fp," %4d", i); } } printf("\n乗除回数:%d\n", count); fprintf(fp,"\n乗除回数 %d\n", count); fclose(fp); return 0; } (通常課題2-3 1000以下の正の整数値のうち,素数をすべて計算し,結果をファイルに格納するプログラムを作れ. .また、計算の実行の中で乗除を行った回数もあわせて表示し、ファイルに格納すること 実行結果 2 3 5 7 11 13 17 … 991 997 乗除回数:78022 どこが間違ってるのか指摘してください お願いします!

  • プログラムが~~~!!

    こんにちは。今、プログラム書いてるんですけど目的としては、 1、テキストファイルから文字列を読み込む。(大体数万文字) 2、それを100個ずつに区切る。 3、その百個ずつを二文字ずつ読んでいって、それがgcという文字列ならばその 百個の中での割合を示す。 4、さらに次の百個を・・・・ みたいなプログラムを書いてるんですけど一応下のような形までこぎつけましたが もう、お手上げです。 どなたか、助けてください。 #include<iostream.h> #include<stdio.h> #include<string.h> int main() { char pch[3]; int count=0; FILE *fin; fin=fopen('C:\ahowaki.dat','r'); fscanf(fin,'%s',&pch); cout<<"入力\n"; while(pch){ cin.read(pch,2); if((strcmp(pch,"gc"))==0) count++; if(count>=0 && count<=25) cout<<"Under25%\n"; if(count>=26&& count<=50) cout<<"Under50\n"; if(count>=51&& count<=75) cout<<"Under75%\n"; if(count>=76&& count<=100) cout<<"Under99%\n"; else cout<<"Over100%\n"; } return 0; fclose(fin); }

  • 直角三角形を表示するプログラム

    下記のプログラムを実行するとコマンドプロントになにも表示されず、強制終了しなければならなくなってしまいます。 whileのところがおかしいのはわかったのですが、この書き方の何がいけないのかが分かりません。 初歩的な質問で申し訳ありませんが、回答していただけると有難いです。 #include <stdio.h> int main(void){ int count, i; printf("何段ですか?"); scanf("%d", &count); for(i = 1; i <= count; i++){ while(i-- > 0){ putchar('*'); } putchar('\n'); } return 0; }

  • 入力された2つの整数の差を絶対値を出力するプログラム

    2整数の差を絶対値を出力するプログラムをつくりました. 入力される数値は、正数の場合は最大8桁まで有効とし、9桁目以降を無視、負数の場合は '-'を含め、最大9桁まで有効とし,10桁目以降を無視するようにしたい。 2番目の数値入力で9桁以降に数字以外の文字を入力すると,うまく動きません.なぜ動かないかとどのように直したらよいか教えてください. お願いします. #include <stdio.h> #include <stdlib.h> #define BUFFERSIZE 10 #define PLUS_MAX 8 #define MINUS_MAX 9 #define C_NULL ('\0') #define RC_OK 0 #define RC_ND -1 #define RC_ID -2 #define RC_MD -3 int absolute( int n1, int n2 ) ; main() { char n[ 2 ][ BUFFERSIZE ]; int i ; int a[ 2 ] ; int ab ; int count ; int n_pos ; char c ; for( i = 0 ; i < 2 ; i ++ ){ printf( "%d番目の数値 :", i + 1 ) ; for( count = 0 ; count <= BUFFERSIZE ; count ++ ){ c = getchar() ; if( c >= '0' && c <= '9' || count == 0 && c == '-' ){ n[i][ count ] = c ; continue ; } if( c == '\n' ) break ; printf( "Error!\n" ) ; return( RC_ID ) ; } if( count == 0 ){ printf("Error!\n"); return( RC_ND ); } else if( n[ i ][ 0 ] == '-' && count < 2 ){ printf("Error!\n"); return( RC_ID ) ; } if( n[ i ][ 0 ] == '-' && count > MINUS_MAX ){ n_pos = MINUS_MAX ; }else{ if( count > PLUS_MAX ){ n_pos = PLUS_MAX ; }else{ n_pos = count ; } } n[ i ][ n_pos ] = '\0' ; a[ i ] = atoi( n[ i ] ) ; } ab = absolute( a[ 0 ], a[ 1 ] ) ; printf( "絶対値は %d \n", ab ) ; return( RC_OK ); } int absolute(int n1, int n2) { int i ; i = n1 - n2 ; return i >= 0 ? i : -i ; }

このQ&Aのポイント
  • クリックポスト印刷時に白抜き文字が表示され、次に白い紙が出力される問題が発生しました。インクを交換したりクリーニングを行っても問題は解消されませんでした。さらに、紙詰まりのエラーも表示されています。ブラザーに問い合わせたところ、修理不可との回答がありました。しかし、どうすれば修理できるのか教えていただきたいです。
  • DCP-j4210nが壊れました。クリックポスト印刷時に白抜き文字が表示され、さらに白い紙が出力されるというトラブルが発生しました。インク交換やクリーニングを試しましたが解決できず、紙詰まりのエラーも表示されています。ブラザーに問い合わせたところ、修理不可との回答がありました。どのようにすれば修理できるのでしょうか?
  • DCP-j4210nの故障に関して相談です。クリックポスト印刷時に白抜き文字が表示され、その後白い紙が出力されるという問題が発生しました。インクを交換し、クリーニングを試みましたが解決できませんでした。さらに、紙詰まりのエラーも発生しており、ブラザーに相談したところ修理不可との回答がありました。どのようにすれば修理できるでしょうか?
回答を見る

専門家に質問してみよう