These are solutions to the problems of Homework 8 that were not assigned from the textbook.
The problem is to use the qsort
routine
to sort 3000 records of the following type:
struct city {
char Name[80] ;
char State[2] ;
}
First, you need a routine to compare the records. The problem
requires us to sort first by city and then by state.
The arguments to this routine are of type void *
as required in the specification of qsort
.
Consequently, we must cast the arguments to type
struct city *
before accessing the
fields of the record.
int cityCmp(const void *R1, const void *R2) {
struct city *P1, *P2 ;
int tempCmpRes ;
P1 = (struct city *)R1 ;
P2 = (struct city *)R2 ;
/* Compare the states. If unequal, return the result of the compare */
if (tempCmpRes = strncmp(P1>State, P2>State, 2))
return tempCmpRes ;
else
return strncmp(P1>Name, P2>Name, 80) ;
}
Assume Cities
is our array of 3000
struct city
records.
Now we only need to call qsort
.
Of course, qsort
expects the
array to be passed as a void *
.
qsort((void *)Cities, 3000, sizeof(struct city), cityCmp) ;
The ASCII values for the letters 'U', 'N', 'C', and 'A' are,
in hex, 0x55
, 0x4e
, 0x43
,
and 0x41
, respectively.
C statement  *key  h  g 

initally  0x55 or 'U' 
0x00000000 

h = (h << 4) + *key++ ; 
0x4e or 'N' 
0x00000055 

unsigned long g = h & 0xF0000000L ; 
0x4e or 'N' 
0x00000055 
0x00000000 
if (g) h ^= g >> 24 ; 
0x4e or 'N' 
0x00000055 
0x00000000 
h &= ~g ; 
0x4e or 'N' 
0x00000055 
0x00000000 
h = (h << 4) + *key++ ; 
0x43 or 'C' 
0x0000059e 

unsigned long g = h & 0xF0000000L ; 
0x43 or 'C' 
0x0000059e 
0x00000000 
if (g) h ^= g >> 24 ; 
0x43 or 'C' 
0x0000059e 
0x00000000 
h &= ~g ; 
0x43 or 'C' 
0x0000059e 
0x00000000 
h = (h << 4) + *key++ ; 
0x41 or 'A' 
0x00005a23 

unsigned long g = h & 0xF0000000L ; 
0x41 or 'A' 
0x00005a23 
0x00000000 
if (g) h ^= g >> 24 ; 
0x41 or 'A' 
0x00005a23 
0x00000000 
h &= ~g ; 
0x41 or 'A' 
0x00005a23 
0x00000000 
h = (h << 4) + *key++ ; 
0x00 
0x0005a271 

unsigned long g = h & 0xF0000000L ; 
0x00 
0x0005a271 
0x00000000 
if (g) h ^= g >> 24 ; 
0x00 
0x0005a271 
0x00000000 
h &= ~g ; 
0x00 
0x0005a271 
0x00000000 
So, the answer is 0x0005a271
.
The problem would have been more interesting had
the string had more than eight characters.