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

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

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

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

Q&A

解決済

1回答

5289閲覧

C言語でマスターマインド

thetapazu

総合スコア13

C

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

0グッド

0クリップ

投稿2019/01/09 08:22

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
C言語でマスターマインドを作成しています。
ヒットした数字の中で最も先頭側の一文字をヒントとして教える。
というヒント機能を追加したいです。

### #include <time.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> /*--- 相異なる四つの数字の並びを生成して配列xに格納 ---*/ void make4digits(int x[]) { int i, j, val; for (i = 0; i < 4; i++) { do { val = rand() % 10; /* 0~9の乱数 */ for (j = 0; j < i; j++) /* その数が既に得られているか */ if (val == x[j]) break; } while (j < i); /* 重複しない値が得られるまで繰り返す */ x[i] = val; } } /*--- 入力された文字列sの妥当性をチェック ---*/ int check(const char s[]) { int i, j; if (strlen(s) != 4) /* 文字列の長さが4でない */ return 1; for (i = 0; i < 4; i++) { if (!isdigit(s[i])) return 2; /* 数字以外の文字が含まれている */ for (j = 0; j < i; j++) if (s[i] == s[j]) return 3; /* 同一の数字が含まれている */ } return 0; /* 文字列は妥当 */ } /*--- ヒット&ブローの判定 ---*/ void judge(const char s[], const int no[], int *hit, int *blow) { int i, j; *hit = *blow = 0; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (s[i] == '0' + no[j]) /* 数字が一致 */ if (i == j) (*hit)++; /* ヒット(位置も一致) */ else (*blow)++; /* ブロー(位置が不一致) */ } } } /*--- 判定結果を表示 ---*/ void print_result(int snum, int spos) { if (spos == 4) printf("正解です!!"); else if (snum == 0) printf("  それらの数字はまったく含まれません。\n"); else { printf("  それらの数字中%d個の数字が含まれます。\n", snum); if (spos == 0) printf("  ただし位置もあっている数字はありません。\n"); else printf("  その中の%d個は位置もあっています。\n", spos); } putchar('\n'); } int main(void) { int try_no = 0; /* 入力回数 */ int chk; /* 入力された文字列のチェック結果 */ int hit; /* 位置も数字も当たっている個数 */ int blow; /* 数字が当たって位置が当たっていない数字の個数 */ int no[4]; /* 当てる数字の並び */ char buff[10]; /* 読み込む数字の並びを格納する文字列 */ clock_t start, end; /* 開始時刻・終了時刻 */ srand(time(NULL)); /* 乱数の種を設定 */ puts("■ マスターマインドをしましょう。"); puts("■ 四つの数字の並びを当ててください。"); puts("■ 同じ数字が複数含まれることはありません。"); puts("■ 4307のように連続して入力してください。"); puts("■ スペース文字などを入力してはいけません。\n"); make4digits(no); /* 相異なる四つの数字の並びを生成 */ start = clock(); /* 計測開始 */ do { do { printf("入力してください:"); scanf("%s", buff); /* 文字列として読み込む */ chk = check(buff); /* 読み込んだ文字列をチェック */ switch (chk) { case 1: puts("\aきちんと4文字で入力してください。"); break; case 2: puts("\a数字以外の文字を入力しないでください。"); break; case 3: puts("\a同一の数字を複数入力しないでください。"); break; } } while (chk != 0); try_no++; judge(buff, no, &hit, &blow); /* 判定 */ print_result(hit + blow, hit); /* 判定結果を表示 */ } while (hit < 4); end = clock(); /* 計測終了 */ printf("%d回かかりました。\n所要時間は%.1f秒でした。\n", try_no, (double)(end - start) / CLOCKS_PER_SEC); return 0; } ```c言語 ### 試したこと hitやblowの数を増やすだけでなく配列にその数字をいれるようにしようとしましたが、どう書けばいいかわからなくなりました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

jadgeって関数があるんでそれを改造するといいでしょう
途中まで書いておくんであとは自分で考えてください

c

1void hint(const char s[], const int no[], int *hitnum) 2{ 3 int i; 4 5 *hitnum = -1; 6 for (i = 0; i < 4; i++) { 7 if (s[i] == '0' + no[i]){ /* 数字が一致 */ 8 /* ここになにか追加 */ 9 return; 10 } 11 } 12} 13

投稿2019/01/10 01:24

izmktr

総合スコア2856

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問