TEを引数にして、JUDGEを返す

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あーす

TEを引数にして、JUDGEを返す

#1

投稿記事 by あーす » 3年前

コード:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

int main()
{
	FILE *fp;
	int i;
	int p_LOOSE,p_EVEN,p_WIN;
	typedef enum { GU,CHOKI,PA,END }TE;
	TE pc,player;/* PCとあなたの手*/
	const char *te[] = {"グー", "チョキ", "パー", "終了"};
	typedef enum { LOOSE, EVEN, WIN } JUDGE;
	p_LOOSE=0;
	p_EVEN=0;
	p_WIN=0;
	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]]);
		if(te,player==GU,te && te,pc==GU){
	p_EVEN++;
	}
	else if(te,player==GU && te,pc==CHOKI){
	p_WIN++;
	}
	else if(te,player==GU && te,pc==PA){
	p_LOOSE++;
	}
	else if(te,player==CHOKI && te,pc==GU){
	p_LOOSE++;
	}
	else if(te,player==CHOKI && te,pc==CHOKI){
	p_EVEN++;
	}
	else if(te,player==CHOKI && te,pc==PA){
	p_WIN++;
	}
	else if(te,player==PA && te,pc==GU){
	p_WIN++;
	}
	else if(te,player==PA && te,pc==CHOKI){
	p_LOOSE++;
	}
	else if(te,player==PA && te,pc==PA){
	p_EVEN++;
	}
	}while (player != END);
	printf( "\n" );
	 printf( "じゃんけんゲームの結果発表\n" );
	 printf("トータルで[%d]勝[%d]敗[%d]引き分けでした。\n",p_WIN,p_LOOSE,p_EVEN);
	 fp=fopen("test.txt","a");
	 fprintf(fp,"トータルで[%d]勝[%d]敗[%d]引き分けでした。\n",p_WIN,p_LOOSE,p_EVEN);
	 fclose(fp);
	return 0;
}
以前、ゲームの結果をファイルに表示するということで、質問させて頂いたものです。
このように、一応、プログラムができたところでございます。

このプログラムができてすぐ、勝敗部分等に関数を使い、TEを引数にしてJUDGEを返す関数を作ってもらいたいと課題を頂きました。
今回教えて頂きたいのは、この<<関数を使い、TEを引数にしてJUDGEを返す関数を作ってもらいたい>というところです。

正直言って、ちょっと言っている意味がわからなかったのですが、
同じ処理を何度も書かないためにする必要があるものなのかなと思っています。

関数などのサイトや、本などを見てやっていますがいまいちどうしていいかわかりません。
漠然とした質問ですが、一体TEを引数にしてJUDGEを返すとはどういうことなのでしょうか。

宜しくお願い致します。

inemaru
記事: 108
登録日時: 3年前

Re: TEを引数にして、JUDGEを返す

#2

投稿記事 by inemaru » 3年前

あーす さんが書きました: このプログラムができてすぐ、勝敗部分等に関数を使い、TEを引数にしてJUDGEを返す関数を作ってもらいたいと課題を頂きました。
今回教えて頂きたいのは、この<<関数を使い、TEを引数にしてJUDGEを返す関数を作ってもらいたい>というところです。

正直言って、ちょっと言っている意味がわからなかったのですが、
同じ処理を何度も書かないためにする必要があるものなのかなと思っています。

関数などのサイトや、本などを見てやっていますがいまいちどうしていいかわかりません。
漠然とした質問ですが、一体TEを引数にしてJUDGEを返すとはどういうことなのでしょうか。
単純に、<<じゃんけんの結果を返す関数を作成しなさい>>ということなので、
まず、関数について調べて理解する必要があります。

キーワードは以下の通り
  • 関数
  • 引数
  • 戻り値
以上の内容を理解した上での質問ですか?

あーす

Re: TEを引数にして、JUDGEを返す

#3

投稿記事 by あーす » 3年前

>inemaruさん返信ありがとうございます。
なるほど!そういうことでしたか。
といっても、やはり色々見ないとわかりませんが・・・・。
ですがinemaruさんのおかげで結構イメージつきました。ありがとうございます。

あーす

Re: TEを引数にして、JUDGEを返す

#4

投稿記事 by あーす » 3年前

