• ベストアンサー

C言語のプログラムを作成して下さい。

C言語で以下のような機能を持つプログラムを作成してください。 3つの文章X.txt,Y.txt,Z.txtでY,ZのうちどちらがXに近いか判定するプログラム。X.txtを読み込んでXに出現する単語からなる単語の木を作成する。次にY,Zを読み込み単語の木と単語の出現頻度をもとにXとY、XとZの類似度を測るための統計的データを計算する。そしてY,ZのどちらがXに近いか、とその根拠となる統計データを出力する。

noname#136979
noname#136979

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

  • ベストアンサー
回答No.1

「単語の木」が何なのか説明されていないし、 そもそも丸投げはカンベンして。

関連するQ&A

  • C言語で以下のようなプログラムを作成してください

    3つの文章X.txt,Y.txt,Z.txtでY,ZのうちどちらがXに近いか判定するプログラム。X.txtを読み込んでXに出現する単語からなる単語の木を作成する。次にY,Zを読み込み単語の木と単語の出現頻度をもとにXとY、XとZの類似度を測るための統計的データを計算する。そしてY,ZのどちらがXに近いか、とその根拠となる統計データを出力する。

  • C言語のプログラムについて

    三角形を判定するプログラムを作ったのですが直角三角形ができるはずがないのに直角三角形の判定が出てしまいます。簡単なことなのかもしれませんが自分ではわからなくなってしまったのでご指摘してもらいたいです。 #include<stdio.h> void tri(int x,int y,int z) { if((x*x==y*y+z*z)||(y*y==x*x+z*z)||(z*z==x*x+y*y)) { printf("これは直角三角形です。"); printf("これは三角形です。"); }else if((x+y>=z)||(x+z>=y)||(y+z>=x)) { printf("これは三角形ではありません。"); }else{ printf("これは三角形です。"); } } int main(void) { int e1,e2,e3; printf("3辺を入力してください"); scanf("%f,%f,%f",&e1,&e2,&e3); tri(e1,e2,e3); return(0); }

  • C言語についての質問です。

    C言語で英文X,Y,ZでY,ZのどちらがXに近いかを判定するプログラムをX.txtに出現する単語において、その出現数と、Y.txt(Z.txt)における出現数を掛け算し、その総和が大きい方を類似度の高い文章とするという手法でコードを書いたのですがtheやaによって誤差が出るようなので単語長が5以上のものについてだけ調べるようにしたいのですがうまくいきません以下にコードを示すのでどのように変更したらいいか教えてください。また、ほかに何か精度を上げる方法があれば教えて下さい。 #include <stdio.h> #include <string.h> #include <malloc.h> struct WordList { int count;/*出現数*/ char word[ 64 ];/*単語文字列*/ }; /*単語リストを作成する*/ bool makeWordList( const char* fileName, WordList** list, int* listSize ) { FILE* stream = fopen( fileName, "r" ); if( !stream ) { return false; } char buffer[ 256 ];/*1行は255文字まで*/ while( fgets( buffer, sizeof( buffer ), stream ) ) { const char sep[] = " ,.;:\"\'\t\r\a\n"; char* word = strtok( buffer, sep ); while( word ) { /*既に登録済みの単語を検索して見つかったら出現数+1*/ int ii; for( ii = 0; ii < *listSize; ii++ ) { if( !strcmp( ( *list )[ ii ].word, word ) ) { ( *list )[ ii ].count++; break; } } /*新しい単語の場合は単語リストに登録する*/ if( ii >= *listSize ) { *list = ( WordList* )realloc( *list, sizeof( WordList ) * ( *listSize + 1 ) ); memset( ( *list ) + *listSize, 0, sizeof( WordList ) ); ( *list )[ *listSize ].count = 1; strncpy( ( *list )[ *listSize ].word, word, sizeof( ( *list )[ *listSize ].word ) - 1 ); ++( *listSize ); } word = strtok( NULL, sep ); } } fclose( stream ); return true; } /*単語リストを破棄する*/ void removeWordList( WordList** list ) { if( *list ) { free( *list ); *list = NULL; } } /*単語リストから該当する単語を探す*/ int findList( WordList* list, int listSize, const char* word ) { for( int ii = 0; ii < listSize; ii++ ) { if( !strcmp( list[ ii ].word, word ) ) { return list[ ii ].count; } } return 0; } /*単語リストを比較する*/ int compareList( WordList* list1, int listSize1, WordList* list2, int listSize2, WordList* list3, int listSize3 ) { printf( "X.txtに出現する単語(数)\tY.txt出現数(point)\tZ.txt出現数(point)\n" ); int count2 = 0; int count3 = 0; for( int ii = 0; ii < listSize1; ii++ ) { /*単語の類似点=X.txtでの単語の出現数×Y.txt(Z.txt)での出現数とする*/ /*X.txtの単語について全て上記の計算を行い、総和を文章の類似度とする*/ int temp2 = findList( list2, listSize2, list1[ ii ].word ); int temp3 = findList( list3, listSize3, list1[ ii ].word ); printf( "%s(%d)\t%d(%d)\t%d(%d)\n", list1[ ii ].word, list1[ ii ].count, temp2, temp2 * list1[ ii ].count, temp3, temp3 * list1[ ii ].count ); count2 += list1[ ii ].count * temp2; count3 += list1[ ii ].count * temp3; } return count2 - count3; } int main() { WordList* listX = NULL; WordList* listY = NULL; WordList* listZ = NULL; int listSizeX = 0; int listSizeY = 0; int listSizeZ = 0; int result = 0; do { if( !makeWordList( "B.txt", &listX, &listSizeX ) ) break; if( !makeWordList( "B.txt", &listY, &listSizeY ) ) break; if( !makeWordList( "BB.txt", &listZ, &listSizeZ ) ) break; result = compareList( listX, listSizeX, listY, listSizeY, listZ, listSizeZ ); if( 0 < result ) printf( "故にB.txtのほうが類似している\n" ); else if( 0 > result ) printf( "故にBB.txtのほうが類似している\n" ); else printf( "故に類似度は同じ\n" ); } while( false ); removeWordList( &listX ); removeWordList( &listY ); removeWordList( &listZ ); fflush(stdin); getchar(); return 0; }

  • C言語のプログラムを作るのに困っています。

    C言語で、4次のルンゲクッタ法を用いて微分方程式を解くプログラムを作成したいのですが、始めたばかりの初心者で分からないところだらけなので教えてください。 わからないなりに、下のプログラムを作ってみましたがエラーになります。どうすればうまくいくのでしょうか。本当に始めたばかりなので、文?の組立もよくわかりません。できればわかりやすくお願いします。 このプログラムでは微分方程式dy/dx=x^3+4xy+y+2の解を求めようとしています(自分で適当に作った方程式なので、あるのかどうかわかりません)。 そのほかにもy'=2x^2+3xy-1や、y'=sinxcosy, y'=e^xなどいろいろな微分方程式でできるようにしたいのですが、どうやるのでしょうか。 #include <stdio.h> double f(double x,double y); int main() { double x,y,dx,xmax; double k1,k2,k3,k4; FILE *fp; if ((fp=fopen("result.txt","w"))==NULL) { printf("Cannot open result.txt \n"); return 0; } dx=0.1; //刻み幅 xmax=100.0; //繰り返し最大 x=1.0; //xの初期値 y=1.0; //yの初期値 f(x,y)=x^3+4xy+y+2;; //関数f(x,y)の定義 for(x=1.0;x<xmax;x+=0.1) { k1=dx*f(x,y); k2=dx*f(x+dx/2.0,y+k1/2.0); k3=dx*f(x+dx/2.0,y+k2/2.0); k4=dx*f(x+dx,y+k3); y=y+(k1+2.0*k2+2.0*k3+k4)/6.0; printf(" %f %lf \n",x,y); fprintf(fp," %f %lf \n",x ,y); } return 0; }

  • C言語におけるtxtファイルの読み込みと出力

    環境:WinXP,Borland C++compiler 以下のようなプログラムを考えました。 ・sample.c #include <stdio.h> float func(float x,float y,float z); int main(void) { float x,y,z; scanf("%f",&x); scanf("%f",&y); scanf("%f",&z); printf("%f",func(x,y,z)); return 0; } float func(float x,float y,float z) { return x+y+z; }//ここまで。 例えば(x,y,z)=(1,2,3)と入力すると6が出力されます。 このプログラムを、任意のn組の(x,y,z)の記述されたテキストファイルを読み込んで出力outを計算し、別のテキストファイルにn組の(x,y,z,out)を書き込むようにするにはどのような変更を加えればよいのでしょうか。 具体例は以下のような感じです。用意しておいたinput.txtをsample.cで読み込んで計算し、また作成されていないoutput.txtに出力するのが目標です。 (n=3の場合) ・input.txt //x y z 1 2 3 1 8 9 -1 7 5 ・output.txt //x y z out 1 2 3 6 1 8 9 18 -1 7 5 11

  • C言語のプログラムについて質問

    明解C言語という書籍に 大きい方を表示するプログラム #include <stdio.h> int maxof(int x, int y) {  if (x > y)   return (x);  else   return (y); } int main(void) {  int na, nb;  puts("二つの整数を入力してください。");  printf("整数1:"); scanf("%d", &na);  printf("整数1:"); scanf("%d", &na);  printf("大きいほうの値は%dです。\n", maxof(na, nb));  return (0); } の関数maxofを利用し、 int max4(int w, int x, int y, int z) {  return (maxof(maxof(w, x), maxof(y, z))); } を挿入して変えれば四つの整数から最大値を求められるとのことですが、 コンパイルがうまくいきません。 関数maxofのwとx,yとzをそれぞれ比較し最大値を求めてさらにmaxof(w, x)とmaxof(y, z)を比較して最大値を求めるということですよね?ですので、 maxof(w, x) {  if (w > x)   return (w);  else   return (x); } maxof(y, z) {  if(y > z)   return (y);  else   return (z); を挿入しようとしたらmaxofはすでにありますというようなことが表示されてだめでした。 また、 int maxof(maxof(int w, int x), maxof(int y, int z)) { if (w > x)   return (w); if (w < x)   return (x); if (y > z)   return (y); if (y < z)   return (z); if (maxof(w, x) > maxof(y, z))   return (maxof(w, x)); if (maxof(w, x) < maxof(y, z))   return (maxof(y, z)); } としてみましたがやはりだめでした。 前のページの説明を読み返したりネットで調べてもわかりませんでした。 何がわからないのかがわからないのでもうお手上げです。 長くなってすいません プログラム例と説明をお願いします。

  • ガンマ変換 C言語でプログラムの作成

    次式のように、原画像の任意の階調値fから、点線の矢印のようにして交換後の階調値gを決める。このような階調値の変換を表す配列 unsigned char trans[256];を用いて画像の濃度補正を行うプログラム作成せよとあるのですが、どのような計算式を用いて任意の変換の プログラムを作成してよいかわかりません。 同、問題でガンマ変換のプログラムは作成したのですが、 詳しい方で添付画像のようなプログラムを作成できる方がいましたらよろしくお願いします。 ESPライブラリを使用していますので、添付ファイルにソースとヘッダファイルと図を添付しています   プログラムの開始: sを押す         終了: xを押す --------------------------------------------------------------*/ #include <stdio.h> #include <stdlib.h> #include "mypgmesp.h" /* ESP関係の関数が定義されているヘッダファイル */ #define FINAL_LEVEL 64 //最終的な表現階調数// // 関数のプロトタイプ宣言 void gamma_histgram(void); /*************************************************************************    このプログラムを実行したとき、はじめに実行される処理を書く *************************************************************************/ void ESP_Ready(void) { ESP_Open_Window(); } /*************************************************************************    このプログラムが終了したとき、実行される処理を書く *************************************************************************/ void ESP_Finish(void) { } /*************************************************************************    startボタンが押されたときに、実行される処理を書く *************************************************************************/ void ESP_Main(void) { int ret; /* 準備 */ ESP_Prepare(); /* 画像データを image1 に読み込んで表示する */ ret = ESP_load_image_data(); if(ret){ ESP_StartMenu(); return; } /////////////////////////////////////////////////// // 以下に関数や命令を記述する gamma_histgram(); // ここまで /////////////////////////////////////////////////// /* image2 を保存し表示する */ ESP_save_image_data(); /* メッセージの表示 */ ESP_StartMenu( ); } ////////////////////////////////////////////////// // 以下の関数内にプログラムを追加する /////////////////////////////////////////////////// void gamma_histgram(void) { int i, x, y,g; /* ループ変数 */ long int target_value;//変換後の頻度の目標値// double gam = 2.0,j; unsigned char trans[256]; ESP_Printf("ガンマ補正を行う\n"); for (i = 0; i < 256; i ++){ j=i; g=255*pow(j/255.0,1.0/gam); if(g>255) { trans[i]=255; } else if (g<0) { trans[i]=0; } else { trans[i]=(unsigned char)g; } x_size2=x_size1; y_size2=y_size1; for ( y = 0; y < y_size2; y ++ ) { for ( x = 0; x < x_size2; x ++ ) image2[y][x] = trans[image1[y][x]]; } } }

  • C言語のプログラミングがうまくいきません!

    とりあえず、自分でプログラムしましたが、どこか間違っているようです。僕のプログラムを載せますので、どこが間違っているのか教えて下さい。あと、正しいプログラムを書いていただければ幸いです。 3つの辺の長さをx、y、zに代入して三角形が成立すれば、その形状と面積をヘロンの公式を使って求める。 #include <stdio.h> #include <math.h> { double x ,y, z ,error ,menseki ,ans; printf("x ?") scanf("%f" , &x); printf("y ?") scanf("%f" , &y); printf("z ?") scanf("%f" , &z); ans=(x+y+z)/2; menseki=sqrt(ans*(ans-x)*(ans-y)*(ans-z)); if (x === y || y == z || x == z) { printf ("正三角形です"); printf("面積は%dです" , menseki); } else if (x == y || y == z || z == x) { printf("二等辺三角形です"); printf("面積は%dです" , menseki); } else { printf("三角形です"); printf("面積は%dです , menseki); if(x<y+z || y<x+z || z<x+y) { printf("error"); } }

  • プログラムの組み方が分かりません。

    ある課題で以下の問題が出題されました。 >>>> 2つのint型変数x,yにキーボードから値を入力し、その大小を判定する関数funcを作成せよ。この課題では、大きいと判定された数が代入された変数のアドレスがmain関数に戻されるものとする。 ============ #include<stdio.h> int *func(int *a,int *b) { /* 2つの値の大小判定を行い、アドレスを返す */ } main(void) { int x, y, *z; /* 変数 x,yにキーボードからデータを入力する */ /* 関数funcの呼び出し */ /* 変数zを用いて値の出力を行う */ } ============ <<<< 2行目の*funcというように、関数の頭に*が付くプログラムは初めてで、 どういう意味かもさっぱりわかりません。 それも含め、この問題はどういう風解けばいいのか、教えてください。 お願いします。

  • c言語

    c言語で写真の課題を出されたのですが自分のプログラムでは上手くいきません。どこが間違っているのか教えて欲しいです。 自分のプログラム #include<stdio.h> #include<math.h> int main(){ int i,j; double c,d,x,y,z; for(i=0;i<=360;i++){ c=10*cos(i*M_PI/180); d=10*sin(i*M_PI/180); if(c>=0 && d>=0){ for(j=0;j<=1000;j++){ x=0.001*j; y =x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } if(c<=0 && d>=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c<=0 && d<=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c>=0 && d<=0){ for(j=0;j<=1000;j++){ x=0.001*j; y=x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } printf("x=%lf y=%lf z=%lf\n",x,y,z); } return(0); }

専門家に質問してみよう