「一気に最後まで読んだ」本、教えて下さい!

この列挙体で下の関数はあっていますか?
勝ったら1点負けたらマイナス1点引き分けでゼロ点を代入するプログラムです。
至急お願いします
typedef enum janken {
Gu = 0, Choki = 2, Pa = 5}JPON;

int shoubu(JPON kenin,JPON kenout) {
int shoubukekka;
switch (kenout) {
case Gu:
{if (kenout == 0)shoubukekka = 0;
else if (kenout == 2)shoubukekka = 1;
else shoubukekka = -1;
}
case Choki:
{if (kenout == 0)shoubukekka = -1;
else if (kenout == 2)shoubukekka = 0;
else shoubukekka = 1;
}
case Pa:
{if (kenout == 0)shoubukekka = 1;
else if (kenout == 2)shoubukekka = -1; else shoubukekka = 0; }
}
return(shoubukekka);
}

A 回答 (4件)

おっと、



> char* msg = "\nジャンケンをしましょう。グーは0 チョキは2 パーは5をいれます。\nじゃんけんぽん はい!どうぞ : ";

はこうだね。

char* msg = "\nジャンケンをしましょう。グーは0 チョキは1 パーは2をいれます。\nじゃんけんぽん はい!どうぞ : ";

0、2、5 -> 0、1、2

に変更。
フツーに行こうぜ。
    • good
    • 0

ちなみに。



もう一回繰り返すけど、この問題って以下の問題

https://oshiete.goo.ne.jp/qa/12336707.html

と丸っきり同じでしょ?
誘導型の問題なんで、問題の指示に従って行ったら、そのままプログラムになる・・・ってのが理想なんだけど、ぶっちゃけ、学生に回り道させる為だけに作ったように見える。結果かなりmessyと言うか・・・・・・。
(例えばフツーにGu = 0、Choki = 1、Pa = 2にすればジャンケンの勝負判定はもっと簡単になるので、「わざわざ学生にメンド臭い判定法を書かせる為に」意地悪い列挙体定義にしてる、とか)

んなワケで「俺ならこう書く」ってのを参考までに挙げときます。問題の仕様に準じる必要はない、って思ったトコは思い切り変えてますがね。でも参考にはなるんじゃないかしらん・・・あるいは改造の元ネタにする、とかね。

/* ここから */

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

enum janken { Gu, Choki, Pa};

char* ken[] = {"グー", "チョキ", "パー"};
char* anata = "あなた";
char* watashi = "わたし";
char* hand = "%sは%sを出しました。\n";
char* kekka[] = {"\nあいこです\n", "\nあなたの負けです\n", "\nあなたの勝ちです\n"};
char* msg = "\nジャンケンをしましょう。グーは0 チョキは2 パーは5をいれます。\nじゃんけんぽん はい!どうぞ : ";

int sysjan(void) {
 switch(random() % 3 + 1) {
 case 1: return Gu;
 case 2: return Choki;
 default: return Pa;
 }
}

int shoubu(int kenin, int kenout) {
 return (kenin - kenout + 3) % 3;
}

int main(void) {
 int choken, sysken, shoubukekka;
 int acc[3] = { 0, 0, 0 };
 char str[2];

 srand((unsigned)time(NULL));

 while (true) {
  printf("%s", msg);
  scanf("%1s%*[^\n]%*c", str);
  choken = strtol(str, NULL, 10);
  if ((choken < 0) || (choken > 2)) {
   printf("\n@@@正しく入れてください@@@\n");
   continue;
  }
  sysken = sysjan();
  shoubukekka = shoubu(choken, sysken);
  printf(hand, anata, ken[choken]);
  printf(hand, watashi, ken[sysken]);
  printf("%s\n", kekka[shoubukekka]);

  acc[shoubukekka] += 1;
  printf("%d勝%d敗%d分け\n", acc[2], acc[1], acc[0]);

  scanf("%1s%*[^\n]*c", str);
  choken = strtol(str, NULL, 10);
  if (choken == 1) {
   continue;
  } else {
   break;
  }
 }
 printf("\n終わります。お疲れ様でした。\n\n");
 return EXIT_SUCCESS;
}

/* ここまで */
    • good
    • 0

あんしんしていいよ. どう見ても「間違ってる」から.



そも「勝つ」「負ける」の定義がない時点で....
    • good
    • 1

> 勝ったら1点負けたらマイナス1点引き分けでゼロ点を代入するプログラムです。



だとしたら間違いですね。
これは代入するプログラムじゃない。言い換えると代入が最終目的じゃない。
得点を返すプログラムです。
その違いが全然分かってないですね。
「細かい事を・・・」と思うかもしれませんが、プログラミングでは意味は大違いです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!