質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

3回答

913閲覧

C 基本 じゃんけん問題

big000

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

1クリップ

投稿2019/05/16 16:18

編集2019/05/16 16:28

ヘディングのテキスト### C言語「じゃんけんをして、勝敗を出力する」

C言語の基本項目「ファイル分割」で、上手くいかない
ファイルの開始を行うと、黒い画面が出るのみで、出力されない。
環境はVisual Studioで、コードにエラーはなく、問題は見つかりませんでした。となっている
ソース、ヘッダーファイルなどは、cドライブにプログラミング→練習というファイルフォルダーを作成して保存している

発生している問題・エラーメッセージ

エラーは発生していないが、実行できない。

該当のソースコード

/*main.c*/ #include<stdio.h> #include"mys.h" #include"comp.h" #include"iff.h" int main(void) { int own(); int random(); int battle(); return 0; }
/*mys.h 自分の手を入力するところ*/ #ifndef MY_H #define MY_H extern int a; int own(); #endif MY_H /*mys.c*/ #include"mys.h" #include<stdio.h> int a=0; int own() { printf("入力してください\nグー:1 チョキ:2 パー:3\n"); scanf("%d\n", &a); return a; }
/*comp.h コンピュータの手*/ #ifndef COMP #define COMP extern int b; int random(); #endif COMP /*comp.c*/ #include"comp.h" #include<time.h> #include<stdlib.h> #include<stdio.h> int b; int random() { srand((unsigned)time(NULL)); b= rand() % 1 + 3; return b; }
/*iff.h勝敗の判定をするところ*/ #ifndef IFF_H #define IFF_H int battle (int, int); #endif IFF_H /*iff.c*/ #include"iff.h" #include<stdio.h> #include"comp.h" #include"mys.h" int battle() { if (a == b) { printf("あいこです"); return 1; } else if ((a == 1 && b == 2) |(a == 2 && b == 3) |(a == 3 && b == 1)) { printf("あなたの勝ちです"); return 0; } else{ printf("あなたの負けです"); return 0; } }


試したこと

エラーはなくなったが、論理式がおかしいのか、ファイル分割の仕方がおかしいのか、関数の使い方がおかしいのか分からなかった。
scanfで、戻り値が無視されている、という警告があったので、
extern やグローバル変数の使い方が違うのかと思ったが、よくわからなかった。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuicho

2019/05/16 16:23 編集

ソースコードがマークダウン記法として解釈されてしまいとてもわかりにくくなっているので、 ```ここに言語を入力 コード ``` を用いて記載すると見やすくなるかと思います
guest

回答3

0

int main(void) {

int own(); int random(); int battle(); return 0;

}

これ、main関数のナカミは全部プロトタイプ宣言とみなされますんで、なにも実行されません
するなら、

int main(void) {
own();
random();
battle();
return 0;
}

としましょう

投稿2019/05/16 21:30

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

変数名が意味を持ってない。ヘッダファイル(〜.h)に関数が有る。
b= rand() % 1 + 3;・・・・rand() % 1は1で割った余りだが・・・0にしかならない。
←1〜3が欲しければ rand() % 3 + 1;
((a == 1 && b == 2) |(a == 2 && b == 3) |(a == 3 && b == 1))
論理演算のorは||
((a == 1 && b == 2) ||(a == 2 && b == 3) ||(a == 3 && b == 1))
じゃんけんは1回だけか? グローバル変数については他の方の意見を・・・
C言語のファイル分割方法などを学習されたほうがいいかも?

投稿2019/05/16 17:53

編集2019/05/16 17:58
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/05/16 18:07 編集

ここ(teratail)で「じゃんけん」で検索すると300件程度ヒットします。参考にされたらいかがでしょう?
yuicho

2019/05/17 02:27

> ヘッダファイル(〜.h)に関数が有る。 長らくCを触っていないとうろ覚えで自信ないので間違ってたら恐縮なのですが、ヘッダファイルのプロトタイプ宣言って他のファイルから関数のプロトタイプ宣言が見える必要があるから必要じゃなかったでしたっけ?
yuicho

2019/05/17 02:29

後の点に関してはその通りですね。見落としていた。。 私も今回のご質問を見る限り、分割方法もそうですがC言語でのコーディングにもう少し慣れてからの方が良いのではと思います。
cateye

