• b1_1_1.cxx
  • b1_1_3.cxx
  • b1_4_5v.cxx
  • b1_5.cxx
  • b1__13.cxx
  • b1__14.cxx
  • b1__16.cxx
  • b2_1_3.cxx
  • b2_3.cxx
  • b2_3_6a.cxx
  • b2_3_6b.cxx
  • b2_3_7.cxx
  • b2_3__10.cxx
  • b3_1all.cxx
  • b3_2_6a.cxx
  • b3_2_6b.cxx
  • b4_6_8.cxx
  • b4_6_9.cxx
  • b5_3_2.cxx
  • b5_4_5.cxx
  • b5_5_3.cxx
  • b6_3_2.cxx
  • b6_6.cxx
  • b6_7.cxx
  • b6_8.cxx
  • b6_9.cxx
  • b7_2_8.cxx
  • b7_7.cxx
  • b8_3_3.cxx
  • * ÏÐÈÌÅÐÛ *

    b1_1_1.cxx

    #include ‹stream.hxx›


    main()

    {

     cout ‹‹ "Hello, world\n";

    }

    b1_1_3.cxx

    #include ‹stream.hxx›


    main ()

    {

     int inch = 0;

     cout ‹‹ "inches=";

     cin ›› inch;

     cout ‹‹ inch;

     cout ‹‹ "in = ";

     cout ‹‹ inch*2.54;

     cout ‹‹ " cm\n";

    }

    b1_4_5v.cxx

    #include ‹stream.hxx›


    main()

    {

     const float fac = 2.54;

     float x, in, cm;

     char ch = 0;


     for (int i= 0; i‹ 8; i++) {

      cerr ‹‹ "enter length: ";

      cin ›› x ›› ch;


      if (ch == 'i') {// inch

       in = x;

       cm = x*fac;

      }

      else if (ch == 'c') {// cm

       in = x/fac;

       cm = x;

      }

      else

       in = cm = 0;


       cerr ‹‹ in ‹‹ "in = " ‹‹ cm ‹‹ " cm\n";

     }

    }

    b1_5.cxx

    #include ‹stream.hxx›

    extern float pow(float, int);


    main()

    {

     for (int i=0; i‹10; i++) cout ‹‹ pow(2,i) ‹‹ "\n";

    }


    extern void error(char *);


    float pow(float x, int n)

    {

     if (n ‹ 0) {

      error ("sorry, negative exponent to pow()");

      return 0;

     }


     switch (n) {

     case 0: return 1;

     case 1: return x;

     default: return x*pow(x,n-1);

     }

    }


    void error(char *s)

    {

     cout ‹‹ s;

    }

    b1__13.cxx

    #include ‹stream.hxx›


    // 1.11

    class vector {

     int *v;

     int sz;

    public:

     vector(int); // constructor

     ~vector(); // destructor

     int size() { return sz; }

     void set_size(int);

     int& operator[](int);

     int& elem(int i) { return v[i]; }

    };


    // 1.13

    class vec: public vector {

     int low, high;

    public:

     vec(int, int);

     int& elem(int);

     int& operator[](int);

    };


    main()

    {

     vector a(10);

     for (int i=0; i‹a.size(); i++) {

      a[i] = i;

      cout ‹‹ a[i] ‹‹ " ";

     }

     cout ‹‹ "\n";

     vec b(10,19);

     for (i=0; i‹b.size(); i++) b[i+10] = a[i];

     for (i=0; i‹b.size(); i++) cout ‹‹ b[i+10] ‹‹ " ";

     cout ‹‹ "\n";

    }


    extern void exit(int);

    // 1.13

    void error(char* p)

    {

     cerr ‹‹ p ‹‹ "\n";

     exit (1);

    }


    // 1.11

    vector::vector(int s)

    {

     if (s‹=0) error("bad vector size");

     sz = s;

     v = new int[s];

    }


    int& vector::operator[](int i)

    {

     if (i‹0 || sz‹=i) error("vector index out of range");

     return v[i];

    }


    vector::~vector()

    {

     delete v;

    }


    // 1.13

    int& vec::elem(int i)

    {

     return vector::elem(i-low);

    }


    vec::vec(int lb, int hb): (hb-lb+1)

    {

     if (hb-lb‹0) hb = lb;

     low = lb;

     high = hb;

    }


    void vector::set_size(int) {/* dummy */}


    int& vec::operator[](int i)

    {

     if (i‹low || high‹i) error("vec index out of range");

     return elem(i);

    }

    b1__14.cxx

    #include‹stream.hxx›


    extern void exit(int);

    extern void error(char*);


    // 1.11

    class vector {

     int *v;

     int sz;

    public:

     vector(int); // constructor

     ~vector(); // destructor

     int size() { return sz; }

     void set_size(int);

     int& operator[](int);

     int& elem(int i) { return v[i]; }

    };


    vector::vector(int s)

    {

     if (s‹=0) error("bad vector size");

     sz = s;

     v = new int[s];

    }


    int& vector::operator[](int i)

    {

     if (i‹0 || sz‹=i) error("vector index out of range");

     return v[i];

    }


    vector::~vector()

    {

     delete v;

    }


    // 1.14

    class Vec: public vector {

    public:

     Vec(int s): (s) {}

     Vec(Vec&);

     ~Vec() {}

     void operator=(Vec&);

     void operator*=(Vec&);

     void operator*=(int);

    };


    Vec::Vec(Vec& a): (a.size())

    {

     int sz = a.size();

     for (int i = 0; i‹sz; i++) elem(i) =a.elem(i);

    }


    void Vec::operator=(Vec& a)

    {

     int s = size();

     if (s != a.size()) error("bad vector size for =");

     for (int i =0; i‹s; i++) elem(i)=a.elem(i);

    }


    Vec operator+(Vec& a, Vec& b)

    {

     int s = a.size();

     if (s!= b.size()) error("bad vector size for +");

     Vec sum(s);

     for (int i=0; i‹s; i++)

     sum.elem(i) = a.elem(i) + b.elem(i);

     return sum;

    }


    void error(char* p)

    {

     cerr ‹‹ p ‹‹ "\n";

     exit (1);

    }


    void vector::set_size(int) {}


    main()

    {

     Vec a(10);

     Vec b(10);

     for (int i=0; i‹a.size(); i++) a[i] = i;

     b = a;

     Vec c = a+b;

     for (i=0; i‹c.size(); i++) cout ‹‹ c[i] ‹‹ "\n";

    }

    b1__16.cxx

    #include ‹vector.hxx›


    declare(vector,int);

    implement(vector,int);


    main()

    {

     vector(int) vv(10);

     vv[2] = 3;

     vv[10] = 4; // range error

    }

    b2_1_3.cxx

    #include ‹stream.hxx›


    int a = 1;


    void f()

    {

     int b = 1;

     static int c = 1;

     cout ‹‹ " a = " ‹‹ a++

      ‹‹ " b = " ‹‹ b++

      ‹‹ " c = " ‹‹ c++ ‹‹ "\n";

    }


    main ()

    {

     while (a ‹ 4) f();

    }

    b2_3.cxx

    #include ‹stream.hxx›


    main()

    {

     int* p = new int;

     cout ‹‹ "sizeof(int) = " ‹‹ sizeof(int) "\n";

    }

    b2_3_6a.cxx

    #include ‹stream.hxx›


    extern int strlen(char*);


    char alpha[] = "abcdefghijklmnopqrstuvwxyz";


    main ()

    {

     int sz = strlen(alpha);


    for (int i=0; i‹sz; i++) {

     char ch = alpha[i];

     cout ‹‹ "'" ‹‹ chr(ch) ‹‹ "'"

      ‹‹ " = " ‹‹ ch

      ‹‹ " = 0" ‹‹ oct(ch)

      ‹‹ " = 0x" ‹‹ hex(ch) ‹‹ "\n";

     }

    }

    b2_3_6b.cxx

    #include ‹stream.hxx›


    char v[2][5] = {

     'a', 'b', 'c', 'd', 'e',

     '0', '1', '2', '3', '4'

    };


    main() {

     for (int i = 0; i‹2; i++) {

      for (int j = 0; j ‹5; j++)

       cout ‹‹ "v[" ‹‹ i ‹‹ "][" ‹‹ j

        ‹‹ "]=" ‹‹ chr(v[i][j]) ‹‹ " ";

      cout ‹‹ "\n";

     }

    }

    b2_3_7.cxx

    #include ‹stream.hxx›


    main()

    {

     char cv[10];

     int iv[10];


     char* pc = cv;

     int* pi = iv;


     cout ‹‹ "char* " ‹‹ long(pc+1)-long(pc) ‹‹ "\n";

     cout ‹‹ "int* " ‹‹ long(pi+1)-long(pi) ‹‹ "\n";

    }

    b2_3__10.cxx

    #include ‹stream.hxx›


    struct pair {

     char* name;

     int val;

    };

    extern int strlen(char*);

    extern int strcpy(char*, char*);

    extern int strcmp(char*, char*);


    const large = 1024;

    static pair vec[large];


    pair* find(char* p)

    {

     for (int i=0; vec[i].name; i++)

      if (strcmp(p,vec[i].name)==0) return &vec[i];


     if (i == large) return &vec[large-1];


     return &vec[i];

    }


    int& value(char* p)

    {

     pair* res = find(p);

     if (res-›name == 0) {

      res-›name = new char[strlen(p)+1];

      strcpy(res-›name,p);

      res-›val = 0;

     }

     return res-›val;

    }


    const MAX = 256;


    main ()

    {

     char buf [MAX];


     while (cin››buf) value(buf)++;


     for (int i=0; vec[i].name; i++)

      cout ‹‹ vec[i].name ‹‹ ":" ‹‹ vec[i].val ‹‹ "\n";

    }

    b3_1all.cxx

    #include ‹xstream.hxx›

    #include ‹ctype.h›


    enum token_value {

     NAME, NUMBER, END,

     PLUS = '+', MINUS = '-', MUL='*', DIV='/',

     PRINT=';', ASSIGN='=', LP='(', RP=')'

    };


    token_value curr_tok;


    struct name {

     char* string;

     name* next;

     double value;

    };


    const TBLSZ = 23;

    name* table[TBLSZ];


    int no_of_errors;


    double error(char* s) {

     cerr ‹‹ "error: " ‹‹ s ‹‹ "\n";

     no_of_errors++;

     return 1;

    }


    extern int strlen(const char*);

    extern int strcmp(const char*, const char*);

    extern char* strcpy(char*, const char*);


    name* look(char* p, int ins = 0)

    {

     int ii= 0;

     char *pp = p;

     while (*pp) ii = ii‹‹1 ^ *pp++;

     if (ii ‹ 0) ii = -ii;

     ii %= TBLSZ;


     for (name* n=table [ii]; n; n=n-›next)

      if (strcmp(p,n-›string) == 0) return n;


     if (ins == 0) error("name not found");


     name* nn = new name;

     nn-›string = new char[strlen(p) + 1];

     strcpy(nn-›string,p);

     nn-›value = 1;

     nn-›next = table[ii];

     table[ii] = nn;

     return nn;

    }


    inline name* insert(char* s) { return look (s,1); }


    token_value get_token();

    double term();


    double expr()

    {

     double left = term();


     for (;;)

      switch (curr_tok) {

      case PLUS:

       get_token();

       left += term();

       break;

      case MINUS:

       get_token();

       left -= term();

       break;

      default:

       return left;

      }

    }


    double prim();


    double term()

    {

     double left = prim();


     for (;;)

      switch (curr_tok) {

      case MUL:

       get_token();

       left *= prim();

       break;

      case DIV:

       get_token();

       double d = prim();

       if (d == 0) return error("divide by 0");

       left /= d;

       break;

      default:

       return left;

      }

    }

    int number_value;

    char name_string[80];


    double prim()

    {

     switch (curr_tok) {

     case NUMBER:

      get_token();

      return number_value;

     case NAME:

      if (get_token() == ASSIGN) {

       name* n = insert(name_string);

       get_token();

       n-›value = expr();

       return n-›value;

      }

      return look(name_string)-›value;

     case MINUS:

      get_token();

      return -prim();

     case LP:

      get_token();

      double e = expr();

      if (curr_tok != RP) return error(") expected");

      get_token();

      return e;

     case END:

      return 1;

     default:

      return error ("primary expected");

     }

    }


    token_value get_token()

    {

     char ch = 0;


     do {

      if (!cin.get(ch)) return curr_tok = END;

     } while (ch !='\n' && isspace(ch));


     switch (ch) {

     case ';':

     case '\n':

      cin ›› WS;

      return curr_tok=PRINT;

     case '*':

     case '/':

     case '+':

     case '-':

     case '(':

     case ')':

     case '=':

      return curr_tok=ch;

     case '0': case '1': case '2': case '3': case '4':

     case '5': case '6': case '7': case '8': case '9':

     case '.':

      cin.putback(ch);

      cin ›› number_value;

      return curr_tok=NUMBER;

     default:

      if (isalpha(ch)) {

       char* p = name_string;

       *p++ = ch;

       while (cin.get(ch) && isalnum(ch)) *p++ = ch;

       cin.putback(ch);

       *p = 0;

       return curr_tok=NAME;

      }

      error ("bad token");

      return curr_tok=PRINT;

     }

    }


    int main(int argc, char* argv[])

    {

     switch (argc) {

     case 1:

      break;

     case 2:

      cin = *new istream(strlen(argv[1]),argv[1]);

      break;

     default:

      error("too many arguments");

      return 1;

     }


     // insert predefined names:

     insert("pi")-›value = 3.1415926535897932385;

     insert("e")-›value = 2.7182818284590452354;


     while (1) {

      get_token();

      if (curr_tok == END) break;

      if (curr_tok == PRINT) continue;

      cout ‹‹ expr() ‹‹ "\n";

     }


     return no_of_errors;

    }

    b3_2_6a.cxx

    extern void strcpy(char *,char *);

    extern void exit(int);

    extern int strlen(char *);


    char *save_string(char* p)

    {

     char* s = new char[strlen(p)+1];

     strcpy(s,p);

     return s;

    }


    int main (int argc, char* argv[])

    {

     if (argc ‹ 2) exit(1);

     int size = strlen(argv[1])+1;

     char* p = save_string (argv[1]);

     delete[size] p;

    }

    b3_2_6b.cxx

    #include ‹stream.hxx›


    extern void exit(int);

    void out_of_store()

    {


     cout ‹‹ "operator new failed: out of store\n";

     exit(1);

    }


    typedef void (*PF)();


    extern PF set_new_handler(PF);


    main()

    {

     set_new_handler(&out_of_store);

     char *p = new char[100000000];

     cout ‹‹ "done, p = " ‹‹ long(p) ‹‹ "\n";

    }

    b4_6_8.cxx

    // This version of the program does not assume sizeof(int) == sizeof(char*)!


    #include ‹stream.hxx›

    #include ‹stdarg.hxx›


    extern void exit(int);

    void error (int …);


    main(int argc, char* argv[])

    {

     switch (argc) {

     case 1:

      error(0,argv[0],(char*)0);

      break;

     case 2:

      error(0,argv[0],argv[1],(char*)0);

      break;

     default:

      error(1,"with",dec(argc-1),"arguments",(char*)0);

     }

    }


    void error(int n …)

    {

     va_list ap;

     va_start(ap,n);


     for (;;) {

      char *p = va_arg(ap,char*);

      if (p == 0) break;

      cerr ‹‹ p ‹‹ " ";

     }


     va_end(ap);


     cerr ‹‹ "\n";

     if (n) exit(n);

    }

    b4_6_9.cxx

    #include ‹stream.hxx›


    struct user {

     char *name;

     char* id;

     int dept;

    };


    typedef user* Puser;


    user heads[] = {

     "Mcilroy M.D", "doug", 11271,

     "Aho A.V.", "ava", 11272,

     "Weinberger P.J.", "pjw", 11273,

     "Schryer N.L.", "nls", 11274,

     "Schryer N.L.", "nls", 11275,

     "Kernighan B.W.", "bwk", 11276

    };


    typedef int (*CFT)(char*,char*);


    void sort(char* base, unsigned n, int sz, CFT cmp)

    {

     for (int i=0; i‹n-1; i++)

      for (int j=n-1; i‹j; j--) {

       char* pj = base+j*sz;

       char *pj1 = pj-sz;

       if ((*cmp)(pj,pj1) ‹ 0)

        // swap b[j] and b[j-1]

        for (int k=0; k‹sz; k++) {

         char temp = pj[k];

         pj[k] = pj1[k];

         pj1[k] = temp;

        }

      }

    }


    void print_id(Puser v, int n)

    {

     for (int i=0; i‹n; i++)

      cout ‹‹ v[i].name ‹‹ "\t"

       ‹‹ v[i].id ‹‹ "\t"

       ‹‹ v[i].dept ‹‹ "\n";

    }

    extern int strcmp(char*, char*);


    int cmp1(char* p, char* q)

    {

     return strcmp(Puser(p)-›name, Puser(q)-›name);

    }


    int cmp2(char* p, char* q)

    {

     return Puser(p)-›dept - Puser(q)-›dept;

    }


    main ()

    {

     sort((char*)heads,6,sizeof(user),cmp1);

     print_id(heads,6);

     cout ‹‹ "\n";

     sort ((char*)heads,6,sizeof(user),cmp2);

     print_id(heads,6); // in department number order

    }

    b5_3_2.cxx

    #include ‹stream.hxx›


    class intset {

     int cursize, maxsize;

     int *x;

    public:

     intset(int m, int n);

     ~intset();


     int member(int t);

     void insert(int t);


     void iterate(int& i) { i = 0; }

     int ok(int& i) { return i‹cursize; }

     int next(int& i) { return x[i++]; }

    };


    extern void exit (int);


    void error(char *s)

    {

     cout ‹‹ "set: " ‹‹ s ‹‹ "\n";

     exit(1);

    }


    extern int atoi(char *);


    extern int rand();


    int randint (int u) // in the range 1…u

    {

     int r = rand();

     if (r ‹ 0) r = -r;

     return 1 + r%u;

    }


    intset::intset(int m, int n)

    {

     if (m‹1 || n‹m) error("illegal intset size");

     cursize = 0;

     maxsize = m;

     x = new int[maxsize];

    }


    intset::~intset()

    {

     delete x;

    }


    void intset::insert(int t)

    {

     if (++cursize › maxsize) error("too many elements");

     int i = cursize-1;

     x[i] = t;


    while (i›0 && x[i-1]›x[i]) {

     int t = x[i];

     x[i] = x[i-1];

     x[i-1] = t;

     i--;

     }

    }


    int intset::member(int t)

    {

     int l = 0;

     int u = cursize-1;


     int m =0;

     while (l ‹= u) {

      m = (l+u)/2;

      if (t ‹ x[m])

       u = m-1;

      else if (t › x[m])

       l = m+1;

      else

       return 1; // found

     }

     return 0; // not found

    }


    void print_in_order(intset* set)

    {

     int var;

     set-›iterate(var);

     while (set-›ok(var)) cout ‹‹ set-›next(var) ‹‹ "\n";

    }


    main (int argc, char *argv[])

    {

     if (argc!= 3) error("two arguments expected");

     int count = 0;

     int m = atoi(argv[1]);

     int n = atoi (argv[2]);

     intset s(m,n);


     int t = 0;

     while (count ‹m) {

      t = randint(n);

      if (s.member(t)==0) {

       s.insert(t);

       count++;

      }

     }

     print_in_order(&s);

    }

    b5_4_5.cxx

    #include ‹stream.hxx›


    struct cl

    {

     char* val;

     void print(int x) { cout ‹‹ val ‹‹ x ‹‹ "\n"; }

     cl(char *v) { val = v; }

    };


    typedef void (cl::*PROC)(int);


    main()

    {

     cl z1("z1 ");

     cl z2("z2 ");

     PROC pf1 = &cl::print;

     PROC pf2 = &cl::print;

     z1.print(1);

     (z1.*pf1)(2);

     z2.print(3);

     ((&z2)-›*pf2)(4);

    }

    b5_5_3.cxx

    main() {

     char *p = new char[100];

     char *q = new char[100];

     delete p;

     delete p;

    }

    b6_3_2.cxx

    #include "stream.hxx"


    int error (char * p)

    {

     cout ‹‹ p ‹‹ "\n";

     return 1;

    }


    class tiny {

     char v;

     tiny assign(int i)

     {v  = (i&~63) ? (error("range error"),0) : i; return *this; }

    public:

     tiny (int i) { assign(i); }

     tiny (tiny& t) { v = t.v; }

     tiny operator=(tiny& t1) { v = t1.v; return *this; }

     tiny operator=(int i) { return assign(i); }

     int operator int() { return v; }

    };


    void main()

    {

     tiny c1 = 2;

     tiny c2 = 62;

     tiny c3 = (c2 - c1);

     tiny c4 = c3;

     int i = (c1 + c2);

     c1 = (c2 + (2 * c1));

     c2 = c1 - i;

     c3 = c2;

    }

    b6_6.cxx

    #include ‹stream.hxx›


    extern int strcpy(char*, char*);


    extern int strlen(char *);


    struct string {

     char *p;

     int size;

     inline string(int sz) { p = new char[size=sz]; }

     string(char *);

     inline ~string() { delete p; }

     void operator=(string&);

     string(string&);

    };


    string::string(char* s)

    {

     p = new char [size = strlen(s) + 1];

     strcpy (p,s);

    }


    void string::operator=(string& a)

    {

     if (this == &a) return;

     delete p;

     p=new char[size=a.size];

     strcpy(p,a.p);

    }


    string::string(string& a)

    {

     p=new char[size=a.size];

     strcpy(p,a.p);

    }

    string g(string arg)

    {

     return arg;

    }


    main()

    {

     string s = "asdf";

     s = g(s);

     cout ‹‹ s.p ‹‹ "\n";

    }

    b6_7.cxx

    #include ‹stream.hxx›

    #include ‹string.h›

    struct pair {

     char * name;

     int val;

    };


    class assoc {

     pair * vec;

     int max;

     int free;

    public:

     assoc(int);

     int& operator[](char*);

     void print_all();

    };


    assoc::assoc(int s)

    {

     max = (s‹16) ? s : 16;

     free = 0;

     vec = new pair[max];

    }


    int& assoc::operator[](char * p)

    /*

     maintain a set of "pair"s

     search for p,

     return a reference to the integer part of its "pair"

     make a new "pair" if "p" has not been seen

    */

    {

     register pair* pp;

     for (pp=&vec[free-1]; vec‹=pp; pp--)

      if (strcmp(p, pp-›name)-0) return pp-›val;


     if (free==max) {// overflow: grow the vector

      pair* nvec = new pair[max*2];

      for (int i=0; i‹max; i++) nvec[i] = vec[i];

      delete vec;

      vec = nvec;

      max = 2*max;

     }


     pp = &vec[free++];

     pp-›name = new char[strlen(p)+1];

     strcpy(pp-›name,p);

     pp-›val = 0;

     return pp-›val;

    }


    void assoc::print_all()

    {

     for (int i=0; i‹free; i++)

      cout ‹‹ vec[i].name ‹‹ ": " ‹‹ vec[i].val ‹‹ "\n";

    }


    main()

    {

     const MAX = 256;

     char buf[MAX];

     assoc vec(512);

     while (cin››buf) vec[buf]++;

     vec.print_all();

    }

    b6_8.cxx

    #include ‹stream.hxx›

    #include ‹string.h›


    struct pair {

     char* name;

     int val;

    };


    class assoc {

     friend class assoc_iterator;

     pair* vec;

     int max;

     int free;

    public:

     assoc(int);

     int& operator[](char*);

    };

    class assoc_iterator {

     assoc* cs;

     int i;

    public:

     assoc_iterator(assoc& s) { cs =&s; i = 0; }

     pair* operator()()

     { return (i‹cs-›free) ? &cs-›vec[i++] : 0; }

    };


    assoc::assoc(int s)

    {

     max = (s‹16) ? s : 16;

     free = 0;

     vec = new pair[max];

    }


    int& assoc::operator[](char* p)

    {

     register pair* pp;


     for (pp = &vec[free-1]; vec‹=pp; pp--)

      if (strcmp(p,pp-›name)==0) return pp-›val;


     if (free == max) {

      pair* nvec = new pair[max*2];

      for (int i=0; i‹max; i++) nvec[i] = vec[i];

      delete vec;

      vec = nvec;

      max = 2*max;

     }


     pp =&vec[free++];

     pp-›name = new char[strlen(p)+1];

     strcpy(pp-›name,p);

     pp-›val = 0;

     return pp-›val;

    }


    main()

    {

     const MAX = 256;

     char buf[MAX];

     assoc vec(512);

     while (cin››buf) vec[buf]++;

     assoc_iterator next(vec);

     pair* p;

     while (p = next())

      cout ‹‹ p-›name ‹‹ ": " ‹‹ p-›val ‹‹ "\n";

    }

    b6_9.cxx

    #include ‹stream.hxx›

    #include ‹string.h›


    extern void exit(int);

    class string {

     struct srep {

      char* s;

      int n;

     };

     srep *p;


    public:

     string(char *);

     string();

     string(string&);

     string& operator=(char *);

     string& operator=(string&);

     ~string();

     char& operator[](int i);


     friend ostream& operator‹‹(ostream&, string&);

     friend istream& operator››(istream&, string&);


     friend int operator==(string&x, char *s)

      { return strcmp(x.p-›s, s) == 0; }


     friend int operator==(string&x, string&y)

      { return strcmp(x.p-›s, y.p-›s) == 0; }


     friend int operator!=(string&x, char *s)

      {return strcmp(x.p-›s, s) != 0;}


     friend int operator!=(string&x, string&y)

      {return strcmp (x.p-›s, y.p-›s) != 0;}

    };


    string::string()

    {

     p = new srep;

     p-›s = 0;

     p-›n = 1;

    }


    string::string(char* s)

    {

     p = new srep;

     p-›s = new char[strlen(s) +1];

     strcpy(p-›s, s);

     p-›n = 1;

    }

    string::string(string& x)

    {

     x.p-›n++;

     p = x.p;

    }


    string::~string()

    {

     if (--p-›n - 0) {

      delete p-›s;

      delete p;

     }

    }


    string& string::operator=(char* s)

    {

     if (p-›n › 1) {

      p-›n--;

      p = new srep;

     }

     else if (p-›n == 1)

      delete p-›s;


     p-›s = new char[strlen(s)+1];

     strcpy(p-›s, s);

     p-›n = 1;

     return *this;

    }


    string& string::operator=(string& x)

    {

     x.p-›n++;

     if (--p-›n == 0) {

      delete p-›s;

      delete p;

     }

     p = x.p;

     return *this;

    }


    ostream& operator‹‹(ostream& s, string& x)

    {

     return s ‹‹ x.p-›s ‹‹ " [" ‹‹ x.p-›n ‹‹ "]\n";

    }


    istream& operator››(istream& s, string& x)

    {

     char buf[256];

     s››buf;

     x = buf;

     cout ‹‹ "echo: " ‹‹ x ‹‹ "\n";

     return s;

    }


    void error(char* p)

    {

     cout ‹‹ p ‹‹ "\n";

     exit(1);

    }

    char& string::operator[](int i)

    {

     if (i‹0 || strlen(p-›s)‹i) error("index out of range");

     return p-›s[i];

    }


    main()

    {

     string x[100];

     int n;


     cout ‹‹ "here we go\n";

     for (n = 0; cin››x[n]; n++) {

      string y;

      if (n==100) error("too many strings");

      cout ‹‹ (y = x[n]);

      if (y=="done") break;

     }

     cout ‹‹ "here we go back again\n";

     for (int i=n-1; 0‹=i; i--) cout ‹‹ x[i];

    }

    b7_2_8.cxx

    #include ‹stream.hxx›


    struct employee {

     friend class manager;

     employee* next;

     char* name;

     short department;

     virtual void print();

    };


    struct manager: employee {

     employee* group;

     short level;

     void print();

    };


    void employee::print()

    {

     cout ‹‹ name ‹‹ "\t" ‹‹ department ‹‹ "\n";

    }


    void manager::print()

    {

     employee::print();

     cout ‹‹ "\tlevel " ‹‹ level ‹‹ "\n";

    }


    void f(employee* ll)

    {

     for (; ll; ll=ll-›next) ll-›print();

    }


    main ()

    {

     employee e;

     e.name = "J. Brown";

     e.department = 1234;

     e.next = 0;

     manager m;

     m.name = "J. Smith";

     m.department = 1234;

     m.level = 2;

     m.next = &e;

     f(&m);

    }

    b7_7.cxx

    #include ‹stream.hxx›


    struct base { base(); };


    struct derived: base { derived(); };


    base:: base()

    {

     cout ‹‹ "\tbase 1: this=" ‹‹ long(this) ‹‹ "\n";

     if (this == 0) this = (base*)27;

     cout ‹‹ "\tbase 2: this=" ‹‹ long(this) ‹‹ "\n";

    }


    derived::derived()

    {

     cout ‹‹ "\tderived 1: this=" ‹‹ long(this) ‹‹ "\n";

     if (this == 0) this = (derived*)43;

     cout ‹‹ "\tderived 2: this=" ‹‹ long(this) ‹‹ "\n";

    }


    main()

    {

     cout ‹‹ "base b;\n";

     base b;

     cout ‹‹ "new base;\n";

     new base;

     cout ‹‹ "derived d;\n";

     derived d;

     cout ‹‹ "new derived;\n";

     new derived;

     cout ‹‹ "new derived;\n";

     new derived;

     cout ‹‹ "at the end\n";

    }

    b8_3_3.cxx

    #include ‹xstream.hxx›


    extern void exit(int);


    void error(char* s, char* s2)

    {

     cerr ‹‹ s ‹‹ " " ‹‹ s2 ‹‹ "\n";

     exit(1);

    }


    main(int argc, char* argv[])

    {

     if (argc != 3) error ("wrong number of arguments",");


     filebuf f1;

     if (f1.open(argv[1],input) == 0)

      error("cannot open input file",argv[1]);

     istream from(&f1);


     filebuf f2;

     if (f2.open(argv[2],output) == 0)

      error("cannot open input file",argv[2]);

     ostream to(&f2);


     char ch;

     while (from.get(ch)) to.put(ch);


     if (!from.eof() || to.bad())

      error("something strange happened",");

    }








    Ãëàâíàÿ |  èçáðàííîå | Íàø E-MAIL | Ïðèñëàòü ìàòåðèàë | Íàø¸ë îøèáêó | Íàâåðõ