2014年5月12日月曜日

開発環境

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

その他参考書籍

実習 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 コメント:

コメントを投稿