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";
}