落書きノート

ふと自分が気になった事を書いてます

C言語で問題を解く

解きながら学ぶC言語

解きながら学ぶC言語

// q8-6
#include <stdio.h>

int factorial(int n) {
  if(n == 1)
    return n;
  return n * factorial(n - 1);
}

int main(void) {
  int n;
  printf("整数を入力してください : ");
  scanf("%d", &n);
  printf("その数の階乗は%dです。\n", factorial(n));
  return 0;
}

// q8-6-another
#include <stdio.h>

int factorial(int n) {
  return n > 0 ? n * factorial(n - 1) : 1;
}

int main(void) {
  int n;
  printf("整数を入力してください : ");
  scanf("%d", &n);
  printf("その数の階乗は%dです。\n", factorial(n));
  return 0;
}

// q8-7
#include <stdio.h>

int fact(int n) {
  int i, sum = 1;
  for(i = 1; i <= n; i++)
    sum *= i;
  return sum;
}

int main(void) {
  int n;
  printf("整数を入力してください : ");
  scanf("%d", &n);
  printf("その数の階乗は%dです。\n", fact(n));
  return 0;
}

// q8-7-another
#include <stdio.h>

int fact(int n) {
  int f = 1;
  while(n > 0)
    f *= n--;
  return f;
}

int main(void) {
  int n;
  printf("整数を入力してください : ");
  scanf("%d", &n);
  printf("その数の階乗は%dです。\n", fact(n));
  return 0;
}

// q8-8
#include <stdio.h>

int combination(int n, int r) {
  if(r == 0 || r == n)
    return 1;
  else if(r == 1)
    return n;
  return combination(n - 1, r - 1) + combination(n - 1, r);
}

int main(void) {
  int n, r;
  printf("n : ");
  scanf("%d", &n);
  printf("r : ");
  scanf("%d", &r);
  printf("組み合わせの数は%dです。\n", combination(n, r));
  return 0;
}

C言語で問題を解く

解きながら学ぶC言語

解きながら学ぶC言語

// q8-3
#include <stdio.h>
#define max(x, y) x > y ? x : y

int main(void) {
  int a = 3;
  int b = 4;
  int c = 1;
  int d = 2;
  printf("%d\n", max(max(a,b),max(c,d)));
  printf("%d\n", max(max(max(a,b), c), d));
  return 0;
}

// q8-4
#include <stdio.h>
#define swap(type, a, b) type t = a; a = b; b = t;

int main(void) {
  int a = 10;
  int b = 5;
  swap(int, a, b);
  printf("%d %d\n", a, b);
  return 0;
}

// q8-5
#include <stdio.h>

enum season { Spring, Summer, Fall, Winter, Invalid };

void spring(void) {
  puts("春はあけぼの");
}

void summer(void) {
  puts("夏は夜");
}

void fall(void) {
  puts("秋は夕暮れ");
}

void winter(void) {
  puts("冬はつとめて");
}

enum season select(void) {
  int tmp;

  do {
    printf("0...春 1...夏 2...秋 3...冬 4...終了 : ");
    scanf("%d", &tmp);
  } while(tmp < Spring || tmp > Invalid);
  return tmp;
}

int main(void) {
  enum season selected;
  do {
    switch(selected = select()) {
    case Spring : spring(); break;
    case Summer : summer(); break;
    case Fall   : fall();   break;
    case Winter : winter(); break;
    }
  } while(selected != Invalid);
  return 0;
}

C言語で問題を解く

解きながら学ぶC言語

解きながら学ぶC言語

// q7-9
#include <stdio.h>
#include <limits.h>

int main(void) {
  unsigned x = UINT_MAX - 1;
  printf("unsigned型の最大値 : %u\n", UINT_MAX);
  printf("x = %u\n", x);
  printf("x + 3 = %u\n", x + 3);
  printf("x * 2 = %u\n", x * 2);
  return 0;
}

// q7-10
#include <stdio.h>

int main(void) {
  int i;
  float x;

  printf("      x       x * x\n");
  printf("----------------------\n");
  for(i = 0; i <= 100; i++) {
    x = i / 100.0;
    printf("%f      %f\n", x, x * x);
  }
  return 0;
}

// q7-11
#include <math.h>
#include <stdio.h>

int main(void) {
  int i;
  double x;

  printf("    x    sqrt(x)\n");
  printf("---------------\n");
  for(i = 0; i <= 100; i++) {
    x = i / 100.0;
    printf("%4.2f     %5.3f\n", x, sqrt(x));
  }
  return 0;
}

// gcc q7_11.c -o q7_11 -lm

// q8-1
#include <stdio.h>
#define sqr(x) x * x
#define cub(x) x * x * x