2019/05/17 02:47 編集

そうですね、コーディングも色々と問題がありそうw 〜.hについては、定数や構造体、関数プロトタイプなどの定義場所で実装は〜.cで・・・まぁ、これも慣例と言うだけで、#includeした場所に、そのファイルが展開されると言うだけなんですが。 演算子なども、もう少し勉強してからでしょうか・・・ライブラリ関数(scanf()など)も仕様を確認してほしいです。
yuicho

2019/05/17 02:53

あ、ですよね。 1ブロック(```)の中に.hと.cが書いてあるのでヘッダで実装されてるように見えますが、一応ちゃんとプロトタイプ宣言だけになってるかなーと思いました。 #すごく細かいところでしたね、すみません;;
guest

0

エラーになりそうな気もするのですが(関数定義としてみなされてエラーにならないのかな?)…
main関数内の別関数呼び出しでintをつけてしまっているせいで、全くよばれずにそのまま return 0 を迎えているせいかと思われます。

main.c

1#include<stdio.h> 2#include"mys.h" 3#include"comp.h" 4#include"iff.h" 5int main(void) { 6 own(); 7 random(); 8 battle(); 9 return 0; 10}

のように関数名だけで記述すれば関数が呼ばれるかと思います。
# 久しぶりにcを触ったので、間違ってたらごめんなさいm(_ _)m

scanfで、戻り値が無視されている、という警告があった

は、単純に

scanf("%d\n", &a);

で戻り値を無視しているからですね。


#グローバル変数について
基本的にグローバル変数を使うのはあまりよくないです
絶対使うなというわけではないですが、今回のようなパターンであれば、関数に値渡しして戻り値を受け取る形にするべきです。
(特に今回はちゃんと関数も返しているので…)

/*main.c*/ #include<stdio.h> #include"mys.h" #include"comp.h" #include"iff.h" int main(void) { int a = 0; int b = 0; a = own(); b = random(); battle(a, b); return 0; }
/*mys.h 自分の手を入力するところ*/ #ifndef MY_H #define MY_H int own(); #endif MY_H /*mys.c*/ #include"mys.h" #include<stdio.h> int own() { int a; printf("入力してください\nグー:1 チョキ:2 パー:3\n"); scanf("%d\n", &a); return a; }
/*comp.h コンピュータの手*/ #ifndef COMP #define COMP int random(); #endif COMP /*comp.c*/ #include"comp.h" #include<time.h> #include<stdlib.h> #include<stdio.h> int random() { int b; srand((unsigned)time(NULL)); b = rand() % 1 + 3; return b; }
/*iff.h勝敗の判定をするところ*/ #ifndef IFF_H #define IFF_H int battle (int, int); #endif IFF_H /*iff.c*/ #include"iff.h" #include<stdio.h> #include"comp.h" #include"mys.h" int battle(int a, int b) { if (a == b) { printf("あいこです"); return 1; } else if ((a == 1 && b == 2) |(a == 2 && b == 3) |(a == 3 && b == 1)) { printf("あなたの勝ちです"); return 0; } else{ printf("あなたの負けです"); return 0; } }

(本当は変数名も a b じゃなくて myHand comHand 等してやったほうが良いです。)

投稿2019/05/16 16:30

編集2019/05/17 02:30
yuicho

総合スコア142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

big000

2019/05/16 16:50

/*mys.h自分の手を入力する*/の部分は出力されましたが、以降のcomp.hとiff.hは読み込まれていないようでした。
yuicho

2019/05/16 17:00

> 以降のcomp.hとiff.hは読み込まれていないようでした。 ということですが、何かエラーが出たりそのまま終了したりしているということでしょうか?
yuicho

2019/05/16 17:16 編集

追加でグローバル変数について追記させていただきました。 基本的にグローバル変数を使うと誰がいついじったかもわからなくなる上に、関数の中でどの変数が使われているかもわからなかったりいろいろ見づらくなります。 特に今回は関数に引数を渡そうとした痕跡は見られたので、グローバル変数は使わずに戻り値として受け取って引数として渡す形をとったほうが良いかと思います。 グローバル変数の是非についてわかりやすいサイトがあったので貼っておきますー http://blog.livedoor.jp/crackstars/archives/1497887.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問