yama5140 の回答履歴
- C言語 文字列操作
トリム関数とリムーブ関数を作成してみました。改良点はありますでしょうか? ~~~~以下ソース~~~~ #include <stdio.h> #include <stdlib.h> #include <string.h> char *Trim(char *str); char *Remove(char *str, char *rmv); void main(void) { char str[10], rmv[10], *p; int c; /* " abcd "をトリムする */ strcpy(str, " abcd "); printf("トリム前 |%s|\n", str); p = Trim(str); printf("トリム後 |%s|\n", str); /* 指定文字列を削除する */ printf("削除する文字列を入力してください :"); scanf("%s", rmv); Remove(str, rmv); printf("削除後 |%s|\n", str); exit(0); } char *Trim(char *str) { char space[] = " "; char null[] = ""; int index = 0; while(1){ if(strcmp(&(str[index]), null) == 0){ index--; if(strncmp(&(str[index]), space, 1) == 0){ strcpy(&(str[index]), &(str[index]) + 1); }else{ break; } }else{ if(strncmp(&(str[index]), space, 1) == 0 && index == 0){ strcpy(&(str[index]), &(str[index]) + 1); }else{ index++; } } } return str; } char *Remove(char *str, char *rmv) { int c, size, i; char *p; c = '\0'; p = strchr(rmv, c); size = p - rmv; for(i = 0; i < size; i++){ c = (int)rmv[i]; p = strchr(str, c); if (p != NULL) { strcpy(&(str[p-str]), p + 1); } else{ printf("""%c""は見つかりませんでした\n", c); } } return str; }
- モンテカルロシミュレーションのプログラム
ブラックジャックのプログラムについて困っています。プレイヤーは1対1とし2人とも戦略は16以下はもう1枚引き、17以上になったら引くのをやめるものとし、何回も何回も試合を自動で繰り返すモンテカルロシミュレーションを作ることは出来ますか?3万回以上の試合を目標としています。 簡単なソースでもよろしいので教えてください。(勝率を表示することが可能ならお願いします。) よろしくお願いします。
- 締切済み
- konkons001
- C・C++・C#
- 回答数4
- 型によらないCSVファイルの読み込みC言語プログラ
あらかじめ型のわかっているN行*M列のエクセルデータをCSV形式にし、 読み込むプログラムを作成しました。 そのプログラムを下に示します #include <stdio.h> #include <stdlib.h> #include <string.h> /* 確保するデータ保存領域の大きさ(N行×M列) */ #define N 23 #define M 6 /* データの区切り文字 */ #define SEP_DATA ',' int csv_read(char filename[], double csv[N][M]) { /* ファイルオープン */ FILE *fp; if( (fp = fopen(filename, "r")) == NULL ) { printf(" file open error!!\n"); return -1; } /* 1行毎に読み出し */ char line[256], *ptr; int i, j, k; i=0; while (fgets(line, 256, fp) != NULL) { printf("*%s", line); ptr = line; j=0; do{ /* line[j]から次のタブ文字までを数値に変換 */ csv[i][j] = atof(ptr); /* 次のタブ文字の位置を探す */ ptr = strchr(ptr, SEP_DATA); /* タブ文字の次の文字を示す */ if (ptr!=NULL) { ptr++; } j++; }while(ptr!=NULL && j<M); i++; } /* ファイルクローズ */ fclose(fp); return 0; } int main(int argv, char *argc[]) { char filename[256]; if( argv > 1){ strcpy(filename, argc[1]); } else { printf("Please Input Filename:"); scanf("%s", filename); } /* データ保存用の領域を確保 */ double (*csvdata)[M]; csvdata = (double(*)[M])malloc(sizeof(double[M]) * N); //malloc(sizeof(*csvdata) * N); if ( csvdata == NULL ){ return -1; } int i,j; /* 配列の初期化 */ for( i=0; i<N; i++) { for( j=0; j<M; j++) { csvdata[i][j] = 0.0; } } /* CSVデータの読み込み */ if( csv_read(filename, csvdata) < 0 ) { return -1; } /* 配列の出力 */ for( i=0; i<N; i++) { printf("%lf", csvdata[i][0]); for( j=1; j<M; j++) { printf("\t%lf", csvdata[i][j]); } printf("\n"); } free(csvdata); csvdata = NULL; return 0; } これをNとMがどんな値であれ読み込めるようにするにはどうすれいいでしょうか
- VC++ 2010 Expressで2の補数計算
テキストボックス内に ”:100000004466FFFFFFFFFFFFFFFFFFFFFFFFFFFF” このようなテキストを入れて左側から2文字づつをHEXとして足し算を行い(":"は無視)、合計の数をビット反転して、最後に+1して2の補数計算をするようして、合計の下二けただけを文字列として付け足して、 :100000004466FFFFFFFFFFFFFFFFFFFFFFFFFFFF54" このような文字列結果をもう一つのテキストボックスに表示させたいのですが、どのようにしたらできますでしょうか? ご教授よろしくお願い致します。
- c++でファイル名から数字をテキストファイルに取り
hogehoge_1_1_1.txt hogehoge_1_2_3.txt というファイル名であった場合、 hogehoge_1_1_1.txtからは1 1 1 hogehode_1_2_3.txtからは1 2 3 というふうにファイル名の他に数値もテキストファイルに出力したい場合どのようにすればできるでしょうか? このように単純な作業なのですが、 このような形式のテキストファイルが大量にあって、まとめて処理してグラフなんかを作成したいために質問させていただきました。 回答よろしくお願いします。 補足 説明が不足していましたが、実行ファイルと同じフォルダに入れたテキストファイル等すべてから、ファイル名を指定しないで数値の部分だけを取り出すようにするにはどうしたらいいかも知りたいです。 分かりにくい説明かもしれませんが、回答よろしくお願いします。
- 締切済み
- catcherrye
- C・C++・C#
- 回答数5
- 型によらないCSVファイルの読み込みC言語プログラ
あらかじめ型のわかっているN行*M列のエクセルデータをCSV形式にし、 読み込むプログラムを作成しました。 そのプログラムを下に示します #include <stdio.h> #include <stdlib.h> #include <string.h> /* 確保するデータ保存領域の大きさ(N行×M列) */ #define N 23 #define M 6 /* データの区切り文字 */ #define SEP_DATA ',' int csv_read(char filename[], double csv[N][M]) { /* ファイルオープン */ FILE *fp; if( (fp = fopen(filename, "r")) == NULL ) { printf(" file open error!!\n"); return -1; } /* 1行毎に読み出し */ char line[256], *ptr; int i, j, k; i=0; while (fgets(line, 256, fp) != NULL) { printf("*%s", line); ptr = line; j=0; do{ /* line[j]から次のタブ文字までを数値に変換 */ csv[i][j] = atof(ptr); /* 次のタブ文字の位置を探す */ ptr = strchr(ptr, SEP_DATA); /* タブ文字の次の文字を示す */ if (ptr!=NULL) { ptr++; } j++; }while(ptr!=NULL && j<M); i++; } /* ファイルクローズ */ fclose(fp); return 0; } int main(int argv, char *argc[]) { char filename[256]; if( argv > 1){ strcpy(filename, argc[1]); } else { printf("Please Input Filename:"); scanf("%s", filename); } /* データ保存用の領域を確保 */ double (*csvdata)[M]; csvdata = (double(*)[M])malloc(sizeof(double[M]) * N); //malloc(sizeof(*csvdata) * N); if ( csvdata == NULL ){ return -1; } int i,j; /* 配列の初期化 */ for( i=0; i<N; i++) { for( j=0; j<M; j++) { csvdata[i][j] = 0.0; } } /* CSVデータの読み込み */ if( csv_read(filename, csvdata) < 0 ) { return -1; } /* 配列の出力 */ for( i=0; i<N; i++) { printf("%lf", csvdata[i][0]); for( j=1; j<M; j++) { printf("\t%lf", csvdata[i][j]); } printf("\n"); } free(csvdata); csvdata = NULL; return 0; } これをNとMがどんな値であれ読み込めるようにするにはどうすれいいでしょうか
- 今日のNHK杯で(囲碁)
今日のNHK杯囲碁(依田-王戦)で、最後にヨセが4カ所残っている場面について、質問があります。 依田九段が、後手2目のハネツギが残っているときに、中央の逆ヨセ1目を先に打ちました。解説ではこの局面では逆ヨセの方とハネツギのどちらを先に打っても同じ結果、と言われていましたが、王九段がコウをつがずに左下の一目作る手をつぶしていたら、半コウの勝敗によって1目の損(=半目負け)になる可能性はないのでしょうか? ハネツギから打っていればコウ争いになることがないので、そちらの方が確実だと思うのですが、あえて逆ヨセを先に打った(打たなければならなかった)意味というのはあるのでしょうか? (あるいは、白はコウ材が無数にあるのでどっちみちコウに勝てるので同じ結果です、ということまで含めて「どちらから打っても同じ」ということなのでしょうか?) 囲碁は級位者程度なので、勘違いでしたらすみませんが、詳しい方がいましたら教えてください。よろしくお願いします。
- C言語 関数の作り方
1~30の数字を使い、直角三角形が成り立つ組み合わせを見つけよ。(a<=b<=c) ただし、a,b,c辺を見つけて配列に入れる機能は関数にすること。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー #include <stdio.h> int main(void) { int a,b,c,i=0,ct=0; int ahen[20]; int bhen[20]; int chen[20]; for(a=1;a<31;a++) { for(b=1;b<31;b++) { for(c=1;c<31;c++) { if(a*a+b*b==c*c && a<=b && b<=c) { ahen[i]=a; bhen[i]=b; chen[i]=c; i=i+1; ct++; } } } } for(i=0;i<ct;i++) { printf("%d %d %d\n",ahen[i],bhen[i],chen[i]); } return 0; } 実行例: 3 4 5 5 12 13 6 8 10 7 24 25 8 15 17 9 12 15 10 24 26 12 16 20 15 20 25 18 24 30 20 21 29 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー とりあえず、関数を使わない上記のプログラムを作って見ました。 ここから関数を使ったものに変更したいのですが、配列が絡むとさっぱり分かりません。 printfで表示する箇所以外を全て関数にするのだと思いますが、どなたかご教示願います。
- 締切済み
- gakusei_0000
- C・C++・C#
- 回答数2
- C言語プログラミング
C言語プログラミングに関して質問です。 元本、年数、単利、複利を順にa,b,c,dと置き、年数経過後の単利、複利の場合のそれぞれの額をe,fとしたとき、 e = a+(a*c)*b となるのはわかるのですが、複利の場合の金額を求める時の計算式はどう書けばよいのですか。 また、複利が単利より小さい時、何年後に複利のときの金額が単利のときの金額を越すかを表示したいのですが、次の書き方で合ってますか。 if(d < c){ b = 2; while(1){ if(f > e) break; else b++; } printf("%d年後、単利のときの金額を複利のときの金額が追い越します\n",b); }
- 文字列の判別させるプログラム
長さの等しい2つの文字列を入力しては、片方を何文字か左に回転したときにもう一方と一致するかどうか調べる関数rotateLを作るのですが、よくわかりません。 たとえば、 文字列1=abcde 文字列2=bcdea なら 一回転で一致 となる関数なのですが、この判別はどのようにすればいいのですか?
- notepad++でのコンパイル設定
コンパイラ:borland c++ compiler 5.5、エディタ:notepad++でプログラミング環境を構築しようと思っているのですが、コンパイル設定のところで詰まっています。 notepad++のNppExecというプラグインを使って, 以下のコマンドを記述したところ // save current file NPP_SAVE // compile & run with bcc D:\borland\bcc55\Bin\bcc32.exe "$(FULL_CURRENT_PATH)" -run コンパイルはできているのですが、実行モジュールやオブジェクト・ファイルの保存場所がnotepad++があるフォルダになるのです。生成された実行モジュールやオブジェクト・ファイルを任意のフォルダに保存するのはどうしたらいいのでしょうか? あとコンパイルしたhogehoge.exeなどをnotepad上で実行するのはどうしたらいいでしょうか?(手動でコマンドプロンプトを起動して実行するのは面倒なのでコンパイルしたときに実行してほしい) 教えていただきたいです。お願いします。
- 線の重なり判定、組み合わせ算出プログラム
一直線上に並んだ線の複数のセットが重ならない様に計算する効率的なアルゴリズムは ありませんか。できればC言語のサンプルや、アルゴリズム名があれば幸いです。 例) パターンA -- -- -- -- パターンB - - - - - パターンC - - - 線では分かりにくいので、アルファベットに変えます。 パターンA AA■■■AA■■■AA■■■AA パターンB B■■■■B■■■■B■■■■B パターンC C■■■■■■■C■■■■■■■C ※■=空白 ABCを重ならない様にマージ (マージ過程・ずらしながら確認) AA■■■AA■■■AA■■■AA ■■■B■■■■B■■■■B■■■■B ■■■■■■C■■■■■■■C■■■■■■■C ●結果例 1つのパターン例 AA■B■■CAA■B■■AA■BC■AA■B■■■C
- ベストアンサー
- tomokipapa
- C・C++・C#
- 回答数2
- 2次元配列からダブルポインタへの合わせ方
固定要素数の行列の処理ですが、subでセグメントエラーを起こしています。 アドレスを出力してみると、subでは元々確保したアドレスでは無いところを指しています。 呼び出し側では「行列の先頭のアドレス」を明示したつもりだったのですが、どこが間違っているのでしょうか。少し長いですが、ソースコードと出力を示します。 typedefのところとsubのIFは変更できないので、double[3][3]とdouble** のIFを合わせないといけないのですが、合わせ方がよくわかりません。 よろしくお願いします。 ========================================= #include <stdio.h> #include <string.h> typedef double Matrix[3][3]; void sub( const double** mat ); int main(void) { int ret = 0; int i, j; Matrix mat = { { 0., 1., 2. }, { 3., 4., 5. }, { 6., 7., 8. } }; for( i = 0; i < 3; i++ ){ for( j = 0; j < 3; j++ ){ printf( "main : mat[%d][%d] = %f\n", i, j, mat[i][j] ); printf( "main : &mat[%d][%d] = %p\n", i, j, &mat[i][j] ); } } printf( "\n" ); sub( &mat[0][0] ); return ret; } void sub( const double** mat ) { int i, j; printf("---- &mat = %p\n", &mat ); for( i = 0; i < 3; i++ ){ for( j = 0; j < 3; j++ ){ printf( "sub : mat[%d][%d] = %f\n", i, j, mat[i][j] ); printf( "sub : &mat[%d][%d] = %p\n", i, j, &mat[i][j] ); } } printf( "\n" ); } ========================================= main : mat[0][0] = 0.000000 main : &mat[0][0] = 0x7ffffca7bca0 main : mat[0][1] = 1.000000 main : &mat[0][1] = 0x7ffffca7bca8 main : mat[0][2] = 2.000000 main : &mat[0][2] = 0x7ffffca7bcb0 main : mat[1][0] = 3.000000 main : &mat[1][0] = 0x7ffffca7bcb8 main : mat[1][1] = 4.000000 main : &mat[1][1] = 0x7ffffca7bcc0 main : mat[1][2] = 5.000000 main : &mat[1][2] = 0x7ffffca7bcc8 main : mat[2][0] = 6.000000 main : &mat[2][0] = 0x7ffffca7bcd0 main : mat[2][1] = 7.000000 main : &mat[2][1] = 0x7ffffca7bcd8 main : mat[2][2] = 8.000000 main : &mat[2][2] = 0x7ffffca7bce0 ---- &mat = 0x7ffffca7bc68 セグメンテーション違反です
- Eclipse3.4で勉強したい
Eclipse3.4 CDTにてC++の勉強をしようと思っているのですが、 どのようにすればEclipseでHelloWorldが作れるのか全く分かりません。 このバージョンに近いEclipseで初心者にも分かるように解説しているサイトはないでしょうか
- EclipseのCの開発環境の構築手順
EclipseのCの開発環境 J2SDKをCドライブ(デフォルト設定)にインストールしました。 eclipse_all_in_one_galileo(pleiades-e3.5-cpp-jre_20100226.zip)をC:\に解凍しました。 MinGWをC:\に解凍しました。 スタート->マイコンピュータ(右クリック)->詳細設定->環境変数で 変数:PATH、値c:\MinGW/bin;C:\Program Files\Java\jdk1.6.0_13\bin と設定しました。 ここまでできたのですが、これからどう設定すればいいのかわかりません。 設定は独自に調べつつやったのですが、参考にしたページとことごとくどこかでずれが生じてしまい、これ以上どこをどうすればいいのかがわからなくなりました。 一度プロジェクトを作成してcを書いたのですが、実行すると「バイナリーが見つかりません」のエラーが出てきました。 ここから実際にhallo,worldを出力させるまでの設定と手順をどなたか教えていただけないでしょうか。 どうかよろしくお願いします。
- ベストアンサー
- spinia0120
- C・C++・C#
- 回答数1
- C言語のプログラミングについての質問です
C言語の課題で数値を入力したらその数に40+して二乗するプログラミングを作りたいのですがソースがいまいちわかりません どなたかご教授お願いします
- 【C言語教えて下さい!】文字検索
引数として、複数の文字列を格納した配列、その文字列数、あるいは文字列aを与え、aが複数の文字列を格納した配列中に見つかれば1を返し、見つからなければ0を返す関数find_string()をつくりたいのですがよくわかりません。 どなたかご教授お願いします。 ヒントや考え方など教えて下さい。
- 学校の課題で悩んでます
#include <stdio.h> void main(){ int okane; float kion; printf("今日のお金は?\n"); scanf("%d",&okane); printf("今日の気温は?\n"); scanf("%f",&kion); if( okane >=700&&kion>=30.0 ){ printf("冷やし中華を食べよう\n"); } if( okane >=700&&kion<30.0 ){ printf("ラーメンを食べよう\n"); } if( okane <=700){ printf("バイトしろ"); } } この文を演算しを使わずにifelse文に書き換えるやり方を教えて下さい
- 締切済み
- e100013re
- その他(プログラミング・開発)
- 回答数4
- 課題で悩んでます
nclude <stdio.h> void main(){ int okane; float kion; printf("今日のお金は?\n"); scanf("%d",&okane); printf("今日の気温は?\n"); scanf("%f",&kion); if( okane >=700&&kion>=30.0 ){ printf("冷やし中華を食べよう\n"); } if( okane >=700&&kion<30.0 ){ printf("ラーメンを食べよう\n"); } if( okane <=700){ printf("バイトしろ"); } } この文で論理演算子を抜いてifelse文に書き換えろという課題が出たのですが分からないので全文教えて下さい
- freadを使用した構造体に乱数を発生させ
タイトルの通りなのですが 一度.binファイルに構造体(date)を読み書きさせ、その構造体で乱数を発生させランダムにキャラを指定の部分に表示させるプログラムなのですが、どうしても配列として扱えないのか乱数部分に(teki)を入れてもエラーになったりしてしまいます。 このプログラムで乱数→配列に代入→配列の[0][1]の取り出し→表示 は可能でしょうか。 すべて書けなかったので一部抜いています typedef struct{ char name[10]; int life; int MP; int att; int defe; }TEKI; TEKI date[20]={ {"ソリッド ",100,100, 90, 80}, {"リキッド ",100,100, 70, 80}, (略) {"マンティス ",100, 80, 70, 70}, {"ビッグ.ボス",100,100, 90, 90}, },*OFF,*DEF,MC[2],teki; srand((unsigned)time(NULL)); /*-------書き込み-------*/ //テキスト fp_txt=fopen("monster.txt","w"); if(fp_txt==NULL){return -1;} for(i=0;i<20;i++){ fprintf(fp_txt,"%s %3d %3d %3d %3d\n",date[i].name,date[i].life,date[i].MP,date[i].att,date[i].defe); } //バイナリ fp_bin=fopen("monster.bin","wb"); if(fp_bin==NULL){return -1;} fwrite(&date,sizeof(date),1,fp_bin); fclose(fp_txt); fclose(fp_bin); /*----------------------*/ fp_bin=fopen("monster.bin","rb"); if(fp_bin==NULL){ return -1; } fread(&teki,sizeof(TEKI),21,fp_bin); /*--------乱数発生------*/ for(i=0;i<20;i++) rand_hai[i]=i; for(i=20;i>1;i--){ rnd=rand()%i; wk=rand_hai[i-1]; rand_hai[i-1]=rand_hai[rnd]; rand_hai[rnd]=wk; } sen=rand_hai[0]; kou=rand_hai[1]; MC[0]=date[sen]; MC[1]=date[kou]; /*----------------------*/ ban^=0x00000001; OFF=&MC[ban]; DEF=&MC[ban^0x00000001]; pos.X=50; pos.Y=5; SetConsoleCursorPosition(hStdout, pos); printf("[%s]",teki.name); pos.X=16; pos.Y=13; SetConsoleCursorPosition(hStdout, pos); printf("[%s]",teki.name); _getch(); fclose(fp_txt); fclose(fp_bin);