この列挙体で下の関数はあっていますか?
勝ったら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件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
おっと、
> char* msg = "\nジャンケンをしましょう。グーは0 チョキは2 パーは5をいれます。\nじゃんけんぽん はい!どうぞ : ";
はこうだね。
char* msg = "\nジャンケンをしましょう。グーは0 チョキは1 パーは2をいれます。\nじゃんけんぽん はい!どうぞ : ";
0、2、5 -> 0、1、2
に変更。
フツーに行こうぜ。
No.3
- 回答日時:
ちなみに。
もう一回繰り返すけど、この問題って以下の問題
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;
}
/* ここまで */
No.1
- 回答日時:
> 勝ったら1点負けたらマイナス1点引き分けでゼロ点を代入するプログラムです。
だとしたら間違いですね。
これは代入するプログラムじゃない。言い換えると代入が最終目的じゃない。
得点を返すプログラムです。
その違いが全然分かってないですね。
「細かい事を・・・」と思うかもしれませんが、プログラミングでは意味は大違いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#からC言語で作成したDLLに文...
-
ftoa の作り方
-
-'0'の意味について
-
charからLPTSTRへの変換方法
-
fgetsなどのときのstdinのバッ...
-
プログラミング(関数reverseを...
-
str系関数を使わずに二つの文字...
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
double型の値をchar配列に変換...
-
”あいうえお” を ”おえういあ...
-
バイナリファイルをコピーする...
-
入力された文字列から整数だけ...
-
絶対パスからのファイル名の切...
-
配列をnビットシフトする
-
Win32APIでのエディットボック...
-
C言語のfor文です。 繰り返しの...
-
'const char *' 型は 'char *' ...
-
構造体の各メンバにfor文からア...
-
C言語 バイナリファイルをfloa...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
CStringをwchar_tに変換したい
-
charでの計算?
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
'const char *' 型は 'char *' ...
-
テキストデータをそのままバイ...
-
配列をnビットシフトする
-
半角カナ→16進
-
double型の値をchar配列に変換...
-
sprintfに同じ変数は使えるか
-
ファイル名である文字列からbas...
-
ネットワークにつながっている...
-
ftoa の作り方
-
間接操作のレベルとは
-
型変換
-
C言語です
-
C言語のfor文です。 繰り返しの...
-
Win32APIでのエディットボック...
-
【C言語】文字型と整数型の違い
おすすめ情報