2014年5月13日火曜日

開発環境

C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅤ部(言語のその他の機能)の25章(STL(Standard Template Library))、25.8(プログラミング実習)、実習 25-1.を解いてみる。

その他参考書籍

実習 25-1.

コード(BBEdit, Emacs)

hist.cpp

#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdlib>
#include <assert.h>
#include <set>
#include <algorithm>

const int NUMBER_OF_LINES = 50;
const int LOW_BOUND = 0;
const int HIGH_BOUND = 99;
const int FACTOR = ((HIGH_BOUND - LOW_BOUND + 1) / NUMBER_OF_LINES);

const int WIDTH = 60;

static std::multiset<int> data_set;

static int out_of_range = 0;
static int counters[NUMBER_OF_LINES];
static int max_count = 0;
static void counter(const int data) {
  if ((data < LOW_BOUND) || (data > HIGH_BOUND))
    ++out_of_range;
  else {
    int count_index;
    count_index =
      static_cast<int>(static_cast<float>(data - LOW_BOUND) / FACTOR);

    assert(count_index >= 0);
    assert(count_index <
           static_cast<int>(sizeof(counters)/sizeof(counters[0])));
    ++counters[count_index];
    if (counters[count_index] > max_count)
      max_count = counters[count_index];
  }
}

int main(int argc, char *argv[])
{
  void read_data(const char *const name);
  void print_histogram();
  
  if (argc != 2) {
    std::cerr << "Error: Wrong number of arguments\n";
    std::cerr << "Usage is:\n";
    std::cerr << "  hist <data-file>\n";
    exit(8);
  }
  
  read_data(argv[1]);
  print_histogram();

  return (0);
}

void read_data(const char *const name)
{
  std::ifstream in_file(name);
  int data;
  
  if (in_file.bad()) {
    std::cerr << "Error: Unable to open " << name << '\n';
    exit (8);
  }
  while (!in_file.eof()) {
    in_file >> data;

    if (in_file.eof())
      break;

    data_set.insert(data);
  }
}

void print_histogram()
{
  int low;
  float scale;
  int index;
  
  std::memset(counters, '\0', sizeof(counters));
  std::for_each(data_set.begin(), data_set.end(), counter);

  scale = float(max_count) / float(WIDTH);

  low = LOW_BOUND;

  for (index = 0; index < NUMBER_OF_LINES; ++index) {
    int char_index;
    int number_of_dots;

    std::cout << std::setw(2) << index << ' ' <<
      std::setw(3) << low << "-" <<
      std::setw(3) << (low + FACTOR - 1) << " (" <<
      std::setw(4) << counters[index] << "): ";

    number_of_dots = int(float(counters[index]) / scale);
    for (char_index = 0; char_index < number_of_dots; ++char_index)
      std::cout << '*';
    std::cout << '\n';
    low += FACTOR;
  }
  std::cout << out_of_range << " items out of range\n";
}

Makefile

CC=g++
CFLAGS=-g -Wall
SRC=hist.cpp
OBJ=hist.o

all: hist

hist: $(OBJ)
 ${CC} ${CFLAGS} -o hist $(OBJ)

hist.o: hist.cpp
 ${CC} $(CFLAGS) -c hist.cpp

clean:
 rm hist hist.o

入出力結果(Terminal)

$ ./hist.py && make && ./hist test
g++ -g -Wall -c hist.cpp
g++ -g -Wall -o hist hist.o
 0   0-  1 (  18): *************************************
 1   2-  3 (  19): ***************************************
 2   4-  5 (  20): *****************************************
 3   6-  7 (  18): *************************************
 4   8-  9 (  25): ***************************************************
 5  10- 11 (  19): ***************************************
 6  12- 13 (  16): *********************************
 7  14- 15 (  20): *****************************************
 8  16- 17 (  16): *********************************
 9  18- 19 (  20): *****************************************
