lizaciya bazovogo klassa of structure inicializaciya struktury initializer inicializator initializer-list spisok-inicializatorov inline inline function funkciya-podstanovka member function funkciya-chlen inline input and output vvod-vyvod of built-in type vvod vstroennyh tipov of user-defined type vvod pol'zovatel'skih tipov operator >> operaciya vvoda >> int int type tip int type specifier specifikaciya tipa int integer constant celaya konstanta conversion celochislennoe preobrazovanie integral promotion standartnoe celochislennoe preobrazovanie type celochislennyj tip interface interfejs class interfejsnyj klass inheritance nasledovanie interfejsa fat obshirnyj interfejs specifications specifikacii interfejsa internal linkage vnutrennee svyazyvanie structure vnutrennyaya struktura I/O buffering buferizaciya vvoda-vyvoda iteration iteraciya statement operator iteracii J jump statement operator perehoda jump-statement operator-perehoda K keyword sluzhebnoe slovo list spisok sluzhebnyh slov L label metka case metka case default metka default scope of oblast' vidimosti metki labeled statement pomechennyj operator language yazyk design and proektirovanie i yazyk high-level yazyk vysokogo urovnya low-level yazyk nizkogo urovnya layout bit-field raspolozhenie bitovyh polej class objects raspolozhenie ob容ktov klassa left shift operator operaciya sdviga vlevo less than operator operaciya men'she chem than or equal to operator operaciya men'she ili ravno levels of abstraction urovni abstrakcii lexical conventions leksicheskie soglasheniya library biblioteka design proektirovanie biblioteki headers biblioteka zagolovochnyh fajlov initialization inicializaciya biblioteki lifetime of object vremya zhizni ob容kta linkage svyazyvanie consistency soglasovannoe svyazyvanie error oshibka svyazyvaniya external vneshnee svyazyvanie internal vnutrennee svyazyvanie linker-specification specifikaciya-svyazi linker redaktor svyazej Lisp Lisp list of operator functions spisok operatornyh funkcij literal literal constants literal'nye konstanty loader zagruzchik local class declaration opisanie lokal'nogo klassa class member function funkciya-chlen lokal'nogo klassa class, scope of oblast' vidimosti lokal'nogo klassa scope lokal'naya oblast' vidimosti locking blokirovanie (zamok) logical AND operator operaciya logicheskoe I OR operator operaciya logicheskoe ILI negation operator operaciya logicheskogo otricaniya operators, bitwise porazryadnye logicheskie operacii long long constant konstanta long double long double double constant konstanta long double double type tip long double type tip long loop statement operator cikla lvalue adres assignment and adres i prisvaivanie cast privedenie adresa conversion preobrazovanie adresa modifiable izmenyaemyj adres M macro makrokomanda definition, preprocessing makroopredelenie expansion, preprocessing makropodstanovka function-like funkcional'naya makrokomanda name, scope of oblast' vidimosti makroopredeleniya names, predefined predopredelennye makroimena preprocessing makroobrabotka syntax summary sintaksis makroopredelenij (svodka) maintenance, software soprovozhdenie programm management upravlenie free store upravlenie svobodnoj pamyat'yu memory upravlenie pamyat'yu manipulator manipulyator member chlen member-declaration opisanie-chlena member-declarator opisatel'-chlena member-list spisok-chlenov modifiable lvalue izmenyaemyj adres modular programming modul'noe programmirovanie modularity modul'nost' multicharacter constant mnogosimvol'naya konstanta multidimensional array mnogomernyj massiv multiple inheritance mnozhestvennoe nasledovanie multiplication operator operaciya umnozheniya multiplicative-expression mul'tiplikativnoe-vyrazhenie N name imya global global'noe imya hiding upryatyvanie imeni length of dlina imeni linkage of local svyazyvanie lokal'nogo imeni overloaded function imya peregruzhennoj funkcii overloaded member imya peregruzhennogo chlena qualified utochnennoe imya scope of oblast' vidimosti imeni nested class declaration opisanie vlozhennogo klassa class, scope of oblast' vidimosti vlozhennogo klassa new operator operaciya new newline \n konec stroki \n node class uzlovoj klass null character simvol null '\0' pointer pustoj ukazatel' (null) O object ob容kt object-oriented programming ob容ktno-orientirovannoe programmirovanie octal constant vos'merichnaya konstanta number vos'merichnoe chislo operand const operand const reference operand ssylka volatile operand volatile operator , operaciya , ! operaciya ! # operaciya # ## operaciya ## %= operaciya %= && operaciya && &= operaciya &= *= operaciya *= *=, user-defined pol'zovatel'skaya operaciya *= +, user-defined pol'zovatel'skaya operaciya + ++ operaciya ++ ++, user-defined pol'zovatel'skaya operaciya ++ += operaciya += -, user-defined pol'zovatel'skaya operaciya - -- operaciya -- --, user-defined pol'zovatel'skaya operaciya -- -= operaciya -= ->, user-defined pol'zovatel'skaya operaciya -> /= operaciya /= :: operaciya :: <<, output operaciya vyvoda << <<= operaciya <<= =, user-defined pol'zovatel'skaya operaciya = >>, input operaciya vvoda >> >>= operaciya >>= ^= operaciya ^= address-of operaciya vzyatiya adresa assignment operaciya prisvaivaniya associativity associativnost' operacij binding strength poryadok vypolneniya operacij built-in vstroennye operacii function call operaciya vyzova funkcii precedence prioritet operacij sizeof operaciya sizeof subscripting operaciya indeksacii summary svodka operacij user-defined pol'zovatel'skaya operaciya operator function operatornaya funkciya function, list of spisok operatornyh funkcij order of argument evaluation poryadok vychisleniya parametrov of evaluation poryadok vychislenij output formatted formatirovannyj vyvod input and vvod i vyvod of built-in type vyvod vstroennyh tipov of user-defined type vyvod pol'zovatel'skih tipov operator << operaciya vyvoda << overflow perepolnenie overloaded assignment operator peregruzka operacii prisvaivaniya binary operator peregruzka binarnoj operacii decrement operator peregruzka dekrementa function call operator peregruzka operacii vyzova function name peregruzka imeni funkcii increment operator peregruzka inkrementa member access operator peregruzka operacii vybora chlena member name peregruzka imeni chlena operator peregruzka operacii subscripting operator peregruzka indeksacii unary operator peregruzka unarnoj operacii overloading peregruzka and access peregruzka i dostup and scope peregruzka i oblast' vidimosti resolution razreshenie peregruzki resolution rules pravila razresheniya peregruzki overriding virtual function pereopredelenie virtual'noj funkcii P paradigm, programming paradigma programmirovaniya placement ukazanie razmeshcheniya pointer ukazatel' arithmetic arifmeticheskie operacii ukazatelej assignment to prisvaivanie ukazatelyu comparison sravnenie ukazatelej const ukazatel' const conversion preobrazovanie ukazatelej declaration opisanie ukazatelya null pustoj ukazatel' null size of razmer ukazatelya substraction vychitanie ukazatelej type tip ukazatelya postfix ++ and -- postfiksnye ++ i -- expression postfiksnoe vyrazhenie precedence of operator prioritet operacij predefined address-of operator predopredelennaya operaciya vzyatiya adresa assignment operator predopredelennoe prisvaivanie macronames predopredelennye makroimena prefix ++ and -- prefiksnye ++ i -- preprocessing makroobrabotka directive makrokomanda directive, error makrokomanda error directive, null makrokomanda null directive, pragma makrokomanda pragma macro definition makroopredelenie macro expansion makropodstanovka (podstanovka) syntax summary svodka makrokomand primary expression pervichnoe vyrazhenie private private base class chastnyj bazovyj klass class member chastnyj chlen klassa procedural programming procedurnoe programmirovanie program programma environment okruzhenie programmy partitioning razbienie programmy start zapusk programmy termination zavershenie programmy protected protected member zashchishchennyj chlen member access dostup k zashchishchennomu chlenu prototypes prototipy public public class member obshchij chlen klassa pure specifier specifikaciya pure virtual function chisto virtual'naya funkciya pure-specifier specifikaciya-pure Q qualified name utochnennoe imya qualified-class-name utochnennoe-imya-klassa qualified-name utochnennoe-imya qualified-type-name utochnennoe-imya-tipa queue empty pustaya ochered' quote, single odinochnaya kavychka double dvojnaya kavychka R range checking kontrol' diapazona recursion rekursiya recursive decent parser analizator rekursivnogo spuska function call rekursivnyj vyzov funkcii reference ssylka assignment prisvaivanie ssylki assignment to prisvaivanie ssylke call by vyzov po ssylke cast privedenie ssylki conversion preobrazovanie ssylki const ssylka const declaration opisanie ssylki initialization inicializacii ssylki operand operand ssylka overloading and peregruzka i ssylka volatile ssylka volatile register declaration opisanie register initialization inicializaciya registra relational operator operaciya otnosheniya relational-expression vyrazhenie-otnosheniya reserved identifier zarezervirovannyj identifikator resolution ambiguity razreshenie neodnoznachnosti scoping ambiguity razreshenie neodnoznachnosti oblasti vidimosti template function overloading razreshenie peregruzki shablonnoj funkcii resource acquisition zapros resursa exhaustion ischerpanie resursa release osvobozhdenie resursa re-throw povtornyj zapusk (osoboj situacii) return return return statement operator return return type tip vozvrashchaemogo znacheniya run-time error dinamicheskaya oshibka initialization dinamicheskaya inicializaciya type information dinamicheskaya informaciya o tipe S scope oblast' vidimosti class oblast' vidimosti klassa file fajlovaya oblast' vidimosti function oblast' vidimosti funkcii global global'naya oblast' vidimosti local lokal'naya oblast' vidimosti of label oblast' vidimosti metki of local class oblast' vidimosti lokal'nogo klassa of macro name oblast' vidimosti makroimeni of name oblast' vidimosti imeni of nested class oblast' vidimosti vlozhennogo klassa resolution operator operaciya razresheniya oblasti vidimosti rules summary svodka pravil oblasti vidimosti separate compilation razdel'naya translyaciya shift-expression vyrazhenie-sdviga short type tip short type specifier specifikaciya tipa short side effects pobochnye effekty sign extension razmnozhenie znaka signed char type tip signed char type znakovyj tip simple-type-name imya-prostogo-tipa Simula Simula size of pointer razmer ukazatelya of string razmer stroki of structure razmer struktury sizeof operator operaciya sizeof Smalltalk Smalltalk source file ishodnyj fajl file, inclusion vklyuchenie ishodnogo fajla special character special'nyj simvol specifier auto specifikaciya auto declaration specifikaciya opisaniya friend specifikaciya friend function specifikaciya funkcii inline specifikaciya inline static specifikaciya static storage class specifikaciya klassa pamyati template specifikaciya shablona tipa typedef specifikaciya typedef virtual specifikaciya virtual stack unwinding raskruchivanie steka standard component standartnyj komponent conversion standartnoe preobrazovanie headers standartnye zagolovochnye fajly include directory standartnyj katalog vklyuchaemyh fajlov libraries standartnye biblioteki statement operator break operator break compound sostavnoj operator continue operator continue declaration operator opisaniya do operator do empty pustoj operator expression operator vyrazheniya for operator for goto operator goto if operator if summary svodka operatorov switch operator switch (pereklyuchatel') syntax summary sintaksis operatorov while operator while static type checking staticheskij kontrol' tipov static static class member staticheskij chlen klassa linkage of svyazyvanie staticheskih local object staticheskij lokal'nyj ob容kt member staticheskij chlen member declaration opisanie staticheskogo chlena member definition opredelenie staticheskogo chlena member function staticheskaya funkciya-chlen specifier specifikaciya static storage class staticheskij klass pamyati stream closing of zakrytie potoka file and fajl i potok state sostoyanie potoka string strokovyj potok string class strokovyj klass concatenation konkatenaciya strok constant konstanta stroka type of tip stroki wide-character shirokosimvol'naya stroka struct struct type specifier specifikaciya tipa struct structure struktura initialization of inicializaciya struktury subclass vlozhennyj klass subscripting user-defined pol'zovatel'skaya operaciya indeksacii summary class declaration syntax sintaksis opisanij klassa compatibility with ANSI C sovmestimost' s ANSI C compatibility with C sovmestimost' s S declaration syntax sintaksis opisanij declarator syntax sintaksis opisatelej exception handling syntax sintaksis osobyh situacij expression syntax sintaksis vyrazhenij macro syntax sintaksis makrokomand scope rules pravila oblastej vidimosti statement syntax sintaksis operatorov template syntax sintaksis shablonov tipa support for data abstraction podderzhka abstrakcii dannyh for object-oriented programming podderzhka ob容ktno-orientirovannogo programmirovaniya T template shablon tipa class shablonnyj klass class declaration opisanie shablonnogo klassa class definition opredelenie shablonnogo klassa declaration opisanie shablona tipa function shablonnaya funkciya function declaration opisanie shablonnoj funkcii function definition opredelenie shablonnoj funkcii linkage of svyazyvanie shablona tipa member function shablonnaya funkciya-chlen specifier specifikaciya template syntax summary sintaksis shablona tipa template-arg param-shablona-tipa template-arg-list spisok-param-shablona-tipa template-argument parametr-shablona-tipa template-argument-list spisok-parametrov-shablona-tipa template-class-name imya-shablonnogo-klassa template-declaration opisanie-shablona-tipa temporary vremennyj ob容kt this this throw throw throw-expression vyrazhenie-zapuska throwing, exception zapusk osoboj situacii throw-point tochka zapuska token leksema tools design proektirovanie servisnyh programm translation phases stadii translyacii unit edinica translyacii trigraph trigraf try try try-block proveryaemyj-blok type tip user-defined pol'zovatel'skij tip type-specifier specifikaciya-tipa U unary expression unarnoe vyrazhenie minus operator operaciya unarnyj minus operator unarnaya operaciya operator, user-defined pol'zovatel'skaya unarnaya operaciya plus, operator operaciya unarnyj plyus unary-expression unarnoe-vyrazhenie unary-operator unarnaya-operaciya uncaught exception neperehvachennaya osobaya situaciya undeclared argument neopisannyj parametr underscore character simvol podcherkivaniya _ unexpected exceptions neozhidannye osobye situacii union ob容dinenie anonymous bezymyannoe ob容dinenie constructor konstruktor ob容dineniya destructor destruktor ob容dineniya discriminating kontroliruemoe ob容dinenie initialization inicializaciya ob容dineniya member function funkciya-chlen ob容dineniya type specifier specifikaciya tipa union UNIX UNIX unsigned arithmetic bezznakovaya arifmetika char type tip unsigned char constant bezznakovaya konstanta type bezznakovyj tip type specifier specifikaciya tipa unsigned V vertical tab \v vertikal'naya tabulyaciya \v virtual virtual base class virtual'nyj bazovyj klass destructor virtual'nyj destruktor function virtual'naya funkciya function access dostup k virtual'noj funkcii function call vyzov virtual'noj funkcii function, type of tip virtual'noj funkcii specifier specifikaciya virtual user-defined conversion virtual'noe pol'zovatel'skoe preobrazovanie void void argument pustoj parametr pointer to ukazatel' tipa void* type tip void type specifier specifikaciya tipa void volatile volatile member function funkciya-chlen volatile operand operand volatile reference ssylka volatile type tip volatile type specifier specifikaciya tipa volatile W waterfall model model' kaskad white space obobshchennyj probel wide-character string shirokosimvol'naya stroka  * PRIMERY *  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 o"); 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) <