C言語初心者です。どうかご教授いただきますようお願い申し上げます。
#include<time.h>
#include<stdlib.h>
int main()
{
int i;
typedef enum { GU,CHOKI,PA,END }TE;
TE pc,player;/* PCとあなたの手*/
const char *te[] = { "グー", "チョキ", "パー", "終了"};
typedef enum { LOOSE, EVEN, WIN} JUDGE;
const JUDGE result[3][3] = {
{EVEN, WIN, LOOSE},
{LOOSE, EVEN, WIN},
{WIN, LOOSE, EVEN}
}; /* プレイヤーの勝ち負けはresult[player][pc]で得られる */
const char *message[] = { "あなたの負けです", "あいこです", "あなたの勝ちです" };
srand((unsigned)time(NULL));
puts("じゃんけんをします");
for (i = 0; i < sizeof(te) / sizeof(te[0]); i++) {
printf("%dが%sで", i, te);
}
puts("す");
do {
puts("じゃんけん");
scanf("%d",&player); /* 手抜き */
puts("ぽん!");
if (player < 0 || player > END) {
puts("やり直してください");
} else if (player == END)
continue;
pc = (int)(rand() / (RAND_MAX + 1.0) * 3);
printf("あなたは:%s\n", te[player]);
printf("私は:%s\n", te[pc]);
puts(message[result[player][pc]]);
} while (player != END);
main(){
FILE *じゃんけん結果;
fopen("じゃんけん結果.text","w");
fputs(char *[result[player]],FILE *じゃんけん結果);
fclose(file);
return 0;
}
じゃんけんゲームなのですが、此方の結果を自動的にファイルに結果の数だけ書き込ませるためには
どのようにしてプログラムを組んだらよろしいのでしょうか?
どうかこの初心者に、ヒントだけでもご教授ください
宜しくお願い致します。
ゲームの結果をファイルに結果の数だけ書き込む
Re: ゲームの結果をファイルに結果の数だけ書き込む
ザッとこんな流れでしょうか。
ご提示のコードではmain関数が複数見受けられます。それはまずいでしょうね。
また、FILE *型の変数に日本語を使われていますが、あまりおすすめできません。
処理系によっては日本語の変数名が使えるかもしれませんが、一般には使えないものと
思っておく方がいいと思います。
書き込み用のファイルをオープンする。
以下を対戦の数だけ繰り返す。
・ジャンケンをする
・結果を判定する(勝ちor負けorあいこ)
・結果をファイルに書き込む
書き込み用のファイルをクローズする。
また、FILE *型の変数に日本語を使われていますが、あまりおすすめできません。
処理系によっては日本語の変数名が使えるかもしれませんが、一般には使えないものと
思っておく方がいいと思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: ゲームの結果をファイルに結果の数だけ書き込む
boxさん、返信ありがとうございます。
やはり、main関数を複数使うのはダメですね
コンパイルでもエラーはでていたのですが、それ以外の書き方が分からずそのままコピーしてしまいました。
申しわけありません。
ですが、ずっと考えているのですが、どうしても結果をファイルに書き込むという行為の構文の書き方がわかりません。
ファイルテキストがresult.txtとして
FILE *fp;
fp=fopen("result.txt","w");
これでファイルテキストを開き
じゃんけんをする構文があって
その結果が判定される構文があって
その後に、その結果をファイルに書き込ませる構文を書いて
そのファイルをクローズして
fclose(fp);
return 0;
}
まずこの流れで合ってるのでしょうか。
それともじゃんけんとその結果が判定される構文とはまた別に
ファイルに書き込ませるようとしてもう一度書かなければならないのでしょうか。
そして最後に、その結果をファイルに書き込ませるプログラムの書き方がまったく思い浮かびません。
これを使ってみてはどうか、とか
ここをこうすればできるよ、とかなんでもいいのでご教授ください。よろしくお願いします。
思い浮かんでいるもの
fprintf()←文字列をファイルに書き込むものだからできない?
FPUTS(char*[result[player]],FILE*fp);←identifierを付け忘れていると言われる
やはり、main関数を複数使うのはダメですね
コンパイルでもエラーはでていたのですが、それ以外の書き方が分からずそのままコピーしてしまいました。
申しわけありません。
ですが、ずっと考えているのですが、どうしても結果をファイルに書き込むという行為の構文の書き方がわかりません。
ファイルテキストがresult.txtとして
FILE *fp;
fp=fopen("result.txt","w");
これでファイルテキストを開き
じゃんけんをする構文があって
その結果が判定される構文があって
その後に、その結果をファイルに書き込ませる構文を書いて
そのファイルをクローズして
fclose(fp);
return 0;
}
まずこの流れで合ってるのでしょうか。
それともじゃんけんとその結果が判定される構文とはまた別に
ファイルに書き込ませるようとしてもう一度書かなければならないのでしょうか。
そして最後に、その結果をファイルに書き込ませるプログラムの書き方がまったく思い浮かびません。
これを使ってみてはどうか、とか
ここをこうすればできるよ、とかなんでもいいのでご教授ください。よろしくお願いします。
思い浮かんでいるもの
fprintf()←文字列をファイルに書き込むものだからできない?
FPUTS(char*[result[player]],FILE*fp);←identifierを付け忘れていると言われる
Re: ゲームの結果をファイルに結果の数だけ書き込む
ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
結果はバイナリで書き込みたいということですか?具体的にどのようなフォーマットで書き込みたいですか?
ファイルに書き込みたいのに「ファイルに書き込むものだからできない」というのはおかしいでしょう。あーす さんが書きました:fprintf()←文字列をファイルに書き込むものだからできない?
結果はバイナリで書き込みたいということですか?具体的にどのようなフォーマットで書き込みたいですか?
もしもバイナリファイルを書き込みたいので貼れば、モードは"w"ではなく"wb"を使うべきです。あーす さんが書きました:FILE *fp;
fp=fopen("result.txt","w");
これでファイルテキストを開き
(中略)
まずこの流れで合ってるのでしょうか。
あーす さんが書きました:FPUTS(char*[result[player]],FILE*fp);←identifierを付け忘れていると言われる
- C言語の標準ライブラリにfputs関数はありますが、FPUTS関数(大文字で、しかも全角!)はありません。
- 関数呼び出しの実引数に型名を付けてはいけません。
- resutlt[player]のまわりに余計な[]があります。
- FPUTS関数の仕様はわかりませんが、標準ライブラリのfputs関数の第一引数は文字列(へのポインタ)でなければいけないので、これにresult[player]を渡すのは間違っています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ゲームの結果をファイルに結果の数だけ書き込む
みけCATさん返信ありがとうございます。
テキストファイルやバイナリファイルへの書き込みや読み込みなども通して一旦やり直してみます
テキストファイルやバイナリファイルへの書き込みや読み込みなども通して一旦やり直してみます
Re: ゲームの結果をファイルに結果の数だけ書き込む
int main()
{
FILE *fp; /*ファイルポインタ宣言*/
char s[256];
char c;
/*(2)ファイルのオープン*/
/* ここで、ファイルポインタを取得*/
if((fp = fopen("test.txt","w")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE); /*(3)エラーの場合は通常、異常終了する*/
}
while (fgets(s, 256, fp) != NULL) {
printf("出力されると思う文字%s");
typedef enum { GU,CHOKI,PA,END }TE;
TE pc,player;/* PCとあなたの手*/
const char *te[] = {"グー", "チョキ", "パー", "終了"};
typedef enum { LOOSE, EVEN, WIN } JUDGE;
const JUDGE result[3][3] = {
{EVEN, WIN, LOOSE},
{LOOSE, EVEN, WIN},
{WIN, LOOSE, EVEN}
}; /* プレイヤーの勝ち負けはresult[player][pc]で得られる */
const char *message[] = { "あなたの負けです", "あいこです", "あなたの勝ちです" };
srand((unsigned)time(NULL));
puts("じゃんけんをします");
for (i = 0; i < sizeof(te) / sizeof(te[0]); i++) {
printf("%dが%sで", i, te[i]);
}
puts("す");
do {
puts("じゃんけん");
scanf("%d",&player);
puts("ぽん!");
if (player < 0 || player > END) {
puts("やり直してください");
continue;
} else if (player == END)
break;
pc = (int)(rand() / (RAND_MAX + 1.0) * 3);
printf("あなたは:%s\n", te[player]);
printf("私は:%s\n", te[pc]);
puts(message[result[player][pc]]);
} while (player != END);
printf( "\n" );
printf( "じゃんけんゲームの結果発表\n" );
printf("トータルで[%d]勝[%d]敗[%d]引き分けでした。\n",WIN,LOOSE,EVEN);
return 0;
}
考えていてもいまいち集計の仕方が分かりません。
上記の50番のようにWIN,LOOSE,EVEN,);とすると、必ず2勝0敗1分けのようになってしまいます。
一体なぜでしょうか、というよりかは、どのようにすればきちんと結果が集計されるようになりますでしょうか?
ご教授の程、宜しくお願いします。
Re: ゲームの結果をファイルに結果の数だけ書き込む
enumによってLOOSEが0、EVENが1、WINが2と定義されているのを、そのまま出力しているからですね。あーす さんが書きました:上記の50番のようにWIN,LOOSE,EVEN,);とすると、必ず2勝0敗1分けのようになってしまいます。
一体なぜでしょうか
きちんと結果が集計されるようなコードを書いてコンパイルすればいいでしょう。あーす さんが書きました:どのようにすればきちんと結果が集計されるようになりますでしょうか?
具体的には、
- 集計結果を保存する変数を用意し、初期化する
- じゃんけんの結果が出たら、それにあわせて集計結果を更新する
- 定数ではなく、保存した集計結果を出力する
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ゲームの結果をファイルに結果の数だけ書き込む
No: 6のコードには、必要なヘッダがincludeされていない以外に、以下の問題があります。あーす さんが書きました:上記の50番のようにWIN,LOOSE,EVEN,);とすると、必ず2勝0敗1分けのようになってしまいます。
- 12行目で、なぜか書き込みモードで開いたファイルから読み込もうとしている
- 13行目で、printfの書式指定文字列に対し引数が足りないので、実行されれば未定義動作になる
- 28行目で使用されているiが宣言されていない (コンパイルエラー)
- 35行目で、scanfの%dに対応する引数はint*を渡さないといけないのに、enum TE*を渡しているので、実行されれば未定義動作になる
- 12行目の{ (または2行目の{) に対応する}が無い (コンパイルエラー)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ゲームの結果をファイルに結果の数だけ書き込む
>みけCATさん
返信ありがとうございます。
どうやらコピーが上手くいっていなかったらしく、修正する前のソースコードが貼られていました。
ご迷惑おかけしました。
返信ありがとうございます。
どうやらコピーが上手くいっていなかったらしく、修正する前のソースコードが貼られていました。
ご迷惑おかけしました。
Re: ゲームの結果をファイルに結果の数だけ書き込む
無事にファイルに結果をかき込むところまで終了しました。
アドバイスをくれた方、本当にありがとうございました。
まだまだこれから質問することもあると思いますが、その時も何卒ご指導ご鞭撻いただけたらと思います。
有難うございました。
アドバイスをくれた方、本当にありがとうございました。
まだまだこれから質問することもあると思いますが、その時も何卒ご指導ご鞭撻いただけたらと思います。
有難うございました。