10  20- 21 (  18): *************************************
11  22- 23 (  22): *********************************************
12  24- 25 (  22): *********************************************
13  26- 27 (  17): ***********************************
14  28- 29 (  23): ***********************************************
15  30- 31 (  12): ************************
16  32- 33 (  18): *************************************
17  34- 35 (  12): ************************
18  36- 37 (  23): ***********************************************
19  38- 39 (  24): *************************************************
20  40- 41 (  26): *****************************************************
21  42- 43 (  25): ***************************************************
22  44- 45 (   9): ******************
23  46- 47 (  24): *************************************************
24  48- 49 (  14): ****************************
25  50- 51 (  20): *****************************************
26  52- 53 (  20): *****************************************
27  54- 55 (  26): *****************************************************
28  56- 57 (  22): *********************************************
29  58- 59 (  16): *********************************
30  60- 61 (  21): *******************************************
31  62- 63 (  19): ***************************************
32  64- 65 (  29): ************************************************************
33  66- 67 (  14): ****************************
34  68- 69 (  22): *********************************************
35  70- 71 (  13): **************************
36  72- 73 (  22): *********************************************
37  74- 75 (  19): ***************************************
38  76- 77 (  22): *********************************************
39  78- 79 (  16): *********************************
40  80- 81 (  24): *************************************************
41  82- 83 (  14): ****************************
42  84- 85 (  18): *************************************
43  86- 87 (  20): *****************************************
44  88- 89 (  25): ***************************************************
45  90- 91 (  19): ***************************************
46  92- 93 (  15): *******************************
47  94- 95 (  26): *****************************************************
48  96- 97 (  25): ***************************************************
49  98- 99 (  15): *******************************
99017 items out of range
$ ./hist.py && ./hist test
 0   0-  1 (  18): ************************************
 1   2-  3 (  14): ****************************
 2   4-  5 (  30): ************************************************************
 3   6-  7 (  29): **********************************************************
 4   8-  9 (  19): **************************************
 5  10- 11 (  14): ****************************
 6  12- 13 (  30): ************************************************************
 7  14- 15 (  23): **********************************************
 8  16- 17 (  26): ****************************************************
 9  18- 19 (  18): ************************************
10  20- 21 (  13): **************************
11  22- 23 (  20): ****************************************
12  24- 25 (  16): ********************************
13  26- 27 (  15): ******************************
14  28- 29 (  18): ************************************
15  30- 31 (  20): ****************************************
16  32- 33 (  24): ************************************************
17  34- 35 (  17): **********************************
18  36- 37 (  18): ************************************
19  38- 39 (  22): ********************************************
20  40- 41 (  25): **************************************************
21  42- 43 (  19): **************************************
22  44- 45 (  17): **********************************
23  46- 47 (  30): ************************************************************
24  48- 49 (  22): ********************************************
25  50- 51 (  21): ******************************************
26  52- 53 (  14): ****************************
27  54- 55 (  28): ********************************************************
28  56- 57 (  20): ****************************************
29  58- 59 (  14): ****************************
30  60- 61 (  21): ******************************************
31  62- 63 (  23): **********************************************
32  64- 65 (  21): ******************************************
33  66- 67 (  17): **********************************
34  68- 69 (  18): ************************************
35  70- 71 (  21): ******************************************
36  72- 73 (  20): ****************************************
37  74- 75 (  16): ********************************
38  76- 77 (  24): ************************************************
39  78- 79 (  21): ******************************************
40  80- 81 (  24): ************************************************
41  82- 83 (  25): **************************************************
42  84- 85 (   9): ******************
43  86- 87 (  15): ******************************
44  88- 89 (  14): ****************************
45  90- 91 (  20): ****************************************
46  92- 93 (  24): ************************************************
47  94- 95 (  17): **********************************
48  96- 97 (  15): ******************************
49  98- 99 (  18): ************************************
99002 items out of range
$ ./hist.py && ./hist test
 0   0-  1 (  13): **************************
 1   2-  3 (  16): *********************************
 2   4-  5 (  23): ***********************************************
 3   6-  7 (  23): ***********************************************
 4   8-  9 (  22): *********************************************
 5  10- 11 (  19): ***************************************
 6  12- 13 (  29): ************************************************************
 7  14- 15 (  21): *******************************************
 8  16- 17 (  17): ***********************************
 9  18- 19 (  14): ****************************
10  20- 21 (  20): *****************************************
11  22- 23 (  19): ***************************************
12  24- 25 (  21): *******************************************
13  26- 27 (  20): *****************************************
14  28- 29 (  16): *********************************
15  30- 31 (  21): *******************************************
16  32- 33 (  22): *********************************************
17  34- 35 (  17): ***********************************
18  36- 37 (  19): ***************************************
19  38- 39 (  23): ***********************************************
20  40- 41 (  20): *****************************************
21  42- 43 (  14): ****************************
22  44- 45 (  20): *****************************************
23  46- 47 (  23): ***********************************************
24  48- 49 (  24): *************************************************
25  50- 51 (  17): ***********************************
26  52- 53 (  28): *********************************************************
27  54- 55 (  19): ***************************************
28  56- 57 (  23): ***********************************************
29  58- 59 (  22): *********************************************
30  60- 61 (  19): ***************************************
31  62- 63 (  27): *******************************************************
32  64- 65 (  25): ***************************************************
33  66- 67 (  20): *****************************************
34  68- 69 (  21): *******************************************
35  70- 71 (  17): ***********************************
36  72- 73 (  12): ************************
37  74- 75 (  18): *************************************
38  76- 77 (  21): *******************************************
39  78- 79 (  28): *********************************************************
40  80- 81 (  20): *****************************************
41  82- 83 (  26): *****************************************************
42  84- 85 (  20): *****************************************
43  86- 87 (  23): ***********************************************
44  88- 89 (  20): *****************************************
45  90- 91 (  17): ***********************************
46  92- 93 (  13): **************************
47  94- 95 (  24): *************************************************
48  96- 97 (  13): **************************
49  98- 99 (  17): ***********************************
98993 items out of range
$ ./hist.py && ./hist test
 0   0-  1 (  20): ***********************************
 1   2-  3 (  17): ******************************
 2   4-  5 (  19): *********************************
 3   6-  7 (  23): ****************************************
 4   8-  9 (  23): ****************************************
 5  10- 11 (  16): ****************************
 6  12- 13 (  25): ********************************************
 7  14- 15 (  29): ***************************************************
 8  16- 17 (  21): *************************************
 9  18- 19 (  21): *************************************
