Cプログラムについて質問です。
問題1.1~1.7の解とメイン関数を統合してじゃんけんゲームを作成しています。
(1)じゃんけんを1回した後に「続けますか?」というメッセージを画面に表示し、続ける場合は数字の1を、やめる場合は1以外の数を入力させ、続ける場合は初回に戻ってじゃんけんをし、続かない場合は終了する。
(2)じゃんけんを1回するたびにそれまでの累積の勝敗を表示する。
1.1 じゃんけんゲームで列挙体Gu(グー)に値0、Chki(チョキ)に値2、Pa(パー)に値5を割り当てるenum janken型列挙体を宣言し、これをJPON型と再定義せよ。
1.2 乱数の種に時刻を使用し、1~6の乱数(整数型)を発生する関数saikoroを作成せよ。
1.3 1~6のサイの目を引数で受け取り、目が1,2ならグーを、3,4ならチョキを、5,6ならパーを発生させる関数sysjanを作成せよ。(sysjanはコンピュータが出す拳)
1.4 コンピュータが出した拳を表示する関数watashinokenを以下の仕様で作成せよ
・引数で受け取る変数名をkenとし、その型はJPON型とする。
・引数で受け取った拳の値によって「あなたは○○を出しました。」と表示する。ここで、引数値がGuならグー、Chokiならチョキ、Paならパーの文字が表示されたものとする。
・表示の場合分けにはswitch-case文を用いる。
・この関数に戻り値はない。
1.5 挑戦者が出した拳を表示する関数anatanokenを以下の仕様で作成せよ
1.4と同じ
1.6 コンピュータが出した拳と挑戦者が出した拳を比較し、勝負結果を戻り値として返す関数shoubuを以下の仕様で作成せよ。
・引数で挑戦者の拳をkenin、コンピュータの拳をkenoutとし、その型はどちらもJPON型とする。
・勝負結果を整数型変数shoubukekkaにセットしてretrunする。なお、勝負結果と戻り値の対応関係は下記の通りとする。
・挑戦者の勝ち shoubukekka=1
・コンピュータの勝ち shoubukekka=-1
・あいこ shoubukekka=0
1.7 勝負結果を表示する関数kekkaを以下の仕様で作成せよ。
・引数が-1のとき、「あなたの負けです」と表示する。
・引数が+1のとき、「あなたの勝ちです」と表示する。
・引数が0のとき、「あいこです」と表示する。
・この関数に戻り値はない。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef enum janken { Gu = 0, Choki = 2, Pa = 5 } JPON;
int saikoro(void) {
int sai;
srand((unsigned)time(NULL));
sai = rand() % 6 + 1;
return(0);
}
int sysjan(int sai)
{
int pon;
switch (sai) {
case 1: pon = Gu; break;
case 2: pon = Gu; break;
case 3: pon = Choki; break;
case 4: pon = Choki; break;
case 5: pon = Pa; break;
case 6: pon = Pa; break;
}
return pon;
}
int shoubu(JPON kenin, JPON kenout)
{
int shoubukekka;
switch (kenin) {
case Gu:
if (kenout == Gu) shoubukekka = 0;
else if (kenout == Choki) shoubukekka = 1;
else shoubukekka = -1;
break;
case Choki:
if (kenout == Gu) shoubukekka = -1;
else if (kenout == Choki) shoubukekka = 0;
else shoubukekka = 1;
break;
case Pa:
if (kenout == Gu) shoubukekka = 1;
else if (kenout == Choki) shoubukekka = -1;
else shoubukekka = 0;
break;
}
return (shoubukekka);
}
void watashinoken(JPON ken)
{
switch (ken) {
case Gu: printf("わたしはグーを出しました。\n"); break;
case Choki: printf("わたしはチョキを出しました。\n"); break;
case Pa: printf("わたしはパーを出しました。\n"); break;
}
}
void anatanoken(JPON ken)
{
switch (ken) {
case Gu: printf("あなたはグーを出しました。\n"); break;
case Choki: printf("あなたはチョキを出しました。\n"); break;
case Pa: printf("あなたはパーを出しました。\n"); break;
}
}
void kekka(int r)
{
switch (r) {
case -1: printf("あなたの負けです\n"); break;
case 1: printf("あなたの勝ちです\n"); break;
case 0: printf("あいこです\n"); break;
}
}
int main(void) {
JPON choken;
JPON sysken;
int ken_buf;
int sai;
int shoubukekka;
do {
printf("\nジャンケンをしましょう。\n");
printf("\nグーは0 チョキは2 パーは5を入れます。\n");
printf("\nじゃんけんぽん!はいどうぞ:\a");
scanf("%d", &ken_buf);
choken = (JPON)ken_buf;
if ((choken != Gu) && (choken != Choki) && (choken != Pa))
printf("\n@@@@正しく入れてください!@@@@\n");
} while (!(choken == Gu || choken == Choki || choken == Pa));
sai = saikoro();
sysken = sysjan(sai); ←エラー
shoubukekka = shoubu(choken, sysken);
printf("\a");
anatanoken(choken);
watashinoken(sysken);
kekka(shoubukekka);
printf("\n終わります。おつかれさまでした。\n\n");
return(0);
}
作成してみたのですが、エラーが1か所出てきてしまいます。
どうしたら解消されるのでしょうか?
他におかしい箇所があればご指摘お願いします。
長文すみません。
No.2ベストアンサー
- 回答日時:
Messyだなぁ・・・・・・。
取り敢えず、分かったトコは。
> sysken = sysjan(sai); ←エラー
まず、syskenは
JPON sysken;
としてJPON型として定義されてるんだけど、sysjanは
> int sysjan(int sai)
と定義されてて、JPON型の変数にintを代入しようとしていて、「型の不整合」が起きています。
コンパイラによってはスルーしてくれるけど、多分今のVisual Studio付属のMicrosoftのコンパイラは厳しいんで、「型の不整合」を許してないんじゃないかな。
それが、
> 'int'から'JPON'に変換できません。
と言う意味です。
だからsysjanと言う関数はJPON型を返す関数として書くべきなんじゃないかしらん。
ちなみに、clangだと問題なくコンパイル出来て、でも「ゲームの継続」は出来ないみたいなんで、他にもロジックミスがある気がするんで、覚悟しておいて下さい(笑)。
No.1
- 回答日時:
1.1から1.7を読んで理解し、その後ソースコードを読んで1.1から1.7までを実現しているか解読し、どういうエラーが起きているかわからないのを知らずにその点も解読して指摘する・・・ということを依頼しているわけですか???
それはちょっとどうなのかなぁ。。。
とりあえずコンパイル・エラーやリンク・エラーは無くて実行プログラムが完成して動かせているのですか?
その場合、何をすると何というエラーになるのですか?
せめてそれくらいは具体的に書かないと。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語 3 2022/11/09 13:27
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語でAからZまでを表示する...
-
1秒で動くインターバルタイマ
-
C言語初心者です。次の問題で質...
-
printf で二進表示を行いたい。
-
ヘロンの公式を作ったプルグラ...
-
C言語での数字の花形表示
-
二つの整数値の大小比較
-
インクリメント演算子をprintf...
-
strcmp
-
球の体積と表面積を表示するプ...
-
printf( " %2d", p * q );
-
C言語 プログラミング
-
コンパイルエラーについて
-
エラーの意味が…
-
Cのdoubleの浮動小数点表示につ...
-
Cプログラムについて
-
C言語 関数
-
CTRL+Dでループを抜けるには
-
hit&bolwのプログラミングがで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
既約分数の表示プログラム
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
printf( " %2d", p * q );
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
%P と %X の違い
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
cshの文字列操作(0埋め)
-
万年カレンダーのC言語プログラ...
-
コマンドラインに出力した文字...
-
scanfに文字が入力されたときに...
-
コンパイルエラーについて
-
ホームページをC言語で作りたい...
-
改行について 1行に何個かづ...
-
台形の面積を求めるプログラム
-
なぜgccはstdio.hをインクルー...
おすすめ情報
VisualStudioを使用しています。
デバックなしで開始すると、'int'から'JPON'に変換できません。とエラーが出てしまいます。