開発環境
- 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(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅤ部(言語のその他の機能)の24章(テンプレート)、24.10(プログラミング実習)、実習 24-3.を解いてみる。
その他参考書籍
- C++プログラミング入門 (グレゴリー サティア (著)、ダウグ ブラウン (著)、Gregory Satir (原著)、Doug Brown (原著)、望月 康司 (翻訳)、谷口 功 (翻訳)、オライリージャパン)
実習 24-3.
コード(BBEdit, Emacs)
small_set.h
#include <cstdlib> #include <iostream> const int SIZE = 32; template<typename kind> class small_set { private: kind data[SIZE]; public: small_set() { int i; for (i = 0; i < SIZE; ++i) data[i] = (kind) NULL; } void set(kind item) { int i; int flag = 1; for (i = 0; i < SIZE; ++i) if (data[i] == item) { flag = 0; break; } if (flag) for (i = 0; i < SIZE; ++i) if (!data[i]) { data[i] = item; break; } } void clear(kind item) { int i; for (i = 0; i < SIZE; ++i) if (data[i] == item) { data[i] = (kind) NULL; break; } } int test(kind item) { int i; for (i = 0; i < SIZE; ++i) if (data[i] && (data[i] == item)) return 1; return 0; } void p() { int i; std::cout << "set: "; for (i = 0; i < SIZE; ++i) if (data[i]) std::cout << data[i] << ' '; std::cout << std::endl; } };
small_set.cpp
#include <cstring> #include "small_set.h" template<> void small_set<char *>::set(char * item) { int i; int flag = 1; for (i = 0; i < SIZE; ++i) if (data[i] && (std::strcmp(data[i], item) == 0)) { flag = 0; break; } if (flag) for (i = 0; i < SIZE; ++i) if (!data[i]) { data[i] = item; break; } } template<> void small_set<char *>::clear(char * item) { int i; for (i = 0; i < SIZE; ++i) if (data[i] && (std::strcmp(data[i], item) == 0)) { data[i] = NULL; break; } } template<> int small_set<char *>::test(char * item) { int i; for (i = 0; i < SIZE; ++i) { if (data[i] && (std::strcmp(data[i], item) == 0)) return 1; } return 0; }
test_small_set.cpp
#include <iostream> #include "small_set.h" int main(int argc, char *argv[]) { small_set<int> a_set; small_set<char *> b_set; char lang1[] = "c"; char lang2[] = "cpp"; char lang3[] = "scheme"; a_set.p(); a_set.set(3); a_set.p(); a_set.set(5); a_set.p(); a_set.set(5); a_set.p(); std::cout << a_set.test(3) << std::endl; std::cout << a_set.test(0) << std::endl; a_set.clear(3); a_set.p(); std::cout << a_set.test(3) << std::endl; b_set.p(); b_set.set(lang1); b_set.p(); b_set.set(lang2); b_set.p(); b_set.set(lang2); b_set.p(); std::cout << b_set.test(lang1) << std::endl; std::cout << b_set.test(lang3) << std::endl; b_set.clear(lang1); b_set.p(); std::cout << b_set.test(lang1) << std::endl; return (0); }
Makefile
CC=g++ CFLAGS=-g -Wall SRC=test_array.cpp OBJ=test_array.o all: test_array test_array: $(OBJ) ${CC} ${CFLAGS} -o test_array $(OBJ) test_array.o: test_array.cpp ${CC} $(CFLAGS) -c test_array.cpp clean: rm test_array test_array.o
入出力結果(Terminal)
$ make && ./test_small_set g++ -g -Wall -c test_small_set.cpp g++ -g -Wall -c small_set.cpp g++ -g -Wall -o test_small_set test_small_set.o small_set.o set: set: 3 set: 3 5 set: 3 5 1 0 set: 5 0 set: set: c set: c cpp set: c cpp 1 0 set: cpp 0 $
0 コメント:
コメントを投稿