• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:このプログラムを関数で小分けしたいんですが・・・)

じゃんけんプログラムを関数でコンパクトに分ける方法

このQ&Aのポイント
  • この記事では、じゃんけんプログラムを関数を使ってコンパクトにまとめる方法を解説します。
  • プレイヤーの手の入力や相手の手の計算、勝ち負けの判定をそれぞれ別の関数として作成し、メイン関数から呼び出すことで、コードの可読性や再利用性を向上させることができます。
  • また、関数の分割により、プログラムの機能を理解しやすくなります。

質問者が選んだベストアンサー

  • ベストアンサー
  • ssk38
  • ベストアンサー率44% (22/49)
回答No.2

こんなもんでしょうか。 勝ち負け判定(の表示以外)と相手の手決定を関数化しました。 そうするとsrandが浮いてしまったので、相手の手のところに一緒にして、 はじめだけ呼ばれるようにしました。 #include <stdio.h> #include <stdlib.h> int aitenote() { static int initialized = 0; if (initialized == 0) { srand(0); // 乱数列を初期化 initialized = 1; } return rand() % 3 + 1; } int katimake(int player, int enemy) { if(enemy == player) { return 0; } else if((player == 1 && enemy == 2) || (player == 2 && enemy == 3) || (player == 3 && enemy == 1)) { return 1; } else { return -1; } } int main(void) { int n; int player; // プレイヤーの手 int enemy; // 相手の手 do { puts("じゃん けん (グー:1 チョキ:2 パー:3) "); scanf("%d", &player); //相手の手を計算 enemy = aitenote(); // 勝ち負けを判定 switch (katimake(player, enemy)) { case 0:printf("あいこ~\n");break; case 1:printf("Win!\n");break; case -1:printf("Lose・・・\n");break; } printf("0を押したら終了。続けるなら適当な数字"); scanf("%d", &n); // n が 0 以外だったら続ける }while(n != 0); return 0; }

sumasshu
質問者

お礼

ありがとうございます。 分かりやすくまとめて頂き、助かりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