あれ、さっきとコメント表示が違う・・・。

いえ、まだ勉強途中なので関数、引数、戻り値に関してもあまりよく理解していません。

inemaru
記事: 108
登録日時: 3年前

Re: TEを引数にして、JUDGEを返す

#5

投稿記事 by inemaru » 3年前

あーす さんが書きました:あれ、さっきとコメント表示が違う・・・。

いえ、まだ勉強途中なので関数、引数、戻り値に関してもあまりよく理解していません。
編集と返信が入れ違いになってしまったようです。
(レスの内容にキーワードを書き加えてました。)

とりあえず、検索すれば解説サイトがあるので活用してください。
最低限、「関数」について理解していないと、この課題は解けません。

以下は、関数についての参考までに

コード:

// 関数を使うと
// 共通化できる部分をまとめたり
// 処理を分割したりできる

// 戻り値のない関数
void Proc1(){
	printf("Proc1");
}

// 戻り値のある関数
int Proc2(){
	printf("Proc2");
	return 0;
}

// 引数がある関数
int Proc3(int arg1){
	printf("Proc3");
	return arg1;
}

// 複数引数がある関数
int Proc4(int arg1, int arg2){
	printf("Proc4");
	return arg1 + arg2;
}

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: TEを引数にして、JUDGEを返す

#6

投稿記事 by みけCAT » 3年前

あーす さんが書きました:一体TEを引数にしてJUDGEを返すとはどういうことなのでしょうか。
TE「型のデータ」を引数にしてJUDGE「型のデータ」を返す、ということだと思います。
オフトピック
あーす さんが書きました:

コード:

te,player==GU,te && te,pc==GU
という条件式にはコンマ演算子が使用されており、

コード:

pc==GU
と等価です。
判定部分の他の条件式にも同様に意味のない部分があります。
その結果、グー以外の手を出すと、勝ち負けの情報と最後に出力される数が合わなくなる場合があります。
これは意図した仕様ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あーす

Re: TEを引数にして、JUDGEを返す

#7

投稿記事 by あーす » 3年前

返信遅くなりまして申し訳ありません

>inemaruさん
返信ありがとうございます。
まずはしっかり頭にいれてから、ということですね。

とはいえ、結構複雑なので頭が痛いですが・・・

>みけCATさん
返信ありがとうございます。
playerやpcの何なのかを書きなさいと言われていたので、コンマを使っていたのですが
まさか結果が合わなくなっているとは思いもよらなかったです。

_等も試したのですが、定義されていませんと出るので、何かいい方法はないかと探していましたが見つからず
コンマ演算子を使っていたようです。ご指摘ありがとうございます。
こういう場合は何をどうすればpcの何なのかを示せるのですかね?

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: TEを引数にして、JUDGEを返す

#8

投稿記事 by みけCAT » 3年前

あーす さんが書きました:こういう場合は何をどうすればpcの何なのかを示せるのですかね?
何を求められているかがよくわからないですが、こんな感じでコメントを書くのはどうでしょうか?

