紅茶は無糖

プログラミング勉強中 その他雑多なことも記録

シンタックスハイライトの色を変更する

はてなブログのシンタックスハイライトの色を変更する - 素人趣味のWeb制作ブログ
はてなブログでソースコードの配色をSolarizedにする - orangain flavor
に設定の仕方が載っていたため、
これを参考にソースコードの配色を変更した。

デザイン→カスタマイズ→デザインCSS
すでに記述してあるコードの次に以下を記述する。

.entry-content pre.code {
background-color: #002B36;
color: #E0E2E4;
}
.synSpecial { color: #c000c0; }
.synType { color: #00BFFF; }
.synComment { color: #32CD32; }
.synPreProc { color: #FF6666; }
.synIdentifier { color: #51CFCF; }
.synConstant { color: #FFD700; }
.synStatement { color: #FF6666; }

丁半博打ゲーム

丁半博打ゲーム:さいころを2つ使用して、それぞれの上面に現れる目の合計が偶数か奇数かを当てるゲーム

<ルール>
・最初の手持ち金額は50,000
・手持ちの金額が100,000以上になればプレイヤーの勝ち
・手持ちの金額が0以下になればプレイヤーの負け
・掛け金は10,000を上限とし、手持ちの金額以下とする
・掛け金を0にするとゲームを終了する
河野英昭他 『基礎C言語プログラミング』のルールを使用)

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

# define f_money 50000

int main(void) {
  int money = f_money;
  int d_money, bet, n;
  int d1, d2, dice;
  //乱数の種をまく関数(同じ環境でrand関数を実行すると毎回同じ数が出現するため)
  //種を変えることで実行するたびに異なる乱数を呼び出す
  //time(NULL)は現在の時刻(1970年1月1日からの経過秒数)を表す
  srand(time(NULL));
  d_money = 2 * f_money;

  while((money > 0) && (money < d_money)) {
    do {
      printf("手持ち金額は%dです。\n", money);
      printf("掛け金を入力してください(10000以下)。 > ");
      scanf("%d", &bet);
      if(bet > 10000) { printf("10000以下の数字を入力してください。\n"); }

      if((money < 10000) && (money < bet)) {
        printf("%d以下の数字を入力してください。\n", money);
      }
    } while((bet > 10000) || (money < bet) || (bet < 0));

    if(bet == 0) {
      printf("ゲームを終了します。\n");
      break;
    }

    do {
      printf("丁(偶数)なら1、半(奇数)なら2を入力してください。 > ");
      scanf("%d", &n);
    } while((n < 1) || (n > 2));

    d1 = rand()%6 + 1;
    d2 = rand()%6 + 1;
    dice = (d1 + d2)%2 + 1;

    printf("いざ、勝負!\n");
    if(dice == 1) {
      printf("%d, %d の丁\n", d1, d2);
    }
    else {
      printf("%d, %d の半\n", d1, d2);
    }

    if((dice) == n) {
      printf("正解です。\n");
      money = money + bet; 
    }
    else {
      printf("はずれです。\n");
      money = money - bet; 
    }

    printf("\n");
  }

  if(money <= 0) {
    printf("あなたの負けです。\n");
  }

  if(money >= d_money) {
	printf("あなたの勝ちです。\n");
  }

  return 0;
}

実行結果

手持ち金額は50000です。
掛け金を入力してください(10000以下)。 > 10000
丁(偶数)なら1、半(奇数)なら2を入力してください。 > 1
いざ、勝負!
5, 5の丁
正解です。


手持ち金額は90000です。
掛け金を入力してください(10000以下)。 > 10000
丁(偶数)なら1、半(奇数)なら2を入力してください。 > 2
いざ、勝負!
2, 5の半
正解です。

あなたの勝ちです。

2つの自然数の最大公約数と最小公倍数を求める

最大公約数は(ユークリッドの互除法 - Wikipedia)によって求め、
最小公倍数は、
「正整数a、bに対して、
 aとbの最大公約数 gcd(a、b) と最小公倍数 lcm(a、b) との間には
 gcd(a、b)・lcm(a、b) = ab
 という関係がある。」(最小公倍数 - Wikipedia)
を利用して求める

# include <stdio.h>

//プロトタイプ宣言
int gcd(int x, int y);  //最大公約数を求める関数
int lcm(int x, int y);  //最小公倍数を求める関数

int main(void) {
  int x, y, temp;
  int gcd_n, lcm_n;

  do {
    printf("一つ目の自然数を入力してください > ");  scanf("%d", &x);
    printf("もうひとつの自然数を入力してください > ");  scanf("%d", &y);
  } while((x != y) && (x < 0) && (y < 0));

  if(x < y) {
    temp = x;
	x = y;
	y = temp;
  }

  gcd_n = gcd(x, y);
  lcm_n = lcm(x, y);

  printf("%d%dの最大公約数は%d, 最小公倍数は%dです\n", x, y, gcd_n, lcm_n);

  return 0;
}

int gcd(int x, int y) {
  int r;

  while(x%y != 0) {
    r = x%y;
    x = y;
    y = r;
  }

  return y;
}	

int lcm(int x, int y) {
  int r;

  r = (x*y)/gcd(x, y);

  return r;
}


実行結果
一つ目の自然数を入力してください > 27
もうひとつの自然数を入力してください > 36
36と27の最大公約数は9、最小公倍数は108です

素数かどうかを判定する

# include <stdio.h>
# include <math.h>

//素数を調べる
int main(void) {
  int n, s, i;
  //素数かどうかの判定に使用
  int r = 1;

  do {
    printf("素数かどうか調べたい2以上の自然数を入力してください > ");
    scanf("%d", &n);
  } while(n < 2);

  //入力した自然数の平方根を求める
  s = sqrt(n);

  //2以外の偶数は素数ではないため、条件分岐して奇数のみを素数かどうか判定する
  if(n == 2) { printf("%dは素数です\n", n); }
  else if ((n != 2) && (n%2 == 0)) {
    printf("%dは素数ではありません\n", n);
  }
  else {
    //奇数のみを調べるため、i+=2としている
    //例えばn=3の場合、s=1.732・・・となるため、i<=sが成り立たない
    //そのため、for文は実行されずにrは初期値の1のまま変わらず、
    //if(r == 1) { printf("%dは素数です\n", n); }の文が実行される
    for(i=3; i<=s; i+=2) {
      if(n%i == 0) {
        printf("%dは素数ではありません\n", n);
        //素数ではなかったため、rに0を代入し、ループを抜ける
        r = 0;
        break;
      }
      //iで割りきれなかったため、この時点では素数とみなしてrに1を代入し、
      //次のループへ
      else { r = 1; }
    }
    if(r == 1) { printf("%dは素数です\n", n); }
  }

  return 0;
}

実行結果
C:\Users\pc\c\shift_jis > gcc -o prime_number prime_number.c
C:\Users\pc\c\shift_jis > prime_number.exe
素数かどうか調べたい2以上の自然数を入力してください > 991
991は素数です

約数を調べる

# include <stdio.h>
//入力された値の約数を調べる
int main(void) {
  int n, i;

  do {
    printf("自然数を入力してください(1から100まで) > ");  scanf("%d", &n);
  } while((n < 1) || (100 < n));

  for(i=1; i<=n; i++) {
    if(n%i == 0) {
      printf("%d ", i);
	}
  }

  return 0;
}

実行結果
C:\Users\pc\c\shift_jis > gcc -o divisor divisor.c
//gccはCコンパイラプログラム
//-oはオプション 
//その後ろのファイル名に.exeをつけたものが実行ファイルとして作成される
C:\Users\pc\c\shift_jis > divisor.exe
自然数を入力してください(1から100まで) > 87
1 3 29 87

カレントディレクトリ内のファイルの最終更新時刻とファイル名を表示する

カレントディレクトリ内のファイルとサブディレクトリの最終更新時刻を表示する

# encoding: cp932

# Dir.foreach(.)はカレントディレクトリ下の
# 全ファイルとサブディレクトリに対して処理を行う
Dir::foreach('.') do |name|
  # 最終更新日時を調べるにはFile.mtimeメソッドを使う
  puts "#{File.mtime(name)} #{name}"
end


カレントディレクトリ内にファイルとサブディレクトリが存在している場合、
ファイルのみを選んで最終更新時刻を表示する

# encoding: cp932

Dir::foreach('.') do |name|
  # ファイルのみを取り出すためにFile.ftypeメソッドを使う fileは''で囲む
  # ディレクトリのみを探すなら == 'directory' とする
  if File.ftype(name) == 'file'
  # 最終更新日時を調べるにはFile.mtimeメソッドを使う
    puts "#{File.mtime(name)} #{name} "
  end
end