このプログラムだけでも srand, puts, scanf, rand, printf と 5つも関数を使っているのに「関数を殆ど使ったことがない」とはこれいかに. 「関数を殆ど作ったことがない」と読み替えたとしても, そうだとしたらそもそも C でプログラムが書けない. 「よくわかりません」というのも何がどう「よくわからない」のかわからないんだけどね. 「よくわからない」だから, だいたいは理解してるんでしょ? だとしたら, 理解できているところと理解できていないところをちゃんと書いた方が答えやすいよ.

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C++言語について。構文エラー

    ジャンケンゲームを作ってたんですが サイトを参考にしながらやってたんですが、どこかでミスったみたいで。 コピーしてやるのはイヤなので、自分で打ちたいんです。   どうか間違いを指摘してもらえないでしょうか?            #include <stdio.h> #include <stdlib.h> int main() { int n; int p;//player int c;//computer srand(0);//乱数の初期化 do { //プレイヤーの手 printf("あなたの手を入力してください\n(グー:1、チョキ:2、パー:3\n"); scanf("%d", &p); //コンピュータの手 c = rand() % 3 + 1; //勝ち負け判定 if(p == c){ printf("draw\n"); }else if(p == 1 && c == 2){ printf("WIN!!\n"); }else if(p == 2 && c == 3){ printf("WIN!!\n"); }else if(p == 3 && c == 2){ printf("WIN!!\n"); }else{ printf("lose...\n"); } //続けるかどうかの判定 printf("try agin?\nNO(0を入力)---"); scanf("%d", &n); //nが0以外だったら続ける }while(n != 0); return 0; }        で、エラーが構文エラー : ';' が 'return' の前にありません。 というものでした。   よろしくおねがいします。

  • じゃんけんゲームについてお願いします。

    #include <stdio.h> #include <stdlib.h> int main() { int n; int player; // プレイヤーの手の保存 int computer; // コンピュータの手を保存 srand(0); // 乱数列を初期化 do { printf("あなたの手を入力してください(グー:1 チョキ:2 パー:3) > "); scanf("%d", &player); computer = rand() % 3 + 1; if(computer == player){ printf("あいこです\n"); }else if(player == 1 && computer == 2){ printf("プレイヤーの勝ちです\n"); }else if(player == 2 && computer == 3){ printf("プレイヤーの勝ちです\n"); }else if(player == 3 && computer == 1){ printf("プレイヤーの勝ちです\n"); }else{ printf("コンピュータの勝ちです\n"); } printf("このまま続けますか?続けない場合は 0 を入力してください > "); scanf("%d", &n); // n が 0 以外だったら続ける }while(n != 0); return 0; } このじゃんけんプログラムで一番最初に何回勝負するか指定出来るようにしたいのですが。 指定しただけ勝負して、最後に勝ち、負け、引き分けの結果を。 お願いいたします。

  • scanf関数のプログラムをgetchar関数で

    scanf関数を使って四則演算、論理輪、論理積をint、float、double型で表示するプログラムを作ったのですが これをscanf関数ではなく、getchar関数で組みなおし、関数化する課題が出ました。 そのままscanf関数のところだけを変えても型が違うというエラーが出てうまくいきません。 どうすればいいでしょうか? 一応scanf関数で組んだプログラムの一部を載せておきます。 #include <stdio.h> #include <math.h> main() { float a , b; float x[5]; printf("正の数字を2つ入力して下さい(小数点を含めて4ケタまで):\n"); for(;;) { printf("\na="); scanf("%f" , &a); if(a>=0 && a<=9999 && a) { break; } else { printf("****aに入力エラー****\n"); printf("数字は4ケタ以内の正数を入力:\n"); continue; } } for(;;) { printf("b="); scanf("%f" , &b); if(b>=0 && b<=9999 && b) { break; } else { printf("****bに入力エラー****\n"); printf("数字は4ケタ以内の正数を入力:\n"); continue; } } x[0] = a+b; x[1] = a-b; x[2] = a*b; x[3] = a/b; x[4] = a||b; x[5] = a&&b; printf("\n"); printf("int型 結果:\n足し算=%d\n" , (int)x[0]); printf("引き算=%d\n" , (int)x[1]); printf("掛け算=%d\n" , (int)x[2]); printf("割り算=%d\n" , (int)x[3]); printf("論理和=%d\n" , (int)x[4]); printf("論理積=%d\n" , (int)x[5]); printf("\n"); printf("float型 結果:\n足し算=%f\n" , x[0]); printf("引き算=%f\n" , x[1]); printf("掛け算=%f\n" , x[2]); printf("割り算=%f\n" , x[3]); printf("論理和=%f\n" , x[4]); printf("論理積=%f\n" , x[5]); ・ ・ ・ getchar(); }

  • C言語について

    次のような問題です。 問 自然数nを入力し、nを3で割って割り切れるかどうかを判定し結果を表示する。「割り切れる」、「1余る」、「「2余る」のいずれかが入るものとする。 このようなものをつくりました。 #include<stdio.h> int main(void) { int n; printf("自然数:"); scanf("%d",&n); if(n==0){ printf("割り切れる\n"); }else if(n==1){ printf("1余る\n"); }else{ printf("2余る"); } return(0); } これで合っているかよろしくお願いします。

  • このプログラム見てください

    これで動いたと書いてあるのに動きません。 どこを直せば良いのか教えてください。 #include <stdio.h> int combination(int n,int r){ if ( r==0 ){ return 1; }else if( r==n ){ return 1; }else{ return (combination(n-1,r-1)+combination(n-1,r)); } } int main(){ int num_n=0; int num_r=0; int answer=0; printf("組み合わせの計算をします。数値を入力してください。N=?。\n"); printf("[n]:"); scanf("%d",&num_n); rewind(stdin); printf("[r]:"); scanf("%d",&num_r); rewind(stdin); answer=combination(num_n,num_r); printf("%dC%d=%d\n" , num_n, num_r, answer); return 0; }

  • アッケルマン関数

    アッケルマン関数 ack(m,n)={ n+1 m=0のとき      { ack(m-1,1) m>0,n=0のとき { ack(m-1,ack(m,n-1)) m>0,n>0のとき をプログラムしたいのですが、再帰を使ったプログラムがうまく実行できません。どこがいけないのでしょうか? #include<stdio.h> int m,n; int ack(int m, int n) { if (m = 0) return n + 1; if ((m > 0) && (n = 0)) return ack(m - 1, 1); else return ack(m - 1, ack(m, n - 1)); } main() { int m,n; printf("アッケルマン関数ack(m,n)を計算します。\n"); printf("自然数m,nを入力してください\n"); scanf("%d",&m); scanf("%d",&n); printf("アッケルマン関数ack(%d,%d)の値は%dです。\n", m, n, ack(m,n)); }

  • またプログラムの修正おねがいします。

    キーボードから出力した3つの整数について、以下の判定を行い 判定結果を出力するプログラムを作成する。 全部同じ 2つ同じ バラバラ * 論理演算子を使わないこと。 * インデントを正しくつけること。 #include<stdio.h> void main(void) { int a,b,c; printf("a --->"); scanf("%d",$a); printf("b --->"); scanf("%d",$b); printf("c --->"); scanf("%d",$c); if(a==b){ if(b==c){ printf("全部同じ\n"); } } else if(a!=b){ if(b==c){ printf("2つ同じ"); } else if(a==c){ printf("2つ同じ"); } else{ printf("バラバラ"); } } } 最近c言語を習ったばっかりなのでわからないとこだらけです。よろしくお願いします。

  • フローチャートについての質問です

    #include <stdio.h> int main(void) { int n1, n2, n3; printf ("数値1: "); scanf ("%d",&n1); if (n1%2==1){ printf ("数値1は奇数\n"); } else { printf ("数値1は偶数\n"); } printf ("数値2: "); scanf ("%d ",&n2); printf ("数値3: "); scanf ("%d",&n3); if (n2 > n3) printf ("数値2の方が数値3より大きい\n"); else if (n2 < n3) printf("数値2より数値3の方が大きい\n"); else printf("数値2と数値3は等しい\n"); return 0; } をフローチャートに直したいのですが方法が解りませんどなたか親切なかたお教えください JIS規格のものでお願いします

  • プログラムの添削

    以下のような数当てゲームを作りました.なるべくうまいプログラムを書けるようになりたいのですが,どのような改善点がありますか?よろしくお願いします. /*数当てゲームを作りなさい.*/ #include<stdio.h> void maegaki(void); /*このように関数を定義しまくることに意味はあるのか?main関数はすっきりするけど.*/ void in_check_out(int i); int main(void) { int i; int j; maegaki(); for(j=0;j<10;j++) { scanf("%d",&i); in_check_out(i); if(!(i-1)) return 0; printf("残り%d回です.\n",9-j); } return 0; } void maegaki(void) { printf("数当てゲームをはじめます.\nぼくの好きな整数を当ててください.\nチャンスは10回です.\nヒントはボゾン\n"); } void in_check_out(int i) { if(!(i-1)) { printf("正解!答えは1です.\n"); } else { printf("残念!\n"); if(i>1) printf("%dより小さいです.\n",i); else printf("%dより大きいです.\n",i); } }

  • 素数を判定するプログラム

    整数をひとつ入力して、それが素数かどうかを判定するプログラムを作ったのですが、素数でないものを入力しても「素数です」といわれます。 どうもfor文が評価されていないような気がしますが、原因がわかりません。 // homework4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include <stdio.h> int main(int argc, char* argv[]) { int number; int n = 2; int i; printf("1より大きい整数を入力してください: "); scanf("%d",&number); while (number <= 1) { printf("1より大きい整数を入力してください: "); scanf("%d",&number); } if (number == 2) { printf("%dは素数です\n",number); goto OUT; } else { for (; n == number - 1; n++) { i = number % n; if (i == 0) printf("%dは素数ではありません\n", number); if (i == 0) goto OUT; } } printf("%dは素数です\n", number); OUT: return 0; } どうかよろしくお願いします。