コード:

		if(player/*の手*/==GU && pc/*の手*/==GU){
オフトピック
あーす さんが書きました:まさか結果が合わなくなっているとは思いもよらなかったです。
なんでですか?テストしていないのですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: TEを引数にして、JUDGEを返す

#9

投稿記事 by かずま » 3年前

私なら次のように書きますが、これを参考に、あなたはどう書きますか?
参考にならないなら、どこがわからないのかを質問してください。

コード:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

typedef enum { LOOSE, EVEN, WIN } JUDGE;
typedef enum { GU, CHOKI, PA, END } TE;

JUDGE judge(TE a, TE b)
{
    static const JUDGE result[3][3] = {
        { EVEN, WIN, LOOSE },
        { LOOSE, EVEN, WIN },
        { WIN, LOOSE, EVEN }
    };  /* プレイヤーの勝ち負けはresult[player][pc]で得られる */
    return result[a][b];
}

int main(void)
{
    FILE *fp;
    int i, p_LOOSE = 0, p_EVEN = 0, p_WIN = 0;
    TE pc, player;  /* PCとあなたの手 */
    JUDGE j;
    static const char *te[] = { "グー", "チョキ", "パー", "終了" };
    static 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("す");
    while (1) {
        puts("じゃんけん");
        scanf("%d", &player);
        puts("ぽん!");
        if (player == END) break;
        if (player < GU || player > PA) {
            puts("やり直してください");
            continue;
        }
        pc = (int) (rand() / (RAND_MAX + 1.0) * 3);
        j = judge(player, pc);
        printf("あなたは:%s\n" "私は:%s\n" "%s\n",
            te[player], te[pc], message[j]);
        if (j == LOOSE) p_LOOSE++;
        else if (j == WIN) p_WIN++;
        else p_EVEN++;
    }
    printf("\nじゃんけんゲームの結果発表\n"
        "トータルで[%d]勝[%d]敗[%d]引き分けでした。\n",
        p_WIN, p_LOOSE, p_EVEN);
    fp = fopen("test.txt", "a");
    fprintf(fp, "トータルで[%d]勝[%d]敗[%d]引き分けでした。\n",
        p_WIN, p_LOOSE, p_EVEN);
    fclose(fp);
    return 0;
}

fm

Re: TEを引数にして、JUDGEを返す

#10

投稿記事 by fm » 3年前

<<関数というのは、C++のcoutとcin関数の勘違いでしょうか?
(実際はクラスを使った演算子のオーバーロード)
だとすると、C++の基礎が足りないと分からないかもしれないです。

そうでないなら、じゃんけんゲームのロジックを書き換える必要があります。

あーす

Re: TEを引数にして、JUDGEを返す

#11

投稿記事 by あーす » 3年前

>みけCATさん
返信ありがとうございます。
確かにそういう風にコメントを打てばよかったかもしれません。
思いもよらなかったというよりは、テストの時によく確認していなかったです。申しわけありません。気を付けます。

>>かずまさん
返信ありがとうございます。
コードまで書いてくださいまして、参考にさせて頂きます。
参考にならない、どこがわからない、というよりかは、
まずどこが分からないか、参考にならないか、すら分からない状態でありますので、
今も手元にある参考書と、サイトに複数ある解説サイトを勉強し、多少なりとも関数について理解をしてから考えたいと思います。
またその時、ご協力いただけましたら、その時は宜しくお願い致します。

>>>fmさん
返信ありがとうございます。
ごめんなさい、そのcoutとcin関数というものがわからないです。
ですが恐らく勘違いではなく、前レスでもありますが自作関数を用いてソース量を減らしなさいという事なのだと思います。
ただ、まだ勉強途中の身でありますので、何かヒントを頂けるようでしたら宜しくお願い致します。

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: TEを引数にして、JUDGEを返す

#12

投稿記事 by みけCAT » 3年前

fm さんが書きました:<<関数というのは、C++のcoutとcin関数の勘違いでしょうか?
「関数」に、強調のための「<<」(「作ってもらいたい」のあとの「>」と対応する)がついたものではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: TEを引数にして、JUDGEを返す

#13

投稿記事 by かずま » 3年前

あーす さんが書きました: このプログラムができてすぐ、勝敗部分等に関数を使い、TEを引数にしてJUDGEを返す関数を作ってもらいたいと課題を頂きました。
今回教えて頂きたいのは、この<<関数を使い、TEを引数にしてJUDGEを返す関数を作ってもらいたい>というところです。
次のように書けば、誤解されなかったということでしょうね。
このプログラムができてすぐ、勝敗部分等に関数を使い、TEを引数にしてJUDGEを返す関数を作ってもらいたいと課題を頂きました。
今回教えて頂きたいのは、この 関数を使い、TEを引数にしてJUDGEを返す関数を作ってもらいたい というところです。

fm

Re: TEを引数にして、JUDGEを返す

#14

投稿記事 by fm » 3年前

みけCAT さんが書きました:
fm さんが書きました:<<関数というのは、C++のcoutとcin関数の勘違いでしょうか?
「関数」に、強調のための「<<」(「作ってもらいたい」のあとの「>」と対応する)がついたものではないでしょうか?
すみません、勘違いしてました。ネット上の文字のコミュニケーションのために、<<がついてたんですね。
てっきり、<<や>>はシフト演算子だと思ってました。

閉鎖

“C言語何でも質問掲示板” へ戻る