2014年4月14日月曜日

開発環境

C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅣ部(高度なプログラミング概念)の18章(演算子のオーバーロード)、18.6(プログラミング実習)、実習 18-2.を解いてみる。

その他参考書籍

実習 18-2.

コード(BBEdit, Emacs)

sample372_2.cpp

#include <iostream>
#include <cstring>

class simple_array {
private:
  int nums[100][2];
  int count;
  static int zero;
public:
  simple_array() {
    std::memset(nums, -1, sizeof(nums));
    count = -1;
  }
  // simple_array(const simple_array& old_simple_array);
  // ~simple_array();
  // simple_array operator = (const simple_array& old_simple_array);
  int& operator [] (int key) {
    if (key < 0 || key > 1000000) {
      std::cerr << "index error:" << key << '\n';
      exit(8);
    }
    
    int *key_ptr = &nums[0][0];
    
    for (; key_ptr <= &nums[99][1]; key_ptr += 2)
      if (*key_ptr == key) {
        return *(key_ptr + 1);
      }
    if (count < 99) {
      ++count;
      nums[count][0] = key;
      return nums[count][1];
    }
    return zero;
  }
  void p() {
    int i;
    int j;
    for (i = 0; i < 100; ++i)
      std::cout << '(' << nums[i][0] << ',' << nums[i][1] << ")\n";
  }
};

int simple_array::zero = 0;

int main(int argc, char *argv[])
{
  simple_array array;
  int i;

  for (i = 0; i < 100; ++i)
    array[i*5] = i * i;

  array.p();
  std::cout << "array[0] = " << array[0] << '\n';
  std::cout << "array[1] = " << array[1] << '\n';
  std::cout << "array[9] = " << array[9] << '\n';
  std::cout << "array[10] = " << array[10] << '\n';
  std::cout << "array[11] = " << array[11] << '\n';
  std::cout << "array[104] = " << array[104] << '\n';
  std::cout << "array[105] = " << array[105] << '\n';
  std::cout << "array[106] = " << array[106] << '\n';
  std::cout << "array[495] = " << array[495] << '\n';
  std::cout << "array[496] = " << array[496] << '\n';
  std::cout << "array[1000] = " << array[1000] << '\n';
  std::cout << "array[1000000] = " << array[1000000] << '\n';
  
  return (0);
}

Makefile

#
# FSFのg++コンパイラ用のMakefile
#
CC=g++
CFLAGS=-g -Wall
all: sample372_2

sample372_2: sample372_2.o
 ${CC} ${CFLAGS} -o sample372_2 sample372_2.o

sample372_2.o: sample372_2.cpp
 ${CC} -c -o sample372_2.o sample372_2.cpp

clean:
 rm sample372_2

入出力結果(Terminal)

$ make && ./sample372_2 
g++ -c -o sample372_2.o sample372_2.cpp
g++ -g -Wall -o sample372_2 sample372_2.o
(0,0)
(5,1)
(10,4)
(15,9)
(20,16)
(25,25)
(30,36)
(35,49)
(40,64)
(45,81)
(50,100)
(55,121)
(60,144)
(65,169)
(70,196)
(75,225)
(80,256)
(85,289)
(90,324)
(95,361)
(100,400)
(105,441)
(110,484)
(115,529)
(120,576)
(125,625)
(130,676)
(135,729)
(140,784)
(145,841)
(150,900)
(155,961)
(160,1024)
(165,1089)
(170,1156)
(175,1225)
(180,1296)
(185,1369)
(190,1444)
(195,1521)
(200,1600)
(205,1681)
(210,1764)
(215,1849)
(220,1936)
(225,2025)
(230,2116)
(235,2209)
(240,2304)
(245,2401)
(250,2500)
(255,2601)
(260,2704)
(265,2809)
(270,2916)
(275,3025)
(280,3136)
(285,3249)
(290,3364)
(295,3481)
(300,3600)
(305,3721)
(310,3844)
(315,3969)
(320,4096)
(325,4225)
(330,4356)
(335,4489)
(340,4624)
(345,4761)
(350,4900)
(355,5041)
(360,5184)
(365,5329)
(370,5476)
(375,5625)
(380,5776)
(385,5929)
(390,6084)
(395,6241)
(400,6400)
(405,6561)
(410,6724)
(415,6889)
(420,7056)
(425,7225)
(430,7396)
(435,7569)
(440,7744)
(445,7921)
(450,8100)
(455,8281)
(460,8464)
(465,8649)
(470,8836)
(475,9025)
(480,9216)
(485,9409)
(490,9604)
(495,9801)
array[0] = 0
array[1] = 0
array[9] = 0
array[10] = 4
array[11] = 0
array[104] = 0
array[105] = 441
array[106] = 0
array[495] = 9801
array[496] = 0
array[1000] = 0
array[1000000] = 0
$

0 コメント:

コメントを投稿