明解C言語中級編 1章末問題を解いてみた

TCP/IPソケットプログラミング C言語編を読みたいが故に柴田望洋さんの明解C言語入門編からC言語の勉強を始めました。でただいま中級編に入ったところです。章末に自由課題が載っているのでやってみました。まだ1章なので定番な感じですな。

1問目 無難な感じ。

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
  int i;
  char *omikuji[5] = {"大吉", "吉", "中吉", "小吉", "凶"};
  int k;
  int yn;

  srand(time(NULL));
  k = rand() % 6;

  printf("おみくじひいてな?\n");
  printf("はい -- (1) いいえ -- (2) -> ");
  scanf("%d", &yn);
  if (yn == 1)
  {
    printf("おみくじの結果は%sですねん。\n", omikuji[k]);
  }

  return 0;
}

2問目 疑似乱数の大きい小さいで振り分けた。

#include <time.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
  int i;
  char *omikujia[4] = {"大吉", "吉", "中吉", "小吉"};
  char *omikujib[3] = {"大凶", "凶", "末吉"};
  int k, x, y;
  int yn;

  srand(time(NULL));
  k = rand() % 100;
  x = rand() % 4;
  y = rand() % 3;

  printf("おみくじひいてな?\n");
  printf("はい -- (1) いいえ -- (2) -> ");
  scanf("%d", &yn);
  if (yn == 1)
  {
    if (k > 30)
    {
      printf("おみくじの結果は%sですねん。\n", omikujia[x]);
    }
    else
    {
      printf("おみくじの結果は%sですねん。\n", omikujib[y]);
    }
  }
  else
    printf("ばいなら\n");

  return 0;
}

3問目 randは結構負荷が高いのかしらね。

// -999~999の整数とした数あてゲーム
//
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
  int no;
  int ans;
  int max_stage = 20;
  int remain = max_stage;

  srand(time(NULL));
  ans = rand() % 1999 - 999;

  printf("-999~999の整数を当ててください。\n\n");

  do
  {
    printf("残り%d回 -->", remain);
    scanf("%d", &no);
    remain--;

    if (no > ans)
      printf("もっと小さい\n");
    else if (no < ans)
      printf("もっと大きい\n");
  } while (no != ans && remain > 0);

  if (no != ans)
    printf("残念。正解は%dでした。\n", ans);
  else
  {
    printf("正解です。\n");
    printf("%d回であたり\n", max_stage - remain);
  }

  return 0;
}

4問目 3以上999以下の3の倍数 数あてゲーム。無難な感じ。


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
  int no;
  int rans;
  int max_stage = 20;
  int remain = max_stage;

  srand(time(NULL));
  rans = 1;
  while (rans % 3 != 0)
    rans = 1 + rand() % 1000;

  printf("3~999で3の倍数である数を書いてね。\n\n");

  do
  {
    printf("残り%d回 -->", remain);
    scanf("%d", &no);
    remain--;

    if (no % 3 != 0)
    {
      printf("3の倍数だけだよ~\n");
      return 0;
    }
    else if (no > rans)
      printf("もっと小さい\n");
    else if (no < rans)
      printf("もっと大きい\n");
  } while (no != rans && remain > 0);

  if (no != rans)
    printf("残念。正解は%dでした。\n", rans);
  else
  {
    printf("正解です。\n");
    printf("%d回であたり\n", max_stage - remain);
  }
  return 0;
}

5問目 範囲をランダムに 数あてゲーム。無難な感じ。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
  int no, st, gl;
  int rans;
  int max_stage = 20;
  int remain = max_stage;

  do
  {
    srand(time(NULL));
    rand();
    rand();
    rand();
    rand();

    st = rand() % 500;
    gl = st + rand() % 500;
    rans = st + rand() % gl;
  } while (rans > gl);

  printf("%d~%dの数を書いてね。\n\n", st, gl);

  // 回数を決める
  max_stage = (gl - st) / 30;
  remain = max_stage;

  do
  {
    printf("残り%d回 -->", remain);
    scanf("%d", &no);
    remain--;

    if (no > rans)
      printf("もっと小さい\n");
    else if (no < rans)
      printf("もっと大きい\n");
  } while (no != rans && remain > 0);

  if (no != rans)
    printf("残念。正解は%dでした。\n", rans);
  else
  {
    printf("正解です。\n");
    printf("%d回であたり\n", max_stage - remain);
  }

  return 0;
}

