開発環境
- OS X Mavericks - Apple, ときどきWindows 8.1 + Cygwin64, MinGW (OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- C++ (プログラミング言語)
- g++(コンパイラ)
C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅤ部(言語のその他の機能)の25章(STL(Standard Template Library))、25.8(プログラミング実習)、実習 25-1.を解いてみる。
その他参考書籍
- C++プログラミング入門 (グレゴリー サティア (著)、ダウグ ブラウン (著)、Gregory Satir (原著)、Doug Brown (原著)、望月 康司 (翻訳)、谷口 功 (翻訳)、オライリージャパン)
実習 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 コメント:
コメントを投稿