開発環境
- 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 コメント:
コメントを投稿