10  20- 21 (  17): ******************************
11  22- 23 (  16): ****************************
12  24- 25 (  19): *********************************
13  26- 27 (  11): *******************
14  28- 29 (  18): *******************************
15  30- 31 (  25): ********************************************
16  32- 33 (  23): ****************************************
17  34- 35 (  18): *******************************
18  36- 37 (  19): *********************************
19  38- 39 (  20): ***********************************
20  40- 41 (  22): **************************************
21  42- 43 (  26): *********************************************
22  44- 45 (  31): ******************************************************
23  46- 47 (  22): **************************************
24  48- 49 (  16): ****************************
25  50- 51 (  21): *************************************
26  52- 53 (  20): ***********************************
27  54- 55 (  23): ****************************************
28  56- 57 (  20): ***********************************
29  58- 59 (  22): **************************************
30  60- 61 (  24): ******************************************
31  62- 63 (  25): ********************************************
32  64- 65 (  27): ***********************************************
33  66- 67 (  15): **************************
34  68- 69 (  19): *********************************
35  70- 71 (  19): *********************************
36  72- 73 (  23): ****************************************
37  74- 75 (  16): ****************************
38  76- 77 (  22): **************************************
39  78- 79 (  34): ************************************************************
40  80- 81 (  16): ****************************
41  82- 83 (  18): *******************************
42  84- 85 (  22): **************************************
43  86- 87 (  18): *******************************
44  88- 89 (  19): *********************************
45  90- 91 (  22): **************************************
46  92- 93 (  24): ******************************************
47  94- 95 (  19): *********************************
48  96- 97 (  22): **************************************
49  98- 99 (  15): **************************
98957 items out of range
$ ./hist.py && ./hist test
 0   0-  1 (  15): *******************************
 1   2-  3 (  19): ***************************************
 2   4-  5 (  20): *****************************************
 3   6-  7 (  22): *********************************************
 4   8-  9 (  24): *************************************************
 5  10- 11 (  17): ***********************************
 6  12- 13 (  21): *******************************************
 7  14- 15 (  18): *************************************
 8  16- 17 (  17): ***********************************
 9  18- 19 (  17): ***********************************
10  20- 21 (  26): *****************************************************
11  22- 23 (  24): *************************************************
12  24- 25 (  18): *************************************
13  26- 27 (  16): *********************************
14  28- 29 (  16): *********************************
15  30- 31 (  20): *****************************************
16  32- 33 (  24): *************************************************
17  34- 35 (  25): ***************************************************
18  36- 37 (  22): *********************************************
19  38- 39 (  25): ***************************************************
20  40- 41 (  19): ***************************************
21  42- 43 (  14): ****************************
22  44- 45 (   9): ******************
23  46- 47 (  23): ***********************************************
24  48- 49 (  29): ************************************************************
25  50- 51 (  18): *************************************
26  52- 53 (  16): *********************************
27  54- 55 (  27): *******************************************************
28  56- 57 (  23): ***********************************************
29  58- 59 (  26): *****************************************************
30  60- 61 (  22): *********************************************
31  62- 63 (  19): ***************************************
32  64- 65 (  16): *********************************
33  66- 67 (  14): ****************************
34  68- 69 (  28): *********************************************************
35  70- 71 (  29): ************************************************************
36  72- 73 (  27): *******************************************************
37  74- 75 (  14): ****************************
38  76- 77 (  25): ***************************************************
39  78- 79 (  18): *************************************
40  80- 81 (  18): *************************************
41  82- 83 (  28): *********************************************************
42  84- 85 (  24): *************************************************
43  86- 87 (  25): ***************************************************
44  88- 89 (  16): *********************************
45  90- 91 (   9): ******************
46  92- 93 (  20): *****************************************
47  94- 95 (  17): ***********************************
48  96- 97 (  20): *****************************************
49  98- 99 (  23): ***********************************************
98977 items out of range
$ 

数値のリストが含まれているテキストを生成するpythonのプログラム。

コード(BBEdit, Emacs)

hist.py

#!/usr/bin/env python3
#-*- coding: utf-8 -*-

import random

with open('test', 'w') as f:
    f.write('\n'.join([str(random.randint(0, 10**4)) for x in range(10 ** 5)]))

0 コメント:

コメントを投稿