Справочное руководство по C++ - страница 70

Шрифт
Интервал

стр.

>  ‹‹ " = " ‹‹ 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;


стр.

Похожие книги