int main(void) {
  int nx;
  double dx;

  printf("整数を入力してください : ");
  scanf("%d", &nx);
  printf("その数の二乗は%dで三乗は%dです。\n", sqr(nx), cub(nx));
  printf("実数を入力してください : ");
  scanf("%lf", &dx);
  printf("その数の二乗は%f\n三乗は%fです。\n", sqr(dx), cub(dx));
  return 0;
}

// q8-2
#include <stdio.h>
#define diff(x, y) x > y ? x - y : y - x

int main(void) {
  int n1, n2;
  puts("2つの値を入力してください。");
  printf("整数1 : "); scanf("%d", &n1);
  printf("整数2 : "); scanf("%d", &n2);
  printf("それらの差は%dです。\n", diff(n1, n2));
  return 0;
}

PostgreSQLで問題を解く

スッキリわかる SQL 入門 ドリル215問付き! (スッキリシリーズ)

スッキリわかる SQL 入門 ドリル215問付き! (スッキリシリーズ)

設計ファイル

CREATE TABLE 家計簿 (  日付 DATE, 費目 VARCHAR(20), メモ VARCHAR(100), 入金額 INTEGER, 出金額 INTEGER  ); CREATE TABLE 家計簿アーカイブ (  日付 DATE, 費目 VARCHAR(20), メモ VARCHAR(100), 入金額 INTEGER, 出金額 INTEGER  ); CREATE TABLE 家計簿集計 (  費 目 VARCHAR(20), 合計 INTEGER, 平均 INTEGER, 最大 INTEGER, 最小 INTEGER, 回数 INTEGER  ); INSERT INTO 家計簿 ( 日付,費目,メモ,入金額,出金額 ) VALUES ( '2013-02-03','食費','コーヒーを購入',0,380 );INSERT INTO 家計簿 ( 日付,費目,メモ,入金額,出金額 ) VALUES ( '2013-02-10','給料','1月の給料',280000,0 );INSERT INTO 家計簿 ( 日付,費目,メモ, 入金額,出金額 ) VALUES ( '2013-02-11','教養娯楽費','書籍を購入',0,2800 );INSERT INTO 家計簿 ( 日付,費目,メモ,入金額,出金額 ) VALUES ( '2013-02-14','交際費','同期会の会 費',0,5000 );INSERT INTO 家計簿 ( 日付,費目,メモ,入金額,出金額 ) VALUES ( '2013-02-18','水道光熱費','1月の電気代',0,7560 );INSERT INTO 家計簿アーカイブ ( 日付,費目,メモ,入金額,出金額 ) VALUES ( '2012-12-10','給料','11月の給料',280000,0 );INSERT INTO 家計簿アーカイブ ( 日付,費目,メモ,入金額,出金額 ) VALUES ( '2012-12-18','水道光熱費','水道代',0,4200 );INSERT INTO 家計簿アーカイブ ( 日付,費目,メモ,入金額,出金額 ) VALUES ( '2012-12-24','食費','レストランみやび',0,5000 );INSERT INTO 家計簿アーカイブ (  日付,費目,メモ,入金額,出金額 ) VALUES ( '2012-12-25','居住費','1月の家賃支払い',0,80000 );INSERT INTO 家計簿アーカイブ ( 日付,費目,メモ,入金額,出金額 ) VALUES ( '2013-01-10','給料','12月の給料',280000,0 );INSERT INTO 家計簿アーカイブ ( 日付,費目,メモ, 入金額,出金額 ) VALUES ( '2013-01-13','教養娯楽費','スッキリシネマズ',0,1800 );INSERT INTO 家計簿アーカイブ ( 日付,費目,メモ,入金額,出金額 ) VALUES ( '2013-01-13','食費','新年会',0,5000 );INSERT INTO 家計簿アーカイブ ( 日付,費目,メモ,入金額,出金額 ) VALUES ( '2013-01-25','居住費','2月の家賃支払い',0,80000 );INSERT INTO 家計簿集計 ( 費目,合計,平均,最大,最小,回数 ) VALUES ( '居住費',160000,80000,80000,80000,3 );INSERT INTO 家計簿集計 ( 費目,合計,平均,最大,最小,回数 ) VALUES ( '水道光熱費',11760,5880,7560,4200,2 );INSERT INTO 家計簿集計 ( 費目,合計,平均,最大,最小,回数 ) VALUES ( '食費',10380,3460,5000,380,3 );INSERT INTO 家計簿集計 ( 費目,合計,平均,最大,最小,回数 ) VALUES ( '教養娯楽費',4600,2300,2800,1800,2 );INSERT INTO 家計簿集計 ( 費目,合計,平均,最大,最小,回数 ) VALUES ( '給料',840000,280000,280000,280000,3 );

練習問題

-- q1-3-1
sukkiri=> select * from 家計簿 where 入金額 = 50000;
 日付 | 費目 | メモ | 入金額 | 出金額 
------+------+------+--------+--------
(0 rows)