6問目 レベル選択、範囲はランダムの数あてゲーム。くじを引く回数を決める式が微妙だ。


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
  int no, st, gl;
  int level;
  int rans;
  int max_stage;
  int remain;
  int sho, dai;

  printf("数あてのレベルを選択ください\n");
  printf("簡単1 普通2 難しい3 - 1~3?");

  scanf("%d", &level);
  if (!(level >= 1 && level <= 3))
  {
    printf("1~3だけにしてや\n\n");
    return 0;
  }
  else
    switch (level)
    {
    case 1:
      sho = 100, dai = 100;
      break;
    case 2:
      sho = 100, dai = 1000;
      break;
    case 3:
      sho = 100, dai = 10000;
      break;
    }

  // 数の幅を決める
  //
  do
  {
    srand(time(NULL));
    rand();
    rand();
    rand();
    rand();

    st = rand() % sho;
    gl = st + rand() % dai;
    rans = st + rand() % gl;
  } while (rans > gl);

  printf("%d~%dの数を書いてね。\n\n", st, gl);

  // 回数を決める
  max_stage = (gl - st) / 20;

  // ---------------------------------追記 普通にもとめた。
  if (3000 < gl - st)
    max_stage = 30;
  else if (1000 < gl - st)
    max_stage = 20;
  else
    max_stage = 10;
  // ----------------------------------

  remain = max_stage;

  do
  {
    printf("残り%d回 -->", remain);
    scanf("%d", &no);
    remain--;

    if (no > rans)
      printf("もっと小さい\n");
    else if (no < rans)
      printf("もっと大きい\n");
  } while (no != rans && remain > 0);

  if (no != rans)
    printf("残念。正解は%dでした。\n", rans);
  else
  {
    printf("正解です。\n");
    printf("%d回であたり\n", max_stage - remain);
  }

  return 0;
}

7問目 数あてゲームです。


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_STAGE 10

int main(void)
{
  int i;
  int no;
  int stage;
  int ans;
  int num[MAX_STAGE];

  srand(time(NULL));
  ans = rand() % 1000;

  printf("0~999の整数を当ててください。, \n\n");

  stage = 0;

  do
  {
    printf("あと%d回。いくつかな?", MAX_STAGE - stage);
    scanf("%d", &no);
    num[stage++] = no;

    if (no > ans)
      printf("もっと小さいよ。\n");
    else if (no < ans)
      printf("もっと大きいよ。\n");
  } while (no != ans && stage < MAX_STAGE);

  if (no != ans)
    printf("残念。正解は%dでした。\n", ans);
  else
  {
    printf("正解です。\n");
    printf("%d回で正解しました。\n", stage);
  }

  puts("\n---------------------------");
  for (i = 0; i < stage; i++)
  {
    if (num[i] - ans != 0)
      printf(" %2d : %4d %+4d\n", i + 1, num[i], num[i] - ans);
    else
      printf(" %2d : %4d %4d\n", i + 1, num[i], num[i] - ans);
  }

  return 0;
}

8問目 数あてゲームだよ。



#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_STAGE 10

int main(void)
{
  int i;
  int no;
  int stage;
  int ans;
  int num[MAX_STAGE];

  srand(time(NULL));
  ans = rand() % 1000;

  printf("0~999の整数を当ててください。, \n\n");

  for (stage = 0; no != ans && stage < MAX_STAGE; stage++)
  {
    printf("あと%d回。いくつかな?", MAX_STAGE - stage);
    scanf("%d", &no);
    num[stage] = no;

    if (no > ans)
      printf("もっと小さいよ。\n");
    else if (no < ans)
      printf("もっと大きいよ。\n");
  }

  if (no != ans)
    printf("残念。正解は%dでした。\n", ans);
  else
  {
    printf("正解です。\n");
    printf("%d回で正解しました。\n", stage);
  }

  puts("\n---------------------------");
  for (i = 0; i < stage; i++)
    printf(" %2d : %4d %+4d\n", i + 1, num[i], num[i] - ans);

  return 0;
}

7問目と8問目は本に載ってるソースを修正するものなので、問題があったら削除するので連絡ください。

1章だし、まだまだ序の口といった感じですね。
世の中ではフォルランの話題で持ち切りですが、Jリーグが話題になるのってかなり久し振りな気がしますね。

Related Posts


投稿者: Takeken

インターネット利用者のITリテラシーを向上したいという設定の2次元キャラです。 サーバー弄りからプログラミングまで手を付けた自称エッセイストなたけけんの物語。

「明解C言語中級編 1章末問題を解いてみた」への2件のフィードバック

  1. 問題8について
    中級編1章解答とても助かります!ありがとうございます!
    その中で一つ気になりまして、問題8のno変数が初期化されていないので、こちらのコードですとエラーを起こすかもですっ

    1. きびしめのコンパイルするとちゃんと出てましたね!
      コメントありがとうございます!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です