-- q1-3-2
sukkiri=> delete from 家計簿 where 出金額 > 4000;
DELETE 2
sukkiri=> select * from 家計簿;
    日付    |    費目    |      メモ      | 入金額 | 出金額 
------------+------------+----------------+--------+--------
 2013-02-03 | 食費       | コーヒーを購入 |      0 |    380
 2013-02-10 | 給料       | 1月の給料      | 280000 |      0
 2013-02-11 | 教養娯楽費 | 書籍を購入     |      0 |   2800
(3 rows)

-- q1-3-3
sukkiri=> update 家計簿 set メモ = 'カフェラテを購入' where 日付 = '2013-02-03';
UPDATE 1
sukkiri=> select * from 家計簿;
    日付    |    費目    |       メモ       | 入金額 | 出金額 
------------+------------+------------------+--------+--------
 2013-02-10 | 給料       | 1月の給料        | 280000 |      0
 2013-02-11 | 教養娯楽費 | 書籍を購入       |      0 |   2800
 2013-02-14 | 交際費     | 同期会の会費     |      0 |   5000
 2013-02-18 | 水道光熱費 | 1月の電気代      |      0 |   7560
 2013-02-03 | 食費       | カフェラテを購入 |      0 |    380
(5 rows)

Haskellで問題を解く

普通にインタプリタでやるとできなかったので、テキストファイルに書いてから読み込ませると出来ました。これ以外にやり方がわからないのでわかる方、教えてください。後、面倒なので、このブログではLinuxmacOSHaskellコードと混ぜて書いてます。バージョンが違うと若干違うので…。

問題掲載サイト

99 questions/1 to 10 - HaskellWiki

q7.hs

data NestedList a = Elem a | List [NestedList a]
 
flatten :: NestedList a -> [a]
flatten (Elem x) = [x]
flatten (List x) = concatMap flatten x
-- q7
Prelude> :load q7.hs
[1 of 1] Compiling Main             ( q7.hs, interpreted )
Ok, modules loaded: Main.
*Main> flatten (Elem 5)
[5]
*Main> flatten (List [Elem 1, List [Elem 2, List [Elem 3, Elem 4], Elem 5]])
[1,2,3,4,5]
*Main> flatten (List [])
[]

Haskellで問題を解く

とりあえずこの分だけ投稿しておきます。問題7はもう少し考えないと。let宣言してますが、GHCのバージョンが7だとこういうふうにしないと使えませんでした。Ubuntu 16.04 LTSのHaskell-Platformは古いんですね。

問題掲載サイト

99 questions/1 to 10 - HaskellWiki

-- q6
Prelude> let isPalindrome lists = if lists == reverse lists then True else False
Prelude> isPalindrome [1,2,3]
False
Prelude> isPalindrome "madamimadam"
True
Prelude> isPalindrome [1,2,4,8,16,8,4,2,1]
True

C言語で問題を解く

解きながら学ぶC言語

解きながら学ぶC言語

// q7-8
#include <stdio.h>

int count_bits(unsigned x) {
  int count = 0;
  while(x) {
    if(x & 1U) count++;
    x >>= 1;
  }
  return count;
}

int int_bits(void) {
  return count_bits(~0U);
}

void print_bits(unsigned x) {
  int i;
  for(i = int_bits() - 1; i >= 0; i--)
    putchar(((x >> i) & 1U) ? '1' : '0');
}

unsigned set_n(unsigned x, int pos, int n) {
  int i;
  for(i = 0; i < n; i++) {
    unsigned t = x >> (pos - 1 + i) & 1U;
    x = t ? x : x | (1U << (pos - 1 + i));
  }
  return x;
}

unsigned reset_n(unsigned x, int pos, int n) {
  int i;
  for(i = 0; i < n; i++) {
    unsigned t = x >> (pos - 1 + i) & 1U;
    x = t ? x & ~(1U << (pos - 1 + i)) : x;
  }
  return x;
}

unsigned inverse_n(unsigned x, int pos, int n) {
  int i;
  for(i = 0; i < n; i++)
    x = x ^ 1U << (pos - 1 + i);
  return x;
}

int main(void) {
  unsigned x;
  int pos,no;
  printf("非負の整数xを入力してください : ");
  scanf("%u", &x);
  printf("操作するビット位置posを入力してください : ");
  scanf("%d", &pos);
  printf("操作するビット数noを入力してください : ");
  scanf("%d", &no);
  printf("x = ");
  print_bits(x);
  putchar('\n');
  printf("set_n(x, pos, no) = ");
  print_bits(set_n(x, pos, no));
  putchar('\n');
  printf("reset_n(x, pos, no) = ");
  print_bits(reset_n(x, pos, no));
  putchar('\n');
  printf("inverse_n(x, pos, no) = ");
  print_bits(inverse_n(x, pos, no));
  putchar('\n');
  return 0;
}